nginxのaccess.logに執拗なボットスキャンが絶えないのでfail2banでの一掃を試みた時の手順を備忘録として残しています。
1. 事象と原因(何が起きたか)
事象
NGINXのアクセスログに、海外IP(例:123.45.67.89 等)から存在しないファイル(.php, .env, 管理画面URL等)への大量のアクセス(404エラー)が短時間に記録された。
原因
特定の脆弱性を狙った自動ボットによる無差別な脆弱性スキャン攻撃。放置するとサーバーリソースの枯渇や、未知の脆弱性を突かれるリスクがある。
2. 課題(何が問題だったか)
- Fail2Banが機能不全: jail.conf(デフォルト設定)のまま運用しており、各監視項目(Jail)が enabled = false で無効化されていた。
- 標準フィルターの不足: 標準の nginx-botsearch だけでは、今回のような広範囲な404エラー(ファイル未検出)を出すスキャンを完全には検知できていなかった。
- 再犯者への対策: 一度BANされても、時間が経つと何度も戻ってくるしつこいボットへの重罰化設定が不足していた。
3. 解決手順(実施した作業)
ステップ1:jail.local の作成
設定の重複を避け、メンテナンス性を高めるために /etc/fail2ban/jail.local を作成。共通設定を [DEFAULT] に集約した。
ステップ2:カスタムフィルターの作成標準フィルターで漏れる攻撃を補足するため、独自の検知ルールを作成。ファイルパス: /etc/fail2ban/filter.d/nginx-404-scan.confIni, TOML[Definition]
404エラーログにマッチする正規表現
failregex = ^
画像やCSSの読み込み失敗は無視する
ignoreregex = .(jpg|jpeg|png|gif|css|js|ico|svg|map)$
ステップ3:設定の反映と確認
- 設定反映:sudo systemctl restart fail2ban
- 状態確認:sudo fail2ban-client status全てのJail(sshd, nginx-404-scan等)がリストに入っていることを確認。
4. 運用・検証コマンド集作業中に役立った便利なコマンド
| コマンド | 用途 |
|---|---|
| sudo fail2ban-client status | 特定のJailで現在何件BANされているか確認 |
| sudo fail2ban-regex <ログパス> <フィルターパス> | 設定した正規表現が実際のログにヒットするかテスト |
| sudo fail2ban-client set | 間違えてBANした自分のIPを解除する |
| sudo tail -f /var/log/fail2ban.log | Fail2BanがリアルタイムでIPをBANする様子を監視 |
5. まとめと今後の課題
今回の設定により、ボットによるスキャンは自動的に検知・ブロックされるようになった。今後は、攻撃者のIPが蓄積されてきたら、recidive(再犯者)のBAN状況を定期的にチェックし、必要に応じて bantime.maxtime をさらに延長することを検討する。




