我想阻止任何对 /.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