fail2ban 不匹配日期模式

fail2ban does not match date pattern

我正在尝试调试我的 fail2ban 过滤器和一些关于我的自定义日期模式的奇怪错误,并偶然发现了这个 documentation。 根据该命令的输出 fail2ban-regex "2013-09-19 02:46:12 1.2.3.4" "<HOST>" 应该显示如下内容:

Date template hits:
|- [# of hits] date format
|  [1] Year-Month-Day Hour:Minute:Second

但是这在我的系统上已经不起作用,因为我得到的输出是:

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

Use   failregex line : <HOST>
Use      single line : 2013-09-19 02:46:12 1.2.3.4


Results
=======

Failregex: 0 total

Ignoreregex: 0 total

Date template hits:

Lines: 1 lines, 0 ignored, 0 matched, 1 missed
[processed in 0.07 sec]

|- Missed line(s):
|  2013-09-19 02:46:12 1.2.3.4

为什么 fail2ban 甚至不能正确识别日期?

PS:

$ fail2ban-client -V
0.11.2
$ fail2ban-regex -V
0.11.2
$ uname -r
5.8.18-1-MANJARO

这在我的系统上也不起作用,这意味着 fail2ban 显然无法识别该日期格式。

它会识别不同格式的相同日期,例如:

fail2ban-regex "Sep 19 02:46:12 2013 1.2.3.4" "<HOST>"

Date template hits:
|- [# of hits] date format
|  [1] {^LN-BEG}(?:DAY )?MON Day %k:Minute:Second(?:\.Microseconds)?(?: ExYear)?

这就是您可以通过指定自定义日期模式强制它识别您的时间戳的方法:

fail2ban-regex -d '%Y-%m-%d %H:%M:%S' "2013-09-19 02:46:12 1.2.3.4" "<HOST>"

Date template hits:
|- [# of hits] date format
|  [1] Year-Month-Day 24hour:Minute:Second

你的问题答案是你是对的,不行!他们最终在 0.10 中修复了它并在 0.11 中进行了改进。这是我使用修复答案的作者之一构建的示例,该问题与您的问题类似:

从 0.10 开始,围绕日期模式提取的处理更加精确(因此不易受到攻击),请参阅 #1583 了解详细信息。 不久,如果在某侧没有指定锚点,它会自动获得单词边界 - 在您的情况下,datepattern 应该将字符串匹配到单词的末尾,但在几秒钟之后,时区之前仍然有 3 位数字 050,因此它不匹配。

下面这个例子在版本 0.9.4 中运行良好:

# fail2ban-regex -v --datepattern=' ^%Y%m%d\s+%H%M%S' '20200313 122326050+1100 srv1 popserv 27511 31051 139647144740608 Note;AcctBadPswd(50/6) user=user@example.com:cmd=PASS <pswd>:fromhost=10.0.0.1' '(?:popserv).* (?:Note;AcctBadPswd).*fromhost=(?P<host>\S*).*'

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

Use      datepattern :  ^YearMonthDay\s+24hourMinuteSecond
Use   failregex line : (?:popserv).* (?:Note;AcctBadPswd).*fromhost=(?P<h...
Use      single line : 20200313 122326050+1100 srv1 popserv 27511 31051 1...


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] (?:popserv).* (?:Note;AcctBadPswd).*fromhost=(?P<host>\S*).*
|      10.0.0.1  Fri Mar 13 12:23:26 2020
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1]  ^YearMonthDay\s+24hourMinuteSecond
`-

Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.00 sec]

在 0.11.1 上无法匹配。

# fail2ban-regex -v --datepattern=' ^%Y%m%d\s+%H%M%S' '20200313 122326050+1100 srv1 popserv 27511 31051 139647144740608 Note;AcctBadPswd(50/6) user=user@example.com:cmd=PASS <pswd>:fromhost=10.0.0.1' '(?:popserv).* (?:Note;AcctBadPswd).*fromhost=<ADDR>.*'

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

Use      datepattern : ^YearMonthDay\s+24hourMinuteSecond
Use   failregex line : (?:popserv).* (?:Note;AcctBadPswd).*fromhost=<ADDR>.*
Use      single line : 20200313 122326050+1100 srv1 popserv 27511 31051 1...


Results
=======

Failregex: 0 total
|-  #) [# of hits] regular expression
|   1) [0] (?:popserv).* (?:Note;AcctBadPswd).*fromhost=<ADDR>.*
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [0] ^YearMonthDay\s+24hourMinuteSecond
`-

Lines: 1 lines, 0 ignored, 0 matched, 1 missed
[processed in 0.00 sec]

|- Missed line(s):
|  20200313 122326050+1100 srv1 popserv 27511 31051 139647144740608 Note;AcctBadPswd(50/6) user=user@example.com:cmd=PASS <pswd>:fromhost=10.0.0.1
`-

问题是字符串的正确日期模式: 20200313 122326050+1100 ... 看起来像 ^%Y%m%d\s+%H%M%S%f?%z。 可能这 3 个额外的数字是毫秒,现在将与 %f? 匹配,在哪里?使它成为可选的(如果你不需要这样的毫秒精确时间,你也可以用 \d+ 或 \d* 替换它。

$ msg='20200313 122326050+1100 srv1 popserv 27511 31051 139647144740608 Note;AcctBadPswd(50/6) user=user@example.com:cmd=PASS <pswd>:fromhost=10.0.0.1'
$ fail2ban-regex -v --VD --datepattern='^%Y%m%d\s+%H%M%S%f?%z' "$msg" '(?:popserv).* (?:Note;AcctBadPswd).*fromhost=<ADDR>.*'

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

Use      datepattern : ^YearMonthDay\s+24hourMinuteSecondMicroseconds?Zone offset
Use   failregex line : (?:popserv).* (?:Note;AcctBadPswd).*fromhost=<ADDR>.*
Use      single line : 20200313 122326050+1100 srv1 popserv 27511 31051 1...


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] (?:popserv).* (?:Note;AcctBadPswd).*fromhost=<ADDR>.*
|      10.0.0.1  Fri Mar 13 02:23:26 2020
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] ^YearMonthDay\s+24hourMinuteSecondMicroseconds?Zone offset
|      # weight: 1.000 (1.000), pattern: ^%Y%m%d\s+%H%M%S%f?%z
|      # regex:   ^((?P<Y>\d\d\d\d)(?P<m>1[0-2]|0[1-9]|[1-9])(?P<d>3[0-1]|[1-2]\d|0[1-9]|[1-9]| [1-9])\s+(?P<H>2[0-3]|[0-1]\d|\d)(?P<M>[0-5]\d|\d)(?P<S>6[0-1]|[0-5]\d|\d)(?P<f>[0-9]{1,6})?(?P<z>Z|UTC|GMT|[+-][01]\d(?::?\d{2})?))(?=\b|\W|$)
`-

Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.00 sec]

另请注意,第一个示例中的正则表达式没有包含足够的锚点,因此这使其变得很弱,并且可能会被日志中的错误条目触发。

我使用 Sebres 提供的信息构建了这个答案 here