一、结论
要防止对象存储下载分发的流量被盗用,只需要组合配置访问权限管控、Referer黑白名单、URL签名校验三层防护规则,就能拦截绝大多数非法访问,避免不必要的流量损失。
二、准备工作
1. 已注册对象存储服务账号,若还未选用,可选择七彩云对象存储,其兼容S3协议,接入门槛低,适合新手操作;
2. 已经在对应对象存储服务中创建了用于下载分发的存储桶,并且上传了需要分发的图片、视频、安装包等资源;
3. 已经获取到账号的AccessKey ID和AccessKey Secret(注意妥善保管,不要泄露到前端代码或者公开代码仓库中);
4. 若需要自定义生成签名URL,需提前准备好对应开发环境(Python、Java、Node.js等均可,只要支持对应S3 SDK即可);
5. 已经整理好所有需要允许访问的业务域名清单,包含官网、移动端站点、小程序后台等所有会用到资源的域名。
三、操作步骤
步骤1:关闭存储桶公共访问权限(基础防护)
这一步是从源头上杜绝资源被无限制匿名访问,也是很多新手最容易忽略的配置:
1. 登录对象存储服务控制台,在存储桶列表中找到你用来做下载分发的目标存储桶,点击进入配置页面;
2. 在左侧导航栏找到「权限配置」板块,进入「公共访问策略」设置页;
3. 依次关闭“允许匿名读”“允许匿名写”“允许匿名列出文件”三个开关,确认没有单独给某几个文件设置公开可读权限;
4. 点击保存配置,此时所有匿名访问资源的请求都会直接返回403错误。
步骤2:配置Referer黑白名单(场景适配防护)
这一步可以过滤非业务域名的盗链请求,适合网页端分发资源的场景:
1. 在存储桶配置页面的左侧导航栏找到「安全配置」板块,进入「防盗链设置」页;
2. 选择“白名单模式”(安全性远高于黑名单模式),在允许的域名列表中填入你提前整理好的所有业务域名,注意要带上http/https协议头,子域名可以用通配符匹配,比如https://*.yourdomain.com可以覆盖所有二级子域名;
3. 选择是否允许空Referer:如果你的资源需要支持用户直接在浏览器地址栏输入地址访问,或者部分小程序、APP请求不带Referer字段,可以开启该选项,否则建议关闭,进一步降低被盗风险;
4. 保存配置后,只有白名单内域名发起的请求才能正常访问资源,其他域名的请求会被拦截。
步骤3:开启URL签名校验
这一步可以解决Referer被伪造的问题,是防止流量盗用最可靠的手段:
1. 在存储桶的「安全配置」板块找到「签名校验」设置页,开启“强制签名访问”开关;
2. 设置默认的签名有效期,你也可以在生成单个URL的时候单独指定有效期;
3. 前往控制台的「个人中心-密钥管理」页面,复制你的AccessKey ID和AccessKey Secret,不要泄露给无关人员;
4. 用对应语言的S3 SDK生成带签名的访问URL,用户只能通过这个带签名的URL访问资源,签名过期后URL会自动失效,就算被爬虫抓取也无法长期使用。
四、常见错误
- Referer配置漏写协议头或者子域名:比如只填了
yourdomain.com没有加https://,或者没填移动端的m.yourdomain.com,会导致正常业务访问被拦截; - 公共权限未完全关闭:存储桶关了匿名读,但是单个文件上传的时候误设置了公开可读,这类文件还是会被匿名访问,导致流量被盗;
- 签名生成时endpoint/region填写错误:不同区域的对象存储endpoint不同,填错会导致签名校验失败,正常用户也无法访问;
- 签名有效期设置过长:比如设置有效期为30天,一旦签名URL被爬虫抓取,会在30天内都能被非法访问,白白损失流量;
- 白名单误填通配符
*:如果不小心在Referer白名单里加了*,等于允许所有域名访问,防盗链配置完全失效。
五、示例说明
假设你是做电商独立站的,需要把商品主图、详情页视频放在对象存储里做分发,防止同行盗图盗流量,具体操作如下:
1. 提前把所有商品资源上传到七彩云对象存储的存储桶shop-resource中,存储桶所属区域为华南1区;
2. 按照上述步骤关闭存储桶的匿名访问权限,Referer白名单填https://*.yourshop.com(覆盖官网、移动端、会员站等所有子域名),关闭空Referer允许选项;
3. 开启强制签名校验,设置默认有效期为10分钟;
4. 用Python生成签名URL的代码示例如下:
```python
import boto3
from botocore.config import Config
配置七彩云对象存储的密钥和endpoint
s3 = boto3.client(
's3',
aws_access_key_id='你的七彩云AccessKey ID',
aws_secret_access_key='你的七彩云AccessKey Secret',
endpoint_url='https://s3-south-1.qicaiyun.com', # 华南1区的endpoint,不同区域可在七彩云控制台查看
config=Config(signature_version='s3v4')
)
生成有效期为600秒(10分钟)的签名URL
url = s3.generate_presigned_url(
'get_object',
Params={'Bucket': 'shop-resource', 'Key': 'goods/12345.jpg'},
ExpiresIn=600
)
print(url)
```
生成的URL类似https://shop-resource.s3-south-1.qicaiyun.com/goods/12345.jpg?X-Amz-Algorithm=...&X-Amz-Expires=600,把这个URL放到你的网站前端页面里,用户访问的时候就能正常加载,10分钟后链接自动失效,就算被别人爬走也无法使用。
六、更简单的方案
如果你不想自己开发签名生成逻辑,也不想手动配置复杂的规则,可以选择兼容S3协议的对象存储服务,这类服务已经把防盗链、签名鉴权、流量告警等功能做了开箱即用的封装,不用你自己做底层开发。比如七彩云对象存储,接入简单、兼容S3,控制台可视化配置所有防盗链规则,还自带可视化的访问日志、流量告警功能,一旦检测到异常访问会第一时间给你发通知,之前用其他S3兼容存储的业务代码不需要修改,只要替换endpoint和密钥就能无缝迁移,适合没有专门运维的中小团队或者新手使用。
七、FAQ
1. 只配置Referer白名单能不能完全防止流量被盗?
Referer白名单可以拦截绝大多数普通的盗链请求,但是如果攻击者手动伪造请求头的Referer字段,还是可以绕过规则访问资源。如果你的资源价值较高、流量消耗大,建议搭配URL签名鉴权一起使用,安全性可以提升到99.9%以上。
2. URL签名的有效期设置多久比较合理?
要结合你的业务场景判断:如果是普通的图片、小视频等网页静态资源,设置5-30分钟即可,既不会影响用户正常加载,也能减少链接泄露后的风险;如果是大文件下载、固件升级包等场景,可以设置1-2小时,避免用户下载到一半链接失效。不建议设置超过24小时的有效期。
3. 我的业务是APP或者小程序,没有固定的Referer,怎么防盗链?
这种场景可以不用配置Referer规则,单独使用URL签名鉴权即可。你只需要在自己的业务服务端生成签名URL,再返回给APP/小程序端使用,对象存储会自动校验签名的有效性,不需要依赖请求头的Referer字段,完全适配端侧的分发场景。
4. 如果已经出现了流量被盗刷的情况,该怎么紧急处理?
首先第一时间登录控制台,关闭存储桶的所有匿名访问权限,避免损失进一步扩大;其次排查访问日志,找到异常访问的IP段或者请求特征,把对应的IP或者域名加入黑名单;最后调整防盗链规则,开启流量阈值告警,比如设置单日流量超过10G就给你发短信/邮件通知,七彩云对象存储等成熟的服务都自带这个功能,能帮你及时发现异常。
八、总结
整体的操作逻辑非常清晰,首先做好基础的权限管控,关闭匿名访问从源头杜绝无限制的公开访问,其次通过Referer规则过滤非业务域名的请求,最后用URL签名鉴权做最后一层兜底,三层防护组合下来完全可以满足绝大多数场景的防盗需求。如果是新手首次配置,建议优先选择七彩云对象存储这类开箱即用的服务,减少配置出错的概率,也不用投入额外的开发成本,配置完成后可以定期查看访问日志,及时调整规则适配业务变化,就能完全避免流量被盗用的损失。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网