外部からの執拗なアタックを軽減させるツール
本家様 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 ~]#

RHEL8/Rocky8

--- /etc/fail2ban/fail2ban.conf.orig    2020-11-24 05:43:03.000000000 +0900
+++ /etc/fail2ban/fail2ban.conf 2021-10-27 13:03:32.723439882 +0900
@@ -46,14 +46,14 @@
 #         communicate with the server afterwards.
 # Values: [ FILE ]  Default: /var/run/fail2ban/fail2ban.sock
 #
-socket = /var/run/fail2ban/fail2ban.sock
+socket = /run/fail2ban/fail2ban.sock
 
 # Option: pidfile
 # Notes.: Set the PID file. This is used to store the process ID of the
 #         fail2ban server.
 # Values: [ FILE ]  Default: /var/run/fail2ban/fail2ban.pid
 #
-pidfile = /var/run/fail2ban/fail2ban.pid
+pidfile = /run/fail2ban/fail2ban.pid
 
 # Options: dbfile
 # Notes.: Set the file for the fail2ban persistent data to be stored.

selinux

「/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されます.
っていうかこれだけでよくね?って思いもあるが、まぁ対策は重層的に

最新の60件
2024-10-11 2024-10-10 2024-10-09 2024-10-08 2024-10-06 2024-10-05 2024-10-04 2024-10-03 2024-10-02 2024-10-01 2024-09-30 2024-09-29 2024-09-28 2024-09-27 2024-09-22 2024-09-20 2024-09-17 2024-09-12 2024-09-09 2024-09-08 2024-09-06 2024-09-05 2024-09-04 2024-09-02 2024-09-01 2024-08-31 2024-08-28 2024-08-18 2024-08-17 2024-08-16 2024-08-15 2024-08-14 2024-08-11

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-09-29 (金) 11:56:57