首页 > 解决方案 > 在 nginx 下为 Wordpress 创建 fail2ban 过滤器

问题描述

我正在尝试在 nginx 下为 wordpress 创建一个 fail2ban 过滤器,但它不起作用,需要一些帮助。

日志:

111.111.111.111 - - [27/Oct/2019:02:54:48 +0200] "POST /wp-login.php HTTP/1.1" 200 1697 "http://my-wordpress.com/wp-login.php" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Mobile/15E148 Safari/604.1"

筛选:

[INCLUDES]
before = common.conf

[Definition]
failregexe = <HOST> - - .* "POST /wp-login.php .* 200
ignoreregex =

监狱:

[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 3600

测试正则表达式

#fail2ban-regex /var/log/nginx/access.log  /etc/fail2ban/filter.d/wordpress.conf

Running tests
=============

Use   failregex filter file : wordpress, basedir: /etc/fail2ban
Use      datepattern : Default Detectors
Use         log file : /var/log/nginx/access.log
Use         encoding : UTF-8


Results
=======

Failregex: 0 total

Ignoreregex: 0 total

Date template hits:

Lines: 72 lines, 0 ignored, 0 matched, 72 missed
[processed in 0.01 sec]

Missed line(s): too many to print.  Use --print-all-missed to print all 72 lines

这个正则表达式有什么问题?

我也试过

^<HOST>.*"POST./wp-login.php.*200.*$
^<HOST> - - .* "POST /wp-login.php .* 200

还有很多....

标签: wordpressapachenginxloggingfail2ban

解决方案


有一个错字(删除最后一个e):

- failregexe = ...
+ failregex = 

顺便说一句:你真的想禁止第 200 条回复吗?(200 表示正常)。此外,您的正则表达式太“脆弱”,最好使用锚定且更精确的东西,如下所示:

^<HOST> - \S+ \[\] "[A-Z]+ /wp-login.php [^"]+" 200

如果您想捕获其他代码并且仅用于具有真实用户名的用户,甚至可以使用(?!- )\S+ ... [54]0\d+代替(因此会忽略用户登录为的握手请求)。\S+ ... 200-


推荐阅读