インストールや基本的は設定については、ネット上でたくさん公開されているので割愛します
この記事では
インストール&基本設定では想定した通りに動作しなかったので、ちょっとひと工夫した点をご紹介(たいした工夫ではないですが)
実装環境は以下の通り
- AmazonLinux
- fail2ban(amzn-mainレポジトリ)
- BAN対象:ssh(port 22)
- 監視対象ログ:/var/log/secure
sshをBanする際のキモとなる設定箇所は「./filter.d/sshd.conf」の「failregex=」に記述する正規表現なのですが、インストールしたままのデフォルトの記述では上手くBan出来ない。
「failregex=」の記述を修正する必要があることはすぐ想像が付くのですが
「修正→しばらく動作→確認」をちまちまやるのが面倒なので、何か良い方法がないか調べたところ「fail2ban-regex」なるコマンドがあることを発見。
使い方はこちら
$ fail2ban-regex /var/log/secure /etc/failsban/filter.d/sshd.conf
でもこれだとsecureのサイズが大きい時にアウトプットに時間がかかるのと、secureのどの記述が「failregex=」の正規表現にヒットしているのかイマイチ分かりにくい。
で、manコマンドの表示をよく見てみると
$ fail2ban-regex 'string' /etc/failsban/filter.d/sshd.conf
のように、ログファイルを指定する代わりに文字列を直接指定できる事が判明。
試しに、デフォルトのsshd.confのまま実行してみた結果がこちら
$ fail2ban-regex 'Jun 15 03:50:01 hostname sshd[13214]: Invalid user hogehoge from xxx.xxx.xxx.xxx port 41808' /etc/fail2ban/filter.d/sshd.confう~ん、ヒットしません
~途中省略~
Sorry, no match
「failregex=」の記述の
^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$を
^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s.*$に修正
$ fail2ban-regex 'Jun 15 03:50:01 hostname sshd[13214]: Invalid user hogehoge from xxx.xxx.xxx.xxx port 41808' /etc/fail2ban/filter.d/sshd.confおーっ、ビンゴ!!
~途中省略~
Success, the total number of match is 1
想定取りにBanしたいなら
Banしたいログの記述をピックアップしたあと、「fail2ban-regex」を使いながらsshd.confの記述をチマチマ修正していくのが一番確実でした
このやり方はhttpdやmaillogなど全てのサービスでも同じだと思います。
取りあえずのFIX版の設定はご参考までに以下の通り
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from <HOST>( via \S+)?\s.*$
^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s.*$
^%(__prefix_line)sFailed \S+ for .* from <HOST>(?: port \d*)?(?: ssh\d*)?\s.*$
^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s.*$
^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s.*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers\s.*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because listed in DenyUsers\s.*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because not in any group\s.*$
^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s.*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because a group is listed in DenyGroups\s.*$
^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s.*$
^%(__prefix_line)sAddress <HOST> .* POSSIBLE BREAK-IN ATTEMPT!*\s*$
^%(__prefix_line)sreverse mapping checking getaddrinfo .* \[<HOST>\] failed - POSSIBLE BREAK-IN ATTEMPT!\s*$
^%(__prefix_line)s.+Received disconnect from <HOST> port .*:11: .* \[preauth\]$
さらにもうひと工夫
といっても標準実装の「recidive」というフィルタを使うだけなのですが
「jail.local」に以下の記述を追記しました
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
bantime = 864000 ; 10 Days
findtime = 259200 ; 3 days
maxretry = 2
BanされたIPアドレスは設定した時間経過するとUnbanされます。fail2ban.logを見ると、何度も何度もしつこくいらっしゃる方がいるようでして。
「recidive」 フィルタはそのような方をもっと長い期間Ban出来るフィルタです。
おまけ
現在どのIPをBanしてるかを確認したい場合
iptables -L
でもOKですが
「fail2ban-client 」コマンドで統計情報を含めた詳細を確認することが出来ます
$ fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- filter
| |- File list: /var/log/secure
| |- Currently failed: 6
| `- Total failed: 5011
`- action
|- Currently banned: 46
| `- IP list: xxx.xxx.xxx.xxx ~以下省略~
`- Total banned: 307
$ fail2ban-client status recidive
Status for the jail: recidive
|- filter
| |- File list: /var/log/fail2ban.log
| |- Currently failed: 79
| `- Total failed: 476
`- action
|- Currently banned: 104
| `- IP list: xxx.xxx.xxx.xxx ~以下省略~
`- Total banned: 104
今回はこの辺で