fail2ban 奇怪的禁止行为禁止 IP 正确

fail2ban 奇怪的禁止行为禁止 IP 正确

我尝试通过 fail2ban 禁止所有可疑的 403 错误。

所以我创建了这个监狱

# block 403 errors
[apache-403]
enabled = true
filter = apache-403
port = http,https
logpath = /var/log/apache2/other_vhosts_access.log
bantime = 3600
maxretry = 5
ignoreip = 127.0.0.1/8 37.4.226.100

使用此过滤规则

failregex = <HOST> .* "(GET|POST|HEAD) .* HTTP/1\.[01]" 403 .*

现在我向fail2ban-client status apache-403监狱核实了一下,得到了这个

Status for the jail: apache-403
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 51
|  `- File list:    /var/log/apache2/other_vhosts_access.log
`- Actions
   |- Currently banned: 1
   |- Total banned: 1
   `- Banned IP list:   de:443

但是 de:443 不是一个 IP...那么问题出在哪里?

具体的日志行如下所示:

jotoma.de:443 45.133.192.140 - - [15/Apr/2021:01:42:42 +0200] "POST /wp-login.php HTTP/1.1" 403 10297 "-" "Mozilla/5.0 (Linux; Android 6.0.1; SM-G610M Build/MMB29K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/65.0.3325.109 Mobile Safari/537.36 Instagram 41.0.0.13.92 Android (23/6.0.1; 480dpi; 1080x1920; samsung; SM-G610M; on7xelte; samsungexynos7870; pt_BR; 103516666)"

我现在该怎么做才能改正它?之前我遇到了一个大问题,无法让这个过滤规则正常工作,但现在它可以正常工作,但似乎是错误的。

答案1

此处的问题在于您的“易受攻击”的正则表达式(未固定,带有许多捕获所有字符等),以及标记<HOST>仅匹配 IP 地址的无效假设(它也可以匹配主机名)。您确实可以强制 fail2ban 仅匹配 IP 地址,方法是禁用选项usedns或使用其他标记<ADDR>代替<HOST>

但除此之外,最好使用固定且更精确的正则表达式:

failregex = ^(?:\S+:\d+ )?<ADDR> \S+ \S+ \[\] "[A-Z]+ /[^"]* \S+" 403\b

(如果您的 fail2ban 版本小于 v.0.10,请用 替换标签)<ADDR><HOST>

还要注意,在消息中间使用时间戳是完全不可取的,最好重新配置你的 apache 日志格式以将其放在行首,这样它会产生类似这样的内容:

[15/Apr/2021:01:42:42 +0200] srv:443 192.0.2.1 - - "POST /wp-login.php HTTP/1.1" 403 ...

在这种情况下,你的监狱可能看起来像这样:

[apache-403]
enabled = true
filter =
datepattern = ^\[%%d/%%b/%%Y:%%H:%%M:%%S(?:[.,]%%f)?(?: %%z)?\]
failregex = ^\s*(?:\S+:\d+ )?<ADDR> \S+ \S+ "[A-Z]+ /[^"]* \S+" 403\b
...

(使用单数datepattern也固定在行的开头)。

此外,由于您似乎直接监控访问日志,请阅读Fail2ban :: wiki :: 最佳实践,因为这根本不是推荐的策略。

答案2

谢谢!我现在将LogFormat其改为:

#LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
#LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%t %v:%p %h %l %u \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%t %h %l %u \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%t %h %l %u \"%r\" %>s %O" common

我会报告它是否有效,因为日志必须是新写的并且无法用 进行测试fail2ban_regex

相关内容