所有している公開サーバでFTPによる不正アタックが頻発してきましたので、SSHやFTPといった様々なアプリケーションのログファイルを監視し、指定したフィルターにマッチした場合に自動的に iptables (ファイアウォール) へポリシーを追加して攻撃をブロックしてくれる fail2ban を導入してみることにしました。
fail2ban では自動的にポリシーを追加するだけじゃなく、指定した時間が経過するとポリシーから削除(Banを解除)してくれる機能もあるのでワリと便利です。
目次
インストールする
まずは関連するパッケージとして ipset (公式リポジトリ) と python-inotify (EPELリポジトリ) をインストールします。
$ yum install ipset $ cd /usr/local/src $ wget https://dl.fedoraproject.org/pub/epel/6/i386/python-inotify-0.9.1-1.el6.noarch.rpm $ rpm -ivh python-inotify-0.9.1-1.el6.noarch.rpm
続いて fail2ban をEPELリポジトリからダウンロードしてインストールします。
$ wget https://dl.fedoraproject.org/pub/epel/6/i386/fail2ban-0.9.3-1.el6.1.noarch.rpm $ rpm -ivh fail2ban-0.9.3-1.el6.1.noarch.rpm
試しに動作させてみると、今のところ何もリストに存在していないことが分かります。これでひとまずインストールは完了。
$ /etc/rc.d/init.d/fail2ban start fail2ban を起動中: [ OK ] $ fail2ban-client status Status |- Number of jail: 0 `- Jail list:
fail2banのログファイルを変更する
ail2ban のログがデフォルトではシスログ( /var/log/messages )になっているので、独自のログファイル( /var/log/fail2ban.log )に変更します。
$ cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.conf.org $ vi /etc/fail2ban/fail2ban.conf logtarget = SYSLOG ↓ 変更 logtarget = /var/log/fail2ban.log $ /etc/rc.d/init.d/fail2ban restart
ちなみにログファイルのローテート設定は自動で行われます。便利。
$ cat /etc/logrotate.d/fail2ban # # Gentoo: # http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/net-analyzer/fail2ban/files/fail2ban-logrotate?view=markup # # Debian: # https://github.com/fail2ban/fail2ban/blob/debian/debian/fail2ban.logrotate # # Fedora view: # http://pkgs.fedoraproject.org/cgit/fail2ban.git/tree/fail2ban-logrotate /var/log/fail2ban.log { rotate 7 missingok compress postrotate /usr/bin/fail2ban-client flushlogs 1>/dev/null || true endscript }
初期設定(フィルタの用意)
いろいろなサービスの監視ができますが、今回はFTP(vsftpd)の監視をしたいと思います。
独自のフィルタは /etc/fail2ban/jail.local というファイルを新規で作成して設定します。
今回は
- 1200秒(20分間)の間に
- 5回の接続処理(失敗)が発生した場合
- 300秒(5分間)の間、該当IPからの接続をブロックする
という閾値をとります。
尚、action を指定することで、ban(ブロック)が発生した場合はメールが通知されます。
$ vi /etc/fail2ban/jail.local [vsftpd] enabled = true filter = vsftpd action = iptables-multiport[name=vsftpd, port=ftp, protocol=tcp] sendmail-whois[name=vsftpd, dest=root] logpath = /var/log/vsftpd.log maxretry = 5 findtime = 1200 bantime = 300 ignoreip = 127.0.0.1 $ /etc/rc.d/init.d/fail2ban restart $ fail2ban-client status Status |- Number of jail: 1 `- Jail list: vsftpd
試しにFTP攻撃をして動作を確認する
攻撃元サーバで下記を実行します。
これで接続失敗を短時間で5回連続実施することになります。
$ vi ftptest.txt open [FTPサーバのIP] user hogehoge hogepassword ascii pwd $ ftp -n < ftptest.txt & $ ftp -n < ftptest.txt & $ ftp -n < ftptest.txt & $ ftp -n < ftptest.txt & $ ftp -n < ftptest.txt &
FTPサーバでログを参照して攻撃状態を確認します。
$ tail -f /var/log/messages Nov 5 10:03:31 hogeserver fail2ban.filter[22050]: INFO [vsftpd] Found [FTPサーバのIP] Nov 5 10:03:31 hogeserver fail2ban.filter[22050]: INFO [vsftpd] Found [FTPサーバのIP] Nov 5 10:03:32 hogeserver fail2ban.filter[22050]: INFO [vsftpd] Found [FTPサーバのIP] Nov 5 10:03:33 hogeserver fail2ban.filter[22050]: INFO [vsftpd] Found [FTPサーバのIP] Nov 5 10:03:34 hogeserver fail2ban.actions[22050]: NOTICE [vsftpd] Ban [FTPサーバのIP] Nov 5 10:03:35 hogeserver fail2ban.filter[22050]: INFO [vsftpd] Found [FTPサーバのIP]
キチンと攻撃をブロックするようになりました。
念の為に iptables も確認してみます。
/etc/rc.d/init.d/iptables status テーブル: filter Chain INPUT (policy ACCEPT) num target prot opt source destination 1 f2b-vsftpd tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 21 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain f2b-vsftpd (1 references) num target prot opt source destination 1 REJECT all -- [攻撃元IP] 0.0.0.0/0 reject-with icmp-port-unreachable 2 RETURN all -- 0.0.0.0/0 0.0.0.0/0
これで一通りの検証まで完了です。
サクッと便利。
規制を手動で解除する方法
尚、規制された場合に手動で規制を解除するには下記方法しかなさそうです。
- ホワイトリストに追加する。
- 規制時間が過ぎるのを待つ。
おまけ:試しに検証してみて分かったこと
ちなみに何らかの規制が実施中にfail2ban を再起動した場合、ban中の規制時間はリセットされるっぽいです。
つまり再起動のタイミングからまた待機。