ソフトウェアアーキテクチャ図は開発チームの設計図として機能します。システム間の相互作用、データの流れ、コンポーネントの構造を伝える役割を果たします。しかし、標準的なC4モデル図では、重要な次元であるセキュリティが欠けていることがよくあります。セキュリティ境界を可視化しないと、アーキテクトや開発者は、信頼の前提が不明瞭なシステムを無意識に構築してしまう可能性があり、後で修正するのに費用がかかる脆弱性を生じる原因になります。C4コンテナ図にセキュリティ境界を組み込むことで、リスク管理を設計段階に組み込むことが可能になり、後から追加するという後手の対応を避けられます。
本ガイドは、C4モデルフレームワーク内において、セキュリティ制御、信頼ゾーン、データ保護メカニズムを効果的に表現する方法を探ります。定められた規約に従うことで、構造的に明確なだけでなく、セキュリティに配慮した図をチームが作成できるようになります。このアプローチにより、セキュリティエンジニア、開発者、ビジネス関係者との間でより良いコミュニケーションが実現されます。

🏗️ セキュリティにおけるC4モデルの文脈
C4モデルは、ソフトウェアアーキテクチャを文書化するための階層的アプローチを提供します。4つのレベルから構成されています:システムコンテキスト、コンテナ、コンポーネント、コード。セキュリティ可視化において、コンテナレベル通常、最も重要なレベルです。このレベルでは、ウェブアプリケーション、モバイルアプリ、API、データベースなどの高レベルなソフトウェア構成要素を示します。
セキュリティ境界を導入する際の目的は、信頼が終わる場所と信頼できない環境が始まる場所を明確にすることです。セキュリティ文脈を欠いたコンテナ図では、システムAがシステムBと通信していることは示せても、その接続が暗号化されているか、認証されているか、パブリックネットワークを経由しているかは明らかになりません。セキュリティ境界を追加することで、この情報の空白を埋めることができます。
- レベル1(システムコンテキスト):外部の依存関係を特定し、システムとユーザーまたは第三者との間の高レベルな信頼関係を把握するのに役立ちます。
- レベル2(コンテナ):本ガイドの主な焦点です。ここでは、内部ゾーン、ネットワークセグメント、データ分類レベルを定義します。
- レベル3(コンポーネント):認証モジュールなど、詳細なセキュリティロジックに使用できますが、高レベルなセキュリティレビューにはあまりに細かくなりがちです。
コンテナレベルに注目することで、アーキテクトは抽象化と詳細のバランスを保つことができます。これにより、実装の詳細で図がごちゃごちゃにならず、セキュリティの意思決定が明確に見えるようになります。
🧱 セキュリティ境界の定義
セキュリティ境界は、信頼が変化する境界を表します。境界を越えるには、認証、承認、暗号化などの特定の制御が必要です。図では、同じセキュリティポジションを持つ、または同じネットワークセグメント内にあるコンテナをグループ化します。
境界の種類
異なる境界の種類を理解することで、適切な視覚的表現を選択するのに役立ちます:
- ネットワーク境界:内部のプライベートネットワーク、パブリックインターネットアクセス、DMZ(非武装地帯)のような隔離環境を区別します。
- 信頼ゾーン:完全に信頼できる内部サービスと、部分的にしか信頼できない外部インターフェースを区別します。
- データ分類:機密データ(PII、財務記録など)を扱うコンテナを、パブリック向けサービスとは別にグループ化します。
- コンプライアンスゾーン:GDPR準拠を必要とするシステムと一般的な運用ツールとの間で、規制要件に基づいてシステムを分離します。
信頼とデータフロー
セキュリティの本質は信頼にあります。コンテナ間のすべての接続は、信頼関係を意味します。コンテナAがコンテナBにデータを送信する場合、AはBがそのデータを適切に処理することを信頼しています。Bが侵害された場合、Aもリスクにさらされます。
この信頼関係を可視化することは非常に重要です。C4図の矢印はデータフローを表しますが、同時に信頼の方向性も示すべきです。境界線は、それを越えるにはセキュリティチェックが必要であることを示します。たとえば、「パブリックゾーン ~へインテナールゾーン認証ステップをトリガーすべきである。
🎨 コンテナ図における境界の可視化
視覚的言語の一貫性が、効果的なドキュメント作成の鍵である。セキュリティ境界を描く際には、記法が直感的であるべきである。単一の普遍的な標準は存在しないが、C4モデル内でうまく機能する業界の慣習が発展している。
記法の標準
C4図を作成するために使用される大多数のツールは、カスタム形状とスタイルをサポートしている。セキュリティ境界を表現するためには、以下の標準的な実践を検討すべきである:
- 破線:コンテナのグループを囲むために破線を使用する。これは物理的な壁ではなく、論理的なグループ化を示唆する。
- 陰影付き領域:明るい背景色はゾーンを示すことができる。例えば、明るい赤色の背景は高リスクのパブリックゾーンを示す可能性があり、緑色は信頼できるインテナールゾーンを示す。
- アイコン:境界ラベルの隣に小さなロックまたはシールドのアイコンを追加して、セキュリティ制御が有効であることを示す。
- ラベル: 境界を明確に名前を付ける。以下の用語を使用する:パブリックネットワーク, セキュアゾーン、またはDMZ.
色分け戦略
色は強力なサインである。しかし、意図的に使用しなければならない。色を無作為に使用してはならない。代わりに、色をセキュリティ状態にマッピングするべきである:
- 赤/オレンジ:高リスク、パブリック向け、信頼できない入力ソース。
- 黄色:中程度のリスク、DMZ、または準信頼性インターフェース。
- 緑/青:低リスク、内部、信頼できるサービス。
- グレー:慎重な取り扱いが必要なレガシーシステムまたは非推奨のコンポーネント。
色の選択がアクセシブルであることを確認する。色以外にパターンやラベルを使用して、色覚障害を持つユーザーにとっても図が読みやすいことを保証する。
🔒 図におけるセキュリティ制御の実装
境界が描かれたら、次にその境界を横切る接続を注釈する。セキュリティ境界を横切る線はセキュリティイベントである。特定の制御が必要となる。
暗号化とプロトコル
接続に使用されたプロトコルをラベルで示す。これにより、転送中のデータのセキュリティ状態について読者が理解できる。
- HTTPS/TLS:ウェブトラフィックの標準。関係する場合はバージョンを明記する(例:TLS 1.3)。
- mTLS:相互TLSはマイクロサービスアーキテクチャで一般的である。これは強力な身元検証を示している。
- SSH:管理アクセスまたは内部ファイル転送用。
- 暗号化されていない:暗号化されていないトラフィックを明示的にラベルする。これにより、是正が必要なリスクが強調される。
認証と承認
ユーザーはどこで認証するのか?どのサービスがトークンを検証するのか?これらの質問は図から答えられるべきである。
- APIゲートウェイ:しばしばエントリーポイントとして機能する。認証が行われる境界としてマークする。
- OAuth/SSO:ユーザー、ゲートウェイ、バックエンドサービス間のトークンの流れを示す。
- サービスアカウント:サービスがユーザーのトークンではなく、マシンのアイデンティティを使用して認証しているかどうかを示す。
🔄 一般的なアーキテクチャパターン
特定のアーキテクチャパターンは、現代のソフトウェアシステムで頻繁に出現する。これらのパターンには、特定のセキュリティ境界に関する考慮事項がある。
1. DMZパターン
デミリタリゼッドゾーン(DMZ)は、パブリックインターネットと内部ネットワークの間に位置する。外部からアクセス可能でなければならないコンポーネントをホストするが、機密データへの直接アクセスは許可されない。
- 境界:WebサーバーやロードバランサーをDMZゾーンで囲む。
- 接続: DMZは、制限されたポートまたはAPIエンドポイントを介して内部ゾーンと通信する。
- セキュリティ目標: パブリック面のコンポーネントが侵害された場合の被害範囲を制限する。
2. サービスメッシュを備えたマイクロサービス
マイクロサービスアーキテクチャでは、サービス同士が頻繁に通信する。サービスメッシュはトラフィック管理とセキュリティを担当する。
- 境界: 各サービスは独自のコンテナである。メッシュは論理的なオーバーレイを構築する。
- 接続: すべての内部トラフィックは暗号化される(mTLS)。
- セキュリティ目標: ゼロトラスト。すべてのサービスは、他のすべてのサービスを検証しなければならない。
3. データベースのセグメンテーション
すべてのデータベースを同じように扱うべきではない。機密データストアは隔離すべきである。
- 境界: 機密データベースを専用のサブネットまたはセキュリティゾーンに配置する。
- 接続: データベースに接続できるのは、特定のアプリケーションコンテナのみである。
- セキュリティ目標: 横方向移動を防止する。アプリケーションコンテナが侵害された場合、攻撃者はデータベースに直接アクセスできない。
📊 セキュリティレビュー確認リスト
図面を最終化する前に、セキュリティレビューを行う。すべての必要な境界や制御が表現されていることを確認するために、以下のチェックリストを使用する。
| チェック項目 | 基準 | なぜ重要なのか |
|---|---|---|
| 信頼ゾーンの定義 | すべてのコンテナが信頼ゾーンに割り当てられているか? | セキュリティ制御が必要な場所を明確にする。 |
| 接続ラベル | プロトコルおよび暗号化方法がラベル付けされているか? | 送信中のデータが安全であることを保証する。 |
| 認証ポイント | 認証のエントリーポイントは明確ですか? | アクセス制御が行われる場所を特定します。 |
| データ分類 | 機密データストアは分離されていますか? | 高価値資産を保護します。 |
| 外部依存関係 | サードパーティサービスはマークされていますか? | サプライチェーンリスクを強調します。 |
| 管理者アクセス | 管理者アクセスは制限されていますか? | 不正なシステム制御を防止します。 |
この表は、コードレビューまたはアーキテクチャ意思決定記録(ADR)の際に迅速な参照として機能します。設計段階でセキュリティが見過ごされないことを保証します。
⚠️ セキュリティの反パターン
ベストプラクティスを守ることと同じくらい、ミスを避けることが重要です。以下の反パターンは、セキュリティ境界が欠けた図面によく見られます。
- フラットな図面:ゾーンを設けずに、すべてのコンテナを1つのボックスに描く。これにより、すべてのコンポーネントが同等に信頼されていると誤解されるが、これはほとんど真実ではない。
- 暗号化ラベルの欠如:HTTPSを明示せずに矢印を表示する。これにより、データ保護に関する曖昧さが生じる。
- 過度な信頼:中間層を経ずに、パブリック向けコンテナをデータベースコンテナに直接接続する。これは古典的な脆弱性の原因となる。
- 静的境界:インフラ構成の変更時に図面を更新しないこと。古いネットワークトポロジーを示す図面は、まったく図面がないよりも悪い。
- データフローを無視する:静的構造にのみ注目し、データが境界を越えてどのように移動するかを無視する。セキュリティは動的なものである。
📈 メンテナンスと進化
セキュリティ境界は静的ではありません。システムが進化し、新しいサービスが追加され、脅威も変化します。図面もそれに合わせて進化しなければなりません。図面を動的な文書として扱うことは、長期的なセキュリティにとって不可欠です。
バージョン管理
図面をコードと一緒にバージョン管理に保存する。これにより、チームはセキュリティ境界が時間とともにどのように変化したかを追跡できる。セキュリティインシデントが発生した際、図面の履歴を確認することで、境界が欠落していたか、誤設定されていたかを明らかにできる。
自動生成
可能な限り、コードやインフラストラクチャ-as-コードの構成から図を生成してください。これにより、ドキュメントと実際のシステムとのギャップが小さくなります。インフラストラクチャが変更された場合、図は自動的に更新され、セキュリティ境界が正確なまま保たれます。
定期的な監査
アーキテクチャ図の定期的なレビューをスケジュールしてください。これらのレビューでは、特定のセキュリティに関する質問を投げかけます:
- 境界を越える新しい依存関係が追加されたことはありますか?
- 暗号化の基準はまだ最新のものになっていますか?
- 信頼ゾーンは現在のネットワークトポロジーとまだ一致していますか?
- 攻撃面を小さくするために削除すべき未使用のコンテナはありますか?
🔍 結論
C4コンテナ図にセキュリティ境界を統合することで、単なる構造図から包括的なセキュリティガイドへと変化します。この実践により、信頼関係が明確になり、データ保護要件が強調され、チーム間のコミュニケーションが円滑になります。一貫した表記法、ラベル付けのプロトコルを遵守し、図を長期間にわたり維持することで、組織はより強靭なシステムを構築できます。
セキュリティは製品ではなくプロセスです。図はそのプロセスにおけるツールです。目に見えないものを可視化し、アーキテクトがインシデントになる前にリスクを特定できるようにします。正確でセキュリティを意識したドキュメントに時間を投資することは、脆弱性の低減と迅速なインシデント対応という恩恵をもたらします。
まず現在の図の監査を開始してください。信頼境界が欠けている場所を特定し、必要なゾーン、ラベル、色を追加してください。時間とともにこの習慣は自然なものになり、セキュリティがアーキテクチャを説明する言語そのものに組み込まれます。











