前置き
1つのネットワークセグメントには、どの程度のシステムを配置してもいいでしょうか?
あまりにも複数のシステムを配置してしまうと、仮にそのネットワークセグメントに対して、インシデントが混入されたときに、複数のシステムがダウンするという爆発半径の拡大が起きてしまいます。
1セグメントに、1個のシステムを配置
そのため、
超理想系は、単一責務の原則をネットワークにも適用して、1つのネットワークセグメントに1つのシステム
が乗っかるようにするのが、「最小権限の原則」の観点からも望ましいものです。
トレードオフ
しかし、そうすると、システムの数が少ないうちはいいのですが、企業が拡大成長し、
システム数が増えたときにどおでしょうか?
当たり前に「どのセグメントから、どのセグメントにはアクセス許可」といった、
運用コストが増加してしまうことは容易に想像がつくと思います。
ネットワークセグメントへの配置設計
現在のベストプラクティスは
「そもそもネットワークセグメントを“信頼”しない」
という考え方(ゼロトラスト)に基づいています。
結論から言うと、理想と現実にはトレードオフがあります。
理想(高セキュリティ)
1セグメントに、1個のシステムを配置。
これは「マイクロセグメンテーション」と呼ばれ、最も安全です。
現実(運用とのバランス)
システムの 「共通のセキュリティ要件」 でグルーピングし、1セグメントに複数のシステムを配置します。
なぜ「1セグメント=1システム」が理想なのか (ゼロトラスト)
「ネットワークにも単一責務の原則を適用する」という考えは、
「マイクロセグメンテーション」または「ゼロトラスト・ネットワーク」
と呼ばれる、非常に強力なセキュリティモデルそのものです。
このモデルの前提は 「ネットワークはすでに侵害されている(信頼できない)」 です。
メリット
インシデント発生時に爆発半径が最小になります。
仮にシステムAが侵害されても、ネットワークレベルでシステムBへの通信が許可されていないため、攻撃者は 水平展開(ラテラル・ムーブメント) ができません。
デメリット(現実の壁)
ただし、運用が極度に複雑化します。
100個のシステムがあれば、それらがお互いに通信するためのファイアウォールルールを個別に管理する必要があり、運用コストが爆発してしまいます。
ココは完全にトレードオフです。
現実的なアプローチ:「ゾーン」によるグルーピング
そこで、「意図的に単一原則を破る」 必要性が出てきます。
これは、「運用コスト」とのトレードオフの結果として行われる、
「ゾーン(Zone-Based)セグメンテーション」
と呼ばれる一般的な妥協案です。
まとめ方は、
「そのセグメントに乗せるシステム群が、同じレベルのセキュリティ要件を共有している」 という単位でです。
設計思想
システムを、その「役割」や「セキュリティレベル」に基づいてグルーピングします。
例(3層アーキテクチャ)
①. DMZ(非武装地帯)セグメント
外部に公開されるWebサーバー群をここに配置します。
②. Appセグメント
内部のアプリケーションサーバー群をここに配置します。
③. DBセグメント
最も重要なデータベース群をここに配置します。
ルール
・インターネットからAppセグメントへの直接通信は禁止。
・AppセグメントからDBセグメントへの通信は許可。
爆発半径の制御
これでもしDMZのWebサーバーが侵害されても、攻撃者は(ルール上)AppセグメントやDBセグメントに直接アクセスできません。
それにより、インシデント時の爆発半径をDMZ内に抑え込むことができます。
結論:現代の「ハイブリッド」な設計
「1セグメント=1システム」(マイクロセグメンテーション)は、特にKubernetes(k8s)のような環境では 「サービスメッシュ(Service Mesh)」 によって実現されます。
ネットワークセグメント(Podネットワーク)
物理的には、すべてのPodが1つの巨大なネットワークセグメントに乗っている状態にします。(運用をシンプルにするため)
サービスメッシュ(Istioなど)
その「信頼できない」ネットワークの上で、アプリケーションレベル(L7) で厳格なセキュリティルールを適用します。
これにより、
「注文サービスのPod」は「決済サービスのPod」とだけ通信できる
という論理的な「1対1」のマイクロセグメントを実現します。
これが、「1セグメント=1システム」の理想(高いセキュリティ)と、「1セグメント=複数システム」の現実(シンプルな運用)を両立させる、現代的な答えとなります。
セグメントとメッシュによる多層防御
サービスメッシュは、従来のネットワークセグメントを置き換えるものではなく、
その 「内側」で、よりきめ細かな制御を行うための「補完・強化」レイヤー です。
「城壁(ネットワークセグメント)」と「城壁内の警備員(サービスメッシュ)」
の関係に例えられます。
1. ネットワークセグメントの役割 (The Castle Wall 🏰)
ネットワークセグメント(VLANやサブネット)は、IPアドレスやポート(L3/L4)に基づいて通信を分離する、粗い粒度の境界です。
役割:「どのゾーンが、どのゾーンと通信できるか?」を決定
事例
「DBセグメント(城壁の内側)」には、「Appセグメント(城壁の外側)」からの通信しか許可しない。
弱点
一度「Appセグメント(城壁の外側)」から侵入を許すと、Appセグメント内部にある全てのシステム(Order-ServiceやPayment-Service)は、お互いに自由に通信できてしまいます。
=水平展開(ラテラル・ムーブメント) のリスクが存在する。
2. サービスメッシュの役割 (The Guards Inside the Wall 🕵️)
サービスメッシュ(Istio, Linkerdなど)は、アプリケーション(L7)レベルで動作し、
細かい粒度の制御を行います。
役割
ネットワークセグメントの内部で、「どのサービスが、どのサービスと通信できるか?」を決定します。
事例
同じ「Appセグメント」内部であっても、
Order-ServiceはPayment-Serviceとのみ通信を許可するが、
Admin-Serviceとの通信は禁止する。
強み
・ゼロトラスト
IPアドレスではなく、「サービスのID」に基づいて認証・認可を行います。
・mTLS
サービス間のすべての通信を自動的に暗号化します。
・高度な機能
リトライ、サーキットブレーカー、レイテンシーの監視(オブザーバビリティ)なども提供します。
3. 2つの関係性:多層防御 (Defense-in-Depth)
この2つを組み合わせることで、「多層防御」 が実現します。
第一の壁 (セグメント)
まず、ネットワークセグメントが、無関係なゾーン(例:インターネット)からの不正なアクセスをまとめてブロックします。
第二の壁 (サービスメッシュ)
もし攻撃者が第一の壁を突破し、Order-Serviceを乗っ取ったとしても、
サービスメッシュが「Order-ServiceからAdmin-Serviceへの通信」を個別にブロックし、
被害の水平展開を防ぎます。
設計思想のアナロジー
ちなみに、以下の記事の多層防御の考えとメカニズムは一緒です。
複数のセグメントへの配置の考え方
1つの事業を構成するサービスコンポーネントは、本質的に各コンテキスト境界ごとに求められるセキュリティレベルが異なるので、複数のネットワークセグメントに配置されます。
これは、1つの事業を構成するサービス群であっても、各コンテキスト境界(ドメイン)が持つ「セキュリティ上の重要度」や「外部に晒されるリスク」は全く異なるため、
それらを 異なるネットワークセグメント(セキュリティゾーン)に配置 するのが、多層防御の基本です。
なぜコンテキスト境界でセグメントを分けるのか
これは、
「爆発半径の拡大」を防ぎ、攻撃者がシステム内部を自由に移動する「水平展開(ラテラル・ムーブメント)」を阻止するために不可欠
です。
もし、すべてのサービスを「信頼できる」という理由で一つの巨大なセグメントにまとめて配置してしまうと、
最も弱いコンポーネント(例:外部に公開されたWebサーバー)が1つ侵害された瞬間に、最も重要なコンポーネント(例:決済データベース)までが危険に晒されることになります。(制約理論により)
現実的な設計:「ゾーン」によるグルーピング
上記でも触れましたが、「1セグメント=1システム」は、運用が複雑になります。
そのため、以下のような 「ゾーンセグメンテーション」 が、現実的な最適解となります。
「同じセキュリティ要件を持つコンポーネント群」を「1つのネットワークセグメント」にグルーピング
します。
1つの事業(例:ECサイト)は、以下のように複数セグメントにまたがって配置されます。
🛡️ 1. DMZ(非武装地帯)セグメント (低信頼・高リスク)
目的は、「インターネットからのトラフィックを直接受け付ける」 こと。
配置されるコンポーネント
・Webフロントエンド(ドメインA)
・APIゲートウェイ(ドメインB)
爆発半径
ここが侵害されても、被害はこのセグメント内に留まり、次の「Appセグメント」には直接到達できません。
🔒 2. Appセグメント (中信頼・中リスク)
目的は、「コアドメインのビジネスロジックを実行」 すること。
配置されるコンポーネント
・注文サービス(ドメインC)
・決済サービス(ドメインD)
・在庫サービス(ドメインE)
特徴
1つのセグメントに複数のシステム(サービスコンポーネント)が同居します。
ただし、それらは
「内部サービス」という共通のセキュリティレベル
を共有しています。
🗝️ 3. Dataセグメント (高信頼・低リスク)
目的は、「最も重要なデータを永続化」 すること。
配置されるコンポーネント
・顧客データベース(ドメインF)
・決済データベース(ドメインG)
爆発半径
Appセグメントが侵害されても、このDataセグメントへの通信は、厳格に制御(例:特定のポートのみ許可)されているため、DB全体が即座に奪われるリスクを低減できます。
結論
1つの事業を構成するコンポーネント群は、
①. DDDの考え方でコンテキスト境界を定義し、
②. その境界が持つセキュリティ要件(例:公開用、内部ロジック用、データ用)を特定し、
③. 同じ要件を持つコンポーネント群を、同じネットワークセグメント(ゾーン) にグルーピングして配置する
という流れで設計されます。
その結果、1つの事業は必然的に複数のネットワークセグメントにまたがって配置されることになります。
