5.2 Service Control Policies (SCPs) & Multi-Account Guardrails
Key Takeaways
- Service Control Policies (SCPs) define the maximum available permissions for IAM principals in member accounts; they act as preventative guardrails and never grant permissions.
- SCPs affect all IAM users, IAM roles, and the root user of member accounts, but have zero effect on the Management account, service-linked roles, or resource-based policies accessed by external accounts.
- Under the default Deny List strategy, the AWS-managed FullAWSAccess policy remains attached throughout the tree, and specific prohibited actions are restricted using explicit Deny statements.
- In multi-OU hierarchies, SCP permissions are evaluated as an intersection down the tree; if FullAWSAccess is detached at any intermediate OU without an explicit Allow, all permissions below that point are implicitly denied.
- Critical enterprise SCP patterns enforce region restrictions via aws:RequestedRegion, prevent disabling logging services (CloudTrail, Config), and use Condition blocks with ArnNotEquals to preserve break-glass emergency access.
Service Control Policies (SCPs) Mechanics & Evaluation Engine
Service Control Policies (SCPs) are the primary preventative governance mechanism in AWS Organizations. Understanding how SCPs interact with other AWS identity and access management layers is essential for the DOP-C02 exam.
The Guardrail Principle: Boundaries vs. Grants
[!IMPORTANT] Core Rule: An SCP never grants permissions. It specifies the maximum available permissions (a permission boundary) for the accounts or Organizational Units (OUs) to which it is attached.
Even if an IAM user or role inside a member account is assigned the AWS-managed policy AdministratorAccess ("Action": "*", "Resource": "*"), if an attached SCP does not allow an action—or explicitly denies it—the caller cannot perform that action under any circumstances.
[ Service Control Policy (SCP) ] ── (Maximum Allowed Permissions Boundary)
∩
[ IAM Permissions Boundary ] ── (Identity-Level Upper Bound)
∩
[ IAM Policy (User / Role) ] ── (Actual Identity Grants)
∩
[ Resource-Based Policy / Session Boundary ]
│
▼
[ Effective Runtime Authorization ]
Entities Subject to SCPs
- Impacted Entities: All IAM users, federated IAM roles, applications, and the account root user within target member accounts.
- Exempt Entities:
- The Management Account: SCPs do not restrict any actions taken within the Organization's Management account, regardless of where policies are attached.
- Service-Linked Roles: Predefined roles utilized by AWS services to execute cross-service operations (e.g.,
AWSServiceRoleForAutoScaling) cannot be blocked by SCPs. - Resource-Based Policies: If an IAM principal in an external AWS account accesses a resource in your member account (e.g., an S3 bucket with a permissive bucket policy), the member account's SCP does not filter that external principal's permissions.
Policy Inheritance & Evaluation Logic
AWS Organizations evaluates SCPs hierarchically from the Root, down through parent OUs, child OUs, and finally to the individual Account.
Full-List Authorization & The Default FullAWSAccess Policy
By default, AWS Organizations attaches an AWS-managed SCP named FullAWSAccess to the Root, every OU, and every newly created account:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
For an API call to be authorized at the member account level, there must be an explicit Allow present at every single level of the hierarchy between Root and the target account:
Deny List Strategy vs. Allow List Strategy
| Architectural Strategy | Implementation Method | Pros & Cons | Recommendation |
|---|---|---|---|
| Deny List Strategy | Leave FullAWSAccess attached at Root and all OUs. Attach custom SCPs containing Effect: Deny for specific prohibited actions or unauthorized regions. | Pros: Low operational overhead; new AWS services work immediately; resilient against accidental lockouts.<br>Cons: Proactive guardrails must explicitly enumerate every forbidden action. | Strongly Recommended & Standard Best Practice. |
| Allow List Strategy | Detach FullAWSAccess. At each OU, attach custom policies containing Effect: Allow only for explicitly approved AWS services. | Pros: Maximum least-privilege security posture; unapproved services are blocked by default.<br>Cons: Extreme administrative burden; whenever AWS releases a new service feature or API, administrators must update SCPs at multiple OU levels or pipelines break. | Rarely used; reserved for ultra-high-security isolated enclaves. |
[!CAUTION] The Accidental Black Hole: If an engineer detaches
FullAWSAccessfrom an OU before attaching an alternative Allow policy, the effective permission boundary becomes an empty set. Every IAM user, role, and workload in every account beneath that OU immediately loses access to all AWS services.
Critical Enterprise SCP Guardrail Patterns
Production landing zones enforce non-negotiable security controls using standardized SCP patterns.
1. Restricting Allowed AWS Regions (aws:RequestedRegion)
To prevent data exfiltration, shadow IT, and unexpected infrastructure spend in unmonitored geographic regions, organizations restrict API activity to designated operating regions (e.g., us-east-1 and us-west-2).
However, naive region-blocking SCPs break global AWS services (IAM, Route 53, CloudFront, AWS Organizations, AWS Support, AWS WAF global) that operate out of us-east-1 or without regional endpoints. The SCP must explicitly exclude global service actions using NotAction:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RestrictAllowedRegionsWithGlobalExclusions",
"Effect": "Deny",
"NotAction": [
"a4b:*",
"acm:*",
"aws-marketplace-management:*",
"aws-marketplace:*",
"aws-portal:*",
"budgets:*",
"ce:*",
"chime:*",
"cloudfront:*",
"config:*",
"cur:*",
"directconnect:*",
"ec2:DescribeRegions",
"ec2:DescribeAvailabilityZones",
"fms:*",
"globalaccelerator:*",
"health:*",
"iam:*",
"importexport:*",
"kms:*",
"mobileanalytics:*",
"networkmanager:*",
"organizations:*",
"pricing:*",
"route53:*",
"route53domains:*",
"s3:GetAccountPublicAccessBlock",
"s3:ListAllMyBuckets",
"s3:PutAccountPublicAccessBlock",
"shield:*",
"sts:*",
"support:*",
"trustedadvisor:*",
"waf:*",
"wafv2:*",
"wellarchitected:*"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": [
"us-east-1",
"us-west-2"
]
}
}
}
]
}
2. Protecting Security & Compliance Tooling
To guarantee auditability, member account administrators must be blocked from stopping logging, disabling monitoring, or tampering with centralized security infrastructure:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PreventDisablingCloudTrailAndConfig",
"Effect": "Deny",
"Action": [
"cloudtrail:DeleteTrail",
"cloudtrail:StopLogging",
"cloudtrail:UpdateTrail",
"config:DeleteConfigRule",
"config:DeleteConfigurationRecorder",
"config:DeleteDeliveryChannel",
"config:StopConfigurationRecorder",
"guardduty:DeleteDetector",
"guardduty:DisassociateFromMasterAccount",
"guardduty:UpdateDetector"
],
"Resource": "*"
}
]
}
3. Preventing Accounts from Leaving the Organization
To prevent rogue administrators or compromised accounts from detaching from corporate oversight and removing all inherited SCPs:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyLeavingOrganization",
"Effect": "Deny",
"Action": [
"organizations:LeaveOrganization"
],
"Resource": "*"
}
]
}
4. Restricting the Member Account Root User
Best practices demand that all operational tasks be performed via federated IAM Identity Center roles with Multi-Factor Authentication (MFA). The member account root user should have no day-to-day operational capability:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RestrictMemberAccountRootUser",
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"StringLike": {
"aws:PrincipalArn": [
"arn:aws:iam::*:root"
]
}
}
}
]
}
5. Enforcing In-Transit Encryption (SSL/TLS)
To satisfy regulatory standards (such as PCI-DSS and FedRAMP), an SCP can enforce that Amazon S3 API requests use HTTPS:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnforceSecureTransport",
"Effect": "Deny",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
Break-Glass Roles and Condition Exceptions
During high-severity operational incidents or infrastructure outages, emergency incident responders (the "break-glass" team) may require temporary, unrestricted access to recover systems or modify baseline infrastructure.
Implementing Safe SCP Exemptions
An SCP containing an unconditional Deny will block even emergency responders. To create an exception, include a Condition block utilizing ArnNotEquals or StringNotLike targeting the designated break-glass role:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyS3BucketDeletionExceptBreakGlass",
"Effect": "Deny",
"Action": [
"s3:DeleteBucket",
"s3:DeleteBucketPolicy"
],
"Resource": "*",
"Condition": {
"ArnNotEquals": {
"aws:PrincipalArn": [
"arn:aws:iam::*:role/EmergencyBreakGlassRole",
"arn:aws:iam::*:role/aws-service-role/*"
]
}
}
}
]
}
[!TIP] DOP-C02 Exam Trap — Assumed-Role vs. Role ARN Evaluation: When an engineer assumes an IAM role, AWS STS issues temporary credentials where
aws:PrincipalArnevaluates to the IAM role ARN (arn:aws:iam::<AccountID>:role/EmergencyBreakGlassRole). However, the session ARN isarn:aws:sts::<AccountID>:assumed-role/EmergencyBreakGlassRole/<SessionName>. Theaws:PrincipalArncondition key evaluates the underlying IAM role ARN, makingArnNotEqualsonarn:aws:iam::*:role/EmergencyBreakGlassRolework reliably for assumed roles.
A multinational enterprise wants to enforce a strict governance policy ensuring that developers across 60 member accounts can only launch resources in us-east-1 and us-west-2. A DevOps engineer attaches an SCP to the Organization Root containing an explicit Deny for all actions where aws:RequestedRegion does not equal us-east-1 or us-west-2. Immediately after attaching the policy, developers report that IAM user creation, Amazon CloudFront distribution updates, and AWS Route 53 DNS changes are failing with AccessDenied errors across all accounts. What is the root cause of this failure and the proper remediation?
A DevOps security engineer needs to implement an SCP that prevents any user or role in member accounts from deleting Amazon S3 buckets or disabling AWS CloudTrail logging. However, the organization maintains a specialized, highly audited emergency incident response role named SecOpsBreakGlassRole that must retain the ability to perform these actions during catastrophic operational events. Which SCP configuration correctly satisfies these requirements?
An AWS Organization consists of the Root, a parent Organizational Unit named CoreServices, and a child Organizational Unit named StagingOU. An administrator notices that the default FullAWSAccess policy is attached to the Root. To implement strict service whitelisting for StagingOU, the administrator detaches the FullAWSAccess policy from the CoreServices OU and attaches a custom SCP allowing only ec2:* and s3:. The StagingOU retains both the FullAWSAccess policy and a custom policy allowing rds:. What is the effective set of AWS services available to an IAM administrator with AdministratorAccess in an account residing inside StagingOU?