我被刷几万元的血泪经验。。。

程序员鱼皮

共 3882字,需浏览 8分钟

 ·

2024-04-12 01:29

大家好,我是程序员鱼皮。

曾经有一个无辜的程序员,他想要上线自己的网站给别人用。

他听说使用云服务可以很轻松地存储网站文件,于是他试了下,发现果真如此。

从那天起,他仿佛发现了一个新世界,云服务器、对象存储、CDN,一个个开箱即用的云产品,让他如沐春风、开发效率嘎嘎倍增。

他乐此不疲地用着各种云服务。直到有一天,记得那是一个风雨交加的夜晚,他收到了一条短信:“您的云账户已欠费 x 万元”。

那一刻,他发如雨下,终于意识到了:世道险恶,人心不古啊!使用云服务,就意味着有被小人攻击的风险。

没错,这位无辜的程序员就是在下。

我从大学开始做网站,至今 7 - 8 年了,经历过无数的网络攻击,也损失过数万元的米。但也正因如此,我积累了丰富的实战经验。

这篇文章鱼皮会以最容易造成大额损失的、按量计费的云服务 —— 对象存储和 CDN 为例,给大家分享一些安全使用云服务的方法,希望能帮助更多的开发者避坑。

友情提示:不要以为攻击不会发生在自己身上,建议读完这篇文章,不要让自己成为下一位 “无辜的程序员”。

如何安全使用云服务?

1、能不用就不用!

一定要根据自己的需求和实际情况选用云服务,不要为了用技术而用技术。

比如你做的是学习练手的项目或者免费网站,那么就慎用像对象存储、CDN 这种按量计费的服务。

的确,对象存储是很方便、CDN 能给网站加速,但真的有必要么?你服务器的带宽不足以支撑那点儿用户了么?不用 CDN 网站就要违背 8 秒原则了么?

8 秒原则是互联网的一个著名的原则:用户在访问网页时,如果时间超过 8 秒就会感到不耐烦;如果下载需要太长时间,他们就会放弃访问。

其实再加一点点成本给服务器增大带宽,也能提高网站的加载速度。

以前鱼皮就很喜欢用 CDN,觉得不给网站套 CDN 加速就浑身难受,但其实大多数网站没什么并发访问量,用了 CDN 也快不了多少,反而增加了成本和被攻击的风险。别跟我说什么 Cloudflare CDN,国内用免费版本堪称 “网站减速器”。

之前也给大家推荐过一些免费的网站部署服务,像 Vercel、GitHub Pages、Railway 等等,都是省成本的好方法,可以试试。但是一旦部署到这些平台的网站被攻击,平台大概率会把你封号。毕竟他们没必要关注谁是攻击者,只要你的服务产生了流量,把你的服务和账号封了,也算是解决问题了。

2、保护好唯一标识!

唯一标识是一个比较广泛的定义,对于不同的云服务,唯一标识也不同。

  • 云服务器:服务器的 IP
  • 对象存储:对象存储的存储桶名称
  • CDN:CDN 服务的域名
  • 开发者账号:accessKey
  • 应用:appId

这点非常重要,因为大多数云服务的唯一标识是 不可更改的 ,一旦暴露给攻击者,他就可以一直打你。

比如知道了你的服务器 IP,就可以对服务器进行 DDOS 攻击;知道了对象存储的桶名,就能够拼接出对象存储的域名,然后刷你的流量。

有同学会问了,服务器的 IP 不是通过网站的请求或者 DNS 解析就能看到么?

如果你的网站部署在单台服务器,那的确是这样,但如果你背后接了负载均衡服务(服务器集群)或者 CDN,那么得到的 IP 可能是动态变化的,攻击者无法直接攻击到背后的某台服务器。

所以,一定要保护好服务的唯一标识,不要主动暴露!

3、严格控制权限

尽量遵循 “最小权限原则”,默认关闭全部权限,然后根据需要逐个放开。

比如使用对象存储服务,控制权限的方法有:存储桶访问权限设置、防盗链设置、按需分配权限等。

1)在创建存储桶的时候,就要将权限设置为 “私有读写”。如果需要给团队成员开放权限,尽量使用子账号,不要直接把自己的主账号分享出去。

2)防盗链设置,拒绝空 Referer,并且只添加自己网站的域名到白名单中。

3)按需配置权限。比如存储桶内有很多目录,可以只允许特定的用户公开读取其中一部分目录(比如公开的图片)。

4、配置监控告警

前面提到的策略是为了防止受到攻击,但如果真的出现了攻击,我们一定要在第一时间能够收到 “被攻击” 的通知,而不是直接收到 “欠费” 通知。

所以每个云服务,都必须配置监控告警,而且一定要综合考虑多种维度和告警策略,不能随便配置一条就完事。

比如可以配置多个指标的组合,服务错误、流量过大、或者客户端错误请求过多时,都会进行告警。

在之前我出了被刷量的那个事情后,给腾讯云官方提了不少改进建议,官方也是做出了改进,现在创建桶时就会提醒你告警,这点我觉得非常 nice~

值得一提的是,官方还补充了一条公告,说对象存储已经自动支持流量防盗刷功能了:

emmm,无论是真是假,还是建议大家手动配置下权限和告警吧,双保险。

5、紧急管控措施

如果我们通过告警发现云服务正在被攻击,其实可以采取一些紧急的措施来防止损失继续扩大。

比如。。。关闭服务!

别笑,如果你服务继续运行的收益还不如被攻击的损失,临时关闭服务可能是最好的选择,打不过就战术撤退~

一般云服务平台都提供了限制或封禁攻击的手段,比如 IP 黑白名单、IP 访问限频、禁止某区域用户访问、禁止某些请求等。

如果你要使用对象存储,一定不要直接使用对象存储的域名,而是使用 CDN 域名来访问存储桶。因为 CDN 不仅提供的能力更多,还可以保护对象存储(源站)的地址。

当然了,CDN 本身一样可以被攻击,所以也要做好上述防护措施。其中,必须要配置 IP 访问限频,而且如果面向国内用户的项目,建议直接封禁国外地域的访问。

6、存储迁移

这一点我相信 90% 以上的同学没有经验。

举一个之前我遇到的场景吧,有攻击者持续请求某个对象存储桶来刷流量。被我发现后,很快禁止了他的访问,他的所有请求都变成了 403 Forbidden(被服务器拒绝)。

结果你猜怎么着?他依然持续不断地发送请求。

天坑的是,对象存储服务的计费不仅有流量,也会按照请求数计费!也就是说,即使把攻击者的请求全部拒绝了,只要他继续请求,依然会对我造成损失!

对了,还有个值得分享的经历,为了查询出攻击者的 IP,需要给对象存储开通日志记录功能。但你猜怎么着?日志文件是存储在你自己的对象存储桶内的,也就是说,攻击者的每次请求,都相当于在给你的存储桶写入文件!好家伙,被刷个几天,日志的数量比正常的文件都多!而且日志存储也是要计费的哦~

我也咨询过客服,这种情况下怎么办?就让他一直刷?

客服给出的解决方案是:存储迁移。

也就是说,换一个新的桶名,不要让攻击者知道就可以了。

嗯,的确是一种解决方案,虽然代价有点大。

所以再次强调,对象存储的桶名不要泄露!保护好服务的唯一标识!

7、按需充值

大白话:不要一次性给云账户充太多!

因为网络攻击这件事防不胜防,即使你配置了告警,但也不是完全可控的。假如凌晨 3 点给我发了短信告警,还是得第二天才能看到,说不定为时已晚。

这个时候,如果账户还有余额,就会接着扣除;如果欠费了,就不会继续扣除了,能够更快地发现问题、及时止损。



以上就是本期分享。最后再次强调,不要以为网络攻击不会发生在自己身上,90% 的 Bug 都来源于自信,攻击者盯上你根本不需要理由。

👇🏻 点击下方阅读原文,获取鱼皮往期编程干货。

往期推荐

春招,启动!

唉,新项目内测延期了。。我的一点思考

为什么你理解不了 HTTPS?

鼠鼠我啊,有工作了!

我用这个技术,干掉几千行 if else!

只知道 Nginx 牛逼!却不知道它怎么支持百万并发?

浏览 12
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报