CLOUD COMPUTING / TECHNICAL EXPLAINER

AWS SCS-C03: Permission Boundaries, SCPs, and IAM Roles

AWS organizations need a way to delegate administration without giving every team unrestricted power. IAM roles, permissions boundaries, and AWS Organizations service control policies solve […]

In this article

AWS organizations need a way to delegate administration without giving every team unrestricted power. IAM roles, permissions boundaries, and AWS Organizations service control policies solve different parts of that problem. Roles provide temporary identities and permissions, permissions boundaries cap what a user or role can receive through identity policies, and SCPs set maximum permissions for principals in member accounts. None of these mechanisms should be treated as an automatic grant; effective permission still depends on the entire AWS authorization model.

The topic maps directly to AWS Certified Security – Specialty (SCS-C03), with SAA-C03 and DOP-C02 providing architecture and automation context.

Use roles as temporary permission containers

An IAM role has a trust policy defining who can assume it and permission policies defining what the resulting session can do. Roles avoid distributing long-lived target-account credentials and make session context visible in CloudTrail.

Separate roles by job function such as deployment, read-only security analysis, data engineering, and incident response instead of creating one broad role for every automation system.

Keep role session duration aligned with the task and use source identity or session tags where useful for attribution.

Understand permissions boundaries as ceilings

A permissions boundary does not grant permissions. For identity-based permission, the effective allow is limited to the intersection of the identity policies and the boundary, subject to other explicit denies and policy types.

This makes boundaries useful for delegated administration: a development platform can create project roles, but those roles cannot exceed the organization’s approved ceiling.

The access-control principle applies because the boundary defines the maximum capability of an identity class.

Protect the boundary itself

A boundary is useful only if delegated administrators cannot remove it, replace it with a weaker policy, or create unbounded alternative identities.

Control `iam:CreateRole`, `iam:PutRolePermissionsBoundary`, `iam:DeleteRolePermissionsBoundary`, policy attachment, and PassRole behavior according to the delegation model.

Infrastructure templates should make the boundary mandatory rather than relying on every project team to remember it.

Use SCPs for organization-level guardrails

SCPs define the maximum available permissions for principals in organization member accounts. They can prevent use of prohibited Regions, block sensitive services, or enforce security invariants across organizational units.

SCPs do not grant access. A role still needs IAM permission for an action that the SCP permits.

Because SCPs apply broadly, test them in lower-risk OUs and understand service exceptions before attaching a Deny at the root.

Remember the management account and service behavior

AWS Organizations policy behavior differs for the management account and for some service-linked roles or service-specific scenarios. Security teams should read current Organizations documentation rather than assuming every principal is affected identically.

Document which controls are enforced through SCPs versus IAM or resource policies so responders know where to troubleshoot.

One broad organizational deny can look like an application-role defect to teams that cannot see the SCP.

Use roles and SCPs together for separation of duties

Roles express what one workload or administrator should be able to do; SCPs define what no workload in the account or OU should exceed. Together they allow local autonomy inside enterprise guardrails.

A platform team can grant developers deployment roles while an SCP blocks account closure, disabling audit services, or use of unapproved Regions.

This separation makes policy ownership clearer: application teams manage job permissions, security teams manage global ceilings.

Use PassRole as a privileged action

`iam:PassRole` allows a principal to give an IAM role to an AWS service. A user who cannot directly perform an action may still cause Lambda, EC2, CloudFormation, or another service to perform it under a powerful role.

Scope PassRole to specific role ARNs and intended services where possible. Review it during privilege-escalation analysis.

The role’s own permissions, trust policy, and service configuration all contribute to the resulting capability.

Session policies and tags can create narrower delegation. STS role sessions can be further restricted with session policies and can carry session tags for ABAC or audit. This lets a broker create narrower temporary permissions without creating a new role for every short-lived task.

Session policy cannot expand beyond the role’s available permissions. Keep the session logic understandable so incident responders can reproduce the effective permission.

Do not allow callers to self-assert privileged session tags without controls.

Test the full evaluation path

When a request fails, inspect SCPs, permissions boundaries, session policies, identity policies, resource policies, endpoint policies, KMS key policies, and explicit denies. Adding another Allow rarely fixes a request blocked by an upper-layer ceiling.

The approved MFA concept shows how conditions can add another requirement for selected privileged role assumptions.

Use CloudTrail evidence and policy simulation tools to test a concrete principal, action, resource, and context rather than reasoning from policy names alone.

Review ceilings as the organization evolves

New services, accounts, Regions, and automation patterns can make old boundaries or SCPs too broad or too restrictive. Review guardrails as architecture changes.

The AWS authorization model scales when responsibilities are explicit: roles provide temporary identity, boundaries cap delegated IAM permission, SCPs cap account or OU capability, and each layer is versioned and testable.

Delegated IAM administration should start with a threat model. The organization should decide which teams may create roles, attach policies, change trust, pass roles to services, and modify boundaries before writing individual permissions.

A common pattern is to let project teams create roles only when a specific permissions boundary is attached. The boundary contains the organization’s maximum approved actions, while the project team chooses narrower job permissions.

Boundary policy should be managed by a central security or platform team, not by the same delegated role that is constrained by it.

Deletion or replacement of the boundary must be denied unless a trusted administrator performs the change. Otherwise a developer can simply remove the ceiling and attach a broader identity policy.

SCPs provide a second control plane above individual account IAM. Use them for enterprise invariants such as blocking certain Regions, preventing disabling security services, or restricting especially dangerous APIs.

OU design matters because SCPs inherit through the organization hierarchy. An account can be affected by policies attached at root, parent OUs, and its own OU placement.

Moving an account between OUs can therefore change effective permissions without any IAM role change inside the account. Treat organization structure as security configuration.

Deny-based SCPs are common because they preserve account autonomy inside a prohibited boundary, while allow-list SCP strategies can provide stricter control but require more maintenance as services evolve.

New AWS services can interact differently with old allow-list SCPs. Governance should include a process for reviewing service additions so innovation does not require emergency global-policy changes.

Permissions boundaries and SCPs do not eliminate resource-based policies. S3 buckets, KMS keys, Lambda functions, and other resources can have their own policy logic that must still be evaluated.

Some resource-based policies interact differently with IAM users, role ARNs, and role-session ARNs. Security engineers should understand the exact principal type before assuming a boundary applies in the expected way.

Role trust policy is another independent layer. A tightly bounded role can still be a risk if its trust policy allows an unexpected external account or federated identity to assume it.

External ID, MFA, organization ID, source identity, and principal tags can strengthen trust according to the use case, but they should be applied only when the request context reliably includes them.

PassRole should be reviewed with the target service. A deployment role might be allowed to pass one application execution role to ECS but not pass the security administration role to Lambda or CloudFormation.

Role chaining should be minimized when direct trust is simpler. Long chains make attribution and session-duration behavior harder to reason about during incidents.

ABAC can reduce the number of roles by using tags, but tag governance becomes part of the authorization boundary. Prevent users from editing the tags that grant them higher privilege.

Session tags can carry project or environment attributes into temporary sessions. This supports fine-grained access without permanent role proliferation, provided trusted systems control the tag values.

Security teams should publish patterns for common role classes so application teams do not invent subtle IAM combinations independently.

Policy-as-code validation can check for wildcard actions, missing boundaries, risky trust principals, unrestricted PassRole, and other common defects during CI/CD.

Access Analyzer can flag external access and validate policies, while CloudTrail shows what identities actually do. Use both design-time and runtime evidence to refine permissions.

Temporary elevation should have expiry. Just-in-time or incident roles should not become permanent daily-use identities because the emergency access process is more convenient.

Break-glass roles should be excluded from ordinary automation and monitored aggressively. Their purpose is recovery when normal controls fail, not routine deployment.

Every policy ceiling should have an owner and documented intent. Future engineers need to know whether a denied action is an intentional risk decision or a historical artifact.

Authorization architecture scales when controls are layered coherently: roles express job permission, boundaries constrain delegated identity design, SCPs enforce organization-level maximums, and monitoring verifies how those capabilities are actually used.

Permissions boundaries are particularly valuable in self-service cloud platforms where application teams create roles through templates or portals. The platform can provide flexibility while keeping every generated role inside a centrally approved ceiling.

Templates should fail if the required boundary is missing. Relying on documentation alone creates one-off roles that silently escape the delegation model.

SCP design should also preserve emergency and security-service access. A root-level deny that blocks the security tooling account, incident role, or required AWS service can make containment much harder during an attack.

Policy exceptions should be time-bounded. If one account needs a broader action temporarily, use a dedicated OU, scoped exception policy, or approved role rather than weakening the global guardrail permanently.

Role trust and role permission should be reviewed together. A perfectly least-privilege permission policy still creates risk if the trust policy allows an unexpected external account or weak federation claim to assume it.

Account moves between OUs should trigger security review because inherited SCPs can change instantly even when CloudFormation or Terraform inside the account has not changed.

IAM Access Analyzer can help identify unintended external access, but organization-specific guardrails still need code review and architectural context.

Delegated administrators should have a clear escalation path when a boundary or SCP blocks legitimate work. Fast, auditable exceptions reduce pressure to create shadow administrator roles outside the governance model.

Policy documentation should explain intent in plain language. Future reviewers need to know why an action is denied, which risk it controls, and which exception process exists.

Organization guardrails should be tested with representative deployment pipelines. A security SCP that looks correct in isolation may block CloudFormation, service-linked roles, or automation in ways that teams discover only during release.

Keep a non-production OU for validating new SCPs and boundaries before attaching them to critical accounts. Test both desired denies and expected legitimate operations.

Policy rollouts should have rollback instructions and owners. Changing an inherited SCP at the root can affect thousands of principals immediately, so production governance needs the same change discipline as other high-impact infrastructure.

Authorization documentation should include examples of effective permission. Showing one allowed and one denied request is often more useful to application teams than publishing several pages of policy JSON without interpretation.

Temporary access requests should specify duration, resource, action, approver, and business reason. Automating expiration reduces the accumulation of privileged roles created for projects that ended months earlier.

Cloud security teams should review privilege escalation paths such as policy attachment, role trust modification, PassRole, Lambda creation, EC2 instance profiles, CloudFormation, and SSM. A role can be effectively administrative without containing an obvious `AdministratorAccess` policy.

The governance model succeeds when application teams can move quickly inside known ceilings and security teams can prove that no delegated administrator can silently exceed those ceilings.

Role inventories should include owner, trusted principals, boundary, attached policies, session duration, and PassRole relationships. This makes entitlement reviews far more useful than a list of role names.

Security teams should periodically test one expected allow and one expected deny from each critical role class. These small control tests catch drift in SCPs, boundaries, or trust policies before production deployments discover it accidentally.

Keep exception roles separate from ordinary roles so temporary business needs do not silently expand the normal baseline. When the exception expires, remove the trust and permission rather than leaving a dormant privileged identity.

The result should be a permission system that developers can predict and security teams can audit without reconstructing several policy layers during every incident.

Policy maintenance should include stale-condition review. Old account IDs, Regions, tags, and role names can leave unexpected holes or create false denials long after the original project changed.

Central teams should keep reusable policy patterns current so delegated builders inherit good defaults rather than copying obsolete IAM snippets from old repositories.

Access governance should periodically compare actual role use with assigned privilege. Roles that are rarely used or use only a small subset of their actions are candidates for reduction, retirement, or conversion to just-in-time access.

Effective least privilege is therefore a continuous review process rather than a one-time IAM design exercise.

Keep role, boundary, and SCP ownership visible in the same governance inventory so teams know which control layer to change when legitimate requirements evolve.