fail2ban 0.9.3をインストールしてFTP攻撃をブロックする方法

所有している公開サーバで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中の規制時間はリセットされるっぽいです。

つまり再起動のタイミングからまた待機。

コメントを残す

メールアドレスが公開されることはありません。