だから今日、私はfail2banフィルターの正規表現をまとめようとしていました. ここで、fail2ban には、正規表現パターンでネストされた OR 操作に関する問題があることに気付きました。
入力文字列:127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a
パターン:^<HOST> -.*\"(c|b)|a
次に例を示します。
$ fail2ban-regex "127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] \"a" '^<HOST> -.*\"(c|b)|a'
Running tests
=============
Use failregex line : ^<HOST> -.*\"(c|b)|a
Use single line : 127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a
Results
=======
Failregex: 0 total
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [1] Day/MONTH/Year:Hour:Minute:Second
`-
Lines: 1 lines, 0 ignored, 0 matched, 1 missed
|- Missed line(s):
| 127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a
`-
これは実際には成功し、正規表現パターンを実行すると一致が報告されることに注意しましたa|(c|b)
が、最初の OR の両側をチェックして、最初の条件が一致するかどうかを確認できる必要があります (たとえば、HTTP 要求がtype が POST または GET でない場合)、正規表現パターンの残りを無視するか、最初の OR の後に残りの正規表現パターンを実行します。もう1つのことは、グループ化は常に最も外側のORの最初の部分にのみ一致するように見えるため、重要ではないように見えることです。
ここで一致を取得します。
$ fail2ban-regex "127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] \"a" '^<HOST> -.*\"a|(c|b)'
Running tests
=============
Use failregex line : ^<HOST> -.*\"a|(c|b)
Use single line : 127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a
Results
=======
Failregex: 1 total
|- #) [# of hits] regular expression
| 1) [1] ^<HOST> -.*\"a|(c|b)
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [1] Day/MONTH/Year:Hour:Minute:Second
`-
Lines: 1 lines, 0 ignored, 1 matched, 0 missed
regex101.com や debuggex.com などのサイトでテストした結果、これらの正規表現パターンの両方と一致することが報告されたため、これはバグである可能性があります。