跨账号无法解密/下载S3存储桶中经KMS加密的对象
跨账号S3+KMS权限问题:上传加密对象/解密下载失败排查方案
嘿,我来帮你梳理下这个问题——你已经完成了基础的跨账号权限配置,但SSE-KMS的跨账号场景有几个容易踩坑的细节,导致单独操作正常,但组合起来就出问题。咱们一步步来排查:
1. 存储桶策略缺了关键权限
你能上传普通文件,说明s3:PutObject是没问题的,但带SSE-KMS的上传需要额外的KMS操作权限:
- 上传加密对象时,S3会自动调用KMS生成数据密钥,所以你的存储桶策略必须给账号B的IAM用户加上
kms:GenerateDataKey权限 - 下载解密的时候,则需要
kms:Decrypt权限
检查你的存储桶策略,确保包含类似这样的配置(注意资源要同时覆盖S3对象和KMS密钥):
{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::22222:user/你的账号B用户ARN" }, "Action": [ "s3:PutObject", "s3:GetObject", "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": [ "arn:aws:s3:::bucket-in-a/*", "arn:aws:kms:us-east-1:11111:key/KEYID" ] }
2. KMS密钥策略的操作不全
你已经允许账号B使用CMK,但要确认KMS策略里有没有包含所有必要的操作:
- 单独执行
aws kms encrypt只需要kms:Encrypt,但SSE-KMS上传需要的是kms:GenerateDataKey(因为是用数据密钥加密对象,不是直接用CMK加密) - 下载解密则需要
kms:Decrypt
给你的KMS密钥策略加上这些操作:
{ "Sid": "AllowAccountBUserToAccessKMS", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::22222:user/你的账号B用户ARN" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt", "kms:Encrypt" ], "Resource": "*" }
3. 账号B的IAM用户权限要同步
除了存储桶和KMS的策略,别忘了检查账号B里那个IAM用户的自身权限:
- 确保用户的IAM policy里明确允许
s3:PutObject、s3:GetObject,以及对应的KMS操作kms:GenerateDataKey、kms:Decrypt - 特别要注意有没有拒绝语句,IAM的拒绝规则会覆盖所有允许的权限,哪怕存储桶策略给了权限也没用
4. 用测试命令定位具体错误
你可以用下面的命令测试带SSE-KMS的上传,看看具体的错误提示(AWS的错误信息会明确告诉你缺哪个权限):
aws s3 cp localfile s3://bucket-in-a --server-side-encryption aws:kms --sse-kms-key-id arn:aws:kms:us-east-1:11111:key/KEYID
下载测试的话:
aws s3 cp s3://bucket-in-a/加密后的文件名 ./本地文件名 --server-side-encryption aws:kms
根据错误提示(比如AccessDenied: User: ... is not authorized to perform: kms:GenerateDataKey on resource: ...),针对性调整对应的策略就行。
最后总结一下核心要点
跨账号SSE-KMS的权限逻辑比单独操作复杂,关键要做到三点:
- 存储桶策略同时授权S3操作和对应的KMS操作,资源要覆盖S3对象和KMS密钥
- KMS策略必须允许
GenerateDataKey(上传)和Decrypt(下载)这两个容易被忽略的操作 - 账号B的IAM用户自身权限不能有冲突的拒绝规则
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

