しつこい攻撃を fail2ban でブロックする

スポンサーリンク
スポンサーリンク

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 リポジトリを利用できるように設定します。
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 によって登録されます。
は、ブロックやブロック解除の対象IPアドレスです。

接続ブロック時
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

コメント

タイトルとURLをコピーしました