fail2ban 設定メモ

履歴

  • 2021-11-25 高橋芳幸 新規作成

はじめに

経験としては, fail2ban はインストールしてデフォルトの設定ではマトモに動かない (= まったく検出してくれない). itpass サーバの fail2ban の設定に関して, 毎年 (のように) 迷うのでメモ書きしておく.

参考ページ

基礎

問題は設定ファイル (*.conf) に書いた正規表現がログファイル中の目的の行を拾ってくれるかどうか.

「正規表現」って何だっけ? が最初の問題なのだが, それは置いておくとして.

設定ファイルの記述の善し悪しは fail2ban-regex を使って確認する.

ログファイルを指定する場合

$ sudo fail2ban-regex <ログファイル> <設定ファイル> [--print-all-matched]

$ sudo fail2ban-regex /var/log/httpd-access.log ./apache-ddos.conf --print-all-matched

(/var/log の下のログファイルは管理者権限でないと読めない.)

ログの文字列を指定する場合

$ sudo fail2ban-regex "[Thu Nov 25 00:41:14.135339 2021] [auth_basic:error] [pid 888:tid 140546077087488] [client 122.196.11.214:51141] AH01617: user hogehoge: authentication failure for "/hiki/": Password Mismatch, referer: http://epa.scitec.kobe-u.ac.jp/" ./apache-auth.conf --print-all-matched

結果の見方

fail2ban-regex の結果は下のように注意して見る.

例えば下のような場合.

$ sudo fail2ban-regex /var/log/httpd-access.log ./apache-ddos.conf

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

Use   failregex file : ./apache-ddos.conf
Use         log file : /var/log/httpd-access.log
Use         encoding : UTF-8


Results
=======

Failregex: 5780 total
|-  #) [# of hits] regular expression
|   1) [5780] ^<HOST> -.*GET.*
`-

Ignoreregex: 2754 total
|-  #) [# of hits] regular expression
|   1) [2754] \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)
`-

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

Lines: 8813 lines, 2754 ignored, 5780 matched, 279 missed
[processed in 1.37 sec]

Ignored line(s): too many to print.  Use --print-all-ignored to print all 2754 lines
Missed line(s): too many to print.  Use --print-all-missed to print all 279 lines

これは上手く行っている (マトモな) 例.

$ sudo fail2ban-regex /var/log/httpd-access.log /et
c/fail2ban/filter.d/apache-ddos.conf

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

Use   failregex filter file : apache-ddos, basedir: /etc/fail2ban
Use      datepattern : {^LN-BEG} : Default Detectors
Use         log file : /var/log/httpd-access.log
Use         encoding : UTF-8


Results
=======

Prefregex: 0 total
|  ^\[[^]]*\] \[(:?error|\S+:\S+)\]( \[pid \d+(:\S+\d+)?\])? \[client (?:\[?(?:(?:::f{4,6}:)?(?P<ip4>(?:\d{1,3}\.){3}\d{1,3})|(?P<ip6>(?:[0-9a-fA-F]{1,4}::?|::){1,7}(?:[0-9a-fA-F]{1,4}|(?<=:):)))\]?|(?P<dns>[\w\-.^_]*\w))(:\d{1,5})?\] (?:AH\d+: )?(?P<content>.+)$
`-

Failregex: 0 total

Ignoreregex: 0 total

Date template hits:

Lines: 8826 lines, 0 ignored, 0 matched, 8826 missed
[processed in 0.38 sec]

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

こちらは上手く行っていない例.

後者では何も検出されていない. この例では, デフォルトの正規表現を使っていて何も検出してくれないようになっている.

  • 考えるポイントは以下
    • 目的は IP アドレスを検出すること.
      • IP アドレスは, 正規表現では <HOST> で検出する
    • チェックの順番は, datepattern, prefregex, failregex.
      • デフォルトの設定 (正規表現) で上手く行かない時には, 思い切って prefregex, failregex を空にして試すところからやると良い (それぞれに見当はずれの正規表現 (文字列) を入れていることもあるので).

参考ページ

上の方を参照.