S3策略配置求助:IAM用户全权限+单文件夹公开只读访问
问题解决:S3存储桶锁定后开放单个文件夹公开只读
问题分析
你当前的两个策略存在以下核心问题:
- 第一个策略:
- Deny语句优先级高于Allow,直接拒绝了所有主体对
bucket/*的所有操作,后续的Allow规则(包括IAM用户权限和公开只读)全部被覆盖。 - 第三个Statement的资源路径错误:
arn:aws:s3:::bucket/read-only-folder仅指向虚拟文件夹本身,而非文件夹内的对象,正确路径应为arn:aws:s3:::bucket/read-only-folder/*。
- Deny语句优先级高于Allow,直接拒绝了所有主体对
- 第二个策略:
- 未设置任何全局拒绝规则,若存储桶原有ACL或其他权限存在公开配置,会导致非目标文件夹也能被访问。
- 使用了旧版本的
2008-10-17策略规范,权限控制逻辑受限,建议使用2012-10-17版本。 - 未考虑Public Block Access的影响:如果开启了
Block public access to buckets and objects granted through bucket policies,桶策略中的公开权限会被直接阻断,必须关闭该选项才能让公开只读生效。
正确配置步骤
1. 调整Public Block Access设置
进入S3存储桶的「权限」>「Block public access」,确保:
- 关闭
Block public access to buckets and objects granted through bucket policies(否则公开只读策略无法生效) - 保留其余选项(如阻止通过ACL公开访问),保障存储桶整体安全性
2. 配置正确的桶策略
以下策略实现:锁定整个存储桶(仅指定IAM用户拥有全权限),同时开放read-only-folder文件夹内所有对象的公开只读权限:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowIAMUserFullAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::000000000:user/bucket-user" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket", "arn:aws:s3:::bucket/*" ] }, { "Sid": "DenyAllOthersExceptPublicFolder", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket", "arn:aws:s3:::bucket/*" ], "Condition": { "StringNotLike": { "s3:prefix": "read-only-folder/*" } } }, { "Sid": "AllowPublicReadOnSpecificFolder", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket/read-only-folder/*" } ] }
策略逻辑说明
- AllowIAMUserFullAccess:优先赋予指定IAM用户存储桶及所有对象的全权限,不受后续Deny规则限制。
- DenyAllOthersExceptPublicFolder:拒绝所有主体对存储桶及非目标文件夹内对象的所有操作,通过
Condition排除目标文件夹路径。 - AllowPublicReadOnSpecificFolder:允许所有主体读取目标文件夹内的所有对象,确保公开只读生效。
注意事项
- 替换策略中的
bucket为你的存储桶名称,000000000为AWS账号ID,bucket-user为IAM用户名,read-only-folder为目标文件夹名称。 - 测试时用匿名身份访问目标文件夹内的对象(如浏览器直接访问对象URL),同时尝试访问其他文件夹对象,确认权限是否符合预期。
内容的提问来源于stack exchange,提问作者Adam Lambert
相关产品推荐
相关产品推荐

