fail2banで不正アクセス対策
ApacheやNginxなどを利用してWebサーバを運用している場合、fail2banを導入することで、短時間に大量アクセスを行うIPアドレスからのアクセスを禁止(ban)することができる。
fail2banのインストール
AlmaLinux (8/9/10)にfail2ban-firewalldパッケージをインストール。
$ sudo dnf install epel-release -y sudo dnf install fail2ban fail2ban-firewalld -y
そして起動設定
$ sudo systemctl enable –now fail2ban sudo systemctl status fail2ban
$ sudo dnf install epel-release -y sudo dnf install fail2ban fail2ban-firewalld -y
そして起動設定
$ sudo systemctl enable –now fail2ban sudo systemctl status fail2ban
fail2banの設定ファイルの作成
jail.confファイルは、デフォルトのテンプレートファイルです。パッケージのアップグレードによって上書きされる可能性があります。また、変更内容について将来のバージョンと互換性がない可能性があるため、直接変更することは推奨されていません。
新しく設定を行う場合は、jail.confファイルを直接編集せずに、jail.localファイルやjail.d/*.confファイルをカスタマイズする方法が推奨されています。
従ってjail.localファイルを新たに作成するか、/etc/fail2ban/jail.d/ディレクトリ配下に個別の.confファイルを追加することで、設定の上書きが可能です。
#vi /etc/fail2ban/jail.d/apache.local
Apache Webサーバーの保護に向けた Fail2ban の具体的な設定例 AlmaLinuxでは、設定ファイルを
/etc/fail2ban/jail.d/apache.local に新規作成して管理するのが効率的です。以下の内容をapache.localファイルに貼り付けて保存。 主要な攻撃パターン(認証失敗、脆弱性スキャン、不正Bot)をカバーしています。
[DEFAULT] #誤検知を防ぐため、自分自身のIPなどを除外設定(必要に応じて変更)
ignoreip = 127.0.0.1/8
[apache-auth] #Basic認証の失敗を監視
enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 3 bantime = 1h
[apache-badbots] #有害な検索BotやスパムBotを遮断
enabled = true port = http,https logpath = %(apache_access_log)s bantime = 48h maxretry = 1
[apache-noscript] #存在しないスクリプト (.php, .asp等) へのリクエスト(攻撃の予兆)を監視
enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 3
[apache-overflows] #不自然に長いURLなどのバッファオーバーフロー攻撃を監視
enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 2
設定の反映
#systemctl restart fail2ban
動作の確認
#全体の有効なJailリストを表示
#fail2ban-client status
Status |- Number of jail: 4 `- Jail list: apache-auth, apache-badbots, apache-noscript, apache-overflows #特定のJail(例: apache-auth)でBANされたIPを確認
#fail2ban-client status apache-auth Status for the jail: apache-auth |- Filter | |- Currently failed: 0 | |- Total failed: 0 |
- File list: /var/log/httpd/ssl_error_log /var/log/httpd/error_log – Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:誤検知を防ぐため、自分自身のIPなどを除外設定(必要に応じて変更) 127.0.0.1/8 の後ろにスペースを入れて自分のIPを追記
ignoreip = 127.0.0.1/8 219.104.140.224
確認コマンド: 実際に Fail2ban がその IP を除外リストとして認識しているか。 #fail2ban-client get apache-auth ignoreip These IP addresses/networks are ignored:
|- 127.0.0.0/8
`- 219.104.140.224
BANを解除(アンバン)するコマンド
基本の解除コマンド #fail2ban-client set <Jail名> unbanip <解除したいIP>
例:apache-auth でブロックされた 219.104.140.224 を解除する場合
#fail2ban-client set apache-auth unbanip 219.104.140.224
例:apache-auth でブロックされた 219.104.140.224 を解除する場合
#fail2ban-client set apache-auth unbanip 219.104.140.224
設定変更を行う際は、サービスの再起動または設定ファイルの再読み込みを行います。
手動でBANするコマンド
#fail2ban-client set [Jail名] banip [IPアドレス]
例: #fail2ban-client set apache-noscript banip 104.28.161.72
注意点
例: #fail2ban-client set apache-noscript banip 104.28.161.72
注意点
Jailの指定が必要: Fail2Banは「どのルール(Jail)で遮断するか」を指定する必要があります。通常は sshd や apache-noscript など、稼働しているJailを指定します。
持続性: このコマンドでBANしたIPも、先ほど設定した bantime(24時間)が経過すると自動的に解除されます。
引数に設定したルールを付与することで、個別に状態を確認できます。
fail2ban-の設定値確認
$ sudo fail2ban-client -d
ファイアウォール設定確認(nff)
$ sudo nft list ruleset
ファイアウォール設定確認(iptables)
$ sudo iptables -L -n –line-numbers
fail2banの運用
fail2banのログの見方及びログの分析方法を以下に記載します。
また、ログの分析結果を踏まえて、アクセスの傾向に応じた応用的な対策について紹介します。
ログの確認は、/var/log/fail2ban.logファイルを参照します。/var/log/faillogファイルはバイナリファイルです。
/var/log/fail2ban.logファイルについて、監視対象のログファイルがフィルターの条件に一致した場合、Foundのメッセージが出力されます。
その後、findtimeで設定した時間内にmaxretry回以上のしきい値を超えた場合、当該IPアドレスに関するBanのメッセージが出力されます。
設定した時間が経過すると、制限は解除されるるため、Unbanのメッセージが出力されます。
頻繁に同じIPが BAN/Unban を繰り返す場合は、以下の設定を確認。
-
遮断時間を延ばす: 繰り返し攻撃してくる相手に対し、
/etc/fail2ban/jail.local内のbantimeを長く設定する(例:bantime = 1d)。
「bantime.increment」などの高度な設定
ファイルの上方にある
bantime.increment や bantime.factor などは、**「何度もBANされるしつこい攻撃者に対して、遮断時間をどんどん長くするかどうか」**を決めるオプションです。現在はすべて
# でコメントアウトされているため、これらは機能していません。 つまり、何度攻撃してきても毎回「10分」で解除されます。もし、しつこい攻撃者を自動で長時間追放したい場合は、これらを使います。
-
bantime.increment = true: これを有効にすると、2回目のBANは20分、3回目は40分…のように自動で増えます。 -
bantime.multipliers: 10分、1時間、1日…のように、段階的な時間を自分で指定できます。
例:デフォルトの遮断時間を1日(1d)に延ばしたい場合
jail.local に以下のように記述します。
[DEFAULT]
bantime = 1d
コマンド結果から大きく以下の傾向が確認できました。
基本的なパターンは、同一IPアドレスからの大量アクセスです。時間帯に規則性はなく、Banが行われても連日による不定期なアクセスが確認できます。
対策
対策として2つの方法を紹介します。
1つ目の対策は、設定ファイルのチューニングです。findtimeやmaxretryの値を小さくし、bantimeの値を伸ばすことで、アクセスを低減することができます。
2つ目の対策は、recidiveジェイルを併用することで、過去に何度もBanされているIPアドレスを長期的にBanすることができます。
recidiveジェイルの使用する場合は、/etc/fail2ban/jail.localファイルに以下のような設定を記述します。 以下の例では24時間以内に3回以上Banされていたら1週間Banにします。
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
findtime = 86400
maxretry = 3
bantime = 604800
backend = auto
設定変更後、サービスの再起動などを行います。
recidiveジェイルは、単一のジェイルに限らず、複数のジェイルによってBanされた履歴も含めて判断します。


