外部からの執拗なアタックを軽減させるツール
本家様 https://www.fail2ban.org/wiki/index.php/Main_Page
sshサーバへのddosアタックらを軽減できるみたい. 他にもwebサイトへのF5アタックとか.
本家様でも書かれているが、これを仕込んでもssh接続が安全になるわけではない.
sshd_configの「PasswordAuthentication yes」(/etc/passwdでも認証ok)を「PasswordAuthentication no」として
公開鍵を作ってより効果的にすべきかと.
[root@c ~]# yum install epel-release
[root@c ~]# yum install fail2ban fail2ban-server fail2ban-sendmail fail2ban-firewalld fail2ban-systemd fail2ban-selinux
「/etc/fail2ban/jail.conf」に
# Changes: in most of the cases you should not modify this
# file, but provide customizations in jail.local file,
# or separate .conf files under jail.d/ directory, e.g.:
とあるので「/etc/fail2ban/jail.local」を新規作成します。
方針としては ssh のみ防げばいいので
[sshd]
enabled = true
logpath = /var/log/secure
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.0.0/24
bantime = 600
findtime = 10
maxretry = 1
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-allports
bantime = 4w ;604800 ; 1 week
findtime = 1d ;86400 ; 1 day
maxretry = 2
とする。
そして下記のようにして起動する
[root@c ~]# systemctl enable fail2ban.service
[root@c ~]# systemctl start fail2ban.service
*初回は[recidive]をわざと無効にして流して /var/log/fail2ban.log を作らせて、それから[recidive]を有効にしないと起動に失敗するみたい
運用後暫くすればBanされた方々が下記コマンドで見れます。
[root@c ~]#
[root@c ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 5308
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 24
|- Total banned: 2578
`- Banned IP list: <BanされたIPアドレスが列挙されます>
[root@c ~]#
|
「/var/log/fail2ban.log」を参照して[recidive]を定義すると動かない事態が発生することがある
原因はSElinuxへの対応不足
[root@n1 ~]# ls -lZ /var/log/fail2ban.log
-rw-------. root root system_u:object_r:fail2ban_log_t:s0 /var/log/fail2ban.log
[root@n1 ~]#
「fail2ban-selinux」パッケージを入れる
間違ってbanされたらそれを解除するには
fail2ban-client set sshd unbanip XX.XX.XX.XX
とする
最近ではssh試行時間を長めにとってbanされないように攻撃してくる所がでてきた. 10min間隔とかでssh試行してきます.
fail2banの設定で
findtime = 180
maxretry = 2
なら180秒間に2回のssh試行が失敗したらbanになりますが、ssh試行間隔が 10min ならbanされずずっとssh試行が行われます.
短時間に集中的な攻撃には対応可能なのですが、長めでじっくりとssh試行する侵入者には対応が難しい.
なので下記のようなcronスクリプトを用意してみた.
#!/bin/bash
lastb --since `date "+%Y%m%d%H%M%S" --date '-1 hour'` | awk 'match($3,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {print "echo " $3 ";fail2ban-client set recidive banip " $3}' \
| sort -u -k 2 -n > /tmp/fail2ban-run && bash /tmp/fail2ban-run && rm -rf /tmp/fail2ban-run
これは lastb で特定時間(1時間)の間に起こったfailを集めて、fail2ban-clientコマンドを流すファイル(/tmp/fail2ban-run)を作って実行するスクリプトです.
これをcronに入れて流します.
MAILTO=""
*/10 * * * * /usr/local/sbin/fail2ban.sh
これで 10min に一回上記スクリプトが流れて、間隔の長いssh試行もbanされます.
っていうかこれだけでよくね?って思いもあるが、まぁ対策は重層的に