インターネットに公開されているLinuxサーバーのデフォルトSSHポート(TCP 22)は、自動化されたボットネットによる辞書攻撃やブルートフォース攻撃に常時晒されています。ノード数が増加するインフラ運用において、手動でファイアウォールルールを更新して攻撃IPをブロックする手法は人為的ミスの原因となり、レスポンス速度の観点からも限界を迎えます。
本稿では、/var/log/auth.log に記録される認証試行ログの解析パイプラインを構築し、Fail2banを活用して netfilter(iptables)へ動的にパケットドロップルールを注入する侵入防止システム(IPS)の構成手順を整理します。
認証ログ構造とテキスト解析パイプライン
Debian/Ubuntu系のディストリビューションでは、SSH認証に関するイベントは /var/log/auth.log(RHEL/CentOS系では /var/log/secure)へ出力されます。
攻撃ログのサンプルトレース
May 20 14:21:05 server-node sshd[4102]: Failed password for invalid user admin from 192.168.56.120 port 54321 ssh2
May 20 14:21:07 server-node sshd[4105]: Failed password for invalid user root from 192.168.56.120 port 54322 ssh2
May 20 14:21:09 server-node sshd[4108]: Failed password for root from 192.168.56.120 port 54323 ssh2
May 20 14:21:11 server-node sshd[4111]: Accepted password for deployer from 192.168.56.10 port 51100 ssh2
ログ内の Failed password パターンは認証失敗を示します。invalid user が含まれる場合はローカルの /etc/passwd に存在しないユーザー名での試行であり、含まれない場合は実在するアカウントへの攻撃を意味します。
CLIコマンドによる攻撃IP抽出
大量のログデータから攻撃頻度の高い上位IPアドレスを迅速に特定するため、標準のLinuxユーティリティを組み合わせたパイプラインを実行します。
grep "Failed password" /var/log/auth.log | awk '{for(i=1;i<=NF;i++) if($i=="from") print $(i+1)}' | sort | uniq -c | sort -nr | head -n 10
awk ループ処理により、invalid user 判別の有無によって列位置が変動する場合でも、トークン from の直後のフィールドを確実に抽出します。
Fail2banによる自動防御構成
ログ解析で検出された脅威インジケーターに基づき、Fail2banを用いて動的な遮断ルールを適用します。パッケージデフォルトの設定ファイルを保護するため、/etc/fail2ban/jail.local を作成して定義をオーバーライドします。
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 10m
bantime = 1h
💡 主要パラメーターの定義:
・maxretry: 指定時間内に許容する最大失敗回数です。
・findtime: 失敗回数をカウントするウィンドウ時間です(上記設定では10分間)。
・bantime: 条件を満たした際にパケットを遮断する保持時間です(上記設定では1時間)。
SSHサービスの多層防御設定
IPSの導入に加えて、SSHデーモン自体の設定(/etc/ssh/sshd_config)を最適化して攻撃サーフェスを縮小させます。
ポート番号の変更: デフォルトの 22 ポートから高位ポート(例:
22022)へ変更し、広域スキャナーからの露出を低減します。Direct Rootログインの禁止:
PermitRootLogin noを設定し、特権ディレクトリへの直接侵入を遮断します。パスワード認証の無効化:
PasswordAuthentication noを設定し、公開鍵認証のみを許可することで辞書攻撃を排除します。
Troubleshooting
Fail2ban導入時によく直面するトラブルシューティングと対処法です。
1. systemd環境におけるログパス認識不備
Ubuntu 22.04以降やrsyslogが標準で無効化されている環境では、/var/log/auth.log が生成されずFail2banが起動失敗することがあります。
⚠️ 症状: fail2ban.service 起動時に Have not found any log file for sshd jail エラーが発生します。
🛠️ 対策: /etc/fail2ban/jail.local の [sshd] セクションに backend = systemd を明示的に指定し、journaldからログを直接読み込むよう変更します。
2. iptables/nftables バックエンドの競合
OSのカーネルバージョンによってパケットフィルターのバックエンド(iptables-legacy vs nftables)が異なり、BANルールが正しく注入されない場合があります。
🛠️ 対策: fail2ban-client status sshd を実行し、Banned IP list にIPが追加されているにもかかわらず通信が通る場合は、/etc/fail2ban/jail.conf 内の banaction を iptables-multiport から nftables や nftables-multiport に切り替えます。
Configuration Notes
システムの稼働状態およびBANルールの適用状況を確認するためのターミナル実行ログ例です。
# systemctl status fail2ban.service
● fail2ban.service - Fail2ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2026-07-31 09:00:00 UTC; 1h 15m ago
Main PID: 1234 (fail2ban-server)
Tasks: 5 (limit: 4677)
Memory: 14.5M
CGroup: /system.slice/fail2ban.service
└─1234 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 28
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 3
`- Banned IP list: 192.168.56.120
# iptables -L f2b-sshd -n -v
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
6 360 REJECT all -- * * 192.168.56.120 0.0.0.0/0 reject-with icmp-port-unreachable
1250 82000 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0