如何通过Terraform脚本禁用S3 Bucket ACL并配置对象所有权归桶所有者?
解决方案
要实现AWS建议的禁用ACL、默认对象所有权归桶所有者,不能仅依赖aws_s3_bucket_acl资源,需要通过aws_s3_bucket_ownership_controls配置对象所有权规则,具体实现如下:
核心原理
当将对象所有权设置为BucketOwnerEnforced时,AWS会自动禁用桶的ACL功能,所有上传的对象默认归桶所有者所有,完全符合AWS最新的安全建议。
完整Terraform代码
# 创建S3桶 resource "aws_s3_bucket" "s3-bucket" { bucket = "your-unique-bucket-name" # 替换为你的专属桶名 } # 配置对象所有权控制,强制禁用ACL并让对象默认归桶所有者 resource "aws_s3_bucket_ownership_controls" "bucket_ownership" { bucket = aws_s3_bucket.s3-bucket.id rule { object_ownership = "BucketOwnerEnforced" } } # 可选:添加公共访问阻止(安全最佳实践,建议启用) resource "aws_s3_bucket_public_access_block" "bucket_public_access" { bucket = aws_s3_bucket.s3-bucket.id block_public_acls = true block_public_policy = true ignore_public_acls = true restrict_public_buckets = true } data "aws_caller_identity" "current" {}
关键说明
- 移除原有的
aws_s3_bucket_acl资源:因为BucketOwnerEnforced模式会直接禁用ACL,保留该资源会导致配置冲突。 BucketOwnerEnforced是核心配置:启用后,任何针对桶或对象的ACL设置操作都会被拒绝,对象所有权强制归桶所属账户。- 公共访问阻止是可选但推荐的配置:进一步强化桶的安全性,防止意外的公共访问暴露。
验证方式
应用配置后,可通过以下方式确认生效:
- 登录AWS控制台进入目标桶的「权限」标签,查看「对象所有权」为「桶所有者强制」,且ACL配置入口被灰化禁用。
- 上传测试对象后,查看对象的所有者信息,确认是桶所属的AWS账户。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

