他的回复:
结论先行:桶保持私有,用预签名 URL 分享,AK/SK 只留在自己这边。上面几位把原理讲得很全了,我补一个能直接照着落地的版本:三种签发方式的适用场景、‘签了名还打不开’的排查顺序,以及审计和止损分级。 一、三种签发方式,按场景选1. 一次性人工分享、没有后端:OBS 控制台进桶找到对象,在对象详情里生成临时 URL,设好过期时间后把链接发给对方。适合偶尔发一两个人,不适合批量。2. 命令行或脚本:自己机器上配好 obsutil 后执行 obsutil sign obs://桶名/对象路径 -e 1800,1800 是秒(30 分钟)。配置文件里有 AK/SK,千万别发给别人。3. 业务系统自动签发:对方先向你的业务接口申请下载(可先做登录身份校验和审批),后端再用 SDK 对 GetObject 签名,只把链接返回给对方。Python SDK 大致是:ObsClient(access_key_id=AK, secret_access_key=SK, server='obs.cn-north-4.myhuaweicloud.com'),再调 createSignedUrl('GetObject', '桶名', 'partner/report.pdf', expires=1800)。签发建议用专用 IAM 用户,只给该前缀的 obs:object:GetObject,不要用主账号 AK/SK。 二、有效期和权限粒度,按你的三个问题能控制的:一个对象 + 一个操作 + 一个过期时间。签 GetObject 只能下载,不能上传、删除、列桶;换个对象链接就失效。签名时带上 response-content-disposition=attachment,可以让浏览器强制下载而不是直接预览。控制不了的:链接本身不限人、不限 IP、不限次数,有效期内谁拿到都能下载,也能转发。需要限人、限次数、留审计记录,就走后端代理转发:对方先登录你的业务系统,后端校验完再从 OBS 取对象流式转发;固定合作方长期下载,则用桶策略或 IAM 策略给对方账号授予 obs:object:GetObject 并限定到具体前缀。时间给多少:内部临时分享 15~30 分钟足够,别默认给几天;文件大、对方外网下载慢时再适当放宽。 三、链接泄露了怎么止损(由轻到重)1. 等过期:短有效期本身就是止损,窗口只有十几分钟。2. 对象改名或换前缀:旧链接立即 404,最快最彻底,适合单个链接泄露。3. 轮换签发用的 AK/SK:该密钥签出的所有链接同时失效,适合大面积泄露,之后记得更新服务端配置并重发链接。4. 事前加固:敏感目录叠加桶策略 IP 白名单,泄露的链接在白名单外也打不开;敏感文件单独放一个前缀,出事只换这一个前缀。 四、签了名还打不开,先按这个顺序查(最容易漏)1. 先确认链接是不是过期了,有效期从签发时刻算;2. 用 curl -v 打开,看返回的错误码和响应头,先区分是签名问题还是权限问题;3. 检查签发 AK 的权限:有没有该对象的 GetObject,有没有被桶策略或 IAM 策略显式拒绝;4. 检查对象名和区域 endpoint 有没有写错,对象不存在时 OBS 也常返回 403 而不是 404;5. 走了 CDN 加速域名时确认 CDN 回源透传了签名参数,有些‘链接打不开’是 CDN 把 query 丢了;6. 前端直连下载要在桶的 CORS 规则里放行业务域名。 五、审计别忘开临时链接本身不留‘谁下载了’的记录。需要审计时,开启 OBS 访问日志或用云审计 CTS 记录签发和下载行为,至少能查到‘哪个 AK 在什么时候签发了哪个对象’。 一句话总结:一次性分享走控制台或 obsutil 生成短有效期预签名 URL;系统对接走后端 SDK 签发;固定合作方、敏感内部资料改用桶策略、IAM 精确授权或后端代理,桶始终保持私有。