在 fail2ban 中回测历史记录

在 fail2ban 中回测历史记录

设置 我在 ubuntu 服务器上运行 apache。我创建了一条 fail2ban 规则,当某个 IP 请求页面过多且速度过快时,该规则会禁止该 IP。

# Fail2ban Rule
failregex = ^.*?(:80|:443) <HOST> - .* "(GET|POST|HEAD).*$
ignoreregex =.*(.ico|.jpg|.png|.gif|.js|.css|.woff|.mp4)

findtime = 30
maxretry = 10

目标:
我想根据这个新的 fail2ban 规则运行一个旧的 apache 日志,这样我就可以看看它是否会禁止任何合法请求。

尝试 #1 我认为我可以使用 fail2ban-regex 来获取可能被禁止的用户列表,但它没有该功能。

尝试#2 我以为将历史日志回显到 fail2ban 当前正在监视的日志中会使它们得到解析。在修复了日志行包含旧日期的一个小问题(通过添加一年来修复)后,fail2ban 开始解析它们并禁止其中的 IP。但是,我只需查看第一个被禁止的 IP 即可发现它是错误的。有问题的 IP 总共只发出了 10 个请求,而且它们在时间上彼此并不接近。我只能假设 fail2ban 没有使用日志行的时间戳来确定有效性,这使得这种测试方法失败了。

# echo example
zcat other_vhosts_access.log.8.gz | sed -n 's/\/2022:/\/2032:/p' >> /var/log/apache2/fail2ban_test.log

结论 由于我之前的两次尝试都失败了,我想不出一个合理的方法来解决这个问题。有人能推荐一种方法来实现我想要的吗?或者解释一下为什么我的第二个解决方案不起作用。

答案1

尝试 #1

直接看到确实没有,但是……

尽管最新版本的 fail2ban-regex 支持输出参数,但您可以执行以下操作:

fail2ban-client set "$jail" banip $(
   fail2ban-regex -o 'ip' /var/log/path/some.log some-filter | sort --unique | tr '\n' ' '
)

它只适用于你发现任何 IP 发生故障的情况无论数量/时间. 就您而言,至少在没有一些额外的预处理的情况下,这是毫无意义的。

尝试#2 我认为将历史日志回显到 fail2ban 当前正在监视的日志中会使它们被解析。

它不会起作用,因为 fail2ban 不会真正正确考虑消息的时间:要么太旧(如果记录未修改),要么不正确(如果现在记录为故障时间,因为您需要考虑maxretry实际findtime使用情况)。请注意,fail2ban 会寻求now - findtime通过 start(因为其他消息对它不感兴趣,因为太过时了),请参阅https://github.com/fail2ban/fail2ban/issues/2909#issuecomment-758036512

无论如何,目前,使用现成的 fail2bans 工具几乎不可能做到这一点(至少除非上述 RFE 中的“重新扫描”功能得到实施和发布)。

但是由于 fail2ban(以及fail2ban-regex)是 python 中的一个模块,因此可以使用 python 中的过滤器将禁令写入某些日志或将其直接发送到主 fail2ban 实例,请参阅https://github.com/fail2ban/fail2ban/issues/2909#issuecomment-1039267423对于这样的脚本示例。

还要注意,您的过滤器非常脆弱且速度很慢,最好尽可能精确地重写它,就像这样:

failregex = ^"<ADDR>" \S+ \S+ [^"]*"[A-Z]+ /(?:\S+/)*[^\.]*(?:\.(?!ico|jpg|png|gif|js|css|woff|mp4)\w+)? [^"]+"

最后但并非最不重要的一点是,您为什么需要它?如果带有此类过滤器的监狱处于活动状态并且此类爬虫回来了,它们将在监狱配置的maxretry期间一旦出现故障就会被禁止findtime。预防性禁止并不是真正需要的,只会用大量 IP 打扰您的网络过滤子系统(它们可能永远不会再回来)。

相关内容