DUO AGENTIC IDENTITY · lab validation
Gary Townsend · Customer Success Technical Leader · Duo Care Signature Support · Cisco

Zero-Trust Agentic Identity Fabric

A hands-on lab that governs humans and non-humans on one identity truth — agents, LLMs, tools, services, and doors. Built to present and validate a Duo Agentic Identity + Zero-Trust-for-AI approach end to end. A personal skills lab — synthetic identities only, no customer data.

planes → agentgateway · MCP Envoy AI Gateway · LLM Cisco Secure Access · ZTNA Duo = policy decision point

← / → or space to advance  ·  F for fullscreen  ·  ◐ toggles light / dark

02 · The "so what" — customer lens

Why a Duo customer should care

The governance reframing
Stop asking CAN this agent reach the tool?  →  ask SHOULD it, given the human it acts for and current identity intelligence?
Static entitlement → continuous, sponsor-bound, risk-informed authorization — per tool call, per model call, per door.

Enterprises adopting agentic AI face a new identity population — agents, MCP tools, LLMs — with no owner, no lifecycle, no least-privilege. This lab shows the answer is the identity fabric they already run: Duo as the decision point, the same joiner/mover/leaver, the same groups, extended to non-humans. It de-risks the customer's path before they build it.

03 · Architecture

Three enforcement planes, one job each

Every plane is a Policy Enforcement Point (PEP) in front of one resource class; Duo's cloud Authorization API is the shared Policy Decision Point (PDP). One identity truth, three doors.

agentgatewayMCP tools · agent↔tool

PEP

0.12.0 + Duo Authorization Connector. Per-tool-call ext_authz against the sponsor's groups. Federates GitHub · MS Learn · Splunk.

realizes → Duo Agentic Identity · per-action least-privilege

Envoy AI GatewayLLM providers · agent↔model

PEP

aigw run fronts LiteLLM at loopback :8210 — model virtualization, provider fallback, token accounting; three tier keys (local / external / frontier).

enforces → tier + budget per model call

Cisco Secure AccessPrivate apps · user↔app (ZTNA)

PEP

CF Access + Duo live at the edge today; the Private-App API is the target for programmatic grant / revoke of private apps and device trust.

edge live · API target
all three call the same PDP

Duo cloud · Authorization APIthe shared decision point

PDPPIP

Authenticates the agent's Duo JWT, then authorizes the action against the human sponsor's AD-synced groups. Default-deny. Every decision is logged to the Duo Client Authorization Log.

04 · Network topology

Where it all runs — one lab host

One Windows/Hyper-V host: the identity VMs, the Docker fabric, egress through a default-deny Squid proxy, and Cloudflare tunnels publishing everything Duo-gated at the edge — no inbound ports.

Cloudflare edge · CF Access + Duo · no inbound ports
Cloudflare tunnels → lab services
Duo-gated at the edge · no inbound ports
Lab host · Windows 11 / Hyper-V
Docker networks
agentgateway
+ Duo connector · MCP
Envoy AI GW :8210
→ LiteLLM :4000
-lite fabric
hris·iga·itsm·cmdb·pacs
Observability
Prom·Grafana·Loki·Kuma
Hyper-V VMs · identity plane
DC01
AD / DNS · lab.local
SYNC01
Entra Connect + Duo Proxy
SPLUNK
SIEM
WS01-04
endpoints
all egress forced through
Squid egress · default-deny allowlist
10.20.0.1:3128 · the only path out · allowlist → Anthropic · OpenAI · Duo · Microsoft Graph
Cloudflare tunnels front each service; Docker egress is forced through Squid; the identity VMs never touch the public internet directly.
05 · The identity fabric

One source of record, governing every actor

the -lite fabric — provisioning + signaling
Workday-LiteHR SoR · JML authority
IGA-Litegovernance · recert · SoD
ITSM-Litechange SoR · CAB gate
CMDB-LiteCI · device trust
PACS-Litephysical access · badge
Provisioning plane — SCIM · state (who has what)
HRIS-Lite
HR SoR · JML
IGA-Lite
governance · reconcile
ITSM-Lite
CAB gate · Duo push
AD · Entra · Duo
provisioned + badge
every applied grant emits an event
Signaling plane — SSF / CAEP · RISC · events (what just changed)
SSF transmitter
one signed SET · RS256
fans to every receiver
Duo
re-evaluate
CII / Oort
re-evaluate
PACS-Lite
revoke badge
HRIS onboarding drives AD; grants are Duo-push CAB-approved; the SSF/CAEP bus revokes logical and physical access in real time. Humans in HRIS; every NHI owned by a human and tied to a service.
06 · Directory sync — validated via Duo Admin API

Two sync paths, one Duo

The 17 SG-* groups reach Duo on the AD path — not through Entra. SYNC01 runs two sync engines side by side; three inbound directory syncs converge on one Duo the gateways then read.

AD on-prem · lab.local
users + 17 SG-* groups (T0–T4)
SYNC01 · two engines, side by side
Entra Connect
AD → Entra
▸ Entra ID · testenvir010
Duo Auth Proxy · [ADDS]
AD → Duo · the SG-* path
▸ Duo directory
Entra ID and a Google source also sync into Duo — three inbound syncs converge on one Duo directory the gateways read. The 17 SG-* groups arrive on the AD path, not through Entra.
31
AD-synced (incl 17 SG-*)
5
Entra-synced
1
Google-synced
46
Duo groups total
07 · The authorization model

17 groups × 5 tiers, rendered from policy-as-code

Groups = f(roles × tiers) — an identity-plane object, independent of gateway or tool count. Authored once in mcp-authz-intent.yaml, rendered to each PDP. T3/T4 bind to an elevated .adm identity, so neither a human on their daily account nor an agent acting on-behalf-of them can reach destructive tools.

tiers → T0 reference T1 read T2 write T3 privileged · .adm/JIT T4 sensitive · .adm/JIT+alert
PlaneRepresentative groupsProvisioning
MCP · GitHubSG-MCP-GitHub-Read / Write / Merge / Adminbirthright → JIT·.adm
MCP · SplunkSG-MCP-Splunk-Read / Query / IAMDatabirthright → JIT+alert
MCP · AppSecSG-MCP-AppSec · SG-MCP-MSLearnJIT+alert · birthright
LLMSG-LLM-Local / External / Frontierbirthright → JIT
Fabric APISG-AGW-Fabric-Read / Operatorrequestable → JIT·.adm
Gateway adminSG-MCP-AgentGW / EnvoyGW / SecureAccess-AdminJIT · .adm
08 · MCP plane · deep dive

Per-tool-call authorization — Duo=PDP, gateway=PEP

Two checks on every call: authenticate the Duo JWT, then authorize the target tool against the sponsor's groups. Default-deny — a tool not in any of the sponsor's group bundles is hidden.

Agent / MCP client
on-behalf-of a human sponsor
agentgateway
PEP · enforcement
Duo Authorization Connector
PDP · decision
1
tools/call presented with a Bearer Duo JWT
client → gateway
2
Validate the token — iss / aud / JWKS
gateway (PEP)
3
ext_authz Check — token + target_tool
gateway → Duo connector
4
Evaluate sponsor groups ∩ allowedTools(group, server)
Duo (PDP) · default-deny
5a
ALLOW → tool result returned
authorized
5b
DENY → 403, tool hidden / refused
not in any group bundle
57
tools federated
5 / 5
Duo apps correlated
allow + deny proven

Validated: agentgateway 0.12.0 + Duo Authorization Connector live, federating GitHub · MS Learn · Splunk; every ext_authz decision feeds the Duo Client Authorization Log (config ↔ tenant confirmed across all five gateway Duo apps).

09 · LLM plane · deep dive

Envoy AI Gateway → LiteLLM, tiered

Envoy fronts LiteLLM as one OpenAI-compatible upstream; LiteLLM keeps provider custody and the 7-model fan-out, Envoy adds the edge, model virtualization, and token accounting. Three tier keys (local / external / frontier) exist and are vaulted; the tiers are declared in the policy SSOT. Binding group→tier at the gateway (Option B) is the near-term step — today the plane runs on a tier key.

Agent
Duo Agentic Identity
/v1/chat/completions
Envoy AI GW :8210
PEP · model virtualization
LiteLLM :4000
7 models · virtual keys
Ollama
local · no egress
Anthropic · OpenAI
DLP-gated
Out-of-tier model or over-budget → blocked + logged at the gateway
tier / budget deny
200
LLM call · 2 providers
3
tier keys · vaulted
:8210
loopback — not public

Validated: HTTP 200 across Anthropic (haiku) and OpenAI (gpt-4o-mini). Tier keys llm-local / external / frontier vaulted to 1Password. The gateway is loopback-only — no unauthenticated public exposure.

10 · ZTNA + real-time revoke

The edge, and pulling access back

Access is Duo-gated at the Cloudflare edge; the leaver signal inverts the model — disable-first, notify-after — and a single signed SSF/CAEP event drops the agent's token and every access it held, instantly.

Access path — Duo-gated ZTNA
User / Agent
CF Access + Duo
edge PEP · live
Cisco Secure Access
private apps (ZTNA) · target
-lite consoles + fabric API
Real-time revoke — leaver-inversion (disable-first)
HRIS leaver → IGA
Duo session-revoked
one signed SET · SSF / CAEP
pulls token from
agentgateway · Envoy · Secure Access
every plane, instantly
CF Access + Duo live at the edge today; Secure Access private-app API is the programmatic target. SSF receivers verified against CII and caep.dev.
11 · Validation scorecard

Proven vs pending — honestly

CapabilityEvidenceStatus
MCP per-tool-call authz57 tools; allow + deny; Duo audit 5/5 appsproven
LLM gateway + tieringHTTP 200 · 2 providers; 3 vaulted tier keys; :8210 loopbackproven
Directory sync (two-path)31 AD / 5 Entra / 1 Google = 46; 17 SG-* on AD pathproven
JML + Duo-push CAB + SSF revokefabric end-to-end; SSF vs CII + caep.devproven
Duo Authorization Policy (user-level)mcpgw group→tool policy not yet configuredpending
LLM group→tier binding (Option B)tier keys exist; group-driven selection not wiredpending
Public LLM downstream auth · Ollama Local tierloopback-only today; no public auth / no local tierpending
Secure Access private-app APIedge live (CF+Duo); programmatic grant/revokeroadmap

Every "proven" row maps to a test case in the end-user test plan's coverage matrix; every "pending" is a named prerequisite, not a silent gap.

12 · Reference — healthcare, Epic EMR acute facility

Who owns identity — the provider lifecycle

The same fabric shape maps onto a real acute-care hospital. The healthcare-specific twist: providers aren't hired, they're credentialed — the Medical Staff Office is a second source of truth alongside HR, and Epic role/template assignment is its own governed step.

Joiner — credential-driven
1
Credential + privilege → SER record
Medical Staff Office
2
Worker + provider identity created
HR + MSO → IAM
3
Enroll MFA + tap-and-go
Duo
4
Assign Epic role / subtemplate
Epic Security
5
Badge to assigned units
Physical Access (PACS)
6
Baseline access cert + SoD
IGA / Governance
Leaver — disable-first, notify-after
1
Privilege end / termination
Medical Staff Office → IGA
2
Disable identity ahead of notice
IGA → IAM
3
session-revoked — one signed SET (SSF / CAEP)
Duo
4
Kill EHR session + revoke badge
Epic + PACS, in real time
Lab mapping — HR→Workday-Lite · Med Staff Office→IGA-Lite credentialing · IAM→AD/Entra/Duo · Epic Security→app owner · IGA→IGA-Lite · Duo revoke→SSF/CAEP leg · Physical→PACS-Lite. The rehearsal is the customer's org chart in miniature.
13 · Reference — RACI, Epic EMR acute facility

Who owns what — identity RACI

ActivityHRMed StaffIAMEpic SecIGASOC/ITDRCompliance/HIM
Onboard staff (nurse / tech)ARCII
Credential + onboard providerCARCIC
Epic role / template assignmentCCACC
Access request (add'l system)CRCAI
Mover (unit / role / locum)ACRCCI
Leaver + real-time revokeCCARRCI
Break-glass emergency accessCIRIRA
Access certification / recertICCCAC
HIPAA access audit / ITDRICCRA
R Responsible — does the work A Accountable — owns the outcome C Consulted — two-way input I Informed — one-way notice

Clinicians invoke break-glass; the data / application owner approves access requests — folded into Consulted above. The point for a Duo customer: this ownership map already exists in their org — the fabric just makes each lane a governed, auditable step.

14 · What success looks like

Two lenses on the same outcome

Read as a Duo Care Signature Support engagement: a reference architecture and de-risking rehearsal for a customer's own agentic-AI adoption — standards-first, mapped to what they already own. Success has to land for both sides of the table.

If I were the customer — success is

  • AI adopted on the Duo I already run — no new IdP, no new identity silo to govern
  • Every agent owned + least-privilege — a human sponsor, a scoped token, a clean audit trail
  • Governance keeps pace with the AI rollout — I move faster because control isn't the blocker
  • One kill-switch I trust — a single signed event pulls an agent across every plane in real time
  • Audit-ready by construction — SCIM · SSF/CAEP · OAuth 2.1 map clean to HIPAA / NIST / SOC 2

For the Care Signature CSM / CSE pair — success is

  • Faster time-to-value — the customer activates Duo for AI sooner; adoption + health score climb
  • Fewer reactive escalations — a proven reference heads off the misconfigurations before they page us
  • A repeatable asset — one validated build accelerates every agentic-AI conversation across the book
  • Expansion, earned — Duo becomes the control plane for AI, deepening the footprint on outcomes, not discounts
  • Trusted-advisor credibility — we lead the customer from "how do we govern AI agents?" to "we already can"

The Care Signature win is the customer's win, restated: durable adoption of Duo as the identity control plane for AI — the reference build, validated, in their hands.

15 · Roadmap

What's next

near — closes the pending rows
  • Duo Authorization Policy for mcpgw — group→tool bindings so user-level allow/deny + Client Auth Log rows land
  • LLM group→tier (Option B) — bind SG-LLM-* to the matching tier key at the gateway
  • Public LLM downstream auth + Ollama Local tier — add the no-egress local plane
then — extends the planes
  • Cisco Secure Access private-app API — programmatic ZTNA grant / revoke
  • Continuous-assurance signals — feed the fabric's identity/device/behavioral signals toward a risk score
  • Broaden the audit correlation — user-level Client Authorization Log via a real policy + login

Gary Townsend · Customer Success Technical Leader · Duo Care Signature Support · Customer Experience · Cisco · personal skills lab, synthetic data only.

01 / 15← / → · space · F · ⤓ pdf