Preporato

SAA-C03 Study Guide

Design Secure ArchitecturesSecure Access to AWS ResourcesService Control Policies (SCPs) & Organizations

Key Concepts

  • SCPs set permission boundaries

  • SCPs don't grant permissions

  • Organizational units (OUs)

  • Policy inheritance

  • Deny lists vs allow lists

Service Control Policies (SCPs) & AWS Organizations

Overview

AWS Organizations enables centralized management of multiple AWS accounts, while Service Control Policies (SCPs) provide the guardrails that define the maximum permissions across those accounts. Together, they form the foundation of enterprise-scale AWS governance.

SCPs don't grant permissions - they set boundaries. Even if an IAM policy allows an action, an SCP can restrict it. This makes SCPs the ultimate "permission ceiling" for your organization, ensuring that no matter what IAM policies exist, certain actions can never be performed.

For the SAA-C03 exam, understanding how SCPs interact with IAM policies and the organizational hierarchy is critical. Questions often test whether you understand that SCPs are preventive guardrails that cannot be overridden.

Key Principle

SCPs set the maximum available permissions - they don't grant permissions themselves. Effective permissions = IAM Policies INTERSECTED WITH SCPs. If either denies an action, the action is denied.

Exam Tip

Remember: SCPs never affect the management account, only member accounts. Also, SCPs don't affect service-linked roles. These are common exam distractors.


Architecture Diagram

SCPs and Organizations Hierarchy
Figure 1: AWS Organizations hierarchy showing how SCPs are inherited through OUs

Key Concepts

AWS Organizations

AWS Organizations

AWS Organizations is a free service for centrally managing multiple AWS accounts.

Key Features:

  • Consolidated Billing: Single payment method for all accounts
  • Centralized Management: Create, organize, and manage accounts
  • Policy-Based Governance: Apply SCPs and other policy types
  • Account Automation: Programmatic account creation

Components:

  • Organization: The root container for all accounts
  • Root: Top of the hierarchy (not the root user)
  • Organizational Units (OUs): Logical groupings of accounts
  • Accounts: Individual AWS accounts (management + members)

Service Control Policies (SCPs)

Service Control Policies

SCPs are organization policies that define the maximum permissions for member accounts.

Key Characteristics:

  • Boundary Policies: Set limits, don't grant permissions
  • Inherited: Flow down through the OU hierarchy
  • Cumulative Effect: All applicable SCPs must allow an action
  • JSON Format: Same syntax as IAM policies

What SCPs Control:

  • API actions (Allow/Deny)
  • Resources (with full ARN support as of 2025)
  • Conditions (IP, tags, regions, etc.)

2025 SCP Enhancements

New SCP Capabilities (2025)

AWS now supports full IAM policy language in SCPs:

  • Conditions: Use any IAM condition keys
  • Resource ARNs: Specify individual resources
  • NotAction with Allow: More flexible allow statements
  • NotResource: Exclude specific resources
  • Wildcards: Use * anywhere in action strings

This enables much more granular control than before!

SCP Inheritance

SCP Inheritance Model

SCPs are inherited through the organizational hierarchy:

How It Works:

  1. SCPs attached to root apply to all OUs and accounts
  2. SCPs attached to an OU apply to all child OUs and accounts
  3. SCPs attached directly to an account apply to that account
  4. All applicable SCPs must allow an action for it to be permitted

Effective Permissions:

Effective Permissions =
  Root SCPs ∩ OU SCPs ∩ Account SCPs ∩ IAM Policies

If any SCP in the path denies an action, it's denied - regardless of IAM policies.

SCP Inheritance Example

LevelSCPEffect
RootAllow: ec2:*, s3:*, rds:*Maximum permissions for org
Production OUDeny: ec2:TerminateInstancesCannot terminate instances
Account A (in Production)No additional SCPsInherits: Allow EC2/S3/RDS, Cannot terminate

What SCPs Don't Affect

SCP Limitations

SCPs do NOT apply to:

  • Management account - Always exempt from SCPs
  • Service-linked roles - Used by AWS services internally
  • Resource-based policies - SCPs only affect principals, not resources
  • Actions performed by AWS services on your behalf

These exceptions are frequently tested on the exam!


How It Works

Deny List vs Allow List Strategies

SCP Evaluation Flow
Figure 2: How SCPs are evaluated with IAM policies to determine effective permissions

Deny List Strategy (Recommended)

Start with Allow, add explicit Denies

How It Works:

  1. Attach FullAWSAccess policy (allows everything)
  2. Add explicit Deny statements for restricted actions
  3. New AWS services are automatically available

Benefits:

  • Simpler to maintain
  • New services work by default
  • Easier to understand what's blocked

Best For: Most organizations

Allow List Strategy

Only allow explicitly permitted actions

How It Works:

  1. Remove FullAWSAccess policy
  2. Only allow specific services/actions
  3. Everything else is implicitly denied

Challenges:

  • Must update for every new AWS service
  • Risk of blocking legitimate workloads
  • More complex to maintain

Best For: Highly regulated industries (finance, healthcare) requiring strict control

Common SCP Patterns

Pattern 1: Deny Specific Regions

JSONDeny All Actions Outside Approved Regions
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyUnapprovedRegions",
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "us-east-1",
            "us-west-2",
            "eu-west-1"
          ]
        },
        "ArnNotLike": {
          "aws:PrincipalARN": "arn:aws:iam::*:role/OrganizationAdminRole"
        }
      }
    }
  ]
}

Pattern 2: Protect Security Services

JSONPrevent Disabling CloudTrail and Config
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ProtectCloudTrail",
      "Effect": "Deny",
      "Action": [
        "cloudtrail:DeleteTrail",
        "cloudtrail:StopLogging",
        "cloudtrail:UpdateTrail"
      ],
      "Resource": "*"
    },
    {
      "Sid": "ProtectConfig",
      "Effect": "Deny",
      "Action": [
        "config:DeleteConfigRule",
        "config:DeleteConfigurationRecorder",
        "config:DeleteDeliveryChannel",
        "config:StopConfigurationRecorder"
      ],
      "Resource": "*"
    }
  ]
}

Pattern 3: Require Encryption

JSONRequire S3 Encryption
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyUnencryptedS3Objects",
      "Effect": "Deny",
      "Action": "s3:PutObject",
      "Resource": "*",
      "Condition": {
        "Null": {
          "s3:x-amz-server-side-encryption": "true"
        }
      }
    }
  ]
}

Pattern 4: Prevent Public Access

JSONPrevent Public S3 Buckets
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyPublicBucketACL",
      "Effect": "Deny",
      "Action": [
        "s3:PutBucketPublicAccessBlock",
        "s3:DeletePublicAccessBlock"
      ],
      "Resource": "*",
      "Condition": {
        "ArnNotLike": {
          "aws:PrincipalARN": "arn:aws:iam::*:role/SecurityAdminRole"
        }
      }
    }
  ]
}

Pattern 5: Restrict Root User Actions

JSONDeny Root User Actions (Except Specific)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyRootUser",
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:PrincipalArn": "arn:aws:iam::*:root"
        }
      }
    }
  ]
}

Recommended OU Structure

OUPurposeSCP Focus
SecurityLog Archive, Audit, Security ToolsProtect security resources, deny deletions
InfrastructureNetworking, Shared ServicesProtect shared resources, limit modifications
Workloads/ProductionProduction applicationsDeny dangerous actions, require encryption
Workloads/SDLCDev, Test, StagingMore permissive, allow experimentation
SandboxDeveloper experimentationBudget limits, region restrictions, minimal guardrails
PolicyStagingTest new SCPs before rolloutTest policies safely
TransitionalMigrating/acquired accountsTemporary permissive policies

Use Cases

Use Case 1: Region Restriction for Data Sovereignty

Scenario: European company must ensure all data stays in EU regions for GDPR compliance.

Solution:

  1. Create SCP denying actions outside EU regions
  2. Attach to Production and SDLC OUs
  3. Except global services (IAM, Route 53, CloudFront)

Use Case 2: Prevent Accidental Termination

Scenario: Operations team accidentally terminated production instances.

Solution:

  1. Create SCP denying ec2:TerminateInstances for production OU
  2. Create exception role for authorized terminations
  3. Require MFA for the exception role

Use Case 3: Security Service Protection

Scenario: Ensure CloudTrail cannot be disabled by any user in any account.

Solution:

  1. Create SCP denying CloudTrail modification actions
  2. Attach to root of organization
  3. Even account admins cannot bypass this

Use Case 4: Sandbox Budget Control

Scenario: Developers need freedom to experiment but costs must be controlled.

Solution:

  1. Create Sandbox OU with permissive SCPs
  2. Add SCP preventing expensive instance types
  3. Restrict to single region for cost visibility

Best Practices

SCP Best Practices
  1. Use Deny List Strategy - Start permissive, add explicit denies
  2. Test Before Applying - Use PolicyStaging OU first
  3. Document All SCPs - Clear naming and descriptions
  4. Use Conditions Wisely - Leverage 2025 condition support
  5. Create Exception Roles - Don't paint yourself into a corner
  6. Apply to OUs, Not Accounts - Easier to manage at scale
  7. Protect Security Services - CloudTrail, Config, GuardDuty
  8. Monitor with CloudTrail - Audit SCP-denied actions
OU Best Practices
  1. Function Over Org Chart - Organize by compliance needs, not reporting structure
  2. Keep Hierarchy Shallow - AWS supports 5 levels, but 2-3 is usually enough
  3. Separate Prod from Non-Prod - Different security requirements
  4. Create Sandbox OUs - Safe experimentation space
  5. Use Transitional OUs - For acquisitions and migrations
  6. Don't Over-Complicate - Simpler hierarchies are easier to maintain

Common Exam Scenarios

Exam Scenarios

ScenarioSolutionWhy
Prevent all users from disabling CloudTrailSCP denying cloudtrail:StopLogging at rootSCPs are preventive guardrails that cannot be overridden
Allow EC2 in us-east-1 onlySCP with region conditionConditions can restrict to specific regions
User has IAM admin access but cannot launch EC2SCP is denying EC2 actionsSCPs limit maximum permissions, even for admins
Management account can still perform denied actionExpected behaviorSCPs do not affect the management account
Need to test new SCP before productionApply to PolicyStaging OU firstTest impact on non-production accounts
Lambda function denied by SCP but it uses service-linked roleService-linked roles are exemptSCPs do not affect service-linked roles
Acquired company needs temporary permissive accessPlace in Transitional OUMinimal restrictions during migration
Consolidate billing across 10 accountsAWS Organizations consolidated billingSingle payment method for all member accounts

Common Pitfalls

Pitfall 1: Locking Yourself Out

Mistake: Applying restrictive SCP without exception role.

Why it's dangerous:

  • Cannot undo the SCP if you denied iam:* actions
  • May need AWS Support to recover
  • Production workloads may fail

Correct Approach:

  • Always create exception/break-glass roles
  • Test SCPs in staging OU first
  • Include conditions to exempt specific roles
Pitfall 2: Forgetting Management Account Exemption

Mistake: Assuming SCPs protect the management account.

Why it matters:

  • Management account is NEVER affected by SCPs
  • Security controls must be applied differently
  • Exam frequently tests this knowledge

Correct Approach:

  • Minimize workloads in management account
  • Use additional IAM policies for management account
  • Restrict who can access management account
Pitfall 3: Not Understanding Inheritance

Mistake: Expecting SCP at lower level to override higher level deny.

Why it fails:

  • SCPs are cumulative (AND logic)
  • All SCPs in path must allow the action
  • Cannot override parent deny with child allow

Correct Approach:

  • Plan hierarchy carefully before implementing
  • Use explicit allows at root, denies at lower levels
  • Understand inheritance flows down, not up
Pitfall 4: Using Allow List in Fast-Moving Environment

Mistake: Using allow list strategy when new services needed frequently.

Why it's problematic:

  • Every new AWS service is blocked by default
  • Teams can't use new features without SCP updates
  • Creates bottleneck and friction

Correct Approach:

  • Use deny list strategy (block specific actions)
  • Reserve allow list for highly regulated environments
  • Automate SCP updates if allow list is required

Test Your Knowledge

Q

Which of the following is NOT affected by Service Control Policies?

AIAM users in member accounts
BIAM roles in member accounts
CThe management account
DCross-account access to member accounts
Q

An IAM user has AdministratorAccess policy, but cannot launch EC2 instances. What is the most likely cause?

Q

How are SCPs evaluated when multiple SCPs apply to an account?

AMost specific SCP wins
BLast attached SCP wins
CAll SCPs must allow the action (AND logic)
DAny SCP allowing grants access (OR logic)
Q

A company wants to test a new SCP before applying it to production accounts. What is the recommended approach?

AApply directly to root and monitor
BApply to management account first
CApply to a PolicyStaging OU with test accounts
DSCPs cannot be tested before deployment


Quick Reference

SCP Limits

SCP Service Limits

LimitValue
Maximum SCPs per organization1,000
Maximum SCPs per OU or account5
Maximum SCP document size5,120 characters
Maximum OU nesting depth5 levels

SCP vs IAM Policy Comparison

SCP vs IAM Policies

AspectSCPIAM Policy
PurposeSet maximum permissionsGrant permissions
ScopeOrganization/OU/AccountUser/Group/Role
Grants AccessNo - only restrictsYes
Affects Management AccountNoYes
Affects Service-Linked RolesNoLimited
InheritanceYes - through OU hierarchyNo automatic inheritance

CLI Commands Reference

SHCommon AWS Organizations CLI Commands
# List all SCPs in organization
aws organizations list-policies --filter SERVICE_CONTROL_POLICY

# Get SCP content
aws organizations describe-policy --policy-id p-abc123def

# Create new SCP
aws organizations create-policy \
  --name "DenyUnapprovedRegions" \
  --description "Prevents use of unapproved regions" \
  --type SERVICE_CONTROL_POLICY \
  --content file://scp-deny-regions.json

# Attach SCP to OU
aws organizations attach-policy \
  --policy-id p-abc123def \
  --target-id ou-root-example

# Detach SCP from OU
aws organizations detach-policy \
  --policy-id p-abc123def \
  --target-id ou-root-example

# List OUs in organization
aws organizations list-organizational-units-for-parent \
  --parent-id r-abc1

# Move account to different OU
aws organizations move-account \
  --account-id 123456789012 \
  --source-parent-id ou-source \
  --destination-parent-id ou-destination

Common SCP Condition Keys

TEXTUseful SCP Condition Keys
aws:RequestedRegion       - Restrict by AWS region
aws:PrincipalArn         - Match principal ARN pattern
aws:PrincipalOrgID       - Ensure principal is in org
aws:PrincipalTag/*       - Match principal tags
aws:ResourceTag/*        - Match resource tags
aws:SourceIp             - Restrict by source IP
ec2:InstanceType         - Restrict instance types
s3:x-amz-server-side-encryption - Require encryption

Further Reading

Related AWS Services

OrganizationsIAM