Web 公共服务基本上没有针对攻击者的根本防御措施
你好,我是个无能的人。
最近攻击明显增多了,我就凭感觉随便写写。
不存在针对 HTTP 客户端攻击的根本防御措施
首先,来考虑一下分别采取各种防御措施的情况。
IP 地址
如果是 IPv6 地址倒还好,但在 CGNAT 环境下,多个用户会被分配到同一个共享 IPv4 地址,因此攻击目标以外的受害者也会受到牵连。
此外,IP 轮换本身很容易,近年来,从在全球拥有大量 IP、常被用于攻击的美国廉价 VPS,或中国的云环境中一次性准备数千个 IP 地址来发动 DDoS,也越来越常见。即便按 AS Number 屏蔽,如果服务有在中国运营,那么屏蔽中国云服务的 IP 地址也不是根本解决方案,而且对中国用户来说也有点可怜。
中国的云环境本身经常被其他国家的用户滥用,因此我认为不能一概而论地将其列为应该屏蔽的对象。
就我个人而言,只要是属于万维网的服务,只要还有哪怕一个人在使用,我就不想一概屏蔽。
我自己也会时不时看 BiliBili 的视频,也会使用美国的服务。
User-Agent
这基本上不值得一提,因为我认为几乎没有必要将请求头评估本身作为访问限制依据,所以也没什么可写的。
由于可以随意伪造,因此不能仅凭简单评估的 UA 作为标准来屏蔽。
如果要做的话,可以像我现在在这个网站上做的那样,对于自称是 googlebot 的 UA,如果其反向解析主机名不是 *.googlebot.com 或 *.google.com,就完全屏蔽。不过,这需要自行实现,或者确认 CDN 一侧是否已经实现了类似功能。另外,虽然 Google 官方是这么说的,但实际上 Google 也会从反向解析主机名不属于这些域名的主机发送一部分正规的 bot,因此也不能完全只靠这一项判断。
顺便一提,就连这样一个垃圾网站,也有这么多家伙自称是 Googlebot:
fail2ban report - fake-googlebot
按国家屏蔽
遭到攻击时,或许可以作为临时措施,但作为长期应对并没有意义,原因和按 IP 地址屏蔽一样,这里就不赘述了。
不过,如果服务只面向国内用户运营,那可能还是有用的。
TLS Fingerprint
TLS 指纹本身也很容易伪造。
为什么呢?只要在 HTTP 客户端中集成与浏览器构建时使用的相同加密库之类的东西,就能伪造浏览器指纹。
要说它完全没有效果,倒也不尽然,但例如,如果正常的 bot 使用了相同的加密库等来发送请求,就会导致误封。
由于与大量 HTTP 客户端重合的风险很高,因此无法简单地据此进行判断。
所以,它可以作为判断标准之一;与其单独作为条件使用,不如与其他规则结合起来综合考虑,这样还是有一定价值的。
Cloudlfare Challenge / PoW Challenge
Cloudflare Challenge 本身不需要使用无头浏览器就能轻松绕过。
Anubis 我不太了解,但它的用户体验不太好,需要客户端进行计算,页面跳转时会带来相当大的压力。
从某种意义上说,它可以与 JS Challenge 结合,形成复合防护。实际上,近年来越来越多的泄露论坛也开始实现自定义的 PoW Challenge。因此,应该在什么场景使用 PoW Challenge,以及如果是为了防范 DoS,是否要在这种接近应用层的部分通过 PoW Challenge 来保护,都值得斟酌。如果能严格限制使用场景来实现,也许可以在尽量不损害用户体验的前提下,构建相对稳妥的前端防护。
Pay Wall
需要设置付费墙的服务有限,这里就不赘述了。
HTTP 缓存
我有点犹豫要不要把这个项目放进本文,但还是加进来了。
从 CDN 缓存能否避免请求到达源站这一点来说,对于 GET 等请求应该是有用的,不过我的感觉是,基本上现在大家都已经部署了吧?
与其把它当作防护措施,不如将其视为提升用户体验的手段;另外,在返回错误时,它也有助于防止请求洪泛。因此,我认为最好将它用于不影响应用的性能优化。
速率限制
不同服务的 key 本身差异很大,所以最好确认清楚具体的实现规则。以 Nginx 为例,可以按整体流量、URI、IP 地址等进行限制,也可以组合使用,因此从防范 DoS 的角度来看应该是有用的。
那么该怎么办?
我认为只能分层处理,并将多种条件结合起来应对。
目前我考虑的是,按 AS Number 将三家可信度较高的云服务提供商以及各家社交平台等的爬虫加入允许列表,对其他来源则采取稍微严格一些的措施。
基本的攻击者模式包括各种明显异常的请求模式,例如:
扫描
.env等文件的 IP 地址自称是
googlebot,但显然不对劲的家伙通过
POST/PUT等方法发送不可能出现的请求在
/login等路径下,或其他能够创建会话的路径上发送乱七八糟的请求
对于这些情况,直接屏蔽一次也没什么不可以吧?说实话,廉价 VPS 被滥用的情况相当多,所以我也有想要一刀切屏蔽的心情,但我自己也经常在廉价 VPS 上搭建 VPN 服务器,然后通过其出口 IP 浏览网站,所以又觉得可能做得太过了。不过,对某些服务来说,这么做或许也没问题。
此外,最近有人批评通过音频设备检测来进行指纹识别,但我认为实际上这是有用的,因此如果检测不到,直接屏蔽也未尝不可。虽然总有一天会出现可以伪造的途径吧……
未来也许会采用 GPU Fingerprint、Audio Finderprint 等方式,综合检测用户设备。