如何配置S3桶策略:已有文件可公开读写 禁止公众创建新文件
问题结论
这个需求完全可以通过S3存储桶策略实现,不需要额外依赖其他AWS服务。
配置思路
1. 专属服务权限配置
给专属服务关联的IAM身份(IAM用户、IAM角色、EC2实例角色等)授予桶级全CRUD权限,允许其创建、读取、修改、删除桶内任意对象。
对应需要放开的S3操作权限包括:
- 桶级操作:
s3:ListBucket - 对象级操作:
s3:GetObject、s3:PutObject、s3:DeleteObject
2. 公众访问权限配置
核心通过S3的条件键IsExistingObject限制公众仅能操作已存在的对象,从根源上避免公众创建新文件:
- 仅给公众放开已存在对象的读权限即可满足基础需求,如果需要支持修改已有文件可额外加有限制的写权限
- 不放开任何无对象存在限制的操作,自然不会授予公众创建新文件的权限
示例存储桶策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowFullAccessForDedicatedService", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的AWS账号ID:role/你的专属服务关联的IAM角色名" }, "Action": [ "s3:ListBucket", "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::你的存储桶名称", "arn:aws:s3:::你的存储桶名称/*" ] }, { "Sid": "AllowReadExistingObjectForPublic", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的存储桶名称/*", "Condition": { "IsExistingObject": "true" } } ] }
注意事项
- 配置策略前需要先调整存储桶的「阻止公共访问」设置,关闭「阻止通过新的公共存储桶策略授予公共访问权限」的选项,否则公共权限不会生效
- 如果你只希望特定路径下的文件对公众开放,可以在第二条声明的Resource中增加路径前缀限制,比如
arn:aws:s3:::你的存储桶名称/public/*,进一步降低风险 - 如果确实需要公众修改已有文件,可以在第二条声明的Action中增加
s3:PutObject,该权限仅对已存在的对象生效,不会允许公众上传新文件
内容的提问来源于stack exchange,提问作者Andreas Rudolph
相关产品推荐
相关产品推荐

