fail2ban は、ログに特定のパターンが一定時間に指定回数現れたら、指定の動作を行います。
例えば、攻撃を示すログが現れた場合に、iptables で攻撃元からの接続をブロックします。
これにより、辞書攻撃などをブロックします。
例えば、/var/log/secure に下記ログが出力されたとします。
これは sshで試行しようとしたユーザ/パスワードが誤っていた場合に出力されるログです。
XXXXX がユーザ名、YY.YY.YY.YY が接続元のIPアドレス、ZZZZZ が接続元のポート番号です。
Failed password for invalid user XXXXX from YY.YY.YY.YY port ZZZZZ ssh2
fail2ban では、このログが10分間にCentOSでは5回、Ubuntuでは6回現れたら攻撃を受けていると判定し、iptables で攻撃元からの接続をブロックします。
ブロックは 10分後、解除します。
これにより、しつこい辞書攻撃などに対処します。
インストール
Ubuntu14.04 の場合
apt-get install fail2ban
インストール直後から fail2ban は起動しています。
また、システム起動時には自動起動もされます。
CentOS6の場合
まず、EPEL リポジトリを利用できるように設定した後、次を実行します。
yum --enablerepo=epel install fail2ban
次に、CentOS での fail2ban の出力先を /var/log/messages に変更します。
以下のように /etc/fail2ban/jail.local を作成します。
なお、Ubuntu ではデフォルトで /var/log/fail2ban.log となっていますので、この作業は不要です。
/etc/fail2ban/fail2ban.local
[Definition] logtarget = /var/log/fail2ban.log
/etc/fail2ban/fail2ban.local は、/etc/fail2ban/fail2ban.conf の設定を上書きします。
通常はこのように fail2ban.local の方に記述していきます。
fail2ban を起動します。
/etc/init.d/fail2ban start
これで fail2ban の動作が開始しました。
なお、次回システム起動時からは、fail2ban は自動起動してきます。
動作確認
fail2ban のデフォルトでは、ssh に対する攻撃がブロックされるようになっています。
10分間にCentOSでは5回、Ubuntuでは6回、sshのログインでIDやパスワードをミスしてみて下さい。
接続ブロックされ、サーバにssh接続できなくなります。
10分後、ブロックが解除され、サーバにアクセスできるようになります。
接続ブロックの際は、/var/log/fail2ban.log に次のような行が出力されます。
XX.XX.XX.XX が接続元IPアドレス(ブロックされたIPアドレス)になります。
CentOSの場合 WARNING [ssh-iptables] Ban XX.XX.XX.XX Ubuntuの場合 WARNING [ssh] Ban XX.XX.XX.XX
ブロック解除の場合は、次のように出力されます。
CentOSの場合 WARNING [ssh-iptables] Unban XX.XX.XX.XX Ubuntuの場合 WARNING [ssh] UnBan XX.XX.XX.XX
CentOSではこの際、通知先メールアドレスにメール送信することが出来ます。
この設定は、/etc/fail2ban/jail.conf の [ssh-iptables]セクションに記述されています。
[ssh-iptables] enabled = true filter = sshd action = iptables[name=SSH, port=ssh, protocol=tcp] sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.com, sendername="Fail2Ban"] logpath = /var/log/secure maxretry = 5
dest= を変えると送信先メールを変更できます。
変更は、/etc/fail2ban/jail.local に以下のようにして記述します。
[ssh-iptables] action = iptables[name=SSH, port=ssh, protocol=tcp] sendmail-whois[name=SSH, dest=メールアドレス, sender=fail2ban@example.com, sendername="Fail2Ban"]
/etc/fail2ban/jail.local は、/etc/fail2ban/jail.conf の設定を上書きします。
通常はこのように jail.local に記述していきます。
記述後、設定を反映させます。
/etc/init.d/fail2ban reload
ブロックの仕組み
fail2ban のデフォルトでは、ssh に対する攻撃がブロックされるようになっていますが、このブロックは iptables によって行われます。
以下では iptables でのブロック/ブロック解除について説明します。
ここでは CentOS6の場合ですが、Ubuntu も基本的に同様です。
/etc/fail2ban/jail.conf , /etc/fail2ban/jail.local の[ssh-iptables]セクションが有効(デフォルト)になっていると、fail2ban起動時に以下が実行されます。
iptables -N fail2ban-SSH iptables -A fail2ban-SSH -j RETURN iptables -I INPUT -p tcp --dport ssh -j fail2ban-SSH
ユーザ定義チェイン fail2ban-SSH を作成し、fail2ban-SSHチェインではパケットを全て RETURN(許可も拒否もしない)します。
また、INPUTチェインの先頭に、TCP の ssh のポートに対して fail2ban-SSH を適用するルールを設定します。
これにより、iptables のルールの中で、まず fail2ban-SSHチェインのルールが適用されることになります。
fail2ban-SSHチェインは、初期状態では何もルールが登録されていませんが、接続ブロックやブロック解除時に次のようなルールが fail2ban によって登録されます。
接続ブロック時
fail2ban-SSH チェインの先頭に、指定IPアドレスを REJECT するルールを追加します。
iptables -I fail2ban-SSH 1 -s <ip> -j REJECT --reject-with icmp-port-unreachable
ブロック解除時
fail2ban-SSH チェインから、指定IPアドレスを REJECT するルールを削除します。
iptables -D fail2ban-SSH -s <ip> -j REJECT --reject-with icmp-port-unreachable
これら iptables へのルール追加/削除により、接続ブロックやブロック解除を行っています。
その他の攻撃にも対処する
fail2ban は、ssh以外への攻撃にも対処できます。
以下では CentOS6での例を説明します。
smtp認証の場合
smtp認証時のID/パスワードの認証エラーのログは、/var/log/mail.log に以下のように出力されます。
YY.YY.YY.YY が接続元のIPアドレスです。
このような認証エラーを示すログが一定回数現れると、接続をブロックするようにします。
warning: unknown[YY.YY.YY.YY]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
/etc/fail2ban/jail.local に以下を追加します。
[sasl-iptables] enabled = true
先に述べたとおり、jail.local は jail.conf の設定を上書きします。
jail.conf では以下のように記述されており、jail.local で enabled = true にすることで設定を有効にしています。
[sasl-iptables] enabled = false filter = postfix-sasl backend = polling action = iptables[name=sasl, port=smtp, protocol=tcp] sendmail-whois[name=sasl, dest=you@example.com] logpath = /var/log/mail.log
記述後、設定を反映させます。
/etc/init.d/fail2ban reload
これで、smtp認証時のID/パスワードの認証エラーに対しても動作するようになります。
メール受信時の認証
メール受信時のID/パスワードの認証エラーのログは、/var/log/mail.log に以下のように出力されます。
XXXXX がユーザ名、YY.YY.YY.YY が接続元のIPアドレスです。
このような認証エラーを示すログが一定回数現れると、接続をブロックするようにします。
auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=XXXXX rhost=YY.YY.YY.YY
/etc/fail2ban/jail.local に以下を追加します。
[dovecot-auth] enabled = true
jail.conf では以下のように記述されており、jail.local で enabled = true にすることで設定を有効にしています。
[dovecot-auth] enabled = false filter = dovecot action = iptables-multiport[name=dovecot-auth, port="pop3,pop3s,imap,imaps,submission,465,sieve", protocol=t cp] logpath = /var/log/secure
記述後、設定を反映させます。
/etc/init.d/fail2ban reload
これで、メール受信時のID/パスワードの認証エラーに対しても動作するようになります。
以上、fail2ban の説明でした。
参考
CentOS 6.5でfail2banを設定 | Works | URAMIRAIKAN
Ubuntu Manpage: jail.conf – configuration for the fail2ban server
コメント