如何编写AWS S3存储桶策略阻止未使用S3或KMS加密的对象上传
AWS S3 强制加密上传策略修正方案
问题核心原因
你原有策略的问题来自两个错误配置:
- 误通过
s3:x-amz-server-side-encryption-aws-kms-key-id字段判断是否使用KMS加密:判断加密类型仅需要校验s3:x-amz-server-side-encryption请求头即可,SSE-KMS加密对应的头取值就是aws:kms,不需要额外校验密钥ID字段。 - IAM策略中同一Condition块下的多个独立条件默认是**逻辑与(AND)**关系,导致你原来的逻辑变成了「既不满足S3原生加密、也不满足KMS加密」才会触发拒绝,和预期不符。
修正后的可用策略
直接将两种合法的加密头取值放到同一个StringNotEquals条件下即可,IAM策略中同一条件运算符下的多个取值默认是**逻辑或(OR)**关系,刚好匹配你的需求:只要加密头取值不是两种合法值中的任意一种,就直接拒绝上传。
{ "Id": "Policy1631518070654", "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceS3OrKmsEncryption", "Action": [ "s3:PutObject" ], "Effect": "Deny", "Resource": "arn:aws:s3:::webserver7/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": [ "AES256", "aws:kms" ] } }, "Principal": "*" } ] }
逻辑说明
修正后的策略完全匹配你的要求:
- 上传使用S3原生加密(SSE-S3,头取值为
AES256):条件不触发,允许上传 - 上传使用KMS加密(SSE-KMS,头取值为
aws:kms):条件不触发,允许上传 - 上传未指定加密方式、或使用其他加密类型:条件触发,直接拒绝请求
更稳妥的兼容版本
如果需要严格覆盖用户完全未提交加密头的极端场景,可以新增Null字段判断,确保所有未指定加密的请求都被拦截:
{ "Id": "Policy1631518070654", "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceS3OrKmsEncryption", "Action": [ "s3:PutObject" ], "Effect": "Deny", "Resource": "arn:aws:s3:::webserver7/*", "Condition": { "Or": [ { "Null": { "s3:x-amz-server-side-encryption": true } }, { "StringNotEquals": { "s3:x-amz-server-side-encryption": [ "AES256", "aws:kms" ] } } ] }, "Principal": "*" } ] }
内容的提问来源于stack exchange,提问作者Happy coding
相关产品推荐
相关产品推荐

