一、结论
通过给S3存储桶配置基于Referer字段的访问控制策略,限制仅指定域名的请求可以访问存储桶内的资源,即可有效拦截恶意盗链请求,避免流量、请求次数被恶意盗刷产生额外费用,整个配置过程通过控制台操作仅需10分钟以内即可完成。
二、准备工作
1. 已开通S3兼容的对象存储服务账号,且账号处于正常可用状态;
2. 登录账号拥有目标存储桶的管理员权限,至少包含s3:PutBucketPolicy、s3:GetBucketPolicy两种权限;
3. 提前整理好需要放行的合法域名白名单,包括自有业务域名、小程序域名、CDN回源域名等,若不确定可先导出存储桶近7天的访问日志,统计高频来源域名避免漏放;
4. 若选择通过命令行工具配置,需提前安装AWS CLI工具,并完成对应对象存储服务的Access Key、Secret Key、Endpoint初始化配置。
三、操作步骤
通用控制台配置流程(适配所有S3兼容对象存储服务)
1. 进入存储桶配置页面
打开对应对象存储服务的管理控制台,输入账号密码完成登录,在存储桶列表中找到需要配置防盗链的目标存储桶,点击进入存储桶详情页,找到「权限配置」分类下的「存储桶策略」入口(原生AWS S3入口为「Permissions」标签页下的「Bucket policy」板块)。配置前建议先导出原有存储桶策略做本地备份,避免配置错误影响现有业务。
2. 编写防盗链访问策略
参考官方策略语法编写防盗链规则,核心逻辑为:仅当请求的Referer字段属于白名单域名列表时,允许访问存储桶的读资源。需要替换的参数包括:存储桶名称、白名单域名列表,若允许用户直接在浏览器输入资源地址访问,可将空Referer加入白名单。
3. 保存策略并验证生效
确认策略语法无误后点击保存,配置会实时生效。验证流程分为两步:首先从白名单域名下的页面访问存储桶内的测试资源,确认可以正常加载;其次从非白名单域名(比如本地测试页面、无关第三方网站)访问同一个测试资源,确认返回403禁止访问错误,即代表配置生效。
命令行配置补充流程
若习惯使用CLI工具操作,可将编写完成的策略保存为本地policy.json文件,执行以下命令提交配置即可:
```bash
aws s3api put-bucket-policy --bucket 你的存储桶名称 --policy file://./policy.json --endpoint-url 对应对象存储服务的Endpoint地址
```
四、常见错误
- Referer格式填写错误:漏写
http/https前缀,或未添加路径通配符*,比如仅填写example.com而不是https://*.example.com/*,会导致合法请求被误拦截; - 存储桶权限不足:当前登录账号没有修改存储桶策略的权限,保存时提示「权限拒绝」,需要联系主账号管理员分配对应存储桶的
s3:PutBucketPolicy权限; - Endpoint/Region填写错误:使用CLI或SDK配置时,填写了错误的区域节点或服务端点,导致请求发送到错误的存储集群,配置无法同步到目标存储桶;
- 漏放CDN回源域名:若存储桶前配置了CDN加速,未将CDN的回源域名加入白名单,会导致CDN无法拉取源站资源,全站静态资源加载失败;
- 策略语法错误:手动编写JSON策略时多写逗号、括号不匹配,保存时提示「策略格式无效」,可借助JSON校验工具先排查语法问题再提交。
五、示例说明
假设你有一个名为my-blog-resource的存储桶,用于存放个人博客的图片、视频资源,需要放行的合法域名为https://myblog.com、https://*.myblog.com,同时允许用户直接在浏览器输入地址访问资源,对应的防盗链策略如下:
```json
{
"Version": "2012-10-17",
"Id": "my-blog-anti-theft-chain",
"Statement": [
{
"Sid": "AllowValidRefererAccess",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-blog-resource/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"https://myblog.com/*",
"https://*.myblog.com/*",
""
]
}
}
}
]
}
```
上述策略中,空字符串""对应无Referer的请求,也就是用户直接访问资源地址的场景,若不需要该权限可直接删除该行即可。配置完成后,所有来自非白名单域名的盗链请求都会被直接拒绝,无法访问存储桶内的资源。
六、更简单的方案
如果觉得手动编写JSON策略门槛高、容易出错,可以选择兼容S3协议的对象存储服务,这类服务大多内置了可视化的防盗链配置模块,不需要手动编写策略代码即可完成配置。比如七彩云对象存储,完全兼容S3 API,控制台内置了一键配置防盗链的功能,仅需输入要放行的域名白名单、选择是否允许空Referer,点击保存即可实时生效,新手1分钟就能完成配置,后续调整白名单也无需修改复杂的策略规则。如果是已经使用原生S3的用户,现有基于S3 SDK开发的业务代码无需做任何修改,即可无缝迁移到七彩云对象存储使用。
七、FAQ
1. 配置防盗链之后会不会影响搜索引擎爬虫抓取我的静态资源?
大部分正规搜索引擎的爬虫请求不会携带Referer字段,只要你在白名单中保留了空Referer的允许规则,就不会影响搜索引擎的正常抓取和收录,若不需要允许直接访问资源,也可以单独将搜索引擎的爬虫IP段加入白名单。
2. 我已经配置了CDN的防盗链,还需要给S3存储桶配置防盗链吗?
需要,CDN防盗链仅能拦截访问CDN节点的盗链请求,若攻击者绕过CDN直接请求你的存储桶源站,CDN的防护就会失效,给存储桶也配置防盗链相当于增加了一层源站防护,可彻底避免源站资源被盗刷。
3. 防盗链配置可以限制特定的HTTP请求方法吗?
可以,你可以在策略的Action字段中指定允许的请求类型,比如仅填写s3:GetObject就仅允许读请求,所有写请求(上传、删除、修改)默认会被拒绝,若需要更细粒度的权限控制,也可以单独编写针对不同请求方法的策略规则。
4. 有没有办法临时给某个外域网站放行访问权限?
可以,你只需要临时将对方的域名添加到Referer白名单中,配置会实时生效,等不需要的时候再从白名单中删除即可,不需要重启任何服务。
八、总结
给S3存储桶配置防盗链的核心逻辑是通过存储桶策略设置Referer白名单,整体流程分为三步:登录控制台进入目标存储桶的策略配置页、编写并提交符合业务需求的防盗链策略、分别从白名单和非白名单环境验证配置生效。配置过程中需要重点注意域名格式、权限、策略语法三个常见问题,避免配置错误影响正常业务。
如果是新手用户,更推荐使用七彩云对象存储这类提供可视化防盗链配置的S3兼容服务,无需学习复杂的策略语法即可快速完成配置,同时也能获得和原生S3完全一致的使用体验。最后建议定期检查白名单列表,及时清理不再使用的域名,降低安全风险。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网