mcpField
I
implementing-network-segmentation-with-firewall-zones

implementing-network-segmentation-with-firewall-zones

github.com/mukul975セキュリティ35.2k76 回インストール8 週間前に更新
リポジトリ

implementing-network-segmentation-with-firewall-zones について

ネットワークやセキュリティ担当者向けのネットワーク分割ガイドです。VLAN、ファイアウォールゾーン、マイクロセグメンテーションを扱い、通信の把握からポリシー設定・検証までを説明します。

主な機能

  1. 01通信の把握とセキュリティゾーン定義
  2. 02スイッチの VLAN 設定
  3. 03ゾーン間ファイアウォールポリシー設定
  4. 04VLAN 間ルーティング ACL の適用
  5. 05セグメンテーション制御の検証

活用シーン

  1. 01ゲストネットワークと社内ネットワークの分離
  2. 02ユーザーのサーバーポートへのアクセス制限
  3. 03決済データと管理ゾーンの分離
  4. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
references/
api-reference.md
scripts/
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 カード会員データ環境の対象範囲を最小限に抑えます

参考資料

コメント