Business Problem
IDSentinel Solutions' AWS environment had reached a critical operational threshold: six AWS accounts, growing workloads, and a developer population that required access provisioning and deprovisioning managed entirely by manual ticketing. When a developer joined a new team, their AWS access had to be manually assigned — the correct permission set identified, the account located, and the assignment created by hand in the AWS IAM Identity Center console.
An internal audit found 14 active AWS assignments belonging to Entra accounts that had been disabled for more than 30 days. In two cases, the accounts were associated with contractors whose engagements had ended. AWS access had never been removed because there was no automated link between the Entra identity lifecycle and AWS access rights.
Risk
- 14 stale AWS assignments confirmed for disabled Entra accounts — orphaned access in a production cloud environment
- No automated deprovisioning — offboarded users retain AWS access until a ticket is filed and manually actioned
- Role changes go undetected — movers retain previous permission sets with no recertification trigger
- Manual provisioning introduces 24–72 hour access delays for new joiners
- Non-compliant with Zero Trust mandate — access must be tied to current identity state
- SOC 2 CC6.2 (Access Provisioning) and CC6.3 (Logical Access Controls) exposure
Scope
| Parameter | Detail |
|---|---|
| Identity source | Microsoft Entra ID (M365 Developer Tenant) |
| Target system | AWS IAM Identity Center |
| Protocol | SCIM 2.0 |
| Groups provisioned | GRP-AWS-Engineering, GRP-AWS-DevOps, GRP-AWS-Security |
| Lifecycle events tested | Joiner (add to group), Mover (group change), Leaver (disable account) |
| Compliance target | SOC 2 Type II — CC6.2, CC6.3 |
Solution Design — 4 Workstreams
AWS IAM Identity Center Configuration
IAM Identity Center enabled with external identity source set to Entra ID. SCIM endpoint URL and bearer token generated for inbound provisioning. Permission sets created for each group.
Entra Enterprise App Registration
AWS IAM Identity Center enterprise app added from the Entra gallery. SCIM provisioning mode enabled — Tenant URL and Secret Token populated from the AWS SCIM endpoint. Connection test confirmed successful.
Group Scoping and Provisioning Activation
Three pilot groups scoped for provisioning. Groups and their 17 members pushed to AWS IAM Identity Center. Group-to-permission-set assignments configured in AWS.
Lifecycle Validation
Joiner, Mover, and Leaver events simulated end-to-end. Each triggered in Entra and confirmed propagated to AWS via provisioning logs and IAM Identity Center console verification.

Implementation
-
01
Enable AWS IAM Identity Center + SCIM Credentials
IAM Identity Center enabled in
us-east-1. Identity source changed to external identity provider to unlock SCIM inbound provisioning. Automatic provisioning enabled — SCIM endpoint URL and bearer token generated and stored securely for use in Entra.// 01-identity-center-enabled
// 02-scim-endpoint-bearer-token
-
02
Create Permission Sets
Permission Set Base Policy Target Group IDSentinel-ReadOnlyReadOnlyAccess GRP-AWS-Engineering IDSentinel-PowerUserPowerUserAccess GRP-AWS-DevOps IDSentinel-SecurityAuditSecurityAudit GRP-AWS-Security // 03-permission-sets
-
03
Configure Entra Enterprise App for SCIM
AWS IAM Identity Center app added from the Entra gallery. Provisioning mode set to Automatic. SCIM Tenant URL and Secret Token populated. Connection test confirmed successful before proceeding.
// 04-entra-enterprise-app
// 05-scim-credentials-configured
// 06-connection-test-success
-
04
Review and Confirm Attribute Mappings
Default SCIM attribute mappings confirmed —
userPrincipalName → userName,displayName → displayName,mail → emails[work],givenName → name.givenName,surname → name.familyName.// 07-attribute-mappings
-
05
Scope Groups and Run Initial Provisioning
Three pilot groups scoped — GRP-AWS-Engineering (8), GRP-AWS-DevOps (5), GRP-AWS-Security (4). Provisioning triggered manually. All 17 users and 3 groups created in AWS IAM Identity Center. Zero errors.
// 08-groups-scoped
// 09-initial-provisioning-logs
// 10a-users-in-identity-center
// 10b-users-in-identity-center
-
06
Assign Permission Sets to Provisioned Groups
Each provisioned group assigned to the target AWS account with the corresponding permission set — Engineering → ReadOnly, DevOps → PowerUser, Security → SecurityAudit.
// 11-permission-set-assignments
Lifecycle Validation
-
07
Joiner — User Added to Provisioned Group
Test user
t.chen@idsentinelsolutions.comadded toGRP-AWS-Engineeringin Entra ID. Provisioning cycle ran within 40 minutes. User confirmed present in IAM Identity Center with ReadOnly access to the dev account.// 12a-joiner-group-add
// 12b-joiner-provisioning-log
// 12c-joiner-iam-confirmed
-
08
Mover — User Transferred to Different Group
t.chenremoved fromGRP-AWS-Engineeringand added toGRP-AWS-DevOpsin Entra ID. Provisioning cycle propagated the change. IAM Identity Center confirmed ReadOnly assignment removed and PowerUser assignment applied. Zero manual steps.// 13a-mover-group-change
// 13b-mover-provisioning-log
// 13c-mover-permission-updated
-
09
Leaver — Account Disabled in Entra ID
PowerShell — disable account to simulate offboardingUpdate-MgUser -UserId "t.chen@idsentinelsolutions.com" ` -AccountEnabled:$false
SCIM provisioning detected the account state change and deprovisioned the user from IAM Identity Center. Confirmed user no longer appears in IAM Identity Center and all permission set assignments removed. Zero orphaned access.
// 14a-leaver-account-disabled
// 14b-leaver-provisioning-log
// 14c-leaver-iam-removed
Outcome
Implementation Results
| Metric | Value |
|---|---|
| Protocol | SCIM 2.0 |
| Groups provisioned | 3 (Engineering, DevOps, Security) |
| Users provisioned | 17 |
| Permission sets created | 3 |
| Provisioning errors | 0 |
| Lifecycle events validated | 3 (Joiner, Mover, Leaver) |
| Stale assignments removed | 14 |
| Manual provisioning steps (post-pipeline) | 0 |
| Provisioning cycle latency | < 40 minutes |
| Long-lived AWS credentials issued | 0 |
Files
-
scripts/validate-scim-pipeline.ps1Validates SCIM provisioning state — confirms Entra group membership matches IAM Identity Center -
scripts/audit-stale-assignments.ps1Pre-migration audit script — identified the 14 stale AWS assignments for disabled Entra accounts -
diagrams/scim-provisioning-architecture.pngArchitecture diagram — Entra ID to AWS IAM Identity Center SCIM flow -
evidence/SOC2-EVIDENCE.mdSOC 2 control mapping — CC6.2 and CC6.3 evidence checklist -
screenshots/Implementation evidence organized by stage