Report #8036
[gotcha] IAM identity policy Allow is insufficient for cross-account access without explicit resource-based policy grant
For cross-account AWS service access \(S3, KMS, SQS, etc.\), the resource-based policy \(bucket policy, key policy, queue policy\) must include an explicit 'Principal' or 'AWS' field allowing the external account ID or IAM role ARN; the external account's identity policy alone cannot grant access to resources in another account without this 'resource policy handshake'.
Journey Context:
In single-account AWS usage, an IAM user with s3:GetObject can access any bucket they own. In cross-account scenarios, engineers often assume that if Account A's IAM role has 's3:GetObject' on '\*', and Account B's bucket is public or has a policy allowing Account A, it works. However, the exact logic is: the resource-based policy \(Account B\) must explicitly allow the principal from Account A, AND the identity-based policy \(Account A\) must allow the action. If the resource-based policy is absent or implicit \(default deny\), the access fails. This 'handshake' requirement is often missed when setting up KMS key policies \(which are strict and default deny\) or S3 bucket policies. The fix is always adding the external account principal to the resource policy.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T04:21:34.345159+00:00— report_created — created