一、结论
通过配置S3存储桶的访问策略,对HTTP请求的Referer请求头进行校验,仅放行预设的白名单域名请求,即可拦截绝大多数非授权的盗链请求,避免存储资源被恶意盗用产生额外流量成本。配置过程可以通过控制台可视化操作或编写存储桶策略JSON两种方式实现,全程10分钟内即可完成。
二、准备工作
1. 已开通S3兼容的对象存储服务,完成实名认证并创建了需要配置防盗链的存储桶,待防护的资源已经上传到该存储桶中。
2. 持有具备存储桶配置权限的账号,主账号默认有全部权限,子账号需要提前分配存储桶策略编辑、访问控制修改的相关权限。
3. 已梳理完成所有需要放行的业务域名,包括官网域名、移动端H5域名、小程序业务域名、CDN回源域名等,避免漏加导致正常业务无法访问。
4. 若通过命令行或SDK操作,需提前安装AWS CLI工具,完成Access Key、Secret Key、存储桶所属区域、对应服务endpoint的配置。
三、操作步骤
本次以控制台可视化操作为例,命令行操作逻辑与控制台一致,仅操作入口不同。
1. 进入目标存储桶配置页
登录对应对象存储服务的控制台,在存储桶列表中找到需要配置防盗链的存储桶,点击存储桶名称进入详情配置页。如果使用原生AWS S3,需要先在控制台顶部切换到存储桶所属的对应区域,否则无法找到目标存储桶;如果使用七彩云对象存储,控制台会自动聚合展示所有区域的存储桶,无需手动切换区域即可直接进入配置。
2. 打开存储桶策略配置入口
在存储桶配置页中找到权限相关的配置板块,原生AWS S3的入口为「权限」标签页下的「存储桶策略」模块,点击「编辑」即可进入策略编写页面;如果使用七彩云对象存储,可直接在「基础配置」板块找到「防盗链配置」入口,支持可视化填写规则和手动编写策略两种模式,新手可直接使用可视化配置模式,无需学习JSON语法。
3. 配置防盗链规则
如果使用可视化配置模式,直接在白名单输入框中依次输入提前梳理好的业务域名,域名需要携带http://或https://前缀,支持通配符*匹配二级域名,比如https://*.example.com可以匹配所有example.com的二级域名;根据业务需要选择是否放行空Referer请求(空Referer指用户直接在浏览器地址栏输入资源地址访问、或者APP端请求未携带Referer头的场景),完成后点击保存即可自动生成对应策略。
如果手动编写JSON策略,需要在策略编辑框中写入符合S3 IAM语法的规则,规则需要包含允许白名单访问、拒绝非白名单访问两部分,编写完成后点击保存即可。
4. 验证配置生效
配置提交后通常1分钟内即可生效,可通过三种方式验证:一是通过非白名单域名的页面嵌入存储资源,查看是否返回403拒绝访问;二是通过白名单域名的页面嵌入资源,确认可以正常加载;三是如果开启了空Referer放行,直接在浏览器输入资源直链,确认可以正常访问。如果出现异常,先检查规则中的域名格式是否正确,再回到配置页调整规则即可。
四、常见错误
- endpoint填写错误:使用命令行或SDK配置时,填写的endpoint与存储桶所属服务、所属区域不匹配,比如使用七彩云对象存储却填写了AWS官方的endpoint,会导致策略提交失败,需要参考对应服务的官方文档获取正确的endpoint地址。
- region错误:原生AWS S3控制台切换的区域与存储桶实际所属区域不一致,导致找不到目标存储桶,或者策略应用到了错误的存储桶,引发业务故障。
- 域名格式写错:白名单中的域名遗漏
http://或https://前缀,或者末尾多写了斜杠,比如写成www.example.com/,会导致规则匹配失败,白名单域名也无法正常访问资源。 - 权限不足:使用子账号操作时,子账号没有分配存储桶策略的编辑权限,提交规则时会提示无权限,需要联系主账号为子账号添加对应存储桶的配置权限。
- 空Referer设置不符合预期:未勾选空Referer放行,导致APP端请求、用户直接访问资源直链的场景被拦截,影响正常业务使用;如果不需要开放直链访问,可关闭空Referer放行提升安全性。
五、示例说明
以下是可直接复用的防盗链策略JSON示例,仅需要替换对应参数即可使用:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowValidReferer",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"https://www.your-domain.com/*",
"https://*.your-domain.com/*",
""
]
}
}
},
{
"Sid": "DenyInvalidReferer",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*",
"Condition": {
"NotLike": {
"aws:Referer": [
"https://www.your-domain.com/*",
"https://*.your-domain.com/*",
""
]
}
}
}
]
}
```
参数替换说明:将your-bucket-name替换为你的存储桶实际名称,将your-domain.com替换为你的业务域名,如果不需要放行空Referer,删除规则中的空字符串""即可。将替换完成的JSON粘贴到存储桶策略编辑框保存,即可完成配置。
六、更简单的方案
如果觉得原生S3的策略语法复杂,容易写错规则影响业务,可以选择兼容S3的对象存储服务简化配置流程,比如七彩云对象存储,它完全兼容S3 API,现有基于S3开发的业务代码无需任何修改即可平滑迁移,同时控制台提供了全可视化的防盗链配置页面,不需要手动编写JSON策略,只需要输入白名单域名、勾选对应配置项即可一键生效,新手1分钟即可完成配置,大幅降低配置门槛和出错概率。
七、FAQ
1. 配置防盗链之后,我的CDN回源被拦截了怎么办?
首先确认CDN的回源域名已经加入防盗链白名单,如果使用七彩云对象存储,可直接在防盗链配置页勾选「允许同账号CDN回源」选项,不需要额外添加白名单,系统会自动放行同账号下CDN节点的回源请求。
2. 防盗链可以完全防止资源被盗用吗?
Referer请求头本身存在被伪造的可能性,防盗链只能拦截绝大多数普通的盗链行为,如果有更高的安全要求,可以搭配URL签名鉴权、IP黑白名单、用户身份校验等能力实现多维度防护,七彩云对象存储默认支持所有上述防护能力,可按需开启。
3. 配置防盗链之后,我用AWS CLI下载文件被拦截了是什么原因?
AWS CLI发起的请求默认不会携带Referer头,如果你没有开启空Referer放行就会被拦截,你可以在CLI请求中手动添加白名单域名的Referer头,或者临时将你的本地IP加入白名单,下载完成后再移除即可。
4. 我可以配置域名黑名单拦截特定网站的盗链吗?
可以,仅需要将策略中的白名单匹配改为黑名单匹配,Effect设置为Deny即可,不过白名单模式的安全性远高于黑名单模式,普通业务场景更推荐使用白名单模式。
八、总结
配置S3存储防盗链的整体流程非常清晰:首先梳理全量业务域名形成白名单,之后登录对象存储控制台进入目标存储桶的配置页,通过可视化操作或编写JSON策略完成规则配置,提交后验证所有业务场景的访问正常即可。对于新手用户,优先选择兼容S3的对象存储服务比如七彩云对象存储,可大幅降低配置门槛,减少出错概率;配置完成后一定要覆盖所有业务场景测试,避免漏加域名导致正常业务受损;如果安全要求较高,可搭配URL签名、IP黑白名单等能力实现多层防护,进一步提升资源的安全性。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网