fail2ban 正则表达式不匹配

fail2ban 正则表达式不匹配

我必须承认,正则表达式一直是我的弱点。我从来没有坐下来花足够的时间学习它们,以便有效地使用它们。然而,我真的不知道为什么这不匹配。我试图制作一个自定义的失败正则表达式来阻止人们试图利用任何 xmlrpc.php 错误(他们一直在试图暴力破解)。

我在 Ubuntu 16.04.2 上使用 fail2ban v0.9.3 和 Apache 2.4.18。

这是我的正则表达式:

<HOST> - - \[\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} +\d{4}\] "POST /xmlrpc.php HTTP/1.0" 200

下面是不匹配的示例行(IP 替换为 0):

0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php HTTP/1.0" 200 752 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

我不明白为什么不匹配。据我所知,这应该是完全匹配。有人能解释一下吗?

此外,如果时区偏移量与 + 和 - 符号匹配就好了……而且我认为用它替换HTTP/1.0应该HTTP/1.\d{1}可以匹配 1.0 和 1.1,对吗?

提前致谢!

编辑:在命令行上使用 fail2ban-regex 后,我发现使用正则表达式<HOST> - - \[它将匹配所有行。但是,当我将其更改为<HOST> - - \[\d{2}它时,它根本不匹配任何行。这似乎没有意义!

编辑 2:好吧,与此同时,我正在使用<HOST> - - \[.* "POST /(xmlrpc|wp-login).php HTTP/1.\d" 200并且它匹配我想要的行。但是,我仍然想知道为什么我的原始正则表达式不匹配,因为我宁愿使用更具体的正则表达式,而不是我现在使用的宽泛正则表达式。

答案1

经过几次迭代之后fail2ban-regex,我认为 fail2ban 会尝试从日志行本身中选择日期,然后根据您的过滤模式进行测试。

$ line='0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php'

使用.*时间戳的位置,它会匹配,但是正如您所注意到的,明确寻找时间戳开头的数字并不匹配:

$ ./fail2ban-regex "$line"  '<HOST> - - \[.*\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 1 matched, 0 missed

$ ./fail2ban-regex "$line"  '<HOST> - - \[\d+.*\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 0 matched, 1 missed

但请看一下:

$ ./fail2ban-regex "$line"  '<HOST> - - \[ \+0000\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 1 matched, 0 missed

我从模式中删除了整个时间戳,而是希望它是空的(只有时区指示器)。它仍然匹配,暗示fail2ban实际上移除根据配置中的模式进行测试之前的时间戳。

因此,最好将该部分排除在过滤模式之外,并匹配时间戳中的任何内容:

<HOST> - - \[.*?\] "POST /xmlrpc.php HTTP/1.0" 200

附带说明一下,您原来的 RE+在时间戳开始的地方有一个未加引号的部分,加号表示“至少重复一次前一个元素”,因此您需要对其进行转义。

答案2

尝试这个正则表达式 - 我用 regexr.com 测试过它并且它肯定被匹配:

<HOST> - - \[\d{2}\/\w{3}\/\d{4}(:\d{2}){3} \+0000\] "POST \/xmlrpc.php HTTP\/1.0" 200

其中一个问题是无法摆脱斜线 - 这需要完成。

编辑(在我看到您的编辑之后):我尝试稍微简化它并得出了以下匹配结果:

failregex = ^<HOST> - - \[.*\] "POST \/xmlrpc.php.*$

它不完全是你想要的,但它确实有效

相关内容