不想把 OBS 桶设成公共读:预签名 URL 与 CDN 回源的临时授权下载做法
把对象存储 OBS 的桶设成公共读,是最省事、也最危险的做法:任何人拿到对象地址都能直接访问,链接一旦被转发或爬取,流量费用和内容泄露的风险就不再受自己控制。更稳妥的做法是桶保持私有,只在需要的时候给某一个对象、某一个人发一张有时效的临时通行证。本文介绍两种最常用的做法:预签名 URL 和 CDN 回源,并给出选型、实现要点和排查清单。
一、先定原则:桶私有,访问临时授权
新建桶默认私有,这是最安全的起点。临时分享、对外下载、静态资源分发,都不应该靠放开整桶来解决。判断该用哪种方式,先看两个问题:第一,访问者是不是确定的少数人、访问有没有明确的结束时间;第二,资源是不是要被大量陌生用户反复访问。如果是前者,用预签名 URL;如果是后者,用 CDN 回源加防盗链。两种方式可以并存:桶始终私有,后端负责签发,前端和 CDN 只拿到有限的访问能力。
二、预签名 URL:给单个对象发临时链接
预签名 URL 是在服务端用有权限的凭证,对某一个对象的 GET 请求做签名后生成的链接,链接里带有签名参数和过期时间。过期后链接自动失效,不需要再去改桶策略。生成链接的凭证只保存在服务端,绝不能写进前端页面、小程序或公开代码里,否则等于把桶的钥匙交了出去。
用 S3 兼容接口生成下载链接的思路如下,Endpoint 和区域要与桶一致:
import boto3
s3 = boto3.client(
"s3",
endpoint_url="https://obs.cn-north-4.myhuaweicloud.com",
aws_access_key_id="你的AK",
aws_secret_access_key="你的SK",
)
url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": "mybucket", "Key": "docs/report.pdf"},
ExpiresIn=600,
)
有效期要按业务定,不要图省事设成几天。内部审批用的文件,十分钟到一小时通常够用;发给客户的资料,可以按天计算,但要同时限制只能下载指定对象。生成链接前,先在服务端核对当前登录用户有没有权限访问这个对象,不要只靠链接难猜来保护内容。下载完成后如果发现链接被转发,最快的止损办法是让链接过期,而不是匆忙改桶策略影响正常业务。
三、CDN 回源:公开静态资源走 CDN,桶不直接暴露
图片、视频、安装包、官网静态资源这类需要长期公开访问的内容,适合走 CDN。用户访问的是 CDN 域名,CDN 回源到 OBS 取内容,桶本身仍然保持私有或只对 CDN 回源授权。这样做的好处有三点:一是 CDN 节点离用户更近,访问更快;二是可以在 CDN 上做缓存和防盗链,避免源站被直接刷流量;三是出问题时先在 CDN 侧限流和换域名,源站不用频繁改动。
配置时要注意三个对应关系。第一,回源地址要填对:静态网站托管和直接访问对象是两回事,填错会出现回源 403 或 404,而桶策略本身可能并没有问题。第二,缓存规则要按文件类型区分:版本号不变的静态文件可以缓存久一点,经常更新的页面和接口结果不要缓存。第三,防盗链要配 Referer 白名单,只放行自己的域名;同时不要把防盗链当成唯一的权限控制,真正敏感的文件还是要用预签名 URL。
四、分享和前端使用时的四个细节
第一,控制台里复制的对象链接需要登录鉴权,发给外部人员打不开是正常现象,不是权限坏了,临时分享要用预签名链接,长期公开资源再走 CDN。第二,浏览器直传或前端直接读取对象时,要先配 CORS,放行具体的来源、方法和请求头;来源不要图省事写星号又带凭证。第三,上传时按文件扩展名显式设置 Content-Type,否则图片可能被浏览器当成下载文件处理。第四,对象名里不要放手机号、令牌等敏感信息,也不要只用空格和中文混用,避免不同 SDK 编码不一致导致按名找不到对象。
五、出问题时的排查顺序
访问被拒绝时,不要只改桶策略,按凭证、IAM 权限、桶策略、对象权限的顺序逐层查,同时核对 Endpoint、区域和客户端时间。签名报错多半是时间偏差、凭证换了环境或区域写错,先用最小的上传下载例子验证。链接打不开时,先确认是预签名过期、CDN 回源配置错误,还是 CORS 没有放行;贴出完整报错原文、区域、对象 Key 和操作时间,别人才能快速定位。费用异常时,先看存储量、请求次数和公网流出流量这三类,再看是哪个前缀、哪类请求在涨。
结语
一句话总结:桶保持私有是底线,临时访问用预签名 URL,公开静态资源用 CDN 回源加防盗链。先在测试桶里把上传、下载、分享、过期这条链路完整走一遍,再把规则用到正式桶上,新手最容易踩的整桶公共读、链接长期有效、凭证下放到前端这三类问题,基本可以避开。
- 点赞
- 收藏
- 关注作者
评论(0)