CentOS 7 で fail2ban を使ってみたメモ

2020/04/18

fail2ban とは、ログファイルを読み取り、不審なアクセスを行なった IP Address 特定し、当該 IP Address からのアクセスを自動的に一定時間(期間)拒否することができるソフトウェアです。

訳あって、すぐに sshd のポートを変更できないサーバーを任されていますが、Port 22 への攻撃が激しいため fail2ban を導入しました。

作業は全て root で行っていることを前提としています。

環境

  • CentOS 7.2

インストールと起動

fail2ban は EPEL (エンタープライズ Linux 用拡張パッケージ) リポジトリにありますので、まだ EPEL リポジトリを導入していない時は次のように導入します。

bash
yum install epel-release

EPEL リポジトリの導入が済みましたら、早速 fail2ban のインストールと起動を行います。

yum install fail2ban
systemctl start fail2ban
systemctl enable fail2ban

これだけで導入は完了です。
続いて sshd の監視を行う設定を書いていきます。

設定

設定ファイルは /etc/fail2ban/jail.conf になりますが、直接触るのではなく、/etc/fail2ban/jail.local を作ることで設定をオーバーライドできるようです。

例えば、下記のような 2 行だけのファイルを作成し、/etc/fail2ban/jail.local として保存すると、sshd の監視を行うことができます。

[sshd]
enabled = true

つまり jail.local に書かれていない記述は jail.conf がデフォルト値として使われるようですので、jail.conf を参考に jail.local を作っていくことを考えればよいかと思います。

しかし、個人的には fail2ban のアップデートを行なった時に動作が変わることを極力防ぐことができるとも考えられるので、/etc/fail2ban/jail.conf をコピーして使っても良いと考えます。

cp -p /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

設定の反映

daemon を再起動させます。

systemctl start fail2ban

動作確認

現在の状態を確認するには次のコマンドで行います。

fail2ban-client status sshd

表示例

$ fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     5
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   117.135.144.233

現在の ban リストの確認方法は次のコマンドで行います。

ipset --list

表示例

Name: fail2ban-sshd
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536 timeout 600
Size in memory: 16656
References: 1
Members:
117.135.144.233 timeout 120

fail2ban-sshd という名前でまとめて、iptables で制御しているようです。

iptables にこのようなルールが追加されていました。

Chain INPUT_direct (1 references)
target     prot opt source               destination         
REJECT     tcp  --  anywhere             anywhere             multiport dports ssh match-set fail2ban-sshd src reject-with icmp-port-unreachable

生ログをみてみます。

more /var/log/fail2ban.log
2017-01-08 15:03:54,036 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:03:54,038 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:03:54,048 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:03:54,054 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:03:54,574 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:03:55,356 fail2ban.actions        [29852]: NOTICE  [sshd] Ban 117.135.144.233
2017-01-08 15:13:56,161 fail2ban.actions        [29852]: NOTICE  [sshd] Unban 117.135.144.233
2017-01-08 15:14:20,713 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:16:30,647 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:18:36,460 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:20:37,708 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:22:48,156 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 15:22:48,879 fail2ban.actions        [29852]: NOTICE  [sshd] Ban 117.135.144.233
                :
               省略
                :
2017-01-08 19:00:28,966 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 19:02:27,070 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 19:04:30,232 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 19:04:31,068 fail2ban.actions        [29852]: NOTICE  [sshd] Ban 117.135.144.233
2017-01-08 19:14:31,870 fail2ban.actions        [29852]: NOTICE  [sshd] Unban 117.135.144.233
2017-01-08 19:14:45,760 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 19:15:55,291 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233
2017-01-08 19:17:47,258 fail2ban.filter         [29852]: INFO    [sshd] Found 117.135.144.233

ban -> unban -> ban -> unban を延々と繰り返している IP Address があります。

このような攻撃への対策も fail2ban で行えます。

常習犯対策

繰り返し不正アクセスを試みる IP Address に対しては、recidive の設定をします。recidive とはオランダ語で「常習犯」という意味のようで、ある一定期間で決められた回数の BAN が行われた IP Address を長期間アクセス拒否にする設定です。

/etc/fail2ban/jail.local に次を追記しました。

[recidive]
enabled = true
maxretry = 3

3 回 BAN を繰り返した IP Address を対象としています。

設定後は忘れずに daemon を再起動します。

systemctl start fail2ban

その後ログをみてみます。

grep "recidive" /var/log/fail2ban.log
2017-01-08 20:49:38,035 fail2ban.jail           [944]: INFO    Creating new jail 'recidive'
2017-01-08 20:49:38,036 fail2ban.jail           [944]: INFO    Jail 'recidive' uses poller
2017-01-08 20:49:38,042 fail2ban.server         [944]: INFO    Jail recidive is not a JournalFilter instance
2017-01-08 20:49:38,059 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,060 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,061 fail2ban.jail           [944]: INFO    Jail 'recidive' started
2017-01-08 20:49:38,066 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,069 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,071 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,072 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,074 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,078 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,080 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,082 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,084 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,086 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,088 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,090 fail2ban.filter         [944]: INFO    [recidive] Found 91.224.161.88
2017-01-08 20:49:38,092 fail2ban.filter         [944]: INFO    [recidive] Found 117.135.144.233
2017-01-08 20:49:38,387 fail2ban.actions        [944]: NOTICE  [recidive] Ban 117.135.144.233

しつこい 117.135.144.233 が recidive に引っかかったようです。

とりあえずこんな感じにしました

sshd について、600 秒以内(デフォルト)に 3 回不正アクセスを行なった IP Address を 600 秒間(デフォルト) BAN します

常習犯(recidive)について、1 日以内(デフォルト)に 3 回 BAN になった IP Address を 1 週間(デフォルト) BAN します。

[sshd]
enabled = true
maxretry = 3

[recidive]
enabled = true
maxretry = 3

ちなみに複数ポートをチェックする時は

複数ポートを監視する時にはカンマで区切るようです。

[sshd]
enabled = true
port = ssh,10022
maxretry = 3