调用SSE-KMS加密S3对象get_object返回Access Denied问题排查
问题排查与解决方案
常见遗漏配置项
- KMS密钥策略未授权Lambda角色:KMS权限需要IAM策略和KMS自身的密钥策略同时授权,仅给Lambda角色的IAM策略加
kms:Decrypt权限不够,必须在对应KMS密钥的密钥策略中,添加允许Lambda执行角色调用kms:Decrypt的规则,这是该类报错最常见的原因。 - KMS密钥ARN不匹配:你IAM策略中填写的KMS资源ARN,需要和S3对象实际加密使用的KMS密钥ARN完全一致。如果对象使用的是AWS托管的S3默认KMS密钥、其他自定义密钥,都会因为ARN不匹配导致权限校验失败。
- S3桶策略拦截:如果S3桶配置了桶策略,需要确认桶策略没有拒绝Lambda角色的
GetObject请求,常见的拦截规则包括限制访问来源VPC/IP、要求特定加密请求头、限制访问账号等。 - Lambda角色权限边界限制:如果给Lambda绑定的IAM角色配置了权限边界,需要确认权限边界中也允许了
kms:Decrypt和s3:GetObject操作。 - VPC访问限制:如果Lambda部署在VPC内,需要确认已配置S3和KMS的VPC端点,且端点策略没有拦截对应操作请求。
具体解决步骤
- 确认加密密钥匹配:
在S3控制台找到目标对象,进入「属性」标签查看服务器端加密配置,核对使用的KMS密钥ARN和IAM策略中填写的资源ARN完全一致。 - 配置KMS密钥策略:
进入KMS控制台找到对应密钥,在密钥策略的JSON配置中添加如下授权语句,替换为你的Lambda执行角色ARN:
{ "Sid": "AllowLambdaDecrypt", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/你的Lambda角色名" }, "Action": "kms:Decrypt", "Resource": "*" }
- 校验S3桶策略:
检查目标S3桶的桶策略,排查是否存在匹配Lambda角色的Deny规则,移除不必要的拦截配置。 - 校验Lambda角色配置:
确认Lambda绑定的IAM角色没有配置限制KMS、S3操作的权限边界,原有IAM策略中的s3:GetObject和kms:Decrypt权限配置逻辑正确。
内容的提问来源于stack exchange,提问作者Taufik Pirjade
相关产品推荐
相关产品推荐

