Fail2ban: failregex で使用される正規表現が機能しません (角括弧 ] の問題?!)

Fail2ban: failregex で使用される正規表現が機能しません (角括弧 ] の問題?!)

fail2ban を使用して、apache_access.log ファイルの内容に基づいて IP を禁止します。

これは正規表現ルールに一致させたい行の例です:

197.221.254.56 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"

これが私の fail2ban カスタム フィルター ファイルです。

[Definition]

failregex = ^<ADDR> - - \[\S+ \S+\] "GET \/ HTTP\/1.0" 400 \S "-" "-"$
ignoreregex =

正規表現は「https://regex101.com/」のようなウェブサイトで完璧に機能します。

しかし、fail2ban-regex ツールを次のように使用すると:

sudo fail2ban-regex /var/log/site1_access.log /etc/fail2ban/filter.d/les400enhttp1-0.conf

何にでも合います。

この最も単純な正規表現ルールを試してみました:^<ADDR> - - \[\S+ \S+ そしてうまくいきました!

Results
=======

Failregex: 10 total
|-  #) [# of hits] regular expression
|   1) [10] ^<ADDR> - - \[\S+ \S+
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [10] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-

Lines: 10 lines, 0 ignored, 10 matched, 0 missed
[processed in 0.03 sec]

しかし、正規表現を試みると:^<ADDR> - - \[\S+ \S+\]左四角いラケット]右に追加))コマンド「fail2ban-regex」が返されます:

Lines: 10 lines, 0 ignored, 0 matched, 10 missed
[processed in 0.03 sec]

|- Missed line(s):
|  36.170.59.167 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
|  183.228.2.12 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
|  183.228.2.12 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
|  126.131.138.146 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
|  197.221.254.56 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
|  110.11.157.122 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
|  220.135.236.27 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
|  61.231.224.176 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
|  106.165.107.215 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
|  61.231.224.176 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
`-

10 見逃しました! 左角括弧 (]) を追加すると、例の行はどれも正規表現と一致しません

どこに間違いがあるのか​​分かりません... 助けていただければ幸いです :)

答え1

必要なものを古典的な方法でキャッチする方が良いでしょう。例:

\[.*\]

日付パターン部分 (これが、あなたが気づいた問題の原因) は、どうやら fail2ban によって特別な方法で処理されるようです。

次のパターンを試してください:

\[\]

皮肉なことに、これも一致することがわかります。つまり、角括弧内の日付パターンが削除されるということです。したがって、これを考慮する必要はありません。

次のようなものを使うことができます:

^<ADDR> -.*\"(GET|POST|HEAD).*HTTP.*\"$

PS. failregex はフィルター ファイル内でコメント アウトされているので、変更を加えるときには必ずコメントを解除してください。

関連情報