如何防止 CDN 带宽滥用并缓解 AWS 账单激增

几周前,我一位客户的 AWS 账单显示,前一天的费用比本周早些时候上涨了 20%。因为之前已经遇到过几次 AWS 账单问题,我一直紧盯着 AWS 资源消耗和账单的任何异常增长。初步分析后,我认为是 CloudFront 带宽消耗增加导致的。平时每天的 CloudFront 带宽消耗大约是 950 GB,那天却飙到了约 1600 GB。考虑到过去偶尔也有类似增长,我当时推测,可能是某些内容(博客文章、照片或视频)爆红,或者某个营销活动效果特别好。

流量激增后的第二天,我观察到带宽消耗大约是 1300 GB。很快又想,可能之前爆红的内容已经慢慢冷却了。然而到了第三天,CDN 带宽消耗飙到了约 3700 GB。按每 GB 数据传输成本 0.109 美元计算,这意味着每天要多花 300 美元。这个增长幅度足够大,让我立刻着手调查带宽消耗激增的原因。

在 CloudWatch 上按小时查看 CDN 分发的带宽消耗时,发现带宽出现了突然的波动。如果是病毒式营销活动,带宽不应该下降得这么剧烈。这是第一次怀疑,有人在试图滥用某个 CDN 端点。

CDN 端点带宽滥用
CDN 端点带宽消耗(按小时计)

速率限制器

一个立竿见影的解决方案,是给相关的 CDN 分发部署基于 AWS WAF 的速率限制器(限制每个 IP 地址每 5 分钟的请求数)。这确实降低了我们的数据传输量。到这一步,我们以为问题应该已经解决了。

然而,实施这项变更大约 8 小时后,我开始发现 CDN 端点数据传输带宽消耗的模式变了。仔细观察这一趋势后,发现那些滥用 CDN 端点的人,在达到速率限制后,现在会等待几分钟再继续。

设置了速率限制器后,CDN 端点带宽滥用问题依然存在
设置了速率限制器后,CDN 端点带宽滥用问题依然存在

由此可见,有人是在蓄意且有系统地试图滥用我们的 CDN 端点。这意味着我们可能需要加强安全防护,并密切关注未来几天和几周内滥用行为的变化。

CDN 访问日志

为了解发送到 CDN 端点的请求到底是什么性质,我启用了 CDN 的访问日志几分钟。我们把部分日志加载到表格里,以便做更深入的分析:

CDN 访问日志
CDN 访问日志

通过筛选这些日志,只保留被 AWS WAF 速率限制器阻止的请求,我了解到以下信息:

  • 滥用者通过某个特定的公共 API 端点拿到了有效的静态资源 URL,并在这些(数量相对较多的)静态资源 URL 之间循环使用。
  • 滥用者利用的是谷歌云(孟买)的基础设施来获取数据。
  • 滥用者用的是 node-fetch(UserAgent : undici)来获取数据。

用户代理

为了争取一些时间,我屏蔽了用户代理 undici。因为我预计网站的真实用户不会用 node-fetch,所以执行起来很简单。但不出所料,攻击者把 UserAgent 改成了常用字符串,让我没法再基于这个 UserAgent 字符串屏蔽请求。

IP 地址

为了争取更多时间,我屏蔽了发出请求的特定 IP 地址。这导致我和攻击者之间展开了一场猫捉老鼠的游戏,因为攻击者不断更换被屏蔽的 IP 地址。不过,有了速率限制器和 IP 地址屏蔽,我争取到了足够的时间,来制定长期的防范机制,防止这类滥用行为。

长期保障措施

我为防止这类(以及未来可能发生的)滥用行为而采取的长期保障措施,是屏蔽来自各个云服务提供商的所有请求。相关的 CDN 端点用于向访客浏览器和应用请求提供静态文件,所以我们预计不会有来自 AWS、GCP、Azure 等的真实访客请求。因此,屏蔽来自各个云服务提供商的请求,不会影响我们的自然流量。但这可能会屏蔽以下请求:

  • 我努力响应各种搜索引擎机器人的请求,以便让我们的内容被搜索索引。
  • 我使用的一些自动化工具和服务(可能托管在云基础设施上)。

为了实施上述方法,我做了以下工作:

  • 主流云服务提供商会公布其基础设施的 IP 地址范围(例如:AWS、GCP、Azure、DigitalOcean)。我已经屏蔽了这些 CIDR。
  • 主流搜索引擎机器人会公布它们的 IP 地址范围(例如:GoogleBot、BingBot)。我已经把这些 IP 地址加入白名单。
  • 我还把使用的服务和自动化工具的 IP 地址列入了白名单。

除了上述措施,我还设置了 AWS CloudWatch 警报(每小时请求数、每小时下载字节数),用来捕获任何可能突破安全防护的滥用行为。此外,我仍然启用 AWS WAF 速率限制。

局限性

在上述保障措施到位后,我还没有再发现滥用者出现。不过,我们目前也意识到这些保障措施存在以下局限性,未来会努力解决:

  • 滥用者可能利用了尚未屏蔽的云服务提供商。我希望靠警报系统检测到这类滥用行为,从而扩充黑名单 IP 地址范围。
  • 我们需要定期更新黑名单和白名单里的 IP 地址范围。我目前正在寻找自动化这个流程的方法(欢迎提建议)。

结论

基于使用量的计费方式,一个局限就是账单金额可能会出现波动。限制这类波动的一种方法,是给每个公共端点设置一定的速率限制,避免滥用(在静态响应的情况下)或拒绝服务(在非静态响应的情况下)。

此外,防止在野外运行的脚本滥用我们公共端点的一种方法,是让它们无法从各种云提供商的基础设施访问。

THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容