マイクロサービスベースのセキュリティ設計文書 チートシート
はじめに
マイクロサービス・アーキテクチャは、クラウドベースおよびオンプレミスのインフラストラクチャの双方におけるアプリケーション・システムの設計と実装に、ますます利用されています。アプリケーションの設計および実装の段階で対処すべき多くのセキュリティ上の課題があります。いくつかのセキュリティ課題に対処するためには、アプリケーション・アーキテクチャに関するセキュリティ特有の情報を収集することが必要です。本記事の目的は、アプリケーションを保護するために、マイクロサービスベースのアーキテクチャ情報を収集するアプローチの具体的な提案を提供することです。
コンテキスト
マイクロサービス・アーキテクチャに基づくアプリケーションを保護する際、セキュリティアーキテクト/エンジニアは通常、以下のような問いに直面します(主に OWASP Application Security Verification Standard Project の V1「アーキテクチャ、設計、脅威モデリング要件」 で参照されています)。
- 脅威モデリングと最小権限の原則の適用:
- 他のマイクロサービスの API にアクセスするために、そのマイクロサービスが最小限必要とするスコープまたは API キーは何か?
- データベースまたはメッセージキューにアクセスするために、そのマイクロサービスが最小限必要とする権限(グラント)は何か?
- データ漏えい分析:
- どのストレージやメッセージキューが機微データを含んでいるか?
- マイクロサービスは特定のデータベースまたはメッセージキューから/へデータを読み書きするか?
- 専用のマイクロサービスはどのマイクロサービスを呼び出すのか?マイクロサービス間でどのデータが渡されるのか?
- 攻撃面(アタックサーフェス)分析:
- セキュリティテストの際にテストすべきマイクロサービスのエンドポイントは何か?
多くの場合、既存のアプリケーション・アーキテクチャ文書は、これらの問いに答えるのに適していません。以降のセクションでは、上記の問いに答えるために収集できる、アーキテクチャのセキュリティ特有の情報を提案します。
目的
本チートシートの目的は、上記の問いに答えるために収集できるアーキテクチャのセキュリティ特有の情報を説明し、アプリケーションを保護するためにマイクロサービスベースのアーキテクチャ情報を収集するアプローチの具体的な提案を提供することです。
提案
構成要素(ビルディングブロック)に関する情報を収集する
アプリケーション機能サービスを特定して記述する
アプリケーション機能サービスは、1つまたは複数のビジネスプロセスや機能(例:顧客情報の保存、製品カタログの保存と表示)を実装します。各アプリケーション機能サービスに関して、以下に挙げるパラメータの情報を収集します。
| パラメータ名 | 説明 |
|---|---|
| サービス名(ID) | 一意のサービス名または ID |
| 短い説明 | マイクロサービスが実装するビジネスプロセスまたは機能の短い説明 |
| ソースコードリポジトリへのリンク | サービスのソースコードリポジトリへのリンクを指定 |
| 開発チーム | 当該マイクロサービスを開発する開発チームを指定 |
| API 定義 | マイクロサービスが外部インターフェースを公開する場合、そのインターフェース記述(例:OpenAPI 仕様)へのリンクを指定。使用するセキュリティスキームを定義するのが望ましい。たとえば、特定のエンドポイント呼び出しに必要なスコープや API キーを定義する(例:参照)。 |
| マイクロサービス・アーキテクチャ記述 | マイクロサービスのアーキテクチャ図や記述(もしあれば)へのリンクを指定 |
| ランブックへのリンク | マイクロサービスのランブックへのリンクを指定 |
インフラストラクチャ・サービスを特定して記述する
インフラストラクチャ・サービス(リモートサービスを含む)は、認証、認可、サービス登録とディスカバリ、セキュリティ監視、ロギング等を実装し得ます。各インフラストラクチャ・サービスに関して、以下に挙げるパラメータの情報を収集します。
| パラメータ名 | 説明 |
|---|---|
| サービス名(ID) | 一意のサービス名または ID |
| 短い説明 | サービスが実装する機能(例:認証、認可、サービス登録とディスカバリ、ロギング、セキュリティ監視、API ゲートウェイ)の短い説明 |
| ソースコードリポジトリへのリンク | サービスのソースコードリポジトリへのリンクを指定(該当する場合) |
| サービスドキュメントへのリンク | サービスの API 定義、運用ガイダンス/ランブック等を含むサービスドキュメントへのリンクを指定 |
データストレージを特定して記述する
各データストレージに関して、以下に挙げるパラメータの情報を収集します。
| パラメータ名 | 説明 |
|---|---|
| ストレージ名(ID) | 一意のストレージ名または ID |
| ソフトウェア種別 | データストレージを実装するソフトウェアを指定(例:PostgreSQL、Redis、Apache Cassandra) |
メッセージキューを特定して記述する
メッセージングシステム(例:RabbitMQ、Apache Kafka)は、非同期のマイクロサービス間通信メカニズムを実装するために使用されます。各メッセージキューに関して、以下に挙げるパラメータの情報を収集します。
| パラメータ名 | 説明 |
|---|---|
| メッセージキュー(ID) | 一意のメッセージキュー名または ID |
| ソフトウェア種別 | メッセージキューを実装するソフトウェアを指定(例:RabbitMQ、Apache Kafka) |
データ資産を特定して記述する
システムのマイクロサービス/サービスによって処理されるデータ資産を特定して記述します。まずはセキュリティの観点から価値の高い資産(例:「ユーザー情報」「決済」)を特定するのが望ましいです。各資産に関して、以下に挙げるパラメータの情報を収集します。
| パラメータ名 | 説明 |
|---|---|
| 資産名(ID) | 一意の資産名または ID |
| 保護レベル | 資産の保護レベルを指定(例:PII、機密) |
| 追加情報 | 補足情報を追加 |
構成要素間の関係に関する情報を収集する
「サービス対ストレージ」の関係を特定する
各「サービス対ストレージ」の関係に関して、以下に挙げるパラメータの情報を収集します。
| パラメータ名 | 説明 |
|---|---|
| サービス名(ID) | 上記で定義したサービス名(ID)を指定 |
| ストレージ名(ID) | 上記で定義したストレージ名(ID)を指定 |
| アクセスタイプ | アクセスタイプを指定(例:「Read」「Read/Write」) |
「サービス対サービス」の同期通信を特定する
各「サービス対サービス」の同期通信に関して、以下に挙げるパラメータの情報を収集します。
| パラメータ名 | 説明 |
|---|---|
| 呼び出し元サービス名(ID) | 上記で定義した呼び出し元サービス名(ID)を指定 |
| 呼び出し先サービス名(ID) | 上記で定義した呼び出し先サービス名(ID)を指定 |
| 使用プロトコル/フレームワーク | 通信に使用するプロトコル/フレームワークを指定(例:HTTP(REST、SOAP)、Apache Thrift、gRPC) |
| 短い説明 | 通信の目的(情報の問い合わせのためのリクエスト、または状態変更を伴うビジネス機能のためのリクエスト/コマンド)およびサービス間で渡されるデータを(可能であれば、上で定義した資産の観点で)簡潔に記述 |
「サービス対サービス」の非同期通信を特定する
各「サービス対サービス」の非同期通信に関して、以下に挙げるパラメータの情報を収集します。
| パラメータ名 | 説明 |
|---|---|
| パブリッシャーサービス名(ID) | 上記で定義したパブリッシャーサービス名(ID)を指定 |
| サブスクライバーサービス名(ID) | 上記で定義したサブスクライバーサービス名(ID)を指定 |
| メッセージキュー(ID) | 上記で定義したメッセージキュー(ID)を指定 |
| 短い説明 | 通信の目的(情報の受領、または状態変更を伴うビジネス機能のためのコマンド)およびサービス間で渡されるデータを(可能であれば、上で定義した資産の観点で)簡潔に記述 |
「資産対ストレージ」の関係を特定する
各「資産対ストレージ」の関係に関して、以下に挙げるパラメータの情報を収集します。
| パラメータ名 | 説明 |
|---|---|
| 資産名(ID) | 上で定義した資産名(ID) |
| ストレージ名(ID) | 上記で定義したストレージ名(ID)を指定 |
| ストレージ種別 | 当該資産に対するストレージの種別を指定(例:「ゴールデンソース」「キャッシュ」) |
アプリケーション・アーキテクチャの図示を作成する
アプリケーション・アーキテクチャ(上で定義した構成要素とその関係)を、サービス呼び出しグラフまたはデータフロー図の形で図示することが望ましいです。そのために、専用のソフトウェアツール(例:Enterprise Architect)や DOT 言語 を使用できます。DOT 言語の使用例はこちらを参照してください。
収集した情報をセキュアソフトウェア開発プラクティスで活用する
収集した情報は、セキュリティ要件の定義、脅威モデリング、セキュリティテストなどのアプリケーション・セキュリティ実践に役立ちます。以下のセクションでは、アプリケーション・アーキテクチャの保護に関する活動(およびそれらの OWASP プロジェクトへのマッピング)の例と、上記で収集した情報を用いた実装のヒントを示します。
攻撃面(アタックサーフェス)分析
実装のヒント
セキュリティテスト時にテストすべきマイクロサービスのエンドポイントを列挙し、脅威モデリング時に分析するため、以下のセクションで収集したデータを分析します。
- アプリケーション機能サービスの特定と記述(パラメータ「API 定義」)
- インフラストラクチャ・サービスの特定と記述(パラメータ「サービスドキュメントへのリンク」)
OWASP プロジェクトへのマッピング
データ漏えい分析
実装のヒント
潜在的なデータ漏えいを分析するため、以下のセクションで収集したデータを分析します。
- データ資産の特定と記述
- 「サービス対ストレージ」の関係の特定
- 「サービス対サービス」の同期通信の特定
- 「サービス対サービス」の非同期通信の特定
- 「資産対ストレージ」の関係の特定
OWASP プロジェクトへのマッピング
アプリケーションのトラスト境界、コンポーネント、重要なデータフローの正当化
実装のヒント
アプリケーションのすべてのトラスト境界、コンポーネント、重要なデータフローの文書化と正当化を検証するため、以下のセクションで収集したデータを分析します。
- アプリケーション機能サービスの特定と記述
- インフラストラクチャ・サービスの特定と記述
- データストレージの特定と記述
- メッセージキューの特定と記述
- 「サービス対ストレージ」の関係の特定
- 「サービス対サービス」の同期通信の特定
- 「サービス対サービス」の非同期通信の特定
OWASP プロジェクトへのマッピング
アプリケーションの高レベル・アーキテクチャの分析
実装のヒント
アプリケーションの高レベル・アーキテクチャおよび接続されたすべてのリモートサービスの定義とセキュリティ分析を検証するため、以下のセクションで収集したデータを分析します。
- アプリケーション機能サービスの特定と記述
- インフラストラクチャ・サービスの特定と記述
- データストレージの特定と記述
- メッセージキューの特定と記述
OWASP プロジェクトへのマッピング
集中管理されたセキュリティコントロール実装の検証
実装のヒント
重複、不足、非効率、または安全でないコントロールを回避するために、集中管理され、単純(設計の経済性)、検証済みで安全かつ再利用可能なセキュリティコントロールの実装を検証するには、「インフラストラクチャ・サービスの特定と記述」のセクションで収集したデータを分析します。
OWASP プロジェクトへのマッピング
最小権限の原則の適用
実装のヒント
マイクロサービスに最小限必要な権限を定義するには、以下のセクションで収集したデータを分析します。
- アプリケーション機能サービスの特定と記述(パラメータ「API 定義」)
- 「サービス対ストレージ」の関係の特定
- 「サービス対サービス」の同期通信の特定
- 「サービス対サービス」の非同期通信の特定
OWASP プロジェクトへのマッピング
機微データの特定と分類
実装のヒント
すべての機微データが特定され、保護レベルに分類されていることを検証するには、以下のセクションで収集したデータを分析します。
- データ資産の特定と記述
- 「資産対ストレージ」の関係の特定
OWASP プロジェクトへのマッピング
アプリケーション・コンポーネントのビジネス/セキュリティ機能の検証
実装のヒント
提供するビジネスまたはセキュリティ機能の観点から、すべてのアプリケーション・コンポーネントの定義と文書化を検証するには、以下のセクション(パラメータ「短い説明」)で収集したデータを分析します。
- アプリケーション機能サービスの特定と記述
- インフラストラクチャ・サービスの特定と記述