Cross-Account SSE-KMS Uploads: Required KMS Key Policy and IAM Permissions
Company A stores encrypted log files in its S3 bucket using SSE-KMS with a customer-managed KMS key. A partner application in Company B uploads objects into Company A's bucket using an IAM role in Company B. Uploads fail with an error indicating KMS access is denied (kms:Encrypt not authorized). Neither the partner IAM policy nor the S3 bucket policy currently mentions KMS.
What is the most secure and correct change to allow cross-account uploads to succeed?
⚠ Common exam trap
Watch out — candidates often assume an IAM policy in the partner account alone is sufficient for cross-account KMS access, forgetting that KMS key policies are the definitive authorization mechanism for external principals.
Answer choices
Why each option matters
Answer the question above first, then reveal the full breakdown to understand why each option is right or wrong.
Correct answer & explanation
✓
In Company A's KMS key policy, allow Company B's partner role principal to use the key for kms:Encrypt, kms:GenerateDataKey, and kms:DescribeKey, and also add a matching IAM policy in Company B that grants the partner role those same KMS actions on Company A's key ARN, constrained to the target S3 bucket context when possible.
For cross-account SSE-KMS uploads, the KMS key policy must explicitly grant the external IAM role principal the required KMS actions (kms:Encrypt, kms:GenerateDataKey, and kms:DescribeKey). Additionally, the partner account's IAM policy must also allow those same actions on the key ARN. This dual-permission model is required because KMS does not implicitly trust IAM policies in the key owner's account for cross-account access; the key policy is the authoritative gatekeeper. Option A correctly implements both sides, and constraining to the target S3 bucket context (via kms:ViaService or kms:EncryptionContext) adds a security best practice.
Answer analysis
Option-by-option breakdown
For each option: why learners choose it and why it is or isn't the right answer here.
- ✓
In Company A's KMS key policy, allow Company B's partner role principal to use the key for kms:Encrypt, kms:GenerateDataKey, and kms:DescribeKey, and also add a matching IAM policy in Company B that grants the partner role those same KMS actions on Company A's key ARN, constrained to the target S3 bucket context when possible.
Why this is correct
Cross-account SSE-KMS requires both the KMS key policy in the key owner account and an IAM policy in the caller account to allow the required KMS actions. Scoping the permissions to the specific bucket or encryption context reduces blast radius.
- ✗
In Company B's IAM policy, allow kms:Encrypt on Company A's KMS key ARN, without changing Company A's key policy.
Why it's wrong here
Adding only an IAM policy in Company B cannot grant access to Company A's KMS key because KMS key policies are the ultimate authority for cross-account access. Unless Company A's key policy includes an explicit Allow statement granting the external principal (or account) the required actions, the request will fail even if Company B's IAM policy permits it. Additionally, the IAM policy alone would need to cover kms:GenerateDataKey and kms:DescribeKey, not just kms:Encrypt, since S3 SSE-KMS uses GenerateDataKey to obtain a plaintext key.
- ✗
Create a new KMS key in Company B and configure Company A's S3 bucket to use that key for SSE-KMS.
Why it's wrong here
Creating a new KMS key in Company B and reconfiguring Company A's bucket to use it would not resolve the original denial; it would instead change the trust boundary and operational ownership. The original issue remains: Company A's existing key policy denies access, and simply switching keys does not address that. Moreover, cross-account usage of a key owned by Company B would require Company A's bucket policy and Company B's key policy to be mutually permissive, adding complexity and potentially violating security requirements if the bucket must remain under Company A's control.
- ✗
Disable key policy restrictions by setting the KMS key to enabled and removing all policy statements so that encryption automatically works for any principal.
Why it's wrong here
Disabling key policy restrictions by removing all statements would make the key effectively unusable because with no Allow statements, no principal has permission—the default behavior is implicit denial. Even if the intent was to allow all principals, that would be an insecure and non-least-privilege approach, exposing the key to any AWS account. The correct fix is to add a scoped, explicit Allow in the key policy for the partner role, not to gut the policy entirely or rely on the key being enabled.
Quick reference
AWS S3 Storage Class Comparison
| Storage Class | Min Duration | Retrieval | Use Case |
|---|---|---|---|
| S3 Standard | None | Immediate | Frequently accessed data |
| S3 Standard-IA | 30 days | Immediate | Infrequent access, rapid retrieval |
| S3 One Zone-IA | 30 days | Immediate | Non-critical infrequent data |
| S3 Intelligent-Tiering | None | Immediate–hours | Unknown or changing access patterns |
| S3 Glacier Instant | 90 days | Milliseconds | Archive with instant retrieval |
| S3 Glacier Flexible | 90 days | Minutes–hours | Archive, flexible retrieval |
| S3 Glacier Deep Archive | 180 days | Hours | Long-term compliance archive |
Go deeper
Related to this question
About these practice questions
This SAA-C03 question is part of Courseiva's 935-question bank — original exam-style content with full explanations and wrong-answer analysis, never real exam questions or exam dumps. Learn why practice questions differ from exam dumps →
JA
Written by Johnson Ajibi, MSc IT Security
Senior Network & Security Engineer · founder of Courseiva
This SAA-C03 practice question is part of Courseiva's free Amazon Web Services certification practice question bank. Courseiva provides original exam-style practice questions with explanations, topic-based practice, mock exams, readiness tracking, and study analytics to help learners prepare for the SAA-C03 exam.