对象存储桶被公开读取的风险与权限收敛:从默认私有开始
对象存储的数据泄露事件,绝大多数不是因为被攻破,而是因为权限被设成了公开可读。这类问题的特点是没有任何攻击痕迹,数据就那样一直对全网开放,直到被搜索引擎收录或被批量抓取才暴露。
桶为什么会变成公开的
第一条路径是为了图省事。开发阶段发现签名访问麻烦,直接把桶设为公开读,计划上线前改回来,然后忘了。
第二条路径是为了解决"图片显示不出来"。前端加载资源报权限错误时,把读权限放开是最快见效的处理方式,但它同时也放开了桶里其他所有对象。
第三条路径是权限策略写得过宽。为了让某个服务能访问,授权时把资源范围写成了全部对象、把来源写成了任意身份,实际效果等同于公开。
三条路径的共同点是:都是为了让功能先跑起来,而权限收敛这一步没有人回头去做。
公开读的实际后果
数据泄露是最直接的后果。桶里往往不只有需要公开的图片,还可能混着用户上传的文件、导出的报表、备份包、配置文件。只要能列出对象清单,全部内容都可被下载。
流量费用是第二个后果,而且经常被低估。公开的资源一旦被批量抓取或被他人直接引用,出方向流量会持续产生费用,账单可能在很短时间内异常升高。
被用作他人图床是第三种情况。资源被外部站点直接引用,流量成本由你承担,而你得不到任何收益。
收敛的起点是默认私有
正确的默认状态是私有,公开访问应当是经过判断的例外,而不是省事的起点。
对于确实需要公开的内容,比如网站的静态图片和样式文件,可行的做法是把它们与其他数据分桶存放。公开桶里只有确实该公开的内容,其他数据在私有桶中,这样即使公开桶的权限被放开,也不会牵连敏感数据。
分桶带来的额外好处是权限判断变简单了。不需要在同一个桶里区分哪些前缀该公开、哪些不该,出错的空间更小。
私有内容用签名访问
需要让特定用户临时下载私有对象时,使用带签名和有效期的临时链接,而不是把对象设为公开。链接过期后自动失效,不需要事后清理权限。
有效期要按实际需求设置。用于页面展示的链接可以短一些,用于用户下载大文件的链接留出足够时间。有效期过长等于变相公开,尤其是链接可能被转发或记录在日志里的时候。
关闭列出对象的权限
即使某些对象需要公开读取,也应当禁止列出对象清单。能列清单意味着攻击者可以枚举出全部文件名,进而下载所有内容;不能列清单时,只有已知确切路径的对象可被访问。
这一条经常被忽略,因为放开读权限时容易连带放开列举权限。检查时要把两者分开确认。
用防盗链限制引用来源
对于必须公开的静态资源,配置来源限制可以减少被他人直接引用的情况。只允许自己的域名引用,其他来源的请求被拒绝。
需要注意留出必要的例外。某些客户端不发送来源信息,如果规则设置为一律拒绝空来源,会导致部分正常访问失败。规则调整后要覆盖测试主要访问场景。
开启访问日志并定期看
访问日志的价值在于让异常可见。批量枚举、来自陌生来源的集中下载、访问量的突然跳升,都会在日志里留下痕迹。
不需要天天盯着,但应当为流量和请求数配置告警,出现异常时能被动收到通知。没有日志和告警的情况下,公开读带来的问题通常要等到账单出来才会被发现。
一次盘点该查什么
列出所有存储桶,逐个确认读写权限;确认哪些桶允许列出对象;检查权限策略里是否存在过宽的资源范围或来源范围;确认公开桶里的内容确实都可以公开;确认访问日志已开启且有流量告警。
这套盘点建议定期做,而不是只在出事后做一次。权限会随着需求变更被反复调整,一次收敛不代表长期安全。
怎么发现自己的桶已经公开了
不需要专门的工具,几个简单动作就能自查。
用一个未登录的环境直接访问对象地址。如果不带任何签名就能下载,说明该对象是公开可读的。注意要用无痕窗口或命令行,避免浏览器带上已有的登录状态造成误判。
尝试访问桶的根地址,看是否返回对象清单。能列出清单意味着风险等级更高,攻击者可以枚举全部文件。
在搜索引擎里用站点限定的方式搜索自己的存储域名,看有没有内容被收录。已被收录说明公开状态已经持续了一段时间,且内容已经扩散。
检查访问日志里有没有来源异常的批量下载。集中的顺序访问、来自陌生地址的大量请求,都是被抓取的迹象。
已经泄露之后怎么处理
发现公开之后,处理顺序影响最终损失。
第一步立刻收权限,把桶和对象改为私有。这一步优先做,因为泄露在持续。
第二步评估范围。列出被公开的对象清单,判断其中有哪些属于敏感内容。这决定了后续要不要通知受影响的用户。
第三步查访问记录。从日志判断这些对象实际被下载过多少次、来源分布如何。区分"被扫描器扫到但没下载"和"已被批量下载",处置力度不同。
第四步处理已扩散的内容。如果被搜索引擎收录,需要通过相应的移除流程申请下架;如果对象地址已经在外部流传,仅改权限不够,还应当更换对象路径,让旧地址彻底失效。
第五步复盘权限是怎么被放开的,并检查其他桶是否存在同样问题。这类配置往往不是孤立的,一个桶出问题,同批创建的其他桶大概率也一样。
腾讯云国际和阿里云国际商品当前开放;AWS 与 Google Cloud 商品目前未开放,本文不提供相关导流。权限模型、防盗链能力与日志功能均以对应国际站控制台实时信息为准。
官方来源
常见问题
对象存储桶被公开读取的风险与权限收敛需要注意什么?
操作前先确认账号属于国际云对应站点,并备份关键数据或记录当前配置。按本文步骤完成后做一次验证。需要账号可申请账号,续费见自助充值。
出错后如何快速回滚或止损?
优先恢复到变更前的快照、镜像或原规则;若涉及计费或销毁类操作,先停止继续变更,再按官方控制台状态与工单路径处理。不确定时不要反复点击高危按钮。
没有对应云账号时怎么开始?
可先通过申请账号开通国际云账号,再用自助充值完成额度准备。新账号建议先完成 MFA、访问密钥收敛与费用告警,再部署业务。