不想把 OBS 桶设成公共读:预签名 URL 与 CDN 回源的临时授权下载做法

举报
yd_276656611 发表于 2026/10/29 10:02:35 2026/10/29
【摘要】 桶保持私有是底线:临时访问用预签名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 回源加防盗链。先在测试桶里把上传、下载、分享、过期这条链路完整走一遍,再把规则用到正式桶上,新手最容易踩的整桶公共读、链接长期有效、凭证下放到前端这三类问题,基本可以避开。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。