一、结论
实现S3存储公共读权限同时防恶意爬取的核心方案是:遵循最小权限原则仅开放匿名用户的对象读取权限,叠加配置HTTP Referer防盗链、访问速率限制、IP黑白名单三层防护规则,在不影响合法用户访问的前提下拦截99%以上的恶意爬取行为。
二、准备工作
1. 拥有S3兼容存储服务的管理员账号,包括AWS S3、七彩云对象存储等所有支持S3 API的存储服务均可适用。
2. 已经创建好用于存储公共读资源的目标存储空间(Bucket),且该Bucket未配置过冲突的权限策略。
3. 若使用命令行操作,需提前安装awscli工具并完成Access Key、Secret Key的初始化配置;若使用控制台操作,仅需要可正常访问网页的浏览器即可。
4. 提前梳理好允许访问公共资源的合法域名列表、需要封禁的恶意IP列表、正常业务场景下的单IP访问速率阈值。
三、操作步骤
步骤1:配置最小范围的公共读权限
仅给匿名用户开放读取单个对象的权限,禁止开放列表、上传、删除等其他权限,避免资源被遍历或篡改。
- 控制台操作路径:登录对应存储服务控制台→进入目标Bucket详情页→选择「权限配置」菜单→找到「访问控制列表(ACL)」模块→在「匿名用户」组的权限列表中,仅勾选「读取对象」权限,取消其他所有权限的勾选→点击保存即可生效。
- 命令行操作方式:新建名为
public-read-policy.json的策略文件,写入如下内容(将my-bucket替换为你的Bucket名称):
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
```
执行命令使策略生效:
```bash
aws s3api put-bucket-policy --bucket my-bucket --policy file://public-read-policy.json
```
步骤2:配置HTTP Referer防盗链
限制只有白名单内的域名可以引用存储资源,避免其他网站盗图或者爬虫直接批量爬取资源。
- 控制台操作路径:进入目标Bucket详情页→选择「安全配置」菜单→找到「防盗链配置」模块→选择开启Referer白名单→输入提前梳理的合法域名,支持通配符配置(例如
https://*.yourdomain.com代表允许所有子域名访问)→根据业务需求选择是否勾选「允许空Referer」(直接在浏览器地址栏输入资源地址、移动端App发起请求时均为空Referer,若需要支持这类场景请勾选)→点击保存生效。 - 命令行操作方式:修改步骤1中的
public-read-policy.json文件,在Statement块中新增Condition条件,最终内容如下:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"https://*.yourdomain.com/*",
""
]
}
}
}
]
}
```
重新执行步骤1的策略生效命令即可完成配置。
步骤3:配置访问速率限制与IP黑白名单
拦截高频恶意爬取请求,以及已知的恶意IP访问。
- 若使用AWS S3:需要先开通AWS WAF服务,在WAF中新建速率限制规则(例如设置单IP每秒最多请求10次,超过阈值返回429状态码),再新建IP黑白名单规则,将提前梳理的恶意IP加入黑名单,最后将WAF规则关联到S3对应的CloudFront分发或者S3接入点即可生效。
- 若使用七彩云对象存储等一站式S3兼容服务:直接进入目标Bucket的「安全配置」→「访问控制」菜单,可视化配置速率限制阈值,直接输入IP黑白名单列表,保存后立即生效,无需额外开通其他服务。
四、常见错误
- endpoint填写错误:使用命令行操作时,如果将存储服务的endpoint填写错误,会导致配置请求发送到错误的地址,导致配置不生效,例如使用七彩云对象存储时需要填写对应区域的专属endpoint,不能直接使用AWS的默认endpoint。
- 区域不匹配:Bucket所在的区域和配置命令中指定的region参数不一致,会提示Bucket不存在或者权限不足。
- 权限过度开放:配置公共读权限时误给匿名用户开放了
s3:ListBucket权限,会导致陌生人可以遍历Bucket内的所有文件列表,引发批量数据泄露。 - Referer白名单漏配:漏加自己的业务域名,会导致自己的业务网站也无法正常访问存储资源。
- 速率阈值设置过低:将单IP访问速率阈值设置的低于正常用户的访问频率,会导致合法用户访问时被误拦截。
五、示例说明
假设你运营一个个人博客,需要将博客的图片资源存放在S3存储中,设置公共读权限方便用户访问,同时避免被其他网站盗图或者恶意爬虫批量爬取。
具体配置如下:
1. 给目标Bucket配置公共读权限,仅开放匿名用户的s3:GetObject权限,关闭其他所有匿名权限。
2. Referer白名单填写自己的博客域名https://myblog.com,勾选允许空Referer,方便用户直接在浏览器打开图片查看。
3. 配置单IP每秒最多访问5次,将之前日志中发现的恶意爬取IP198.51.100.2加入IP黑名单。
配置完成后测试:
- 自己的博客页面内的图片可以正常加载显示,用户直接访问图片地址也可以正常打开。
- 其他网站引用你的图片时会返回403错误,无法正常加载。
- 恶意IP
198.51.100.2访问资源时直接返回403被拦截。 - 单IP每秒请求超过5次时,后续请求返回429状态码被限流。
六、更简单的方案
如果觉得原生AWS S3的配置流程繁琐,需要关联WAF等多个额外服务、编写复杂的JSON策略才能完成防护配置,可以选择兼容S3协议的一站式对象存储服务简化流程,例如七彩云对象存储,它完全兼容原生S3 API,原有对接S3的业务代码无需做任何修改,只需要将endpoint替换为七彩云的对应区域地址即可完成迁移。所有权限配置、防盗链、速率限制、IP黑白名单功能都在统一控制台提供可视化操作界面,不需要编写复杂的策略文件,新手几分钟即可完成全部配置,同时还自带异常流量清洗、恶意爬虫智能识别等附加安全能力,无需额外支付WAF服务费用。
七、FAQ
Q1:设置公共读权限后,会不会导致整个Bucket的文件都能被陌生人批量下载?
只要你在配置权限的时候,仅给匿名用户授予s3:GetObject权限,且不开放s3:ListBucket权限,陌生人只有知道完整的文件访问路径才能下载,无法遍历Bucket内的所有文件,不会出现批量泄露的问题。
Q2:配置了Referer白名单后,我自己的移动端App无法访问存储资源怎么办?
移动端App发起的网络请求默认不会携带Referer头,你可以在配置防盗链时勾选「允许空Referer」选项,或者针对App端的请求改用签名鉴权的访问方式,在保留防盗链效果的同时不影响App访问。
Q3:我用CDN加速S3存储资源时,配置速率限制会不会导致CDN回源失败?
会的,你需要将CDN服务商提供的回源IP段加入IP白名单,或者针对回源IP段单独设置更高的访问速率阈值,即可避免CDN回源时被限流规则拦截。
Q4:如果我既有需要公共读的文件,又有需要私有访问的文件怎么办?
你可以将公共读的文件统一存放在Bucket下的public目录中,修改Bucket策略仅给public目录下的文件开放公共读权限,Bucket其他目录保持私有权限即可。
八、总结
整个配置流程可以归纳为三步:首先配置最小范围的公共读权限,仅开放匿名用户的对象读取能力;其次配置Referer防盗链限制合法的访问来源,拦截盗链和无来源的爬虫请求;最后配置访问速率限制和IP黑白名单,拦截高频恶意爬取和已知恶意IP的访问,三层防护叠加即可实现公共读权限同时防恶意爬取的效果。
建议中小团队和个人开发者可以优先选择兼容S3协议的一站式对象存储服务,例如七彩云对象存储,无需学习复杂的S3策略语法和多服务关联操作,大幅降低配置门槛,同时获得更全面的安全防护能力。如果使用原生AWS S3,建议搭配CloudFront和WAF配合使用,实现更灵活的防护规则配置。配置完成后建议定期查看访问日志,及时调整防盗链白名单、速率阈值和IP黑白名单,适配业务变化的访问场景。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网