ネットワークセキュリティ基礎から実践まで 第3編:ファイアウォールの理解と設定
Network Security Series Part 3: Understanding and Configuring Firewalls
はじめに:ファイアウォール、ネットワークセキュリティの第一の防衛線
ファイアウォール(Firewall)は、ネットワークセキュリティの最も基本的でありながら核心的な構成要素です。建物のファイアウォール(防火壁)が火災の拡大を防ぐように、ネットワークファイアウォールは外部の脅威から内部ネットワークを保護する役割を果たします。1988年のモリスワーム(Morris Worm)事件以降、本格的に発展し始めたファイアウォール技術は、今日ではすべての組織の必須セキュリティインフラとなっています。
今回の第3編では、ファイアウォールの基本概念から様々な種類、アーキテクチャ設計、そしてLinuxとWindowsでの実際の設定方法まで体系的に解説します。
1. ファイアウォールとは?
1.1 ファイアウォールの定義と役割
ファイアウォールは、あらかじめ定義されたセキュリティルールに従ってネットワークトラフィックを監視・制御するネットワークセキュリティシステムです。信頼できる内部ネットワークと信頼できない外部ネットワーク(主にインターネット)の間で障壁の役割を果たします。
ファイアウォールの主な機能は以下の通りです:
- トラフィックフィルタリング:許可されたトラフィックのみを通過させ、残りはブロック
- アクセス制御:特定のIP、ポート、プロトコルへのアクセスを許可/拒否
- ロギングとモニタリング:すべてのネットワーク活動を記録
- NAT(Network Address Translation):内部IPアドレスの隠蔽
- VPNエンドポイント:安全なリモートアクセスをサポート
1.2 ファイアウォールの動作原理
ファイアウォールは、ネットワークパケットのヘッダー情報(送信元/宛先IP、ポート番号、プロトコルなど)を検査し、事前に定義されたルールと比較します。ルールに一致すれば、該当するアクション(許可、拒否、ロギング)を実行します。
パケット到着 → ルールマッチング → 一致するルールを発見 → 該当アクションを実行
↓
一致するルールなし → デフォルトポリシー(Default Policy)を適用
2. ファイアウォールの種類
2.1 パケットフィルタリングファイアウォール(Packet Filtering Firewall)
最も基本的な形態のファイアウォールで、OSI 3〜4層(ネットワーク、トランスポート層)で動作します。各パケットを独立して検査し、パケットヘッダーの情報のみに基づいてフィルタリングします。
長所:
- 高速な処理速度
- 低いリソース使用量
- シンプルな実装
短所:
- 接続状態を追跡しない
- アプリケーションレベルの攻撃に脆弱
- IPスプーフィング攻撃に脆弱
2.2 ステートフルインスペクションファイアウォール(Stateful Inspection Firewall)
接続状態を追跡するファイアウォールで、現在最も広く使用されている方式です。セッションテーブルを維持して、接続の状態(新規接続、既存接続、関連接続)を把握します。
状態テーブルの例:
┌─────────────┬─────────────┬───────┬───────┬─────────┐
│ Source IP │ Dest IP │ SPort │ DPort │ State │
├─────────────┼─────────────┼───────┼───────┼─────────┤
│ 192.168.1.10│ 8.8.8.8 │ 45123 │ 53 │ ESTAB │
│ 192.168.1.20│ 142.250.1.1 │ 52341 │ 443 │ ESTAB │
│ 192.168.1.15│ 104.16.1.1 │ 38921 │ 80 │ TIME_WT │
└─────────────┴─────────────┴───────┴───────┴─────────┘
長所:
- 接続状態に基づいた正確なフィルタリング
- 応答パケットの自動許可でルールの簡素化
- DoS攻撃の検出が可能
2.3 アプリケーションレベルゲートウェイ(Application Level Gateway / Proxy Firewall)
OSI 7層(アプリケーション層)で動作し、特定のアプリケーションプロトコルを完全に理解して検査します。クライアントとサーバーの間でプロキシの役割を果たします。
長所:
- ディープパケットインスペクション(DPI)が可能
- アプリケーションレベルの攻撃をブロック
- ユーザー認証機能
- コンテンツフィルタリング
短所:
- 処理速度の低下
- 高いリソース使用量
- サポートするプロトコルに制限
2.4 次世代ファイアウォール(NGFW: Next-Generation Firewall)
NGFWは、従来のファイアウォール機能に様々なセキュリティ機能を統合した現代的なファイアウォールです。代表的な製品としてPalo Alto Networks、Fortinet FortiGate、Cisco Firepowerなどがあります。
NGFWの主な機能:
- アプリケーション認識:ポートではなくアプリケーションベースのポリシー
- ユーザー認識:IPではなくユーザー/グループベースのポリシー
- IPS(侵入防止システム):リアルタイムの脅威検出とブロック
- SSL/TLS検査:暗号化されたトラフィックの復号化と検査
- サンドボックス:疑わしいファイルの隔離分析
- 脅威インテリジェンス:リアルタイム脅威情報との連携
| 機能 | パケットフィルタリング | ステートフル | アプリケーション | NGFW |
|---|---|---|---|---|
| 動作層 | L3-L4 | L3-L4 | L7 | L3-L7 |
| 状態追跡 | X | O | O | O |
| DPI | X | X | O | O |
| IPS統合 | X | X | X | O |
| 処理速度 | 速い | 速い | 遅い | 中程度 |
3. ファイアウォールアーキテクチャ
3.1 スクリーンドホストアーキテクチャ(Screened Host Architecture)
スクリーニングルーターとバスティオンホスト(Bastion Host)を組み合わせた構造です。外部から内部ネットワークへのアクセスは、必ずバスティオンホストを経由する必要があります。
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ インターネット │────│ スクリーニング │────│ バスティオンホスト│────│ 内部ネットワーク │
│ │ │ ルーター │ │ (Bastion Host) │ │ │
└─────────────┘ └──────────────┘ └─────────────────┘ └───────────────┘
3.2 スクリーンドサブネットアーキテクチャ(DMZ)
DMZ(Demilitarized Zone、非武装地帯)は、外部と内部ネットワークの間に位置する隔離されたネットワーク領域です。Webサーバー、メールサーバーなど、外部にサービスを提供する必要があるサーバーを配置します。
┌─────────────────────────────────┐
│ DMZ領域 │
│ ┌─────────┐ ┌─────────┐ │
┌─────────┐ │ │ Webサーバー│ │ メールサーバー│ │ ┌───────────────┐
│ インターネット│─────────│ └─────────┘ └─────────┘ │─────────│ 内部ネットワーク │
└─────────┘ │ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ DNS │ │ FTP │ │ │ ┌──────────┐ │
│ │ └─────────┘ └─────────┘ │ │ │ 業務サーバー │ │
│ └─────────────────────────────────┘ │ │ DBサーバー │ │
│ │ │ └──────────┘ │
│ ┌────────┴────────┐ └───────────────┘
└──────────────│ 外部ファイアウォール│
└─────────────────┘
│
┌────────┴────────┐
│ 内部ファイアウォール│
└─────────────────┘
DMZ設計の原則:
- DMZサーバーは内部ネットワークに直接接続不可
- 内部からDMZへの接続のみ許可(必要な場合)
- DMZサーバー間の通信を最小化
- 各サーバーごとに必要なポートのみ開放
4. Linux iptables/nftablesの基礎
4.1 iptablesの概要
iptablesは、Linuxカーネルのnetfilterフレームワークを使用するファイアウォールツールです。テーブル(Table)、チェーン(Chain)、ルール(Rule)の階層構造で構成されます。
主なテーブル:
- filter:パケットフィルタリング(デフォルトテーブル)
- nat:ネットワークアドレス変換
- mangle:パケットヘッダーの修正
- raw:接続追跡の例外設定
filterテーブルの基本チェーン:
- INPUT:ローカルシステムに入ってくるパケット
- OUTPUT:ローカルシステムから出ていくパケット
- FORWARD:システムを通過するパケット(ルーティング)
4.2 iptablesの基本コマンド
# 現在のルールを確認
sudo iptables -L -n -v
# 特定のテーブルのルールを確認
sudo iptables -t nat -L -n -v
# ルールを追加(Append)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# ルールを挿入(Insert) - 特定の位置に
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
# ルールを削除
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# チェーンのすべてのルールを削除
sudo iptables -F INPUT
# デフォルトポリシーを設定
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
4.3 実用的なiptablesルールの例
#!/bin/bash
# 基本サーバーファイアウォールスクリプト
# 既存ルールの初期化
iptables -F
iptables -X
# デフォルトポリシーの設定(ホワイトリスト方式)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# ループバックインターフェースを許可
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 既存接続および関連接続を許可
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSHを許可(特定IPからのみ)
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
# HTTP/HTTPSを許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# DNSを許可
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# ICMP(ping)を許可(制限付き)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# ロギング(ブロックされたパケット)
iptables -A INPUT -j LOG --log-prefix "iptables-dropped: " --log-level 4
# 残りはすべてブロック(デフォルトポリシーでDROPだが明示的に)
iptables -A INPUT -j DROP
# ルールを保存
iptables-save > /etc/iptables/rules.v4
4.4 nftables - iptablesの後継
nftablesは、iptablesを置き換える最新のファイアウォールフレームワークです。より簡潔な文法と向上したパフォーマンスを提供します。
# nftablesの基本設定例
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# ループバックを許可
iif lo accept
# 既存接続を許可
ct state established,related accept
# SSHを許可
tcp dport 22 accept
# HTTP/HTTPSを許可
tcp dport { 80, 443 } accept
# ICMPを許可
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# ロギング後にブロック
log prefix "nftables-dropped: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
5. UFW(Uncomplicated Firewall)の設定
UFWは、Ubuntu/Debianシステムでiptablesを簡単に管理できるようにするフロントエンドツールです。
5.1 UFWの基本コマンド
# UFWの状態を確認
sudo ufw status verbose
# UFWを有効化/無効化
sudo ufw enable
sudo ufw disable
# デフォルトポリシーを設定
sudo ufw default deny incoming
sudo ufw default allow outgoing
# ポートを許可
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 特定IPからのアクセスを許可
sudo ufw allow from 192.168.1.0/24 to any port 22
# 特定ポートを拒否
sudo ufw deny 3306/tcp
# ルールを削除
sudo ufw delete allow 80/tcp
# ルール番号で削除
sudo ufw status numbered
sudo ufw delete 3
# アプリケーションプロファイルを使用
sudo ufw app list
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
5.2 UFWの高度な設定
# レート制限(ブルートフォース防止)
sudo ufw limit ssh/tcp
# 特定インターフェースからのみ許可
sudo ufw allow in on eth0 to any port 80
# ロギング設定
sudo ufw logging on
sudo ufw logging medium # off, low, medium, high, full
# IPv6設定 (/etc/default/ufw)
# IPV6=yes
6. Windowsファイアウォール
6.1 Windows Defenderファイアウォール GUI設定
Windowsは、デフォルトでWindows Defenderファイアウォールを提供しています。コントロールパネルまたはWindowsセキュリティアプリで設定できます。
主な設定パス:
- コントロールパネル > システムとセキュリティ > Windows Defenderファイアウォール
- Windowsセキュリティ > ファイアウォールとネットワーク保護
- セキュリティが強化されたWindows Defenderファイアウォール (wf.msc)
6.2 PowerShellを使用したファイアウォール管理
# ファイアウォールの状態を確認
Get-NetFirewallProfile
# 特定プロファイルのファイアウォールを有効化/無効化
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
# インバウンドルールを照会
Get-NetFirewallRule -Direction Inbound | Where-Object {$_.Enabled -eq 'True'}
# 新しいインバウンドルールを追加(HTTP許可)
New-NetFirewallRule -DisplayName "Allow HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
# 新しいインバウンドルールを追加(特定IPからのみSSH許可)
New-NetFirewallRule -DisplayName "Allow SSH from Internal" -Direction Inbound -Protocol TCP -LocalPort 22 -RemoteAddress 192.168.1.0/24 -Action Allow
# ルールを削除
Remove-NetFirewallRule -DisplayName "Allow HTTP"
# ルールを無効化
Disable-NetFirewallRule -DisplayName "Allow HTTP"
# アウトバウンドルールを追加(特定ポートをブロック)
New-NetFirewallRule -DisplayName "Block Telnet Outbound" -Direction Outbound -Protocol TCP -RemotePort 23 -Action Block
# すべてのルールをエクスポート
netsh advfirewall export "C:\firewall-backup.wfw"
# ルールをインポート
netsh advfirewall import "C:\firewall-backup.wfw"
6.3 netshを使用したファイアウォール管理
REM ファイアウォールの状態を確認
netsh advfirewall show allprofiles
REM ファイアウォールを有効化
netsh advfirewall set allprofiles state on
REM ポートを開放
netsh advfirewall firewall add rule name="Open HTTP" dir=in action=allow protocol=tcp localport=80
REM ルールを削除
netsh advfirewall firewall delete rule name="Open HTTP"
REM すべてのインバウンドルールを照会
netsh advfirewall firewall show rule name=all dir=in
7. ファイアウォールポリシー設計の原則
7.1 最小権限の原則(Principle of Least Privilege)
必ず必要なトラフィックのみを許可し、残りはすべてブロックするホワイトリスト(Whitelist)方式を使用します。
良い例:
- デフォルトポリシー:すべてのインバウンドトラフィックをブロック(DROP)
- 例外:必要なサービスのみを明示的に許可
悪い例:
- デフォルトポリシー:すべてのトラフィックを許可(ACCEPT)
- 例外:危険なポートのみをブロック(ブラックリスト)
7.2 多層防御(Defense in Depth)
単一のファイアウォールに依存せず、複数の層のセキュリティを構築します。
- ネットワーク境界ファイアウォール:外部/内部ネットワーク境界
- セグメントファイアウォール:内部ネットワークセグメント間
- ホストベースファイアウォール:個別サーバー/ワークステーション
7.3 ルール順序の最適化
ファイアウォールルールは上から下へ順次処理されます。効率的なルール順序:
- 最も頻繁に一致するルールを上位に配置
- 明示的な拒否ルールは許可ルールの前に
- より具体的なルールを一般的なルールの前に
- 最後にデフォルト拒否ルール
7.4 文書化と変更管理
すべてのファイアウォールルールは必ず文書化し、変更時には承認手続きを経る必要があります。
ファイアウォールルール文書化テンプレート:
┌────────┬────────────┬──────────┬────────┬────────────┬────────────┬──────────┐
│ ルールID│ 送信元 │ 宛先 │ ポート │ プロトコル │ アクション │ 備考 │
├────────┼────────────┼──────────┼────────┼────────────┼────────────┼──────────┤
│ FW-001 │ Any │ DMZ-WEB │ 443 │ TCP │ Allow │ HTTPS │
│ FW-002 │ Internal │ DMZ-DB │ 3306 │ TCP │ Allow │ MySQL │
│ FW-003 │ Admin-Net │ Any │ 22 │ TCP │ Allow │ SSH │
│ FW-999 │ Any │ Any │ Any │ Any │ Deny + Log │ 基本ブロック│
└────────┴────────────┴──────────┴────────┴────────────┴────────────┴──────────┘
8. ファイアウォールログ分析
8.1 ログの重要性
ファイアウォールログは、セキュリティインシデントの検出、フォレンジック分析、規制遵守などに不可欠です。効果的なログ管理のために:
- すべてのブロックされたトラフィックをロギング
- 重要な許可トラフィックをロギング
- 十分な保存期間を確保(最低90日、推奨1年)
- 中央集中式ログ管理(SIEM連携)
8.2 Linuxファイアウォールログ分析
# iptablesログを確認
tail -f /var/log/kern.log | grep "iptables"
tail -f /var/log/syslog | grep "iptables-dropped"
# ブロックされたIPアドレス Top 10
grep "iptables-dropped" /var/log/syslog | \
awk '{for(i=1;i<=NF;i++) if($i ~ /SRC=/) print $i}' | \
cut -d= -f2 | sort | uniq -c | sort -rn | head -10
# ブロックされた宛先ポート Top 10
grep "iptables-dropped" /var/log/syslog | \
awk '{for(i=1;i<=NF;i++) if($i ~ /DPT=/) print $i}' | \
cut -d= -f2 | sort | uniq -c | sort -rn | head -10
# 時間帯別ブロック回数
grep "iptables-dropped" /var/log/syslog | \
awk '{print $1, $2, $3}' | \
cut -d: -f1,2 | uniq -c
8.3 Windowsファイアウォールログ分析
# ファイアウォールロギングを有効化
Set-NetFirewallProfile -Profile Domain,Public,Private -LogBlocked True -LogAllowed True -LogFileName "C:\Windows\System32\LogFiles\Firewall\pfirewall.log"
# ログファイルの場所
# C:\Windows\System32\LogFiles\Firewall\pfirewall.log
# PowerShellでログ分析
Get-Content "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" |
Where-Object { $_ -match "DROP" } |
Select-Object -Last 100
# ブロックされた接続のソースIP統計
Get-Content "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" |
Where-Object { $_ -match "DROP" } |
ForEach-Object { ($_ -split '\s+')[4] } |
Group-Object | Sort-Object Count -Descending | Select-Object -First 10
8.4 ログ分析時に注意すべきパターン
以下のようなパターンが発見された場合は注意が必要です:
- ポートスキャン:同じ送信元から多数のポートへの接続試行
- ブルートフォース攻撃:SSH(22)、RDP(3389)ポートへの繰り返し接続
- 異常なアウトバウンド接続:内部から外部への異常トラフィック
- 非標準ポートの使用:一般サービスが非標準ポートで接続
- 夜間/週末のトラフィック急増:業務外時間の異常活動
9. まとめと次回予告
今回は、ファイアウォールの基本概念から様々な種類、アーキテクチャ設計、そしてLinuxとWindowsでの実際の設定方法まで解説しました。ファイアウォールはネットワークセキュリティの第一の防衛線として、適切な設計と継続的な管理が不可欠です。
核心的なまとめ:
- ファイアウォールはホワイトリスト方式(デフォルトブロック、必要なものだけ許可)で設定
- ステートフルインスペクション以上の機能を活用して精密なフィルタリング
- DMZを通じたネットワークセグメンテーション
- すべてのルールの文書化と変更管理
- ログ分析を通じた継続的なモニタリング
次回の第4編では、IDS/IPS(侵入検知/防止システム)について解説します。Snort、Suricataのインストールと設定、検知ルールの作成、そしてSIEMとの連携まで取り上げる予定です。