|
アタック対策fail2ban |
2010年10月28日 | 2016年1月2日 更新 |
サーバーに不正にログインしようと試みるホストを検知し、接続拒否するためのソフトfail2banを導入しました。効果絶大、お薦めです。 |
2016年1月2日 追記最近fail2banがアップグレードされ、特にフィルター部分などのファイルや書き方が変更になっています。 この記事は古いfail2banのものですので、あまり参考にはなりません。 新しいfail2banは設定がとてもわかりにくくなってしまい、英語堪能、正規表現得意という方でないと少し苦労するかもしれません。私もよくわからず、そこそこ動けばいいやというところで使っています。 参考に、最近のfail2banの設定はこちら。 → アタック対策 fail2ban (2016.1) |
時折サーバーの負荷が非常に増大していることがあり、調べてみると何者かがSSHやFTPを使ってサーバーに不正ログインをしようとしています。 すべて海外からのアクセスでいくら辞書攻撃をやっても、普通の辞書にはない間違っても他人には言えないくらい上品な日本語をそのままローマ字にしたような私のパスワードが破られるとは思いませんが、気持ちよくありません。 このような不正アタックをログから検知して接続を拒否するソフトがあり、今回そのどれかを使ってみようと思います。 有名どころではdenyhosts,blockhosts,fail2banなどですが、いろいろ比較検討した結果、fail2banを使うことにしました。 |
ソフトの簡単な比較
・hosts.denyを使いTCPWrapper で制御。
・TCPWrapperを使用するサービスに適用される。
・sshがメインのようでそれ以外もできるらしいが情報不足。
・denyhosts-2.6-5 がEPELにあり。
denyhosts-2.6-3 がRPMForgeにあり。
blockhosts
・hosts.allowを使いTCPWrapper で制御、
あるいはファイアウォールを使うことも可能。
・sshがメインのようでそれ以外もできるらしいが情報不足。
・CentosPlus,EPEL,RPMForgeのいずれにもパッケージはない。
fail2ban
・ファイアウォールとTCPWrapper両方使える。
・(ログがあってフィルターが書ければ)原理的にはすべてのサービスに適用可能。
・sshd httpd proftpd vsftpdなどのフィルタが標準で準備されている。
postfix,dovecotなど他のフィルターも何とか自分で書けそう。
・gamin, shorewallが必要。
gaminはなぜかすでにインストールされてる。
shorewall-4.0.15-1 がEPELにあり。
・fail2ban-0.8.2-3 がRPMForge にあり。
fail2ban-0.8.4-23 がEPELにあり。
・情報が他に比べわりと多い。
インストール
shorewallはfail2banのインストール依存関係で必要なだけで特に使わなくてもいいようです。(単に作者の好みでshorewall推奨ということのようだ。)
rpmに--nodepsオプションをつければインストールしなくてもいいようですが、ちょっと興味があるのでインストールしておいて、あとでゆっくりいじってみます。
引き続きfail2banをインストール。fail2ban-0.8.4-23.el5.noarch.rpm。
設定
設定ファイル /etc/fail2ban/jail.conf編集。
ざっとみてみると、ssh, proftpd, sasl, apache, named, ...といろいろフィルターが入っています。またTCPWrapperを使うサービスについては、個々にiptablesだけでなく、hosts.denyを使う(denyhostsと同じような)設定もできるようです。
あとは必要に応じて有効化、ログの場所確認、通知メールの確認などをやればいいようです。
以下、/etc/fail2ban/jail.conf 変更箇所。
[default]
maxretry = 5 …自分でも3回くらい間違えることはよくあるんだわ。
logtarget = /var/log/fail2ban.log
…出力log位置は好みで変更。合わせてloglotateの方も変えておく。
あとは各セクションを編集。例:
[ssh-iptables]
enabled = true …セクションを有効にする。
filter = sshd …フィルターの指定。/etc/fail2ban/filter.dに.confとしてある。
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=root, sender=fail2ban]
…メールアドレス確認あるいは修正。
logpath = /var/log/secure …検査するlogの場所確認。
maxretry = 5 …好みで変更。
その他 [proftpd-iptables] などそのまま使えるのを同様に有効にしておきます。
<参考>
# which sshd
/usr/sbin/sshd
# ldd /usr/sbin/sshd
linux-gate.so.1 => (0x0073f000)
libwrap.so.0 => /lib/libwrap.so.0 (0x00448000)
libpam.so.0 => /lib/libpam.so.0 (0x00d91000)
........
で、libwrap.soがあれば該当サービスがTCPWrapper(hosts.allow, hosta.deny)によるチェックをしているということで、tcpwrapperが使えます。これがない場合はiptablesを使わなくてはなりません。
オプションで使うか否かが変更されている場合があるので実際にインストールされている状態での確認が必要です。
起動
# service fail2ban start
見事SELinuxに拒否されました。
起動と停止時にunixソケットにアクセスするのがいけないようです。
例によってSELinux Managementから簡単に許可しようとしましたが...該当する設定項目がありません。
しかたないので許可ポリシーとかをつくってインストールします。
許可ポリシーの作成とインストール。
(私の場合は)/var/log/audit/audit.logにSELInuxのログが記録されています。
まず/var/log/audit/audit.log を空にしておきます。
# > /var/log/audit/audit.log
# setenforce 0 でSELinuxをPermissiveモードにします。
問題のアクセスをやってみます。file2banを起動、停止。
# service fail2ban start; service fail2ban stop
/var/log/audit/audit.logにSELinuxのなんたらかんたらが記録されます。
読んでもよくわかりません。
audit.logからポリシー許可ファイルをつくる。
# mkdir -m 0600 SELinux/ …作業と保存用ディレクトリをなければつくる。
# cd ~/SELinux/
# audit2allow -i /var/log/audit/audit.log -m fail2ban > fail2ban.te
バイナリ形式に変換。
# checkmodule -M -m fail2ban.te -o fail2ban.mod
組込み用パッケージを作る。
# semodule_package -m fail2ban.mod -o fail2ban.pp
パッケージを組み込む。ちょっぴり時間がかかる。
# semodule -i fail2ban.pp
これでOKのはず。
ふたたびSELinuxを起動しておいてfail2banを立ち上げてみます。
# setenforce 1
# service fail2ban start
こんどはOKです!。
アクセスのソースもターゲットも固定されているのでこの方法でいいと思います。
確認maxretryは先ほど2に変えてあります。 SSHででたらめのパスワードをいれてわざとログインを失敗してみます。 ....3回パスワードを要求してきます。おかしいな。 接続を切ってまたつなぐとまたパスワードを要求してきます。 fail2banはもくろみ通りには働いていません。 ProFTPDではちゃんと3回目で応答がなくなり、 [Fail2Ban] ProFTPD: banned xxx.xxx.xxx.xxxというメールがきます。 |
調整SSHでfail2banが働かない原因はすぐにわかりました。 同じユーザで接続を切らずにパスワードだけ変えてログインを失敗してもFailedログは毎回は出力されません。 Oct 30 21:02:52 jiji sshd[4957]: Failed password for admin from .... Oct 30 21:03:59 jiji last message repeated 2 times ....ということは、SSH側で3回、fail2banで3回として最大9回失敗しないとだめだということだな。 アタックがあると何百回もあるからまあ9回でもいいか。 で、SSHで3回、fail2banで3回に設定しなおし。 ためしに1回ごとに接続を切ってやってみたらちゃんと拒否されました。 しばらくしたらメールがきました。 [Fail2Ban] SSH: banned xxx.xxx.xxx.xxx私のIPアドレスではありません。だれかがひっかかったということだな。むふふ。 これでよし! |
効果絶大だな。
dovecot追加その後ログをつらつらと見ていますと、dovecotにもアタックの形跡がありました。人のメールを見てどうしようというんだ? fail2banにはdovecotのフィルターはついていなかったので追加しましょう。 まずは/etc/dovecot.conf、認証ログの詳細を出力するよう設定を変更。 auth_verbose = yes /etc/fail2ban/jail.confにdovecotセクション追加。 [dovecot-iptables]さらに/etc/fail2ban/filter.d/にdovecot.confを作成し、認証の拒絶ログを見ながらフィルターを作成。 ログイン方法や切断再接続の仕方などによっていくつかパターンが出てくるようです。 また私の場合は認証はMySQLで行っていますので、それ以外の場合はわかりません。 [Definition]翌日fail2banよりbanメールがきましたのでちゃんと働いています。ただかなりの数同時接続をやっているようなのと多少の遅れがあるみたいで、拒否するまで数十個のアタックログはありました。(dovecotの同時接続数を減らせばいいのかもしれない。) |
http追加httpにもあやしいアクセスがきます。adminツールをねらっており特にphpMyAdmingがいいターゲットになっているようです。 .htaccessでアクセスはlocalhostのみに制限はしてあり問題はないと思われますが、なんといってもログがうっとうしい。 /etc/fail2ban/jail.confに[apache-badbots]というセクションがあったのでそれをコピーして少々変更。 [http-iptables]/etc/fail2ban/filter.d/http-scan.confも適当なのをコピーしてきてつくる。 [Definition]で、OK。 |
トラブル(というよりどじ)
他のSSHとかはちゃんと動作しています。なんでだろう?
...で、思い出しました。少し前に自分のプログラムミスで大量のエラーログを吐かせてしまい、鬱陶しいのでそれを消していたのです。
もしかしたらfail2banはログの何行目あるいは何文字目まで見たかを覚えていて、ログを勝手に消した場合には覚えた数になるまでたまらないと動作しないのかもしれないと思い、fail2banを再起動。
その後はちゃんと検出するようになりました。めでたしめでたし。
failregex集(2013.6.12 追加) けっこう検索サイトからfail2ban用のフィルターを求めて来る方が多いので、参考までに私のを記載しておきましょう。上に記したのから少し変更したり追加したりしています。 (自動改行はしませんのでブラウザの幅をめいっぱい広げて見てください。) まずは、jail.conf の該当部分。 /etc/fail2ban/jail.conf ........ |
/etc/fail2ban/filter.d/sshd.conf failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>\s*$ |
/etc/fail2ban/filter.d/dovecot.conf failregex = \S+ dovecot: \S+-login: Aborted login:.* rip=<HOST>, \S+ |
/etc/fail2ban/filter.d/httpd.conf failregex = [[]client <HOST>[]] script '.*' not found or unable to stat$ |
/etc/fail2ban/filter.d/postfix.conf failregex = reject: RCPT from (.*)\[<HOST>\]: 550 5.1.1 |
/etc/fail2ban/filter.d/proftpd.conf failregex = \(\S+\[<HOST>\]\)[: -]+ USER \S+: no such user found from \S+ \[\S+\] to \S+:\S+ *$ |
(参考) VineLinuxでもfail2ban (2014.5 追記)
|