implementing-network-segmentation-with-firewall-zones について
ネットワークやセキュリティ担当者向けのネットワーク分割ガイドです。VLAN、ファイアウォールゾーン、マイクロセグメンテーションを扱い、通信の把握からポリシー設定・検証までを説明します。
主な機能
- 01通信の把握とセキュリティゾーン定義
- 02スイッチの VLAN 設定
- 03ゾーン間ファイアウォールポリシー設定
- 04VLAN 間ルーティング ACL の適用
- 05セグメンテーション制御の検証
活用シーン
- 01ゲストネットワークと社内ネットワークの分離
- 02ユーザーのサーバーポートへのアクセス制限
- 03決済データと管理ゾーンの分離
- 04コンプライアンス対象範囲の縮小
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill implementing-network-segmentation-with-firewall-zonesインストール後、Claude Code で/implementing-network-segmentation-with-firewall-zonesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
ファイアウォールゾーンを使用したネットワークセグメンテーションの実装
概要
ネットワークセグメンテーションでは、フラットなネットワークをファイアウォールで境界を強制する分離されたセキュリティゾーンに分割し、侵害の封じ込め、ラテラルムーブメントの制限、ワークロード間の最小権限アクセスの適用を行います。セグメンテーションは、PCI DSS、HIPAA、NIST 800-53、ゼロトラストアーキテクチャで求められる基盤となる制御です。最新のセグメンテーションでは、従来の VLAN ベースの手法と、ワークロードレベルのマイクロセグメンテーションを組み合わせて、東西トラフィックをきめ細かく制御します。このスキルでは、ゾーンアーキテクチャの設計、ゾーン間ファイアウォールポリシーの設定、スイッチでの VLAN セグメンテーションの実装、動的な環境でのマイクロセグメンテーションの導入について説明します。
使用するタイミング
- 環境にネットワークセグメンテーションとファイアウォールゾーン機能を導入または設定するとき
- コンプライアンス要件に沿ったセキュリティ制御を確立するとき
- この分野のセキュリティアーキテクチャを構築または改善するとき
- この実装を必要とするセキュリティ評価を実施するとき
前提条件
- 資産インベントリを含むネットワークトポロジーのドキュメント
- ゾーンベースのポリシーに対応したファイアウォール(Palo Alto、Fortinet、Cisco Firepower)
- VLAN に対応した管理対象スイッチ(802.1Q トランキング)
- ベースライン分析用のトラフィックフローのドキュメントまたは NetFlow データ
- コンプライアンス要件(PCI DSS の適用範囲、HIPAA の ePHI 境界)
主な概念
ゾーンアーキテクチャの階層
| ゾーン | 信頼レベル | 例 | アクセスポリシー |
|---|---|---|---|
| インターネット | なし | パブリックインターネット | インバウンドはデフォルトで拒否 |
| DMZ | 低 | Web サーバー、メールリレー、DNS | インバウンドは限定、アウトバウンドは制限 |
| ゲスト | 低 | ゲスト WiFi、訪問者ネットワーク | インターネットのみ、内部アクセスなし |
| 社内ネットワーク | 中 | 従業員のワークステーション、プリンター | 内部リソースへのアクセスを制御 |
| サーバー/データセンター | 高 | アプリケーションサーバー、データベース | 厳格な ACL、管理者アクセスを制限 |
| PCI CDE | 重大 | 決済システム、カードデータ | PCI DSS に準拠した分離 |
| 管理 | 重大 | ネットワーク機器、ハイパーバイザー、IPMI | 厳しく制限し、ジャンプボックス経由のみ |
| OT/SCADA | 重大 | 産業制御システム | エアギャップ化、または厳格なファイアウォールで保護 |
セグメンテーションの手法
| 手法 | 範囲 | 粒度 | ユースケース |
|---|---|---|---|
| VLAN セグメンテーション | レイヤー 2 | サブネットレベル | 部門の分離、ゲストの隔離 |
| ファイアウォールゾーン | レイヤー 3~7 | ゾーン間 | ゾーン間ポリシーの適用 |
| ルーター上の ACL | レイヤー 3~4 | サブネット/ポート | ルーティング境界での迅速なフィルタリング |
| マイクロセグメンテーション | レイヤー 3~7 | ワークロードレベル | ゼロトラスト、コンテナー環境 |
| SGT/TrustSec | レイヤー 2~7 | タグベース | ID ベースのセグメンテーション |
ワークフロー
ステップ 1:トラフィックフローをマッピングし、ゾーンを定義する
セグメンテーションを実装する前に、ベースラインとなるトラフィックを取得します。
# Capture NetFlow data to understand existing traffic patterns
nfdump -R /var/cache/nfdump/ -s srcip/bytes -n 50
# Identify east-west traffic between subnets
nfdump -R /var/cache/nfdump/ -s record/bytes \
'src net 10.0.0.0/8 and dst net 10.0.0.0/8' -n 100
# Map application dependencies
# Document which servers need to communicate with which other servers
ステップ 2:スイッチで VLAN を設定する
! Core switch VLAN configuration
vlan 10
name Management
vlan 20
name Corporate-Users
vlan 30
name Servers
vlan 40
name PCI-CDE
vlan 50
name Guest
vlan 60
name DMZ
vlan 99
name Native-Unused
! Trunk port to firewall
interface GigabitEthernet1/0/1
description Trunk-to-Firewall
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 10,20,30,40,50,60
switchport trunk native vlan 99
switchport nonegotiate
! Access port for corporate users
interface range GigabitEthernet1/0/2-24
switchport mode access
switchport access vlan 20
spanning-tree portfast
! Access port for servers
interface range GigabitEthernet1/0/25-36
switchport mode access
switchport access vlan 30
! Prevent VLAN hopping
interface range GigabitEthernet1/0/37-48
switchport mode access
switchport access vlan 99
shutdown
ステップ 3:ファイアウォールのゾーンポリシーを設定する
Palo Alto のゾーンベースポリシー:
# Define zones on firewall sub-interfaces
set network interface ethernet ethernet1/1 layer3 units ethernet1/1.10 tag 10 ip 10.0.10.1/24
set network interface ethernet ethernet1/1 layer3 units ethernet1/1.20 tag 20 ip 10.0.20.1/24
set network interface ethernet ethernet1/1 layer3 units ethernet1/1.30 tag 30 ip 10.0.30.1/24
set network interface ethernet ethernet1/1 layer3 units ethernet1/1.40 tag 40 ip 10.0.40.1/24
set zone Management network layer3 ethernet1/1.10
set zone Corporate network layer3 ethernet1/1.20
set zone Servers network layer3 ethernet1/1.30
set zone PCI-CDE network layer3 ethernet1/1.40
# Inter-zone policies (deny by default, explicitly allow)
# Corporate -> Servers (only specific apps)
set rulebase security rules Corp-to-Servers from Corporate to Servers
set rulebase security rules Corp-to-Servers application [ web-browsing ssl dns smtp ]
set rulebase security rules Corp-to-Servers action allow
set rulebase security rules Corp-to-Servers profile-setting group Standard-Profiles
# Corporate -> PCI (DENY)
set rulebase security rules Corp-to-PCI from Corporate to PCI-CDE
set rulebase security rules Corp-to-PCI action deny log-end yes
# Servers -> PCI (only payment processing)
set rulebase security rules Servers-to-PCI from Servers to PCI-CDE
set rulebase security rules Servers-to-PCI source [ 10.0.30.10 ]
set rulebase security rules Servers-to-PCI destination [ 10.0.40.10 ]
set rulebase security rules Servers-to-PCI application [ ssl ]
set rulebase security rules Servers-to-PCI service service-https
set rulebase security rules Servers-to-PCI action allow
# Management -> All (admin access via jump box)
set rulebase security rules Mgmt-Admin from Management to [ Servers PCI-CDE ]
set rulebase security rules Mgmt-Admin source [ 10.0.10.50 ]
set rulebase security rules Mgmt-Admin application [ ssh rdp ]
set rulebase security rules Mgmt-Admin source-user [ admin-group ]
set rulebase security rules Mgmt-Admin action allow
# Intra-zone deny (prevent lateral movement within zone)
set rulebase security rules Deny-Intrazone from Corporate to Corporate
set rulebase security rules Deny-Intrazone action deny log-end yes
# Default deny all
set rulebase security rules Deny-All from any to any
set rulebase security rules Deny-All action deny log-end yes
ステップ 4:VLAN 間ルーティング ACL を実装する
ルーター/L3 スイッチでレイヤー 3 のフィルタリングを追加する場合:
! ACL: Corporate can only reach specific server ports
ip access-list extended CORP-TO-SERVERS
permit tcp 10.0.20.0 0.0.0.255 10.0.30.0 0.0.0.255 eq 80
permit tcp 10.0.20.0 0.0.0.255 10.0.30.0 0.0.0.255 eq 443
permit tcp 10.0.20.0 0.0.0.255 10.0.30.0 0.0.0.255 eq 25
permit udp 10.0.20.0 0.0.0.255 10.0.30.10 0.0.0.0 eq 53
deny ip 10.0.20.0 0.0.0.255 10.0.30.0 0.0.0.255 log
! ACL: PCI CDE isolation
ip access-list extended PCI-ISOLATION
permit tcp host 10.0.30.10 host 10.0.40.10 eq 443
permit tcp 10.0.10.50 0.0.0.0 10.0.40.0 0.0.0.255 eq 22
deny ip any 10.0.40.0 0.0.0.255 log
! Apply ACLs to VLAN interfaces
interface Vlan20
ip address 10.0.20.1 255.255.255.0
ip access-group CORP-TO-SERVERS out
interface Vlan40
ip address 10.0.40.1 255.255.255.0
ip access-group PCI-ISOLATION in
ステップ 5:セグメンテーションを検証する
#!/usr/bin/env python3
"""Network segmentation validation - tests connectivity between zones."""
import subprocess
import sys
import json
from datetime import datetime
class SegmentationValidator:
"""Test network segmentation controls between zones."""
def __init__(self):
self.results = []
def test_connectivity(self, src_desc: str, dst_ip: str, port: int,
protocol: str = "tcp", expected: str = "blocked"):
"""Test if connectivity exists between source and destination."""
try:
if protocol == "tcp":
cmd = ["nc", "-z", "-w", "3", dst_ip, str(port)]
elif protocol == "udp":
cmd = ["nc", "-z", "-u", "-w", "3", dst_ip, str(port)]
elif protocol == "icmp":
cmd = ["ping", "-c", "1", "-W", "3", dst_ip]
else:
return
result = subprocess.run(cmd, capture_output=True, timeout=5)
actual = "open" if result.returncode == 0 else "blocked"
except subprocess.TimeoutExpired:
actual = "blocked"
except FileNotFoundError:
actual = "error"
status = "PASS" if actual == expected else "FAIL"
self.results.append({
"source": src_desc,
"destination": f"{dst_ip}:{port}/{protocol}",
"expected": expected,
"actual": actual,
"status": status,
})
symbol = "[+]" if status == "PASS" else "[!]"
print(f" {symbol} {src_desc} -> {dst_ip}:{port}/{protocol} "
f"| Expected: {expected} | Actual: {actual} | {status}")
def run_validation(self):
"""Run segmentation validation tests."""
print(f"\n{'='*70}")
print("NETWORK SEGMENTATION VALIDATION")
print(f"{'='*70}")
print(f"Date: {datetime.now().isoformat()}\n")
# Tests that SHOULD be blocked
print("[*] Testing controls that should BLOCK traffic:")
self.test_connectivity("Corporate", "10.0.40.10", 443, "tcp", "blocked")
self.test_connectivity("Corporate", "10.0.40.10", 22, "tcp", "blocked")
self.test_connectivity("Guest", "10.0.30.10", 80, "tcp", "blocked")
self.test_connectivity("Guest", "10.0.20.1", 0, "icmp", "blocked")
# Tests that SHOULD be allowed
print("\n[*] Testing controls that should ALLOW traffic:")
self.test_connectivity("Corporate", "10.0.30.10", 443, "tcp", "open")
self.test_connectivity("Corporate", "10.0.30.10", 80, "tcp", "open")
self.test_connectivity("Management", "10.0.30.10", 22, "tcp", "open")
# Summary
passed = sum(1 for r in self.results if r["status"] == "PASS")
failed = sum(1 for r in self.results if r["status"] == "FAIL")
print(f"\n{'='*70}")
print(f"Results: {passed} PASSED, {failed} FAILED out of {len(self.results)} tests")
if failed > 0:
print(f"\n[!] FAILED TESTS:")
for r in self.results:
if r["status"] == "FAIL":
print(f" - {r['source']} -> {r['destination']}: "
f"expected {r['expected']}, got {r['actual']}")
# Save report
report = {
"date": datetime.now().isoformat(),
"total_tests": len(self.results),
"passed": passed,
"failed": failed,
"results": self.results,
}
report_path = f"segmentation_test_{datetime.now().strftime('%Y%m%d')}.json"
with open(report_path, 'w') as f:
json.dump(report, f, indent=2)
print(f"\nReport saved to: {report_path}")
if __name__ == "__main__":
validator = SegmentationValidator()
validator.run_validation()
ベストプラクティス
- デフォルトで拒否 - まず、ゾーン間の通信をすべて拒否するルールを設定し、必要なトラフィックを明示的に許可します
- 通信フローを文書化 - 制限を実装する前に、正当なトラフィックフローをすべてマッピングします
- 機密性に応じて分割 - データ分類とコンプライアンスの対象範囲に基づいて、資産をグループ化します
- ゾーン内の制御 - ゾーン間だけでなく、ゾーン内のラテラルムーブメントもブロックします
- 管理アクセスを制限 - 管理プレーンを踏み台ホストのある専用ゾーンに制限します
- 定期的な検証 - 自動化ツールを使用して、セグメンテーション制御を四半期ごとにテストします
- 拒否されたトラフィックを監視 - ポリシーを改善するため、拒否されたゾーン間トラフィックを記録して確認します
- PCI 対象範囲の縮小 - セグメンテーションを使用して、PCI DSS カード会員データ環境の対象範囲を最小限に抑えます
参考資料
コメント
Markdown 対応