记录阿里云 OSS 第一次受到流量攻击

自今年 3 月起静态博客开始托管在阿里云的 OSS 对象存储上,香港节点无需 ICP 备案而且速度尚可,从大陆访问比 GitHub Pages 和 Cloudflare 稳定很多。主站因为备案要求不能放在大陆,字体、图片之类的资源文件不使用自定义域名则无此限制,所以为提升国内访问速度都被托管在阿里云杭州节点的 OSS 上。

OSS 的流量费用并不廉价,为规避可能的账单风险提前用云监控设置过访问规则,当每分钟流量超过200MB时触发报警,自动调用函数计算关闭 OSS 对外服务。我这样的小站点,监控用量、临时关站是应对低成本流量攻击最适合的策略。

报警

昨天中午突然收到阿里云的报警短信:

Aliyun warning sms

意识到预想中的情况发生了,拿出手机打开博客果然无法访问,倒是长舒一口气,看来提前配置的监控策略已经成功关闭 OSS 对外服务。

解析

去阿里云控制台翻看日志,发现在 12:19 ~ 12:25 的 6 分钟内对同一个字体文件有 62 万次请求:

Aliyun most requested resource

主要来自 4 个北美/德国的 IP 地址:

Aliyun top client ip

橘红色代表成功请求,绿色代表失败请求,可以看到在一个时间点后失败陡增,即 OSS 开始关闭对外服务:

Aliyun request timeline

结合阿里云提供的访问数据整理出以分钟为单位的时间线:

时间 成功请求数 失败请求数 公网流出流量
12:19~12:20 89 0 5.3MB
12:20~12:21 4700 0 2.2GB
12:21~12:22 36455 0 17.0GB
12:22~12:23 46944 7 21.8GB
12:23~12:24 27255 339730 12.7GB
12:24~12:25 2 172155 0.4MB
12:25~12:25 4 2 0MB

从表格看,12:20 ~ 12:21 公网流出流量超出阈值,但直到 12:23 ~ 12:24 才出现大量失败请求,与短信显示的报警时间 12:23:19 吻合。查询触发的函数计算日志,是在 12:23:26 执行关闭 OSS 对外服务。

显然,报警时间晚了 2 分钟。我在云监控中设置的粒度单位是分钟,本应该在 12:21 ~ 12:22 触发报警,事实证明被寄予厚望的云监控也并非实时,耸肩。

总结起来,源自国外多个 IP 的攻击持续 5 分钟,前 3 分钟畅通无阻,共 62 万次请求,其中 11 万次成功,消耗 53GB 流量和对应的 25 元账单。这种家庭网络就能轻易发起的流量攻击对普通博主的成本伤害是挺大的,商业带宽并不廉价,接入网络需要谨慎配置监控策略,小心成为“一晚上被盗刷一套房”的都市传说主角。

arrow_upward