Amazon S3存储桶策略异常:特定文件夹Referer限制后其余文件夹无法公开访问
排查S3桶策略公开访问规则失效问题
我来帮你搞定这个S3桶策略的问题,你的需求是让folderName下大部分内容公开,仅users子文件夹需要referer验证,但当前第一条公开规则不生效,咱们一步步来分析解决:
问题根源
首先得搞清楚为什么你的规则不生效,主要有两个核心原因:
1. 策略逻辑不符合需求,且存在资源重叠冲突
你写了两条Allow语句,其中folderName/*的资源范围完全包含了folderName/users/*。这种情况下,当访问users文件夹的内容时,如果referer不匹配,第二条规则失效,但第一条规则本应允许访问——这其实和你想要限制users文件夹的需求背道而驰。但你说第一条规则都不生效,那大概率是下面这个原因:
2. S3的Block Public Access设置拦截了公开访问
这是最常见的“公开规则不生效”的元凶:如果你的桶开启了Block Public Access中的「Block public access to buckets and objects granted through bucket policies」选项,哪怕桶策略里写了Allow,S3也会直接忽略这些公开访问规则,导致所有公开请求被拒绝。
修复方案
第一步:检查并调整Block Public Access设置
先去S3控制台确认这个关键设置:
- 找到你的目标桶,切换到「Permissions」标签页
- 找到「Block Public Access」区域,点击「Edit」
- 确保「Block public access to buckets and objects granted through bucket policies」这个选项是关闭的(如果你的业务确实需要公开访问的话)
第二步:替换为正确的桶策略逻辑
我们需要换个思路:先允许folderName下所有内容公开,再用Deny规则拦截不符合referer要求的users文件夹访问(因为S3中Deny的优先级高于Allow)。修改后的策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPublicAccessToMainFolder", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucketName/folderName/*" }, { "Sid": "RestrictUsersFolderToValidReferer", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucketName/folderName/users/*", "Condition": { "StringNotLike": { "aws:Referer": "https://example.com/*" } } } ] }
策略逻辑解释
- 第一条规则:给所有用户开放
folderName下所有对象的GetObject权限,包括users子文件夹 - 第二条规则:如果有人访问
users文件夹,但referer不是https://example.com/*开头的,直接拒绝这个请求 - 这样组合下来,
folderName下除users外的内容可以正常公开访问,users文件夹只有来自example.com的请求才能打开
测试注意事项
- 测试的时候用匿名浏览器窗口,或者清理本地缓存,避免之前的登录状态、缓存的referer影响测试结果
- 确认你的referer格式正确,
https://example.com/*会匹配所有来自example.com域名下的子页面请求(比如https://example.com/page1、https://example.com/blog/post等) - 如果你的桶还有其他IAM策略或者ACL设置,要确保它们不会和这个桶策略冲突
内容的提问来源于stack exchange,提问作者Satish Gupta
相关产品推荐
相关产品推荐

