Enterprise Identity & Access Management Platform  ·  View 21 of 27  ·  Operations

Identity as Code

How an access change reaches production, and what stops a bad one.

Editable source SVG draw.io All views
Author
Author
IaC repository
Bicep + Terraform azuread
IaC repository...
Policy definitions
deny, audit, DINE
Policy definitions...
CA policies as JSON
38 policies
CA policies as JSON...
Validate
Validate
PR checks
format, lint, PSRule
PR checks...
What-if / plan
no silent role deletes
What-if / plan...
IAM code owners
two-person rule
IAM code owners...
Non-production
Non-production
Deploy DEV
federated credential
Deploy DEV...
Deploy TEST
integration suite
Deploy TEST...
Report-only CA
14 days of signal
Report-only CA...
Gate to production
Gate to production
PIM-activated deployer
60-minute window
PIM-activated deployer...
Change approval
standard or emergency
Change approval...
Compliance scan
Azure Policy, blocking
Compliance scan...
Production & drift
Production & drift
Deploy PROD
5 subscriptions
Deploy PROD...
Drift detector
daily what-if
Drift detector...
Rollback
revert commit, re-apply
Rollback...
destructive plan blocked
destructive plan blocked
non-compliant
non-compliant
raises a PR for manual change
raises a PR for manual change
Identity as Code — how an access change reaches production
Identity as Code — how an access change reaches production
Security / platform
Security / platform
Decision point
Decision point
Interface / broker
Interface / broker
Risk / gap
Risk / gap
failure / alternate
failure / alternate
event / async
event / async
The deploy identity itself holds no standing role: the pipeline federates, activates through PIM, deploys, and expires. Portal changes are not blocked outright — they are detected within 24 hours and reconciled back into the repository, because a control that stops an incident response gets switched off.
The deploy identity itself holds no standing role: the pipeline federates, activates through PIM, deploys, and expires. Portal changes are not blocked outright — they are detected within 24 hours and reconciled back into the repository, because a control that stops an incident response gets switched off.
v 1.0 · owner Data & AI Global Practice · date 2026-08
v 1.0 · owner Data & AI Global Practice · date 2026-08
Text is not SVG - cannot display

Decisions

  • Bicep for Azure RBAC and Policy, Terraform with the azuread provider for directory objects, Conditional Access policies as JSON. One repository, one review path, one history.
  • The deploy identity federates and activates through PIM for 60 minutes. A pipeline with a standing Owner role is the most over-privileged principal in most estates, and this one does not exist between deployments.
  • Portal changes are detected rather than blocked. The drift detector raises a pull request within 24 hours, so an emergency fix is reconciled instead of being punished — controls that block incident response get switched off.

The gates

  • What-if or plan output is posted on every pull request and a destructive change to a role assignment blocks the merge outright.
  • IAM code owners enforce a two-person rule on anything touching privileged roles, Conditional Access or break-glass exclusions.
  • Conditional Access changes serve 14 days in report-only with an impact query before enforcement. That is a schedule constraint on the change, not a suggestion.

Risks

  • A misconfigured Conditional Access policy can lock out the tenant. Break-glass exclusions are asserted by a test in the pipeline, and view 26 is the recovery path when the assertion is wrong.
  • Terraform state for directory objects is itself sensitive; it lives in a storage account with a private endpoint and its own RBAC, and is never in the repository.
  • Emergency changes bypass the pipeline by design. They must be reconciled within 24 hours, and the reconciliation rate is a reported metric.