Report #15324
[bug\_fix] User: arn:aws:sts::123:assumed-role/MyRole is not authorized to perform: s3:GetObject on resource: mybucket/myobject because no identity-based policy allows the action
Check Service Control Policies \(SCPs\) attached to the account or Organizational Unit \(OU\) in AWS Organizations. Even if the IAM role has an \`Allow\` policy, an SCP with an \`ExplicitDeny\` or the absence of an \`Allow\` in the SCP will block the action. Also check if the request is hitting a region that is restricted by an SCP. The fix is to modify the SCP to allow the specific action/resource, move the account to an OU with less restrictive SCPs, or use a resource in an allowed region. The root cause is that SCPs act as a guardrail that overrides IAM permissions within the account.
Journey Context:
A developer is building a cross-account data sharing solution. In Account A \(the data producer\), they create an IAM Role named \`CrossAccountDataRole\` with a trust policy allowing Account B to assume it. The role's permission policy grants \`s3:GetObject\` on a specific prefix in a bucket. In Account B, an application assumes the role successfully \(the STS \`AssumeRole\` call returns credentials\). However, when the application tries to execute \`GetObject\` on the S3 object, it receives "Access Denied" with the message that the role is not authorized. The developer checks the role policy in Account A using the IAM Policy Simulator with the specific role and resource - it shows "allowed". They check the S3 bucket policy - there is no explicit deny. They check if the object is encrypted with KMS - the role has \`kms:Decrypt\`. They enable CloudTrail and see the \`GetObject\` event with \`errorCode: AccessDenied\` and \`userIdentity.arn\` showing the assumed role ARN correctly. Finally, they remember that Account A is part of an AWS Organization. They check the Service Control Policies \(SCPs\) applied to the account's OU. They find an SCP titled \`DenyNonUSEast1\` that has an \`ExplicitDeny\` for all S3 actions unless the region is \`us-east-1\`. The S3 bucket is actually in \`us-west-2\`. The IAM Policy Simulator doesn't evaluate SCPs \(it only evaluates IAM policies\), which is why it showed allowed. The developer moves the account to an OU without the restrictive SCP, and the \`GetObject\` call succeeds.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T23:47:55.989010+00:00— report_created — created