はじめに

とあるお客様から、「メールやsshで不正アクセスを試みているログが多く、本当に必要なログが見つけにくい。」
というお話があったそうで、

では、「ログを抑制してはいかがでしょう」 external_link

じゃなくて

不正アクセスを試みた相手のIPアドレスからの通信を一定期間ブロックするためのソフトウェアであるfail2banを導入しましょう。

fail2ban 導入

fail2banのインストール

yum install epel* yum install fail2ban

fail2banのサービス起動、自動起動有効化

systemctl start fail2ban.service systemctl enable fail2ban.service

fail2banの設定

設定ファイルのディレクトリはこちらになります。```

cd /etc/fail2ban

設定ファイルはjail.confなのですが、直接編集するのではなく、.localファイルを作成して設定をオーバーライドするのが推奨されていますので、そのようにします。

jail.local(新規作成)

ignoreip = 127.0.0.1/8 # 24時間以内に3回不審なアクセスがあったら24時間BAN bantime = 86400 findtime = 86400 maxretry = 3 #CentOS7なのでsystemd backend = systemd # メール通知時の設定(ご自分の環境に合わせて) destemail = nisitand@host185.net2.localnet sender = root@host185.net2.localnet mta = postfix # SSHのアクセスに対する設定 [sshd] enabled = true banaction = firewallcmd-ipset        sendmail-whois[name=SSH, dest=nisitand@host185.net2.localnet, sender=fail2ban@host185.net2.localnet, sendername="Fail2Ban"]#メール通知(任意) # Postfixのアクセスに対する設定 [postfix-sasl] enabled = true banaction = firewallcmd-ipset sendmail-whois[name=SMTP, dest=nisitand@host185.net2.localnet, sender=fail2ban@host185.net2.localnet, sendername="Fail2Ban"]#メール通知(任意)

※メールアドレスはローカル環境のものです。

action.d/firewallcmd-common.conf(修正:54行目付近)

BANしたときの動作(Action)を定義する設定を一部変更します。デフォルトの動作ではBANした相手に拒否(Reject)していることを伝える設定となっていますが、そんなに親切にしてやる必要はないので破棄(DORP)に動作を変更します。

# Option: blocktype (ipv4/ipv6) # Notes See iptables/firewalld man pages for jump targets. Common values are REJECT, # REJECT --reject-with icmp-port-unreachable, DROP # Values: STRING #blocktype = REJECT --reject-with <rejecttype>★コメントアウト blocktype = DROP★追加

fail2banのテスト

SMTPのテスト

自分の端末からtelnetコマンドで25に接続し、エラーになるSMTP認証コマンドをたたきます。

HELO host150.net2.localnet AUTH LOGIN AUTH LOGIN quit

このような感じで応答が帰ってきます。

220 host185.net2.localnet ESMTP Postfix 250 host185.net2.localnet 334 VXNlcm5hbWU6 535 5.7.8 Error: authentication failed: bad protocol / cancel

これを3回繰り返すと、BANされます。

/var/log/maillogにも、このようなログが記録されます。

Sep 8 11:16:34 host185 postfix/smtpd[2123]: warning: unknown[192.168.2.150]: SASL LOGIN authentication failed: bad protocol / cancel

仮に、このログの場合はBANする対象から外したい、などの要望があった場合は、
filter.d/postfix.conf
を修正すれば良さそうです。

SSHのテスト

こちらはTeratermでssh接続(22/TCP)の時に、でたらめなユーザID、パスワードでログイン失敗すればよいですね。(ほかのパターンの失敗も考えられますが、とりあえず)
BANされるログの条件については、
filter.d/sshd.conf
を見ていただければと思います。

BAN対象の確認

もちろん、パケットを捨てられるのでアクセスがすべてタイムアウトになるのですが、BANの対象を確認する方法を記載します。

# fail2ban-client status postfix-sasl Status for the jail: postfix-sasl |- Filter | |- Currently failed: 0 | |- Total failed: 16 | `- Journal matches: _SYSTEMD_UNIT=postfix.service `- Actions |- Currently banned: 1 |- Total banned: 2 `- Banned IP list: 192.168.2.150

この場合はBanned IP list に192.168.2.150(テスト端末のIPアドレス)が入っていることがわかります。

sshの場合も同様です。

# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 11 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 0 |- Total banned: 2 `- Banned IP list: 192.168.2.150

fail2banの運用

banされているIPアドレス確認

上のテストの際にも実行しましたが、このようになります。

fail2ban-client status [Jail名]

Jail名については、今回のsshd(ssh)、postfix-sasl(smtp)が該当します。

banの解除

fail2ban-client set [Jail名] unbanip [IPアドレス]

[Jail名]については、先の項目と同じでbanしてしまったJail名を入れます。
[IPアドレス]はbanされてしまったIPアドレスをxxx.xxx.xxx.xxxのに入れます。

ためしに

先のテストでbanされたテスト端末をBan解除してみましょう。

# fail2ban-client set postfix-sasl unbanip 192.168.2.150 1
# fail2ban-client status postfix-sasl Status for the jail: postfix-sasl |- Filter | |- Currently failed: 0 | |- Total failed: 16 | `- Journal matches: _SYSTEMD_UNIT=postfix.service `- Actions |- Currently banned: 0 |- Total banned: 2 `- Banned IP list:

これで間違ってbanしても大丈夫ですね。では