Fail2ban 正则表达式不起作用

Fail2ban 正则表达式不起作用

我想阻止任何对 /.git、/wp-login、/remote/login/ 的获取请求,因此我创建了以下过滤器,其中也包括其他请求。

 badagents = 360Spider|ZmEu|Auto Spider 1.0|zgrab/[0-9]*\.[0-9a-zA-Z]*|Wget\(.*\)|MauiBot.*|AspiegelBot.*|SemrushBot.*|PHP/.*

failregex = ^.+?:\d+ <HOST> -.*"(GET|POST|HEAD).*HTTP.*(?:%(badagents)s)"$
        ^.+?:\d+ <HOST> -.*"(GET|POST|HEAD) /+wp-login\.php.*$
        ^.+?:\d+ <HOST> -.*"(GET|POST|HEAD) /.git/HEAD.*$
        ^.+?:\d+ <HOST> -.*"GET /.git/.*$
        ^.+?:\d+ <HOST> -.*"(GET|POST|HEAD) /wp-login/.*$
        ^.+?:\d+ <HOST> -.*"(GET|POST|HEAD) /.git/objects/.*$
        ^.+?:\d+ <HOST> -.*"(GET|POST|HEAD) //.git/objects/.*$
        ^.+?:\d+ <HOST> -.*"(GET|POST|HEAD) /remote/login/.*$
        ^.+?:\d+ <HOST> -.*"(GET|POST|HEAD) /wp/wp-includes/.*$
        ^.+?:\d+ <HOST> -.*"GET /wp/wp-includes/.*$
        ^.+?:\d+ <HOST> -.*"GET /wp/wp-login.php/.*$
        ^.+?:\d+ <HOST> -.*"GET /test/wp-includes/.*$
        ^.+?:\d+ <HOST> -.*"GET /config/getuser/.*$

我还将其附加到我的 jail.local

[one-time-ban]
enabled     =true
port        =http,https
logpath     = /var/log/nginx/access.log
              /var/log/nginx/prod_test.log
filter      =one-time-ban
bantime     = 300
maxretry    = 1
findtime     = 10

我已经尝试通过 URL 访问 /.git 超过 10 次,但仍然没有被禁止。为什么会失败。我认为问题出在 failregex 上,我需要添加什么才能使 fail2ban 正常工作?

示例日志如下所示

3.17.11.219 - - [05/Oct/2021:12:33:15 +0000] "GET //.git/objects/a5/920b6c86cc2d972bde9578c0a5d848dff67354 HTTP/1.1" 301 178 "-" "curl/7.61.1"

答案1

您的正则表达式(顺便说一下确实“易受攻击”)以 开头^.+?:\d+ <HOST> -,这意味着:在匹配冒号、至少 1 位数字和空格后找到 IP 地址(或主机名)。
但您的行以 IP 开头。

所以你的正则表达式与你的日志格式完全不匹配。

正确的(和更少的“脆弱的”)failregex 应该是这样的:

^<ADDR> \S+ \S+ (?:\[\] )?"[A-Z]+ /\S*(?<=/)(?:\.git|wp-login|remote/login)\b[^"]*"\s+

但更好的方法是通过 Web 服务器禁止它们(响应 403),然后使用以下命令查找每个错误请求:

^<ADDR> \S+ \S+ (?:\[\] )?"[A-Z]+ /[^"]*"\s+(?!401)[45]\d\d

相关内容