Fail2Ban で独自のフィルターを自作する
Fail2Ban は基本的には「/etc/fail2ban/filter.d」にフィルターが存在するモノに対してしか有効化出来ない。
そこで今回は、Fail2Ban でフィルターを自作した時の話をする。
Fail2Ban の対象となるのはログ
自作でデーモンなどを作成した場合、大抵は SystemD のユニットファイルを自作したと思う。この時に標準出力や標準エラー出力に出力したメッセージはジャーナルになる。つまり、自分でログファイルなどを作成する必要が無いとも言える。
ジャーナルの確認
# journalctl -u ユニット名 -f
これでジャーナルとして出力が確認出来れば問題は無い。
フィルターの自作
# Fail2Ban filter Toybox authentication or failure
#
[INCLUDES]
before = common.conf
[Definition]
# Type of log-file resp. log-format (file, short, journal, rfc5424):
logtype = journal
_daemon = toybox
failregex = ([^\s]+\s+)+((\[WARNING\])|(\[CRITICAL\]))\s+([^\s]+\s+)+((failure)|(failed)|(deny)|(denied))\s+(from)\s+<HOST>$
ignoreregex = ((127\.0\.0\.1)|(::1)|(\s192\.168\.3.\d+))$
journalmatch = _SYSTEMD_UNIT=toybox.service + _COMM=toybox
説明
「/etc/fail2ban/filter.d/フィルター名.conf」
ここでは作成したサービス(ユニット)は「toybox」である。先ずは自分が作成したユニットに変更して貰いたい。
次に重要なのは「logtype = journal」と「journalmatch = _SYSTEMD_UNIT=toybox.service」である。
これにより、上記のコマンドの「journalctl -u ユニット名 -f」の監視対象がジャーナルである事と、ユニットが「toybox.service」である事を記述している。
「failregex」にはジャーナルの Ban 対象となる正規表現を記述している。ここで重要な部分は「<HOST>」の部分である。ここに攻撃者の IP アドレスが入る事を想定している。
「ignoreregex」には Ban 対象外のアドレスを正規表現で記述おく。「<HOST>」の部分が「ignoreregex」にマッチする場合は、Ban 対象外となる。
なお、今回のファイル名は「toybox.conf」としておいた。
「/etc/fail2ban/jail.d/local.conf」に追記
[DEFAULT]
bantime = 1h
findtime = 1d
maxretry = 3
sender = Banした時の通知元のメールアドレス
destemail = Banした時の通知先のメールアドレス
action = %(action_mwl)s
ignoreip = 127.0.0.1/8 192.168.3.0/24 ::1
[フィルター名]
enabled = true
action = firewallcmd-rich-rules %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", chain="%(chain)s"]
「enabled = true」でフィルターが有効になる。
「action = firewallcmd-rich-rules」は、Ban する方法が、firewall-cmd の rich-rules を用いたブロックが行われる事を示している。
Fedora では FirewallD が用いられているので、「firewallcmd-rich-rules」を使用しているが、iptables を利用している場合は「iptables-rich-rules」を選択する必要がある。
※ Ubuntu などではファイヤーウォールとして「uwf」を使用しており、「uwf」は「iptables」のフロントエンドらしいので、「iptables-rich-rules」を選択する必要があると思われる。
なお、Ban する時間は「bantime = 1h」で1時間、期間は「findtime = 1d」で1日に対して、「maxretry = 3」3回以上(4回目からはBan)としている。