如何禁止所有主体向S3存储桶上传未加密对象并修复策略报错
错误根因
你收到MalformedPolicy报错的核心原因是S3存储桶策略的Resource字段不允许直接使用泛通配符*,桶策略作为绑定到指定存储桶的访问控制规则,AWS要求所有Resource必须明确指向当前绑定存储桶的资源范围,泛化通配符不符合桶策略的语法校验规则。
修复方案
将Resource字段替换为当前存储桶下所有对象的ARN即可,在CloudFormation模板中可以通过!Sub函数动态拼接存储桶ARN:
PolicyS3BucketPolicy: Type: AWS::S3::BucketPolicy DependsOn: PolicyS3Bucket Properties: Bucket: !Ref PolicyS3Bucket PolicyDocument: Version: "2012-10-17" Statement: - Effect: Deny Sid: DenyUnEncryptedObjectUploads Action: "s3:PutObject" # 仅修改Resource字段为如下内容即可 Resource: !Sub arn:aws:s3:::${PolicyS3Bucket}/* Principal: AWS: "*" Condition: StringNotEquals: "s3:x-amz-server-side-encryption": "aws:kms"
补充说明
- 如果你需要同时支持SSE-S3(AES256)加密方式而非强制使用KMS加密,可以修改
s3:x-amz-server-side-encryption的取值为AES256,也可以添加StringEqualsIfExists条件适配不同加密场景 - 修改后的策略会严格拒绝所有未携带KMS加密头的对象上传请求,覆盖所有主体,符合你的需求
内容的提问来源于stack exchange,提问作者Shane Bishop
相关产品推荐
相关产品推荐

