跨AWS账号从S3复制文件到EC2时遇AccessDenied错误求助
跨账号SSE-S3加密对象复制到EC2的权限问题解决
你遇到的问题核心是跨账号访问SSE-S3加密的S3对象时,AWS托管KMS密钥(aws/s3)的权限配置缺失——虽然你给了EC2角色KMS Decrypt权限,但还需要S3账号下的KMS密钥策略允许该角色访问,同时要确保权限中的密钥ARN精准匹配。
1. 修正EC2角色的KMS权限目标ARN
SSE-S3使用的是AWS托管的KMS密钥,其ARN格式为:arn:aws:kms:区域:S3账号ID:key/aws/s3。你的EC2角色权限中必须明确指定这个ARN,不能用自定义密钥ARN或泛化的资源范围。
正确的IAM权限示例:
{ "Version": "2012-10-17", "Statement": [ // 保留已配置的S3权限 { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::你的S3桶名", "arn:aws:s3:::你的S3桶名/*" ] }, // 修正后的KMS解密权限 { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:你的区域:S3账号ID:key/aws/s3" } ] }
2. 修改S3账号下AWS托管KMS密钥的密钥策略
AWS托管的aws/s3密钥默认策略不允许跨账号访问,需要手动添加允许EC2角色的解密权限:
- 登录S3所在账号的AWS控制台,进入KMS服务
- 在左侧菜单选择AWS管理的密钥,找到
aws/s3密钥 - 切换到密钥策略标签,点击编辑
- 在原策略中插入以下语句(替换占位符为实际信息):
{ "Sid": "AllowCrossAccountEC2Decrypt", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::EC2所在账号ID:role/ec2-role" }, "Action": "kms:Decrypt", "Resource": "*" }
- 保存修改
3. 排查额外限制因素
- 确认S3桶、EC2实例、KMS密钥的区域完全一致(比如
us-east-1不能写成us-east-1a或其他变体) - 检查AWS Organizations的服务控制策略(SCP)是否禁止了跨账号的
kms:Decrypt操作,若有需要调整SCP规则
4. 验证权限
修改完成后,在EC2实例上执行测试命令验证:
aws s3 cp s3://你的S3桶名/测试文件 ./
若仍报错,查看CloudTrail中kms:Decrypt事件的详细拒绝原因,定位是否存在策略未生效或资源ARN不匹配问题。
内容的提问来源于stack exchange,提问作者Code8549
相关产品推荐
相关产品推荐

