<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Fail2ban on K-Life Hack | システムアーキテクチャ &amp; DevOps</title><link>https://klifehack.com/tags/fail2ban/</link><description>Recent content in Fail2ban on K-Life Hack | システムアーキテクチャ &amp; DevOps</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Fri, 31 Jul 2026 10:03:37 +0900</lastBuildDate><atom:link href="https://klifehack.com/tags/fail2ban/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux環境におけるSSHブルートフォース攻撃ログ解析とFail2ban動的防御の構築</title><link>https://klifehack.com/p/ssh-bruteforce-log-analysis-fail2ban-mitigation/</link><pubDate>Fri, 31 Jul 2026 10:03:37 +0900</pubDate><guid>https://klifehack.com/p/ssh-bruteforce-log-analysis-fail2ban-mitigation/</guid><description>&lt;p&gt;インターネットに公開されているLinuxサーバーのデフォルトSSHポート（TCP 22）は、自動化されたボットネットによる辞書攻撃やブルートフォース攻撃に常時晒されています。ノード数が増加するインフラ運用において、手動でファイアウォールルールを更新して攻撃IPをブロックする手法は人為的ミスの原因となり、レスポンス速度の観点からも限界を迎えます。&lt;/p&gt;
&lt;p&gt;本稿では、&lt;code&gt;/var/log/auth.log&lt;/code&gt; に記録される認証試行ログの解析パイプラインを構築し、Fail2banを活用して netfilter（iptables）へ動的にパケットドロップルールを注入する侵入防止システム（IPS）の構成手順を整理します。&lt;/p&gt;
&lt;h2 id="認証ログ構造とテキスト解析パイプライン"&gt;認証ログ構造とテキスト解析パイプライン
&lt;/h2&gt;&lt;p&gt;Debian/Ubuntu系のディストリビューションでは、SSH認証に関するイベントは &lt;code&gt;/var/log/auth.log&lt;/code&gt;（RHEL/CentOS系では &lt;code&gt;/var/log/secure&lt;/code&gt;）へ出力されます。&lt;/p&gt;
&lt;h3 id="攻撃ログのサンプルトレース"&gt;攻撃ログのサンプルトレース
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-syslog" data-lang="syslog"&gt;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
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ログ内の &lt;code&gt;Failed password&lt;/code&gt; パターンは認証失敗を示します。&lt;code&gt;invalid user&lt;/code&gt; が含まれる場合はローカルの &lt;code&gt;/etc/passwd&lt;/code&gt; に存在しないユーザー名での試行であり、含まれない場合は実在するアカウントへの攻撃を意味します。&lt;/p&gt;
&lt;h3 id="cliコマンドによる攻撃ip抽出"&gt;CLIコマンドによる攻撃IP抽出
&lt;/h3&gt;&lt;p&gt;大量のログデータから攻撃頻度の高い上位IPアドレスを迅速に特定するため、標準のLinuxユーティリティを組み合わせたパイプラインを実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#e6db74"&gt;&amp;#34;Failed password&amp;#34;&lt;/span&gt; /var/log/auth.log | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{for(i=1;i&amp;amp;lt;=NF;i++) if($i==&amp;#34;from&amp;#34;) print $(i+1)}&amp;#39;&lt;/span&gt; | sort | uniq -c | sort -nr | head -n &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;awk&lt;/code&gt; ループ処理により、&lt;code&gt;invalid user&lt;/code&gt; 判別の有無によって列位置が変動する場合でも、トークン &lt;code&gt;from&lt;/code&gt; の直後のフィールドを確実に抽出します。&lt;/p&gt;
&lt;h2 id="fail2banによる自動防御構成"&gt;Fail2banによる自動防御構成
&lt;/h2&gt;&lt;p&gt;ログ解析で検出された脅威インジケーターに基づき、Fail2banを用いて動的な遮断ルールを適用します。パッケージデフォルトの設定ファイルを保護するため、&lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt; を作成して定義をオーバーライドします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[sshd]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;enabled&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;port&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;ssh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;sshd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;logpath&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/var/log/auth.log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;maxretry&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;findtime&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;10m&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;bantime&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;1h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;💡 &lt;b&gt;主要パラメーターの定義:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;・&lt;b&gt;maxretry&lt;/b&gt;: 指定時間内に許容する最大失敗回数です。&lt;/p&gt;
&lt;p&gt;・&lt;b&gt;findtime&lt;/b&gt;: 失敗回数をカウントするウィンドウ時間です（上記設定では10分間）。&lt;/p&gt;
&lt;p&gt;・&lt;b&gt;bantime&lt;/b&gt;: 条件を満たした際にパケットを遮断する保持時間です（上記設定では1時間）。&lt;/p&gt;
&lt;h2 id="sshサービスの多層防御設定"&gt;SSHサービスの多層防御設定
&lt;/h2&gt;&lt;p&gt;IPSの導入に加えて、SSHデーモン自体の設定（&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;）を最適化して攻撃サーフェスを縮小させます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;ポート番号の変更&lt;/b&gt;: デフォルトの 22 ポートから高位ポート（例: &lt;code&gt;22022&lt;/code&gt;）へ変更し、広域スキャナーからの露出を低減します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Direct Rootログインの禁止&lt;/b&gt;: &lt;code&gt;PermitRootLogin no&lt;/code&gt; を設定し、特権ディレクトリへの直接侵入を遮断します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;パスワード認証の無効化&lt;/b&gt;: &lt;code&gt;PasswordAuthentication no&lt;/code&gt; を設定し、公開鍵認証のみを許可することで辞書攻撃を排除します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="troubleshooting"&gt;Troubleshooting
&lt;/h2&gt;&lt;p&gt;Fail2ban導入時によく直面するトラブルシューティングと対処法です。&lt;/p&gt;
&lt;h3 id="1-systemd環境におけるログパス認識不備"&gt;1. systemd環境におけるログパス認識不備
&lt;/h3&gt;&lt;p&gt;Ubuntu 22.04以降やrsyslogが標準で無効化されている環境では、&lt;code&gt;/var/log/auth.log&lt;/code&gt; が生成されずFail2banが起動失敗することがあります。&lt;/p&gt;
&lt;p&gt;⚠️ &lt;b&gt;症状&lt;/b&gt;: &lt;code&gt;fail2ban.service&lt;/code&gt; 起動時に &lt;code&gt;Have not found any log file for sshd jail&lt;/code&gt; エラーが発生します。&lt;/p&gt;
&lt;p&gt;🛠️ &lt;b&gt;対策&lt;/b&gt;: &lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt; の &lt;code&gt;[sshd]&lt;/code&gt; セクションに &lt;code&gt;backend = systemd&lt;/code&gt; を明示的に指定し、journaldからログを直接読み込むよう変更します。&lt;/p&gt;
&lt;h3 id="2-iptablesnftables-バックエンドの競合"&gt;2. iptables/nftables バックエンドの競合
&lt;/h3&gt;&lt;p&gt;OSのカーネルバージョンによってパケットフィルターのバックエンド（iptables-legacy vs nftables）が異なり、BANルールが正しく注入されない場合があります。&lt;/p&gt;
&lt;p&gt;🛠️ &lt;b&gt;対策&lt;/b&gt;: &lt;code&gt;fail2ban-client status sshd&lt;/code&gt; を実行し、&lt;code&gt;Banned IP list&lt;/code&gt; にIPが追加されているにもかかわらず通信が通る場合は、&lt;code&gt;/etc/fail2ban/jail.conf&lt;/code&gt; 内の &lt;code&gt;banaction&lt;/code&gt; を &lt;code&gt;iptables-multiport&lt;/code&gt; から &lt;code&gt;nftables&lt;/code&gt; や &lt;code&gt;nftables-multiport&lt;/code&gt; に切り替えます。&lt;/p&gt;
&lt;h2 id="configuration-notes"&gt;Configuration Notes
&lt;/h2&gt;&lt;p&gt;システムの稼働状態およびBANルールの適用状況を確認するためのターミナル実行ログ例です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# systemctl status fail2ban.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;● fail2ban.service - Fail2ban Service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Active: active (running) since Fri 2026-07-31 09:00:00 UTC; 1h 15m ago
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Main PID: 1234 (fail2ban-server)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Tasks: 5 (limit: 4677)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Memory: 14.5M
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CGroup: /system.slice/fail2ban.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └─1234 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# fail2ban-client status sshd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Status for the jail: sshd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|- Filter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| |- Currently failed: 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| |- Total failed: 28
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| `- File list: /var/log/auth.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;`- Actions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; |- Currently banned: 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; |- Total banned: 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; `- Banned IP list: 192.168.56.120
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# iptables -L f2b-sshd -n -v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Chain f2b-sshd (1 references)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkts bytes target prot opt in out source destination 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 6 360 REJECT all -- * * 192.168.56.120 0.0.0.0/0 reject-with icmp-port-unreachable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1250 82000 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>