Appearance
DDE Privileged Access Review
Environment: Azure DDE (tenant ff1c5d68, ciriusdde.com) Scope: Privileged roles and service principals across all DDE subscriptions Purpose: Quarterly review to detect over-provisioned admin access in a HIPAA-relevant customer-facing environment Owner: Rory (architect) — all remediation approved by Rory before merge Remediation repo: azure-dde-infra (separate Terraform PR)
Why This Review Matters
DDE is customer-facing Medicare billing. Any permanent admin at subscription scope in DDE represents standing privilege that HIPAA and HITRUST expect to be just-in-time or narrowly scoped. Defender for Cloud surfaces service principals with permanent admin roles at subscription scope as findings that must be remediated or justified.
Identities in Scope
Human Identities
| Identity | Tenant | Expected Roles | Expected Scope |
|---|---|---|---|
rory@ciriusdde.com | DDE | Global Administrator (PIM-eligible) | Entra ID |
cirius-breakglass@ciriusdde.com | DDE | Global Administrator (permanent, unsuppressible) | Entra ID |
Break-glass is permanent and unsuppressible by design. Any activity triggers CRITICAL alert — never add to known-good rules (hard API block in SecOps).
Service Principals
| Service Principal | Purpose | Expected Role | Expected Scope |
|---|---|---|---|
github-deploy-main (DDE) | Terraform deploy via OIDC federated credential | Contributor + User Access Administrator (split: Contributor for resources, UAA for RBAC assignments) | Per-subscription, NOT tenant root |
kobe-sp (DDE) | Read-only inventory for Kobe agent | Reader + Security Reader | Per-subscription |
| Any automation SPs for agents | Minimum permission per function | Scoped data-plane roles (Key Vault Secrets User, Storage Blob Data Reader, etc.) | Resource-scope where possible |
Federated credential rule: GitHub org must be Cirius-Group-Inc (exact). OIDC breaks on any other casing.
What Over-Provisioned Access Looks Like
Findings to flag during the review:
Ownerat subscription scope held by a service principal — almost never justified.Contributor+User Access Administratorprovides the same working surface with clearer intent and audit trail.Contributorat subscription scope on human accounts — should be PIM-eligible or scoped to resource groups.- Permanent (non-PIM) assignments of
Global Administrator,Privileged Role Administrator,User Administratoron humans — must be PIM-eligible with activation justification. - Any assignment on the tenant root management group that isn't explicitly required — prefer subscription scope.
- Legacy or decommissioned service principals still holding active role assignments — remove the SP entirely, don't just unassign.
- Classic administrator assignments (Co-Administrator, Account Administrator) — must be zero across DDE subscriptions.
github-deploy-mainscoped to tenant root instead of individual subscriptions.- Guest users with any elevated role — guests must not hold admin.
Review Process
Frequency: Quarterly, plus on-demand whenever Defender for Cloud surfaces a privileged-identity finding in DDE.
- Inventory — run the DDE lpriv audit workflow (same pattern as
pim-audit.ymlfor PROD, ported to DDE tenant) to snapshot all subscription- and management-group- scoped role assignments and all federated credentials on service principals. - Compare — diff snapshot against the expected baseline above. Anything in the snapshot that isn't in the baseline is a finding.
- Classify each finding:
- Remediate — access is not justified, plan removal.
- Justify — access is legitimate, update this baseline with date and reason.
- Investigate — access is unexpected and the owner is unclear.
- File SecOps story — one story per remediation under the
DDEENVproject prefix, statusBACKLOGuntil Rory reviews. - Rory reviews — each remediation requires Rory's approval before any Terraform change lands.
- Remediate in
azure-dde-infra— Terraform changes only, no portal clicks:- Remove the assignment via
azurerm_role_assignmentdeletion or by narrowing thescopeattribute. - For SPs that are fully decommissioned, delete the app registration via
azuread_applicationresource removal. - For
github-deploy-mainover-scope, split into one assignment per subscription rather than a single tenant-root assignment.
- Remove the assignment via
- PR workflow — branch, PR, Checkov +
terraform planin CI, Rory review, merge triggers apply via OIDC. Never apply locally. - Verify — re-run the audit after apply, confirm finding cleared, close the SecOps story with evidence link.
Relationship to Azure Policy
DDE subscriptions carry HIPAA/HITRUST and ISO 27001 policy assignments. The built-in control "A maximum of 3 owners should be designated for your subscription" is the Azure Policy backstop — this review is the deeper continuous check.
Out of Scope
- PROD tenant privileged access — covered by
lpriv-baseline.md. - AWS IAM privileged access — covered by AWS least-privilege workstream.
- Data-plane suppression rules — covered by
lpriv-secops.md.
Related
security/lpriv-baseline.md— PROD tenant equivalentsecurity/lpriv-ops-automation.md— ops-automation identitiessecurity/lpriv-secops.md— SecOps platform identities- SecOps project
DDEENV— DDE HIPAA Compliance Wave epic