Fail2Ban 忽略本地重定向的 404

Posted

技术标签:

【中文标题】Fail2Ban 忽略本地重定向的 404【英文标题】:Fail2Ban ignore 404 of local redirect 【发布时间】:2021-05-06 02:48:03 【问题描述】:

假设一个不良行为者脚本访问 Apache 服务器以探测漏洞。使用 Fail2Ban 我们可以捕获一些 404 并禁止 IP。现在假设单个网页对 CSS、JS 或图像文件有错误的本地引用。同一合法网站访问者的重复点击将导致一定数量的 404,并可能导致 IP 封禁。

是否有一种好的方法可以将这些本地请求与远程请求分开,这样我们就不会禁止重要的访问者?

我知道所有请求都是远程的,因为页面被返回到浏览器并且页面的内容会触发更多的资产请求。问题是,我们如何知道这种页面加载模式和对同一资源的脚本查询之间的区别?

如果我们确实知道请求是基于我们刚刚生成的链接进入的,我们可以执行 302 重定向而不是返回 404,从而避免禁止过程。

可以使用 HTTP Referer 标头。如果 Refer 与请求的页面同源,或者与本地站点 FQDN 相同,那么我们不应该禁止。但是该标题可以被欺骗。那么这是一个好用的工具吗?

我认为可以使用 cookie 或会话随机数,其中可能会在没有当前会话 cookie 的情况下从页面请求资产。但我不知道这样的东西是否是内置功能。

显然,最好的解决方案是确保网站上生成的所有页面都包含对该网站的有效引用,但我们都知道这是不可能的。一些 CMS 将版本信息添加到文件,或者他们调整图像路径以包含基于客户端设备/大小的图像大小。在我们找到并修复创建它们的代码之前,任何这些生成的标头都可能是错误的。在我们部署有问题的东西和修复它的时间之间,我担心使用 Fail2Ban(和其他工具)意外禁止合法访问者,这些工具不考虑请求的来源。

对于这个挑战还有其他解决方案吗?谢谢!

【问题讨论】:

【参考方案1】:

我们如何知道这种页面加载模式之间的区别

在正常情况下你不会(至少没有一些白名单或黑名单)。 但是您知道 URI 或路径段、文件扩展名等,它们绝不会成为此类攻击向量的目标,您可以忽略它们。

一些 CMS 将版本信息添加到文件中,或者他们调整图像路径以包含基于客户端设备/大小的图像大小。

但是您肯定知道正确的前缀,因此允许某些路径段的 RE 是可能的。比如这个:

# regex ignoring site and cms paths:
^<HOST> -[^"]*\"[A-Z]3,\s+/(?!site/|cms/)\S+ HTTP/[^"]+" 40\d\s\d+

会忽略这个:

192.0.2.1 - - [02/Mar/2021:18:01:06] "GET /site/style.css?ver=1.0 HTTP/1.1" 404 469

并匹配这个:

192.0.2.1 - - [02/Mar/2021:18:01:06] "GET /xampp/phpmyadmin/scripts/setup.php HTTP/1.1" 404 469

类似地,您可以编写一个带有负前瞻的正则表达式来忽略某些扩展,如 .css.js 或像 ?ver=1.0 这样的参数。

另一种可能性是在特殊日志文件中创建一个特殊的回退位置记录完全更糟糕的请求(而不是访问或错误日志),如wiki :: Best practice 中所述,因此这样可以认为作恶者是绝对错误的URI 不匹配任何可以由 Web 服务器处理的正确位置。 或者干脆在称为有效位置(路径、前缀、扩展名等)中禁用 404 日志记录。

为了确保或完全避免误报,您可以首先增加 maxretry 或减少 findtime 并稍微观察一下(因此,尝试次数过多的作恶者会被禁止,而合法用户的“破坏”请求会导致 404 但并非如此其中很大一部分仍将被忽略)。因此,您可以累积应用程序的“有效”404 请求的整个列表(以便编写更精确的正则表达式或在某些位置对其进行过滤)。

【讨论】:

以上是关于Fail2Ban 忽略本地重定向的 404的主要内容,如果未能解决你的问题,请参考以下文章

XAMPP 忽略文档根目录;重定向到“本地主机/仪表板”

apache_conf 忽略htaccess重定向中的本地开发域

使用 301 重定向重定向 404 是将现有页面重定向到主页

使用 .htaccess 重定向 404 而不重定向尾部斜杠

react嵌套路由(多重路由)重定向,重定向到404页面,路由重定向

Fiddler重定向AutoResponder