大家好,我是程序员鱼皮。
曾经有一个无辜的程序员,他想要上线自己的网站给别人用。
他听说使用云服务可以很轻松地存储网站文件,于是他试了下,发现果真如此。
从那天起,他仿佛发现了一个新世界,云服务器、对象存储、CDN,一个个开箱即用的云产品,让他如沐春风、开发效率嘎嘎倍增。
他乐此不疲地用着各种云服务。直到有一天,记得那是一个风雨交加的夜晚,他收到了一条短信:“您的云账户已欠费 x 万元”。
那一刻,他发如雨下,终于意识到了:世道险恶,人心不古啊!使用云服务,就意味着有被小人攻击的风险。
没错,这位无辜的程序员就是在下。
我从大学开始做网站,至今 7 - 8 年了,经历过无数的网络攻击,也损失过数万元的米。但也正因如此,我积累了丰富的实战经验。
这篇文章鱼皮会以最容易造成大额损失的、按量计费的云服务 —— 对象存储和 CDN 为例,给大家分享一些安全使用云服务的方法,希望能帮助更多的开发者避坑。
友情提示:不要以为攻击不会发生在自己身上,建议读完这篇文章,不要让自己成为下一位 “无辜的程序员”。
一定要根据自己的需求和实际情况选用云服务,不要为了用技术而用技术。
比如你做的是学习练手的项目或者免费网站,那么就慎用像对象存储、CDN 这种按量计费的服务。
的确,对象存储是很方便、CDN 能给网站加速,但真的有必要么?你服务器的带宽不足以支撑那点儿用户了么?不用 CDN 网站就要违背 8 秒原则了么?
8 秒原则是互联网的一个著名的原则:用户在访问网页时,如果时间超过 8 秒就会感到不耐烦;如果下载需要太长时间,他们就会放弃访问。
其实再加一点点成本给服务器增大带宽,也能提高网站的加载速度。
以前鱼皮就很喜欢用 CDN,觉得不给网站套 CDN 加速就浑身难受,但其实大多数网站没什么并发访问量,用了 CDN 也快不了多少,反而增加了成本和被攻击的风险。别跟我说什么 Cloudflare CDN,国内用免费版本堪称 “网站减速器”。
之前也给大家推荐过一些免费的网站部署服务,像 Vercel、GitHub Pages、Railway 等等,都是省成本的好方法,可以试试。但是一旦部署到这些平台的网站被攻击,平台大概率会把你封号。毕竟他们没必要关注谁是攻击者,只要你的服务产生了流量,把你的服务和账号封了,也算是解决问题了。
唯一标识是一个比较广泛的定义,对于不同的云服务,唯一标识也不同。
这点非常重要,因为大多数云服务的唯一标识是 不可更改的 ,一旦暴露给攻击者,他就可以一直打你。
比如知道了你的服务器 IP,就可以对服务器进行 DDOS 攻击;知道了对象存储的桶名,就能够拼接出对象存储的域名,然后刷你的流量。
有同学会问了,服务器的 IP 不是通过网站的请求或者 DNS 解析就能看到么?
如果你的网站部署在单台服务器,那的确是这样,但如果你背后接了负载均衡服务(服务器集群)或者 CDN,那么得到的 IP 可能是动态变化的,攻击者无法直接攻击到背后的某台服务器。
所以,一定要保护好服务的唯一标识,不要主动暴露!
尽量遵循 “最小权限原则”,默认关闭全部权限,然后根据需要逐个放开。
比如使用对象存储服务,控制权限的方法有:存储桶访问权限设置、防盗链设置、按需分配权限等。
1)在创建存储桶的时候,就要将权限设置为 “私有读写”。如果需要给团队成员开放权限,尽量使用子账号,不要直接把自己的主账号分享出去。
2)防盗链设置,拒绝空 Referer,并且只添加自己网站的域名到白名单中。
3)按需配置权限。比如存储桶内有很多目录,可以只允许特定的用户公开读取其中一部分目录(比如公开的图片)。
前面提到的策略是为了防止受到攻击,但如果真的出现了攻击,我们一定要在第一时间能够收到 “被攻击” 的通知,而不是直接收到 “欠费” 通知。
所以每个云服务,都必须配置监控告警,而且一定要综合考虑多种维度和告警策略,不能随便配置一条就完事。
比如可以配置多个指标的组合,服务错误、流量过大、或者客户端错误请求过多时,都会进行告警。
在之前我出了被刷量的那个事情后,给腾讯云官方提了不少改进建议,官方也是做出了改进,现在创建桶时就会提醒你告警,这点我觉得非常 nice~
值得一提的是,官方还补充了一条公告,说对象存储已经自动支持流量防盗刷功能了:
emmm,无论是真是假,还是建议大家手动配置下权限和告警吧,双保险。
如果我们通过告警发现云服务正在被攻击,其实可以采取一些紧急的措施来防止损失继续扩大。
比如。。。关闭服务!
别笑,如果你服务继续运行的收益还不如被攻击的损失,临时关闭服务可能是最好的选择,打不过就战术撤退~
一般云服务平台都提供了限制或封禁攻击的手段,比如 IP 黑白名单、IP 访问限频、禁止某区域用户访问、禁止某些请求等。
如果你要使用对象存储,一定不要直接使用对象存储的域名,而是使用 CDN 域名来访问存储桶。因为 CDN 不仅提供的能力更多,还可以保护对象存储(源站)的地址。
当然了,CDN 本身一样可以被攻击,所以也要做好上述防护措施。其中,必须要配置 IP 访问限频,而且如果面向国内用户的项目,建议直接封禁国外地域的访问。
这一点我相信 90% 以上的同学没有经验。
举一个之前我遇到的场景吧,有攻击者持续请求某个对象存储桶来刷流量。被我发现后,很快禁止了他的访问,他的所有请求都变成了 403 Forbidden(被服务器拒绝)。
结果你猜怎么着?他依然持续不断地发送请求。
天坑的是,对象存储服务的计费不仅有流量,也会按照请求数计费!也就是说,即使把攻击者的请求全部拒绝了,只要他继续请求,依然会对我造成损失!
对了,还有个值得分享的经历,为了查询出攻击者的 IP,需要给对象存储开通日志记录功能。但你猜怎么着?日志文件是存储在你自己的对象存储桶内的,也就是说,攻击者的每次请求,都相当于在给你的存储桶写入文件!好家伙,被刷个几天,日志的数量比正常的文件都多!而且日志存储也是要计费的哦~
我也咨询过客服,这种情况下怎么办?就让他一直刷?
客服给出的解决方案是:存储迁移。
也就是说,换一个新的桶名,不要让攻击者知道就可以了。
嗯,的确是一种解决方案,虽然代价有点大。
所以再次强调,对象存储的桶名不要泄露!保护好服务的唯一标识!
大白话:不要一次性给云账户充太多!
因为网络攻击这件事防不胜防,即使你配置了告警,但也不是完全可控的。假如凌晨 3 点给我发了短信告警,还是得第二天才能看到,说不定为时已晚。
这个时候,如果账户还有余额,就会接着扣除;如果欠费了,就不会继续扣除了,能够更快地发现问题、及时止损。
以上就是本期分享。最后再次强调,不要以为网络攻击不会发生在自己身上,90% 的 Bug 都来源于自信,攻击者盯上你根本不需要理由。
👇🏻 点击下方阅读原文,获取鱼皮往期编程干货。
往期推荐
春招,启动!
唉,新项目内测延期了。。我的一点思考
为什么你理解不了 HTTPS?
鼠鼠我啊,有工作了!
我用这个技术,干掉几千行 if else!