腾讯云COS防盗链与权限访问控制完全指南
一、为什么需要防盗链与权限控制
对象存储服务在大规模数据存储与分发场景中扮演着核心角色,但随之而来的安全风险也不容忽视。资源盗链是指其他网站未经授权直接引用存储桶中的资源链接,导致资源所有者承担额外的流量费用。更严重的是,一旦存储桶被设置为公有读权限,攻击者可能恶意刷取流量,造成高额账单。腾讯云COS提供了多层防护机制,从基础的Referer防盗链到精细化的权限访问控制,帮助开发者构建安全可靠的对象存储环境。
需要先登录腾讯云控制台,点击:腾讯云控制台,还没有账号,点击:注册后再关联,已有账号点击:登录后再关联
二、Referer防盗链:第一道防线
2.1 防盗链的核心原理
Referer防盗链是COS最基础的防护手段,其原理基于HTTP请求头中的Referer字段。当浏览器向服务器发起资源请求时,通常会在Header中携带Referer信息,告诉服务器请求来源的页面地址。COS通过检查这个字段,判断请求是否来自被允许的域名。
值得注意的是,如果直接在浏览器地址栏输入文件链接访问,请求Header中不会携带Referer。此外,如果访问对象时带有签名(无论签名在URL中还是Header中),COS将跳过防盗链验证。这一设计考虑到了私有读写的使用场景——签名本身已经完成了身份认证,无需再通过Referer重复校验。
2.2 黑白名单配置详解
在COS控制台中,进入存储桶详情页后选择「安全管理」>「防盗链设置」,即可进行配置。防盗链支持两种模式:
黑名单模式:名单内的域名将被拒绝访问存储桶的默认访问地址,返回403状态码。适用于已知恶意来源、需要精准拦截的场景。
白名单模式:仅允许名单内的域名访问,其他所有来源均被拒绝。适用于资源仅服务于特定网站的场景,安全性更高。
Referer字段支持多种格式:域名(如www.example.com)、带端口的域名(如www.example.com:8080)、IP地址(如10.10.10.10)、带端口的IP(如10.10.10.10:8080),以及通配符*(如*.example.com可匹配a.example.com、b.example.com等)。每条规则占一行,最多支持30条。
2.3 空Referer策略
空Referer指的是HTTP请求中不携带Referer字段或Referer字段为空的情况。这在两种常见场景中会出现:用户直接在浏览器地址栏输入URL访问,或某些隐私浏览器/安全插件主动屏蔽了Referer信息。
COS允许用户单独配置空Referer的策略:选择「允许」则空Referer请求可以正常访问;选择「拒绝」则空Referer请求被拦截。建议在大多数场景下将空Referer配置为「拒绝」,以防止直接链接访问造成的资源泄露。但如果业务需要支持用户通过浏览器直接打开文件链接(如图片预览),则需要允许空Referer。
2.4 通过API管理防盗链
除了控制台操作,COS还提供了REST API用于防盗链的读取和设置。GET Bucket referer接口可读取存储桶的Referer黑白名单配置。请求示例:
GET /?referer HTTP/1.1
Host: examplebucket-1250000000.cos.ap-beijing.myqcloud.com
Date: Fri, 25 Feb 2017 04:10:22 GMT
Authorization: Auth String响应体为XML格式,包含防盗链的完整配置信息:
<RefererConfiguration>
<Status>Enabled</Status>
<RefererType>White-List</RefererType>
<DomainList>
<Domain>*.example.com</Domain>
</DomainList>
<EmptyReferConfiguration>Deny</EmptyReferConfiguration>
</RefererConfiguration>其中Status表示是否开启防盗链,RefererType为Black-List或White-List,DomainList为生效域名列表,EmptyReferConfiguration控制空Referer的处理方式。
三、权限访问控制体系
腾讯云COS的权限访问控制体系包含三个层次:ACL(访问控制列表)、Bucket Policy(存储桶策略)和CAM用户策略。三者各有侧重,共同构成了从粗放到精细的完整权限管理能力。
3.1 ACL:快速设置基础权限
ACL是附着在存储桶或对象上的访问控制列表,使用XML语言描述被授权者与授予权限的映射关系。每个存储桶和对象都有与之关联的ACL。ACL支持的操作包括:
- READ:读取对象或列出存储桶内容
- WRITE:上传、覆盖和删除对象
- READ_ACP:读取ACL配置
- WRITE_ACP:写入ACL配置
- FULL_CONTROL:以上四种权限的合集
ACL适用于简单的权限设置场景,例如在控制台快速将某个对象设置为公有读,或为其他主账号授予基本的访问权限。但ACL存在一些限制:资源的拥有者始终具备FULL_CONTROL权限且无法撤销;不支持对权限附加条件;不支持显式拒绝权限;每个资源最多100条ACL策略。
开放匿名用户访问(公有读)属于高危操作,存在流量盗刷风险。如果必须使用公有读,建议配合防盗链进行安全防护。
3.2 Bucket Policy:灵活的存储桶级策略
Bucket Policy使用JSON格式的访问策略语言描述,支持向匿名身份或任何CAM账户授予对存储桶及其中对象的操作权限。相比ACL,Bucket Policy更加灵活,支持条件约束、跨账号授权、匿名用户授权等复杂场景。
一个完整的Bucket Policy包含以下核心元素:
- principal(委托人):策略授权的实体,可以是主账号、子账号、匿名用户或用户组
- effect(效力):allow(允许)或deny(显式拒绝)
- action(操作):允许或拒绝的具体API操作,以name/cos:为前缀
- resource(资源):授权的具体数据,使用六段式描述
- condition(条件):策略生效的约束条件,如IP地址、时间等
以下是一个典型的Bucket Policy示例,授予特定子账号对指定目录的完全控制权限:
{
"version": "2.0",
"statement": [{
"effect": "allow",
"principal": {
"qcs": ["qcs::cam::uin/100000000001:uin/100000000011"]
},
"action": ["name/cos:*"],
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/folder/sub-folder/*"
]
}]
}principal字段中,qcs::cam::uin/100000000001:uin/100000000011表示主账号UIN为100000000001下的子账号100000000011。授予匿名用户权限时,principal可设置为{"qcs": ["qcs::cam::anonymous:anonymous"]}。
存储桶策略的资源范围被限制在该存储桶之内,可针对整个存储桶、指定目录或指定对象进行授权。策略大小限制为20KB。添加策略时应遵循最小权限原则,避免授予resource:*或action:*的权限。
3.3 CAM用户策略:统一身份管理
CAM(访问管理)是腾讯云统一的身份与权限管理系统。CAM用户策略附加在用户或用户组上,用于定义该用户能够对哪些资源执行哪些操作。与Bucket Policy不同,用户策略中不需要指定principal元素,因为策略直接附加到特定用户。
CAM提供了多种预设策略,可在CAM控制台的「策略」>「预设策略」中搜索「COS」关键词查看。预设策略覆盖了常见的权限组合,如COS全读写权限、COS只读权限等。对于更精细的权限控制,可以创建自定义策略,通过策略语法或策略生成器配置。
一个自定义CAM策略的JSON示例:
{
"version": "2.0",
"statement": [{
"effect": "allow",
"action": [
"name/cos:GetObject",
"name/cos:HeadObject"
],
"resource": [
"qcs::cos:ap-beijing:uid/1250000000:examplebucket-1250000000/images/*"
]
}]
}该策略允许用户对examplebucket-1250000000存储桶中images目录下的对象执行读取和获取元数据的操作。
3.4 三种权限方式的对比与选型
ACL、Bucket Policy和CAM用户策略各有适用场景:
- ACL:适合快速设置简单的访问权限,或在控制台快速开放匿名访问。灵活度最低,不支持条件约束。
- Bucket Policy:适合针对特定存储桶进行精细授权,支持跨账号授权、匿名用户授权和条件约束。推荐用于管理ACL无法表述的复杂访问策略。
- CAM用户策略:适合统一管理子账号或用户组的权限,与腾讯云其他产品的权限体系保持一致。
在实际应用中,三种方式可以组合使用。当同时存在多种权限配置时,COS按照「显式拒绝优先」的原则进行评估——只要存在任何一条显式拒绝(deny)的策略,该请求就会被拒绝。
四、私有资源的安全分享:临时密钥与预签名URL
4.1 为什么需要临时密钥
对于私有读写的存储桶,直接通过对象URL访问会失败。安全分享私有资源的两种主流方式是临时密钥和预签名URL。临时密钥通过STS(安全令牌服务)获取,具有时效性(最长不超过36小时)。相比永久密钥,临时密钥更加安全——即使泄露,也只在有限时间内有效。申请临时密钥时应遵循最小权限原则,通过policy参数限制操作和资源范围。
4.2 预签名URL的原理与生成
预签名URL的原理是将签名信息嵌入对象URL中,生成一个可直接访问的链接。签名的有效期决定了链接的有效时间。预签名URL既可用于文件下载(临时分享),也可用于文件上传。
使用永久密钥生成预签名URL时,有效期取决于设置的签名有效期。使用临时密钥时,预签名URL的有效期为签名有效期和临时密钥有效期的较小值。
以下是通过Python SDK生成预签名URL的示例:
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
# 配置信息
secret_id = '您的SecretId'
secret_key = '您的SecretKey'
region = 'ap-beijing'
bucket = 'examplebucket-1250000000'
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key)
client = CosS3Client(config)
# 生成预签名下载URL
response = client.get_presigned_url(
Method='GET',
Bucket=bucket,
Key='images/photo.jpg',
Expired=3600 # 有效期3600秒
)
print(response)使用临时密钥时,需要在请求中携带x-cos-security-token字段:
# 使用临时密钥
config = CosConfig(
Region=region,
SecretId=tmp_secret_id,
SecretKey=tmp_secret_key,
Token=token # 临时密钥的Token
)
client = CosS3Client(config)
response = client.get_presigned_url(
Method='GET',
Bucket=bucket,
Key='images/photo.jpg',
Expired=1800
)4.3 控制台与工具快速获取临时链接
对于非开发场景,COS控制台和COSBrowser工具提供了快速获取临时链接的方式。在控制台的对象详情页面,可以直接复制临时链接,有效期为1小时。COSBrowser客户端使用主账号密钥可获取最长2小时的临时链接,使用子账号密钥可获取最长1.5天的临时链接。
五、配套安全措施
5.1 CDN层防盗链
如果使用了CDN加速域名访问COS资源,CDN层也支持独立的防盗链配置。当同时配置了CDN防盗链和COS防盗链时,优先执行CDN的防盗链规则。这意味着请求会先经过CDN的Referer校验,通过后再由COS进行校验。建议在CDN和COS两侧保持防盗链策略的一致性,避免出现配置冲突导致的访问异常。
5.2 CORS跨域配置
当Web前端应用(如JavaScript代码)直接向COS发起跨域请求时,需要配置CORS(跨域资源共享)规则。在存储桶的「安全管理」>「跨域访问CORS设置」中可添加规则。配置时需注意:如果使用CDN加速域名,跨域规则需在CDN侧配置。CORS配置应严格控制允许的来源(Origin),避免设置为*(所有来源)带来的安全风险。
5.3 日志审计与监控告警
开启存储桶的日志管理功能,可以记录每一次请求的详细信息,帮助定位和分析异常访问。日志中的关键字段包括:
- userSecretKeyId:确定请求使用的密钥,如发现非业务密钥,可能已泄露,需及时在CAM控制台禁用
- referer:请求来源,可用于识别盗链域名并加入黑名单
- remoteIp:客户端IP地址,可用于识别恶意IP
配合云监控告警,可以实时感知流量异常。COS控制台创建存储桶时支持同时配置告警策略,也可在腾讯云可观测平台创建自定义告警。建议针对外网下行流量、请求次数等关键指标设置告警阈值,及时发现盗刷行为。
5.4 存储桶权限的定期审计
定期审查存储桶的访问权限配置是良好的安全习惯。检查内容包括:存储桶是否仍为私有读写、ACL中是否存在不必要的授权、Bucket Policy中是否有过于宽泛的权限、子账号是否拥有超出业务需要的权限等。对于不再使用的临时密钥和子账号,应及时回收权限。
六、综合安全配置建议
基于以上分析,以下是腾讯云COS安全配置的综合建议:
- 存储桶默认私有:除非业务明确需要,否则始终将存储桶设置为私有读写。
- 开启Referer防盗链:根据业务场景选择白名单或黑名单模式,建议将空Referer设置为拒绝。
- 使用Bucket Policy精细授权:对于需要授权的场景,优先使用Bucket Policy而非ACL,以便支持更灵活的条件控制。
- 子账号最小权限:为不同业务模块创建独立的子账号,仅授予必要的操作权限。
- 临时密钥替代永久密钥:在前端直传等场景中,使用临时密钥而非永久密钥。
- 开启日志与告警:配置访问日志和监控告警,及时发现异常。
- 定期安全审计:定期检查权限配置、密钥使用情况和访问日志。
七、常见问题解答
问:设置了防盗链白名单后,为什么我的网站仍然无法访问COS资源?
答:请检查白名单中配置的域名是否与请求的Referer完全匹配。COS采用前缀匹配规则,配置example.com可匹配https://example.com和http://example.com为前缀的地址。同时确认空Referer策略是否配置正确——如果浏览器直接打开链接,请求不带Referer,需要将空Referer设置为允许。另外,如果请求携带签名,则不会进行防盗链验证。
问:Bucket Policy和ACL同时配置时,哪个优先级更高?
答:COS遵循「显式拒绝优先」原则。如果任何一条策略(无论是ACL、Bucket Policy还是CAM策略)中存在显式拒绝(deny),该请求就会被拒绝。在全部为允许(allow)的情况下,只要任意一条策略允许,请求即可通过。
问:预签名URL的有效期最长可以设置多久?
答:使用永久密钥生成预签名URL时,有效期由签名有效期决定,理论上可以设置任意时长。使用临时密钥时,预签名URL的有效期为签名有效期和临时密钥有效期的较小值,而临时密钥的最长时效不超过36小时。
问:如何防止COS流量被恶意盗刷?
答:建议组合使用以下措施:将存储桶设置为私有读写;开启Referer防盗链并将空Referer设为拒绝;配置云监控告警实时感知流量异常;开启日志管理分析访问来源;如发现异常IP或域名,及时加入黑名单。
问:子账号访问COS时提示无权限,但主账号已经授权了,是什么原因?
答:请检查是否同时存在Bucket Policy中的显式拒绝策略。另外,跨账号授权场景中,需要主账号A授权主账号B,且主账号B授权其子账号,两者同时满足子账号才能访问。还需确认子账号是否已被添加到主账号的子账号列表中。
问:CDN加速域名和COS源站都配置了防盗链,以哪个为准?
答:请求会先经过CDN层,再回源到COS。因此优先执行CDN的防盗链配置,通过后再执行COS的防盗链规则。建议两侧配置保持一致,避免出现CDN放行但COS拦截,或CDN拦截但COS放行的不一致情况。




