The ticket
Junior enabled a second region and turned off the CloudTrail trail in the same account that pays the org bill. You cannot SCP the management account. The landing zone was a slide, not a build.
AWS Organizations is the multi-account container. OUs (this lab: Security, Workloads) are where you attach policy. A service control policy (SCP) sets the maximum permissions for IAM users and roles in member accounts — including that account’s root. SCPs do not grant. Identity policies still have to allow. Default managed SCP is FullAWSAccess (allow *). Control Tower vends the landing zone (org, log-archive / audit-style accounts, baseline guardrails, Account Factory). Build that before hub VPC 10.50.0.0/16 and app VPC 10.51.0.0/16.
Account 111122223333 · OUs Security / Workloads · hub VPC 10.50.0.0/16 · app VPC 10.51.0.0/16 · SG sg-web · NACL acl-app · bucket tc-lab-app-logs · role AppEC2Role · TGW tgw-lab · VGW public 203.0.113.60 · on-prem FortiGate WAN 203.0.113.10. Dummy account ID. Not yours.
Mental model
| Object | Job | This lab |
|---|---|---|
| Organization | One bill, one tree, org trail later | mgmt + member accounts under 111122223333 as the dummy id you type |
| OU Security | Log archive, audit, security tooling | No pay-api here |
| OU Workloads | App accounts, hub/app VPCs | 10.50.0.0/16 · 10.51.0.0/16 |
| SCP | Deny / allow-list ceiling | Deny leave-org, deny disable-trail, deny unapproved regions |
No SCP statement ever gives Priya s3:*. It can only stop her.
Root → Security / Workloads
How to choose
| Need | Use | Do not |
|---|---|---|
| Stop member root from disabling CloudTrail | SCP deny on the OU | Trust an IAM policy alone |
| Give Priya S3 read | Identity Center permission set / IAM policy | An SCP Allow thinking it grants |
| New app account | Control Tower Account Factory into Workloads | Build in management |
Runbook
Side A — tree
Organizations: root → OU Security, OU Workloads. Member workload account under Workloads. Nothing runnable in management except org admin.
Side B — guardrail
Attach SCPs to Workloads. Keep
FullAWSAccessunless you are moving to an allow-list model on purpose. Test the deny in a sandbox account first.Side C — prove
From the member account, attempt a denied action. Expect explicit deny. From management, remember SCPs did not apply — that is why workloads do not live there.
aws organizations list-roots # Id: r-lab1 aws organizations list-organizational-units-for-parent --parent-id r-lab1 # Security Workloads aws organizations list-policies --filter SERVICE_CONTROL_POLICY # FullAWSAccess (AWS managed) p-deny-leave (customer) aws organizations list-policies-for-target --target-id ou-lab-workloads --filter SERVICE_CONTROL_POLICY # p-deny-leave attached
Four failures
1 · Workload in the management account
SCPs will not constrain it. Billing + blast radius share a login.
2 · “I attached an SCP Allow so she has access”
She does not. SCP is not a grant. Check the permission set.
3 · SCP on the account, app already using a denied region
You just broke prod. Attach to a sandbox OU, then move the account.
4 · Control Tower after 40 accounts
You will spend a quarter cleaning what Account Factory would have vended clean.
How to prove it
1) Workloads sit in the Workloads OU. 2) You can name the SCP and that it does not grant. 3) Management is empty of apps. 4) A denied API in the member account fails for root too.
Traps
| Belief | Docs |
|---|---|
| SCP replaces IAM | Both must allow; SCP is the ceiling |
| Member root bypasses SCP | Member root is in scope |
| Management root is in scope | SCPs do not affect the management account |
Knowledge check
Judgment items. One best answer. Reasons send you back to the matching section.
AWS security class series: Shared + IAM · Org / OU · SG vs NACL · Role not key · KMS + Secrets · VPC endpoint · Trail + GuardDuty · TGW hub · S3 public · Interview
Sources
Related: AWS session factory · Migration series.