====================== == fabulous.systems == ====================== Welcome to the world of fabulous.systems Start. Archive. Tags. Search. RSS. Join the fabulous.community.

The Day Anubis Saved Our Websites From a DDoS Attack

2025-05-01 14:00:00 #bts #sysops #webdev 我在 ScummVM 项目中的一项工作是帮助保持服务器基础设施的正常运行,包括我们的主服务器,该服务器托管我们的网站、wiki、论坛和一些内部应用程序。

大约三周前,我开始收到监控通知,指示 MariaDB 服务器上的负载增加。 这本身没什么不寻常的。 它通常仅仅意味着新访客的突然涌入,在大多数情况下,只是某个链接在某处被共享或单个 IP 试图惹恼我们。

通知出现后又迅速消失。 我开始查看我们的 Web 服务器的日志文件,并没有注意到任何太不寻常的东西,也许只是一些背景噪音。 这种情况持续了几天,没有严重影响我们的服务器或可访问性——只是比平时慢了一点。

然后网站崩溃了。

我们使用由 Apache2、PHP-FPM 和 MariaDB 组成的堆栈来托管 Web 应用程序。 服务器日志显示一切都已饱和。 Apache2 拒绝接受新连接,PHP-FPM 池已完全填满,并且 MariaDB 也已没有剩余连接。

现在,是时候弄清楚发生了什么事了。 希望只是一个 IP 试图惹恼我们,我打开了当天的访问日志,并看到了以下内容:

127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=30&from=20250417123108&hidemyself=1&limit=500&target=Lure_of_the_Temptress&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6366 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/16.0.843.0 Safari/534.2"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?from=20250417205327&hidemyself=0&limit=100&target=California_Pacific_Computer_Company&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6363 "-" "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 4.0; Trident/3.1)"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=30&from=20250410022141&hidebots=0&hideliu=1&hideminor=1&target=The_Big_Red_Adventure&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6368 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_3; rv:1.9.4.20) Gecko/8520-08-18 14:24:31.076782 Firefox/3.8"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=1&from=20250424060651&fromFormatted=06%3A06%2C+24+April+2025&hideminor=1&limit=100&target=RAMA&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6368 "-" "Mozilla/5.0 (X11; Linux i686; rv:1.9.7.20) Gecko/4195-09-07 16:38:05.879333 Firefox/3.8"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=30&from=20250424183156&fromFormatted=18%3A31%2C+24+April+2025&hideminor=1&limit=250&target=AGOS%2FVersions&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6367 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.0 (KHTML, like Gecko) Chrome/39.0.887.0 Safari/534.0"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=30&from=20250411043805&hidebots=0&target=OpenTasks%2FEngine%2FImprove_WME&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6367 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; rv:1.9.3.20) Gecko/9958-03-18 16:15:48.117981 Firefox/14.0"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=30&from=20250411042538&hidebots=0&hidemyself=1&limit=250&target=Compiling_ScummVM%2FPlayStation_Portable&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6363 "-" "Opera/9.13.(X11; Linux i686; ce-RU) Presto/2.9.173 Version/11.00"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /api.php?action=feedrecentchanges&days=14&feedformat=atom&from=20250405110953&hidebots=1&hidemyself=1&limit=50&target=Summer_of_Code%2FGSoC2010&urlversion=1 HTTP/1.1" 200 6364 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/531.2 (KHTML, like Gecko) Chrome/24.0.862.0 Safari/531.2"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=30&from=20250421165249&fromFormatted=16%3A52%2C+21+April+2025&limit=100&target=Template%3AMain_Contact&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6366 "-" "Opera/9.61.(X11; Linux x86_64; st-ZA) Presto/2.9.160 Version/12.00"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?returnto=Special%3ARecentChangesLinked&returntoquery=from%3D20250418162237%26fromFormatted%3D16%253A22%252C%2B18%2BApril%2B2025%26hidemyself%3D1%26target%3DAGIWiki%252FAl_Pond_-_On_Holiday&title=Special%3AUserLogin HTTP/1.1" 200 6365 "-" "Mozilla/5.0 (compatible; MSIE 7.0; Windows 98; Win 9x 4.90; Trident/3.1)"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=30&from=20250417091241&hidebots=1&limit=250&target=Summer_of_Code%2FApplication%2F2007&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6366 "-" "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_1 like Mac OS X; nr-ZA) AppleWebKit/535.26.3 (KHTML, like Gecko) Version/3.0.5 Mobile/8B114 Safari/6535.26.3"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /api.php?action=webapp-manifest HTTP/2.0" 200 2102 "https://wiki.scummvm.org/index.php?title=Hopkins_FBI" "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=30&from=20250417023112&hidebots=0&hideminor=1&hidemyself=1&limit=250&target=AGIWiki%2FSpecial_flags&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6367 "-" "Mozilla/5.0 (compatible; MSIE 7.0; Windows 98; Trident/3.1)"
127.0.0.1 - - [24/Apr/2025:23:42:29 +0000] "GET /index.php?days=30&from=20250416060403&hideanons=1&limit=100&target=Summer_of_Code%2FApplication%2F2007&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6367 "-" "Mozilla/5.0 (Linux; Android 4.3) AppleWebKit/536.0 (KHTML, like Gecko) Chrome/51.0.880.0 Safari/536.0"
127.0.0.1 - - [24/Apr/2025:23:42:30 +0000] "GET /index.php?days=1&hidebots=0&hideminor=1&hidemyself=0&limit=250&mobileaction=toggle_view_mobile&target=HOWTO-Tips_And_Tricks&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6366 "-" "Mozilla/5.0 (Android 4.4.3; Mobile; rv:58.0) Gecko/58.0 Firefox/58.0"
127.0.0.1 - - [24/Apr/2025:23:42:30 +0000] "GET /index.php?days=30&from=20250415120719&limit=250&target=Time_Zone&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6366 "-" "Mozilla/5.0 (iPad; CPU iPad OS 1_1_5 like Mac OS X) AppleWebKit/532.1 (KHTML, like Gecko) FxiOS/12.3t5461.0 Mobile/69A052 Safari/532.1"
127.0.0.1 - - [24/Apr/2025:23:42:30 +0000] "GET /index.php?title=SCI/Testing&direction=next&oldid=14195 HTTP/1.1" 200 6364 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5; rv:123.0esr) Gecko/20100101 Firefox/123.0esr"
127.0.0.1 - - [24/Apr/2025:23:42:30 +0000] "GET /index.php?days=14&from=20250417034946&hideliu=1&hideminor=1&target=Nippon_Safes_Inc.&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6364 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1; rv:1.9.6.20) Gecko/9899-07-01 03:29:48.393829 Firefox/3.8"
127.0.0.1 - - [24/Apr/2025:23:42:30 +0000] "GET /index.php?returnto=Special%3ARecentChangesLinked&returntoquery=days%3D30%26from%3D20250410005945%26hidebots%3D1%26hideminor%3D1%26hidemyself%3D1%26target%3DUser%253ASpookypeanut&title=Special%3AUserLogin HTTP/1.1" 200 6367 "-" "Mozilla/5.0 (Windows; U; Windows 95) AppleWebKit/533.2.2 (KHTML, like Gecko) Version/4.1 Safari/533.2.2"
127.0.0.1 - - [24/Apr/2025:23:42:30 +0000] "GET /index.php?days=30&from=20250410094930&hidebots=1&hideminor=1&hidemyself=1&limit=100&target=Loom&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6364 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/533.1 (KHTML, like Gecko) FxiOS/9.0k8480.0 Mobile/92A641 Safari/533.1"
127.0.0.1 - - [24/Apr/2025:23:42:30 +0000] "GET /index.php?days=30&from=20250425184120&fromFormatted=18%3A41%2C+25+April+2025&hideminor=1&hidemyself=1&target=Indiana_Jones_and_the_Fate_of_Atlantis&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6365 "-" "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_1 like Mac OS X; pl-PL) AppleWebKit/535.5.2 (KHTML, like Gecko) Version/4.0.5 Mobile/8B116 Safari/6535.5.2"
127.0.0.1 - - [24/Apr/2025:23:42:31 +0000] "GET /index.php?diff=39241&oldid=29636&mobileaction=toggle_view_desktop HTTP/2.0" 200 2104 "https://wiki.scummvm.org/index.php?diff=39241&oldid=29636&mobileaction=toggle_view_desktop" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.3"
127.0.0.1 - - [24/Apr/2025:23:42:31 +0000] "GET /index.php?days=30&from=20250407050329&hideliu=1&hideminor=1&hidemyself=1&target=Summer_of_Code%2FGSoC_Ideas_2020&title=Special%3ARecentChangesLinked HTTP/1.1" 200 6367 "-" "Mozilla/5.0 (Android 2.2; Mobile; rv:51.0) Gecko/51.0 Firefox/51.0"

出于隐私原因,我用 127.0.0.1 替换了真实的 IP,但请相信我,有来自世界各地住宅网络的许多 IP——准确地说,大约 35.000 个。 在这种规模下,甚至考虑阻止单个 IP、子网或整个网络都没有意义。 由于项目的开放性,地理位置拦截也不是一种选择。

主要问题是时间。 攻击中访问的 URL 是 wiki 提供的最昂贵的 URL,因为它们在很大程度上依赖于数据库并且是高度动态的,需要在 PHP 中进行一些处理时间。 这是最糟糕的情况,因为它会将服务器投入死亡螺旋。

首先,数据库开始滞后甚至拒绝新的连接。 加上服务器负载稳步增加,导致 PHP 执行速度变慢。 最终,PHP-FPM 池中的所有资源都被耗尽,并且由于 Apache2 没有及时收到来自 PHP-FPM 的回复,因此它会一直等到耗尽空闲连接。 此时,网站崩溃。 重新启动堆栈会立即解决问题,但最多只能持续几分钟,直到服务器再次耗尽资源。

为了让网站恢复运行,我将堆栈的配置调整到了疯狂的值,冒着服务器最终耗尽内存的风险。

我需要一个合适的解决方案,可以减轻 Web 应用程序堆栈的负载。

你好,Anubis!

Anubis 是一个检查传入连接、处理它们并仅将“良好”连接转发到 Web 应用程序的程序。 为此,Anubis 位于负责接受 HTTP/HTTPS 的服务器或代理与提供应用程序的服务器之间。

Anubis 旨在保护网站免受 AI 抓取机器人的侵害,主要关注请求随附的 user agent 等参数,并查找连接中的异常情况。 “已知良好”且无害的客户端始终被接受,而“已知不良”客户端始终被拒绝。 如果默认设置不适用于您的应用程序,Anubis 允许使用可自定义的 bot policy definitions 进行广泛配置。

然后,还有介于两者之间的部分,真正神奇的部分。 许多机器人将自己伪装成标准浏览器,以规避基于 user agent 的过滤。 因此,如果有什么东西声称自己是浏览器,它应该表现得像一个浏览器,对吧? 为了验证这一点,Anubis 提供了一个浏览器需要解决的 proof-of-work challenge。 如果挑战通过,它会将传入的请求转发到受 Anubis 保护的 Web 应用程序; 否则,请求将被拒绝。

解决 挑战(一旦通过,有效期为一周)需要客户端花费几秒钟,占用 CPU 时间。 检查 浏览器是否解决服务器端的速度非常快,几乎不占用任何资源。

Anubis presenting the proof-of-work challenge Anubis 展示 proof-of-work 挑战

作为普通用户,您所注意到的只是访问网站时的加载屏幕。 作为拥有愚蠢机器人的攻击者,您永远无法通过。 作为拥有聪明机器人的攻击者,您最终会耗尽自己的资源。 作为一家试图抓取网站的 AI 公司,您会很快注意到,如果大规模使用 CPU 时间可能会很昂贵。

长话短说,部署 Anubis 立即解决了我们的问题。 事实上,您可以在我们的监控中看到确切的时间。

Monitoring showing the drop in MariaDB usage after deploying Anubis 监控显示部署 Anubis 后 MariaDB 使用量的下降

之后我没有收到任何通知。 服务器负载从未如此之低。 在撰写本文时,攻击本身仍在进行中。 对我而言,Anubis 不仅是 AI 抓取工具的拦截器。 Anubis 是一种 DDoS 防护。

_Credits: Anubis is created byTecharo . The Anubis mascot is created by CELPHASE _ Do you have any comments or suggestions regarding this article? Please drop an e-mail tofeedback@fabulous.systems!

LATEST POSTS

Contact [Impressum]. Privacy Policy [Datenschutzerklärung]. Web button hosting bymanitu