こんにちは!「LINUX工房」管理人の「リナックス先生」です。
「Ubuntu 26.04 LTS サーバー構築入門」の第3回へようこそ。前回はSSHの鍵認証を導入し、「入り口の扉を絶対に破られない鉄の扉に変更する」作業を行いました。
しかし、インターネットという無法地帯に公開されたサーバーには、1日あたり数万〜数十万回もの「ドアノブをガチャガチャ回す(ログインを試みる)攻撃」が飛んできます。鍵が破られないとはいえ、毎秒ドアを叩かれ続けては、サーバーのログファイルはパンクし、処理能力(CPUやメモリ)が奪われてしまいます。
先生!前回の設定が終わってから、試しに /var/log/auth.log を見てみたら、見たこともない海外のIPアドレスから何百回もSSHへのアクセス履歴が残っていて、背筋が凍りました……。
これって放っておいても大丈夫なんでしょうか?
ログを確認するなんて、立派なインフラエンジニアの習慣が身についてきたわね、コウ君!
鍵認証にしているから乗っ取られることはないけれど、放置するのは「サーバーの体力を削られている状態」だから良くないわ。今回は、そもそも不要な通信を通さない「ファイアウォール(UFW)」で家の周りに高い壁を作り、それでもしつこく壁をよじ登ろうとする不審者を自動でブラックリストに登録する監視カメラシステム「Fail2ban」を構築するわよ!
本記事では、Ubuntuの標準ファイアウォール「UFW」の高度な制御から、最新のUbuntu 26.04(systemdベース)に完全対応したFail2banの最適化設定までを、どこよりも深く、そしてわかりやすく解説します。
🚀 Ubuntu 26.04サーバー構築入門・連載ロードマップ(全8回)
- 【第1回】RHELとの違いとUbuntu 26.04 OSインストール完全ガイド
- 【第2回】公開サーバーへの道:SSH鍵認証(量子耐性暗号対応)とsudo権限の厳格化
- 【第3回】UFWとFail2ban:強固なファイアウォールと不正アクセス対策(本記事)
- 【第4回】不要なサービスの停止とOSカーネル(Linux 7.0)のセキュリティチューニング(公開予定)
- 【第5回】Netplanによる高度なネットワーク設定とIPv6完全対応(公開予定)
- 【第6回】Nginxのインストールと最新Webサーバーの構築(公開予定)
- 【第7回】Dockerの導入:Ubuntuの強みを最大限に活かすコンテナ運用(公開予定)
- 【第8回】システム監視と自動アップデート(Unattended Upgrades)の自律運用(公開予定)
目次
- 1. ネットワークセキュリティの基本概念と「ポート」の理解
- 2. Ubuntuの標準防壁「UFW」とは? iptables/nftablesとの違い
- 3. DROP(破棄)とREJECT(拒否)の決定的な違い
- 4. 実践!UFWによるファイアウォール構築(ホワイトリスト方式)
- 5. UFWの高度な設定:IP制限・レートリミット・ルールの削除
- 6. AI顔負けの自動防衛システム「Fail2ban」のアーキテクチャ
- 7. Ubuntu 26.04環境におけるFail2banの設定とsystemd連携
- 8. 攻撃者のBan(遮断)テストと解除(Unban)の運用方法
- 9. UFWとFail2banのログをAIで分析する高度なプロンプト術
- 総まとめ:自律的に攻撃を弾き返すインフラの完成
- 1. ネットワークセキュリティの基本概念と「ポート」の理解
- 2. Ubuntuの標準防壁「UFW」とは? iptables/nftablesとの違い
- 3. DROP(破棄)とREJECT(拒否)の決定的な違い
- 4. 実践!UFWによるファイアウォール構築(ホワイトリスト方式)
- 5. UFWの高度な設定:IP制限・レートリミット・ルールの削除
- 6. AI顔負けの自動防衛システム「Fail2ban」のアーキテクチャ
- 7. Ubuntu 26.04環境におけるFail2banの設定とsystemd連携
- 8. 攻撃者のBan(遮断)テストと解除(Unban)の運用方法
- 9. UFWとFail2banのログをAIで分析する高度なプロンプト術
- 総まとめ:自律的に攻撃を弾き返すインフラの完成
1. ネットワークセキュリティの基本概念と「ポート」の理解
ファイアウォールを設定する前に、ネットワーク通信における「ポート(Port)」という概念を正確に理解しておく必要があります。
1-1. IPアドレスとポートの関係
サーバーには「IPアドレス」が割り当てられています。これは現実世界でいう「マンションの住所」です。しかし、住所がわかっても、どの部屋(ドア)をノックすればいいのかがわかりません。
サーバーには 0 番から 65535 番までの「仮想的なドア(ポート)」が用意されており、用途に応じてどのドアで通信を受け付けるかが決まっています。
| ポート番号 | プロトコル | 用途・サービス | 公開すべきか? |
|---|---|---|---|
| 22 | TCP | SSH(遠隔操作) | 管理者のみ(またはIP制限して公開) |
| 80 | TCP | HTTP(Webサイト閲覧・暗号化なし) | 全世界に公開 |
| 443 | TCP | HTTPS(Webサイト閲覧・暗号化あり) | 全世界に公開 |
| 3306 | TCP | MySQL(データベース) | 絶対に外部に公開してはいけない |
| 6379 | TCP | Redis(インメモリキャッシュ) | 絶対に外部に公開してはいけない |
1-2. ファイアウォールの基本原則:デフォルト拒否(Default Deny)
セキュリティの鉄則は「ホワイトリスト方式」です。つまり、「基本的にはすべてのポートを固く閉ざし(デフォルト拒否)、必要なポート(例:80番と443番、管理用の22番)だけを明示的に開ける」という運用を行います。
2. Ubuntuの標準防壁「UFW」とは? iptables/nftablesとの違い
Linuxにおけるネットワークパケットの制御は、カーネル内部にある Netfilter という機構が行っています。これを操作するコマンドとして、かつては iptables が、現在では nftables が使われています。
2-1. UFW (Uncomplicated Firewall) の存在意義
しかし、生の nftables や iptables の構文は非常に複雑で、設定を少し間違えただけで「自分自身をサーバーから締め出してしまう」という事故が頻発していました。
そこでUbuntuが開発したのが UFW(Uncomplicated Firewall:複雑じゃないファイアウォール) です。UFWは内部的に nftables を操作する「フロントエンド(翻訳機)」であり、人間が直感的に理解できるシンプルなコマンドで強固なファイアウォールを構築できるように設計されています。
| ツール名 | 特徴と立ち位置 | 難易度 |
|---|---|---|
| iptables | かつての標準。構文が複雑でレガシー。 | 高 |
| nftables | 現在のLinuxカーネルの標準バックエンド。高パフォーマンス。 | 非常に高 |
| firewalld | RHEL系(AlmaLinuxなど)の標準フロントエンド。ゾーン管理が特徴。 | 中 |
| UFW | Ubuntu系の標準フロントエンド。圧倒的にシンプルで直感的。 | 低(初心者最適) |
AlmaLinuxの時は firewalld を使って「publicゾーンにサービスを追加してリロードして…」と結構複雑だった記憶があります。UFWは「複雑じゃない」って名乗っているくらいだから、期待できそうですね!
ええ、UFWのコマンドは本当に美しくて直感的よ。英語の文章を読むように設定できるわ。でも、設定する前に一つだけ絶対に知っておいてほしい「セキュリティの基本概念」があるの。それが『DROP』と『REJECT』の違いよ。
3. DROP(破棄)とREJECT(拒否)の決定的な違い
ファイアウォールで通信を遮断する際、内部的には2種類の方法があります。UFWはデフォルトで「DROP」を採用していますが、その理由をプロの視点で理解しておきましょう。
| 処理方式 | サーバーの対応 | 攻撃者から見た状態 | セキュリティ評価 |
|---|---|---|---|
| REJECT (拒否) | 「そのポートは閉じています」というエラーメッセージ(RSTパケットやICMPエラー)を相手にわざわざ返信する。 | 「あ、このIPアドレスにはサーバーが存在するんだな。でもこのポートは閉じているらしい」と即座に判別できる。 | NG。 サーバーの存在を教えてしまう。 |
| DROP (破棄) | 受け取ったパケットを完全に無視し、何も返信せずに捨てる。 | 応答が一切ないため、サーバーが存在しないのか、途中で通信が失われたのか判断できず、タイムアウトまで待たされる。 | 最高。 攻撃者の時間を浪費させ、サーバーの存在を隠蔽できる。 |
ステルス性を高め、攻撃者のスキャンツール(Nmapなど)を遅延させるため、サーバー運用においては必ず「DROP(破棄)」を使用します。UFWのデフォルト設定は、このDROPに最適化されています。
4. 実践!UFWによるファイアウォール構築(ホワイトリスト方式)
それでは、実際にUbuntu 26.04サーバーでUFWを設定していきます。作業は必ず sudo 権限を持つユーザーで行います。
4-1. UFWのインストールと初期化
Ubuntu Serverには標準でUFWがインストールされていますが、念のため確認します。
sudo apt update sudo apt install ufw -y
次に、先ほど学んだ「ホワイトリスト方式(デフォルト拒否)」のベースルールを設定します。
# 外部からの通信(incoming)は、デフォルトで全てDROP(破棄)する sudo ufw default deny incoming # サーバーから外部への通信(outgoing)は、デフォルトで全て許可する sudo ufw default allow outgoing
この段階では、まだルールを「定義」しただけで、UFW自体は稼働していません。
⚠️ 致命的な罠:有効化の順番
ここで絶対に sudo ufw enable(有効化)を実行してはいけません!
現在のルールは「外部からは全て拒否」です。このまま有効化すると、今あなたが接続しているSSH通信も強制切断され、二度とサーバーにログインできなくなります。(インフラエンジニアが人生で一度はやる失敗です)。
有効化する前に、必ずSSHポート(22番)の許可設定を行わなければなりません。
4-2. 必要なポートの許可(Allow)
SSH通信(22番)と、将来Webサーバーとして使うためのHTTP(80番)、HTTPS(443番)を許可します。
# SSH(22/tcp)を許可する sudo ufw allow 22/tcp # HTTP(80/tcp)とHTTPS(443/tcp)を許可する sudo ufw allow 80/tcp sudo ufw allow 443/tcp
※第2回でSSHのポート番号を例えば 22222 に変更した方は、sudo ufw allow 22222/tcp としてください。
4-3. UFWの有効化(Enable)
SSHの許可設定が終わったことを深呼吸して確認したら、いよいよUFWを有効化します。
sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)?(既存のSSH接続が切れる可能性があります。続行しますか?)と警告が出ます。SSHポートを正しく開けていれば切断されることはないので、y を押してEnterを押します。
Firewall is active and enabled on system startup と表示されれば、あなたのサーバーに鉄壁のファイアウォールが展開されました!
4-4. 設定状態の確認
以下のコマンドで、現在のルール一覧を確認できます。
sudo ufw status verbose
IPv4とIPv6(v6とついている行)の両方で、指定したポートが ALLOW IN になっていることが確認できます。
5. UFWの高度な設定:IP制限・レートリミット・ルールの削除
中級者以上になるために、UFWのさらに強力な機能を知っておきましょう。
5-1. 特定のIPアドレスからのみ許可する(IP制限)
「データベース(3306番ポート)には、特定のWebサーバー(例: 192.168.1.50)からしかアクセスさせたくない」という場合は、以下のように記述します。
sudo ufw allow from 192.168.1.50 to any port 3306
5-2. レートリミット(連続アクセスの制限)
SSHポートを開けていると、ボットが高速でログインを試行してきます。UFWには「同じIPアドレスから、30秒間に6回以上接続を試みたら、自動で通信を遮断する」というレートリミット機能(limit)が標準で備わっています。
# allowの代わりにlimitを使う sudo ufw limit 22/tcp
SSHは基本的に limit で設定するのがプロのベストプラクティスです。
5-3. 間違えたルールの削除(Delete)
設定を間違えたり、不要になったポートを閉じたい場合は、ルールに番号を振って確認し、その番号を指定して削除するのが最も安全です。
# 1. ルールに番号をつけて表示する sudo ufw status numbered # 2. 該当する番号(例えば 3番)のルールを削除する sudo ufw delete 3
6. AI顔負けの自動防衛システム「Fail2ban」のアーキテクチャ
UFWによって不要なポートは塞ぎ、SSHには limit をかけました。しかし、これだけでは「ゆっくりとしたペースでのパスワード総当たり攻撃」や、「Webサーバー(80番や443番)に対する脆弱性スキャン攻撃」を防ぐことはできません。
そこで導入するのが Fail2ban(フェイルツーバン) です。
Fail2banって、直訳すると「失敗したらBan(追放)する」ってことですよね?
どうやって攻撃者を見分けて、どうやって追放しているんですか?
名前の通りよ!Fail2banは、常にサーバーの「ログファイル(アクセス履歴やエラー記録)」を監視しているの。
例えば「このIPアドレス、さっきから存在しないユーザー名で5回もSSHのログインに失敗しているぞ」と検知したら、即座にUFW(ファイアウォール)に命令を出して、「このIPアドレスからの通信を完全に遮断(DROP)しろ!」とルールを自動追加するの。
人間が寝ている間も、ログを分析して自動で防御してくれる、最強の自律型セキュリティAIみたいなツールなのよ。
6-1. Fail2banの3つの構成要素
- Filter(フィルター): 「何を攻撃とみなすか」を定義する正規表現ルール。
- Action(アクション): 攻撃を検知した時に「どうやって遮断するか(UFWを使う等)」。
- Jail(牢屋): フィルターとアクションを組み合わせ、「何回失敗したら、何時間Banするか」というポリシーを定義する設定。
7. Ubuntu 26.04環境におけるFail2banの設定とsystemd連携
Ubuntu 26.04 LTSでは、従来のテキストログ(syslogやauth.log)ではなく、systemd のジャーナル(バイナリログ)でログを一元管理する方向へさらにシフトしています。これに対応したFail2banの設定を行っていきましょう。
7-1. Fail2banのインストール
sudo apt update sudo apt install fail2ban -y
7-2. jail.local の作成(プロの鉄則設定)
Fail2banの設定ファイルは /etc/fail2ban/jail.conf ですが、このファイルはパッケージ更新時に上書きされてしまうため、直接編集してはいけません。
必ず /etc/fail2ban/jail.local という名前でコピー(または新規作成)し、そこに独自の設定を上書きします。
# jail.localを新規作成する sudo nano /etc/fail2ban/jail.local
以下の設定をコピーして貼り付けてください。これはUbuntu 26.04環境に最適化された、非常に強力な設定です。
[DEFAULT] # 自分のIPアドレス(自宅や会社の固定IP)は絶対にBanしないように除外設定(ホワイトリスト) # 例: ignoreip = 127.0.0.1/8 ::1 203.0.113.50 ignoreip = 127.0.0.1/8 ::1 # 攻撃者をBan(遮断)する期間(例: 24時間 = 86400秒) bantime = 86400 # 攻撃と判定する監視期間(例: 過去10分間に) findtime = 600 # 監視期間内に何回失敗したらBanするか maxretry = 3 # Ubuntu 26.04のsystemdジャーナルをログソースとして使用する backend = systemd # 遮断の実行には、先ほど設定した「UFW」を使用する banaction = ufw # ----- 個別の牢屋(Jail)設定 ----- [sshd] # SSHに対する攻撃を監視し、有効化する enabled = true port = ssh # SSHは特に厳しく、2回の失敗で即座にBanする maxretry = 2
7-3. Fail2banの起動と自動起動設定
設定を保存したら、Fail2banを起動し、サーバー再起動時にも自動的に立ち上がるように設定します。
# サービスの起動と有効化 sudo systemctl start fail2ban sudo systemctl enable fail2ban # サービスが正常に動いているか確認 sudo systemctl status fail2ban
Active: active (running) と表示されていれば、自動防衛システムの稼働開始です!
8. 攻撃者のBan(遮断)テストと解除(Unban)の運用方法
Fail2banが正しく動いているか、そして誤って正常なユーザーをBanしてしまった場合にどうやって助け出すのかを学びましょう。
8-1. 現在の監視状態とBanリストの確認
fail2ban-client コマンドを使って、現在の稼働状況を確認します。
# 全体で稼働しているJail(牢屋)のリストを確認 sudo fail2ban-client status # sshdの牢屋に、現在何人が投獄(Ban)されているか詳細を確認 sudo fail2ban-client status sshd
稼働して数時間もすれば、Banned IP list: の欄に、見知らぬ海外のIPアドレスがズラリと並ぶはずです。これらすべてが、Fail2banがあなたの代わりに弾き返してくれた攻撃者です。
8-2. 誤Banの救出(Unban)コマンド
もし、自分自身がパスワードを間違えすぎてBanされてしまった場合(別の回線からスマホなどでサーバーに入り直す必要があります)、以下のコマンドで特定のIPアドレスを牢屋から解放できます。
# 例:192.168.1.99 というIPアドレスのBanを解除する sudo fail2ban-client set sshd unbanip 192.168.1.99
9. UFWとFail2banのログをAIで分析する高度なプロンプト術
インフラエンジニアとしての一歩進んだ運用として、「自サーバーがどのような攻撃を受けているのか」を分析することは非常に重要です。ログ解析は人間が目視で行うのは困難ですが、AI(Gemini等)を使えば一瞬でインサイト(洞察)を得ることができます。
9-1. ログの抽出
まずはUbuntu 26.04のsystemdジャーナルから、Fail2banがBanしたログだけを直近の100件抽出します。
sudo journalctl -u fail2ban --grep="Ban" -n 100 --no-pager > /tmp/ban_logs.txt
9-2. AI(Gemini / ChatGPT)への分析プロンプト
抽出したログをコピーし、以下のプロンプトと一緒にAIに投げ込みます。
「あなたはサイバーセキュリティの専門アナリストです。 私のUbuntu 26.04サーバーで稼働しているFail2banの遮断(Ban)ログを提示します。 以下のタスクを実行して、セキュリティレポートを作成してください。 【ログデータ】 (ここに /tmp/ban_logs.txt の内容を貼り付け) 【タスク】 1. 最も多く攻撃を仕掛けてきている上位5つのIPアドレスを抽出し、それらのIPが属する国籍や組織を推測(または調査方法を提示)してください。 2. 攻撃の頻度や時間帯に特定のパターン(ボットネットの兆候など)はありますか? 3. 現在のFail2banの設定(3回失敗で24時間Ban)で十分か、それとも「bantime.increment」等の累積Ban機能を導入すべきか、プロの視点で助言してください。」
AIはログから「特定のIPレンジからの組織的な攻撃であること」を見抜いたり、「さらに厳格な設定として、Recidive(再犯者)Jailを追加すべき」といった、さらに高度なセキュリティチューニングのアイデアを提供してくれます。
総まとめ:自律的に攻撃を弾き返すインフラの完成
第3回の講座、本当にお疲れ様でした!
今回は、Ubuntuの標準ファイアウォール「UFW」を用いて「不要なポートをすべてDROP(破棄)する」というホワイトリスト運用を確立し、さらに「Fail2ban」を導入して「悪意ある行動をとるIPを自律的に排除する」という能動的な防御システムを構築しました。
第2回の「SSH鍵認証」と、今回の「UFW + Fail2ban」の組み合わせにより、あなたのUbuntu 26.04サーバーは、世界中のハッカーが束になっても容易には突破できない、極めて堅牢な「鉄壁の要塞」へと進化しました。インフラエンジニアとして、これほど頼もしいことはありません。
さて、外部からの攻撃に対する防御は完璧になりました。しかし、サーバーの内部にはまだ「使っていないのに動いている無駄なサービス」や、「デフォルトのままのカーネル設定」が残っています。
次回、第4回「不要なサービスの停止とOSカーネル(Linux 7.0)のセキュリティチューニング」では、Ubuntu 26.04の内部構造にメスを入れ、サーバーの負荷を極限まで軽くしつつ、DDoS攻撃への耐性をOSレベルで高める、真のインフラ職人の技術を解説します。お楽しみに!
▼ 堅牢なインフラ環境を構築しよう ▼
Ubuntu 26.04 LTSのテンプレート対応!
「初心者におすすめの国内VPS」
クラウドネイティブな防衛技術を武器に
「インフラエンジニアとして転職」

コメント