Lambda无法读取加密S3存储桶文件,如何通过KMS别名条件限制访问?
问题原因与解决方案
问题根因
你遇到的Access Denied报错确实和kms:RequestAlias条件的配置有关,核心原因是这个条件键的生效逻辑和预期不符:kms:RequestAlias仅在调用KMS API时请求参数直接指定密钥别名的场景下才会校验匹配,而S3访问加密对象时,后台调用KMS接口传递的是密钥的ARN/ID,不会传递别名,因此这个条件永远无法匹配,直接拒绝访问。
解决方案
把条件中的kms:RequestAlias替换为kms:ResourceAlias即可,这个条件键会校验你访问的KMS密钥本身绑定的所有别名是否符合匹配规则,不管调用KMS时用的是ARN、ID还是别名,只要密钥本身有符合规则的别名就能通过校验,完全匹配限制访问别名含mytoken密钥的需求。
修改后的策略示例如下:
data "aws_iam_policy_document" "lambda_s3_policy_doc" { statement { sid = "" effect = "Allow" resources = [ "arn:aws:s3:::mybucket*", "arn:aws:s3:::mybucket*/*" ] actions = [ "s3:AbortMultipartUpload", "s3:CreateBucket", "s3:DeleteObject", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListMultipartUploadParts", "s3:PutObject" ] } statement { effect = "Allow" actions = [ "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt", "kms:GenerateDataKey" ] resources = ["*"] condition { test = "StringLike" variable = "kms:ResourceAlias" values = [ "alias/*mytoken*" ] } } }
补充注意事项
- 单个KMS密钥可以绑定多个别名,只要其中一个别名包含
mytoken就会匹配该条件 - 如果安全等级要求更高,也可以直接将所有符合别名规则的KMS密钥ARN填写到
resources字段中,替代条件匹配,权限控制粒度更精确 - 请确认你S3桶使用的加密密钥确实已经绑定了包含
mytoken的别名,否则仍然会触发访问拒绝
内容的提问来源于stack exchange,提问作者Hemanth S R
相关产品推荐
相关产品推荐

