有关 OSS 开放公共读是否会造成多余流量风险

2022-05-31 16:18:15 +08:00
 LeeReamond

个人项目使用 OSS 归档,开了个低频读写实例,因为数据量较大自己构建稳定同步还挺麻烦的,低频 OSS 很好地解决了这方面的问题。

目前有一个疑惑就是,为了方便业务代码开发,OSS 设置为了写入需要权限,任何人都可以读取,想问一下一般来讲现在网上是否有爬虫扫描,或者 oss 官方有接口可以查看到泄露的文件,导致出站流量被匿名第三方刷爆的风险?

目前情况是,文件名比较长,内部加入了 hash ,第三方纯靠猜不太可能直接猜到文件名。文件敏感度也没那么高,理论上被别人看到也不会有啥严重问题,希望达到的效果是,在不被特别恶意针对的情况下,按照目前的策略(公共读,但是文件名比较难猜)是否可以确保大致上的流量安全? v 友们有类似部署的经验吗?

顺带问一下目前用的是阿里云 oss ,看面板统计信息疑惑是不是上传不计公网流量。印象里以前看计费文档的时候看到过好像是这样的,但是刚才重新找了一遍没找到原来看到的地方

2163 次点击
所在节点    问与答
17 条回复
yEhwG10ZJa83067x
2022-05-31 16:20:59 +08:00
可能性不大
gam2046
2022-05-31 16:22:55 +08:00
阿里云可以设置消费预警,或者账户余额就留 10 块钱,超出了也就停了。

另外 oss 对于流入流量(即上传到 OSS )是不计费的。仅计算流出流量(从 OSS 下载)费用和存储费用。

如果网络条件还可以,可以考虑 Cloudflare R2 ,流量费用全免,仅需支付存储费用,大概折合人民币,120 元左右 /月 /TB
ch2
2022-05-31 16:31:22 +08:00
你不在别的地方公开,不会有那么闲得无聊的人的
eason1874
2022-05-31 16:35:20 +08:00
Bucket 公共读权限包括 List ,文件名可以遍历出来,不用猜

想要永久开放链接,可以把 Bucket 设为私有读写,然后文件上传后通过 Object ACL 将文件设为公共读,又或者给文件生成数十年有效期的签名链接

会不会被刷流量,其实看运气,有时候不是恶意针对,仅仅是因为某些傻缺爬虫反复抓取也会花掉你几百块,还是得靠欠费预警什么的人工控制
cominghome
2022-05-31 16:44:39 +08:00
不是开了什么静态网站托管这种服务的话,建议关掉公共读,改用 ACL 规则,开放指定目录的 GetObject 权限
LeeReamond
2022-05-31 18:17:52 +08:00
@eason1874
@cominghome 搜索了一下关键字 ACL ,似乎就是权限控制的意思,现在默认是对整个 bucket 进行 acl ,设置为读无限写保护。如果我没理解错的话,两位的意思是说有个 object 粒度的 acl 的 api ,操作方式是将 bucket 设置为读写都需要权限,然后上传文件后单独对文件授权 object 随意读,这样可以避免 list 被读的问题?
LeeReamond
2022-05-31 18:20:34 +08:00
@gam2046 阿里云也不是很贵,我开了个最便宜的美东机器,日常单次传输是类似图片大小的文件,感觉速度也够用,储存费用是 1T10 美元,我的场景是归档储存内容量很大,实际读取流量很少
eason1874
2022-05-31 18:29:24 +08:00
@LeeReamond 对,ACL 是权限控制配置,Object 默认继承 Bucket 的配置,也可以单独配置。可以通过 API 修改,也可以在控制台修改。具体配置语法看文档,文档里有例子

#5 说的操作起来更简单,你可以直接改 Bucket 的 ACL ,向匿名用户只开放 GetObject 和 HeadObject ,那就不怕被 ListObjects 了
cominghome
2022-05-31 20:30:13 +08:00
@LeeReamond 对象存储的权限优先级是这样的,1.桶的全局权限<2.桶级别的 ACL 策略<3.对象本身 ACL

把桶设置为公共读是开在了 1 这一级
我建议的操作是在 2 这一级别做
3 一般是在代码里配置,针对文件单独设置,起到一个保护性作用(避免隐秘文件因继承了上一级的 ACL 被错误地公开)
Seanfuck
2022-05-31 20:39:51 +08:00
读的话,api 有个 STS 临时签名,可以拼到 url 里也可以放 header 里,就是有一大大大串字符串,挺难用的。。。。
yaoyao1128
2022-05-31 20:49:23 +08:00
可能,但是现在我搭的下载 一个月出的流量最多也就 60g 所以感觉还好
可以考虑套 cdn 解决或者限制访问 ip 的方式……
kingjpa
2022-05-31 21:17:16 +08:00
除了恶意,大概率不会。
别被爬虫盯上,曾经做过二手房系统,流量一天几万 ip ,我还挺高兴。
后来发现全是爬虫。真实 ip 连几十都没有. 后来网站都关了, 这些脚本还在不断请求
xxxxxxxxxxxxx
2022-06-01 11:56:28 +08:00
楼上朋友提到的消费预警,并不是很靠谱,因为阿里云的产品计费有一个周期,并不是实时的,像 OSS 就是一个小时、两个小时出一次账单。如果真的被攻击,你收到账单的时候可能就已经欠费一大堆了。你可以搜一下 OSS 盗刷。

如果不是托管了静态网站,建议还是改为私有。不用签名鉴权,坚持设置公共读的话,还是建议增加预警措施。

一个是云监控,监控请求次数和流出带宽、流出流量之类的,另外一个是日志告警。两个方案中,日志告警更具有实时性;两个都可以设置 webhook ,告警的时候进行回调操作,比如到了某个阈值就直接把 Bucket 或者文件的权限改为私有。要点就是,一旦发现风险,立即阻断。
LeeReamond
2022-06-16 23:46:29 +08:00
@eason1874
@cominghome
@kingjpa
@xxxxxxxxxxxxx 大佬们,再问一下,oss 有办法以我要求的权限进行鉴权分发吗?比如想实现的效果是,一个静态资源,登录了的用户才能访问,不登录用户看不了。看了一下 acl 的文档似乎只能控制所有人都能访问或者只有后端能访问,但是如果需要后端中转一层的话就失去 oss 帮助减轻分发压力的优势了。。
cominghome
2022-06-17 09:17:05 +08:00
@LeeReamond 不套一层代理的话是做不到的,因为 AWS 取不到你的 cookie ,不在一个域里。
只能通过预签名实现类似的效果,比如在请求资源之前先请求后端做一个校验,符合要求的话就重定向到被请求资源的预签名 url ,这个预签名的时间可以设短一点
eason1874
2022-06-17 09:56:41 +08:00
@LeeReamond 可以用签名来鉴权。存储桶和对象私有,通过域名+对象路径无法访问,而登录用户,你的后端给他们返回带签名的 OSS 链接,他们可以访问

需要注意的是,签名链接并不知道用户有没有登录,拿到链接的人都可以访问。所以你签名除了设置合理的有效期,最好把用户 IP 加进去 x-oss-ac-source-ip ,确保用户把链接发出去别人也访问不了(但不要缓存签名链接,大部分用户没有公网 IP ,每隔一段时间 IP 会变的)

对象存储 OSS>API 参考>访问控制>在 URL 中包含签名 https://help.aliyun.com/document_detail/31952.html
LeeReamond
2022-06-17 23:48:57 +08:00
@cominghome
@eason1874 谢谢,两位提供的方案都很有操作性

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/856477

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX