Azure Key Vault を使用して Azure Cosmos DB アカウント用にクロステナントのカスタマー マネージド キーを構成する
適用対象: NoSQL MongoDB Cassandra Gremlin Table
Azure Cosmos DB アカウントに格納されるデータは、Microsoft によって管理されるサービス マネージド キーを使って自動的かつシームレスに暗号化されます。 ただし、顧客が管理するキーを使って暗号化の第 2 のレイヤーを追加できます。 このようなキーは、カスタマー マネージド キー (または CMK) と呼ばれます。 カスタマー マネージド キーは、Azure Key Vault のインスタンスに格納されます。
この記事では、Azure Cosmos DB アカウントを作成するときにカスタマー マネージド キーを使って暗号化を構成する手順について説明します。 このクロステナントのシナリオの例では、Azure Cosmos DB アカウントは、サービス プロバイダーと呼ばれる独立系ソフトウェア ベンダー (ISV) によって管理されるテナントに存在します。 Azure Cosmos DB アカウントの暗号化に使われるキーは、顧客が管理する別のテナントのキー コンテナーに存在します。
クロステナントのカスタマー マネージド キーについて
Azure でサービスとしてのソフトウェア (SaaS) オファリングを構築している多くのサービス プロバイダーは、顧客に独自の暗号化キーを管理するオプションを提供したいと考えています。 カスタマー マネージド キーを使用すると、サービス プロバイダーは、サービス プロバイダーの顧客によって管理され、サービス プロバイダーからアクセスできない暗号化キーを使用して、顧客のデータを暗号化できます。 Azure では、サービス プロバイダーの顧客は Azure Key Vault を使って、独自の Microsoft Entra テナントとサブスクリプションで暗号化キーを管理できます。
サービス プロバイダーが所有し、サービス プロバイダーのテナントに存在する Azure プラットフォーム サービスとリソースでは、暗号化/暗号化解除操作を実行するために、顧客のテナントからキーにアクセスする必要があります。
次の図は、サービス プロバイダーとその顧客にまたがるクロステナントの CMK ワークフローでフェデレーション ID を使用した保存時のデータ暗号化を示しています。
上の例では、独立したサービス プロバイダーのテナント ("テナント 1") と顧客のテナント ("テナント 2") の、2 つの Microsoft Entra テナントがあります。 "テナント 1" は Azure プラットフォーム サービスをホストし、"テナント 2" は顧客のキー コンテナーをホストします。
サービス プロバイダーによって、"テナント 1" 内にマルチテナント アプリケーションの登録が作成されます。 ユーザー割り当てマネージド ID を使用して、このアプリケーションにフェデレーション ID 資格情報が作成されます。 次に、アプリの名前とアプリケーション ID が顧客と共有されます。
適切なアクセス許可を持つユーザーは、顧客テナント "テナント 2" にサービス プロバイダーのアプリケーションをインストールします。 次にユーザーは、インストールされているアプリケーションに関連付けられているサービス プリンシパルに、顧客のキー コンテナーへのアクセス権を付与します。 顧客はまた、暗号化キー (カスタマー マネージド キー) をキー コンテナーに格納します。 顧客は、キーの場所 (キーの URL) をサービス プロバイダーと共有します。
これでサービス プロバイダーには次の情報があります。
- 顧客のテナント内にインストールされ、カスタマー マネージド キーへのアクセスが許可されている、マルチテナント アプリケーションのアプリケーション ID。
- マルチテナント アプリケーション上の資格情報として構成されたマネージド ID。
- 顧客のキー コンテナー内のキーの場所。
この 3 つのパラメーターを使用して、サービス プロバイダーは "テナント 2" のカスタマー マネージド キーで暗号化できる "テナント 1" 内の Azure リソースをプロビジョニングします。
上記のエンド ツー エンド ソリューションを 3 つのフェーズに分割しましょう。
- サービス プロバイダーは ID を構成します。
- 顧客は、サービス プロバイダーのマルチテナント アプリに対し、Azure Key Vault 内の暗号化キーへのアクセス権を付与します。
- サービス プロバイダーは、CMK を使用して Azure リソース内のデータを暗号化します。
フェーズ 1 の操作は、ほとんどのサービス プロバイダー アプリケーションに対して 1 回限りの設定となります。 フェーズ 2 とフェーズ 3 の操作は、顧客ごとに繰り返されます。
フェーズ 1 - サービス プロバイダーが Microsoft Entra アプリケーションを構成する
Step | 説明 | Azure RBAC の最小ロール | Microsoft Entra RBAC の最小ロール |
---|---|---|---|
1. | 新しいマルチテナント Microsoft Entra アプリケーションの登録を作成するか、既存のアプリケーションの登録から始めます。 Azure portal、Microsoft Graph API、Azure PowerShell、または Azure CLI を使用して、アプリケーション登録のアプリケーション ID (クライアント ID) をメモします | なし | アプリケーション開発者 |
2. | ユーザー割り当てマネージド ID を作成します (フェデレーション ID 資格情報として使用されます)。 Azure portal / Azure CLI / Azure PowerShell/ Azure Resource Manager テンプレート |
マネージド ID 共同作成者 | なし |
3. | アプリケーションの ID を借用できるように、アプリケーションのフェデレーション ID 資格情報としてユーザー割り当てマネージド ID を構成します。 Graph API リファレンス/ Azure portal/ Azure CLI/ Azure PowerShell |
なし | アプリケーションの所有者 |
4. | アプリケーション名とアプリケーション ID を顧客と共有し、顧客がアプリケーションをインストールして承認できるようにします。 | なし | なし |
サービス プロバイダーに関する考慮事項
- Microsoft Entra アプリケーションの作成に Azure Resource Manager (ARM) テンプレートを使用することは推奨されていません。
- 同じマルチテナント アプリケーションを使用して、"テナント 2"、"テナント 3"、"テナント 4" など、複数のテナント内のキーにアクセスすることができます。 各テナントでは、アプリケーション ID は同じだがオブジェクト ID は異なるアプリケーションの独立したインスタンスが作成されます。 したがって、このアプリケーションの各インスタンスは個別に承認されます。 この機能に使用されるアプリケーション オブジェクトを使用して、すべての顧客間でアプリケーションをパーティション分割する方法を検討します。
- 1 つのアプリケーションで使用できるフェデレーション ID 資格情報は最大 20 個なので、サービス プロバイダーはフェデレーション ID を顧客間で共有する必要があります。 フェデレーション ID の設計に関する考慮事項と制限について詳しくは、「外部 ID プロバイダーを信頼するようにアプリを構成する」をご覧ください。
- サービス プロバイダーが顧客ごとに 1 つのアプリケーション オブジェクトを使用するシナリオもまれにありますが、この場合は、すべての顧客で大規模にアプリケーションを管理するための多額のメンテナンス コストが必要になります。
- サービス プロバイダー テナント内では、発行者の確認を自動化することはできません。
フェーズ 2 - 顧客がキー コンテナーへのアクセスを承認する
手順 | 説明 | 最小特権の Azure RBAC ロール | 最小特権の Microsoft Entra ロール |
---|---|---|---|
1. | なし | アプリケーションをインストールするアクセス許可を持つユーザー | |
2. | カスタマー マネージド キーとして使用されるキーと Azure キー コンテナーを作成します。 | キー コンテナーを作成するには、ユーザーに Key Vault Contributor ロールを割り当てる必要があります キー コンテナーにキーを追加するには、ユーザーに Key Vault Crypto Officer ロールを割り当てる必要があります |
なし |
3. | Key Vault Crypto Service Encryption User ロールを割り当てることで、同意したアプリケーション ID に、Azure キー コンテナーへのアクセス権を付与します | Key Vault Crypto Service Encryption User ロールをアプリケーションに割り当てるには、ユーザー アクセス管理者ロールが割り当てられている必要があります。 | なし |
4. | キー コンテナーの URL とキー名を、SaaS オファリングのカスタマー マネージド キー構成にコピーします。 | なし | なし |
Note
CMK を使用した暗号化のためにマネージド HSM へのアクセスを承認するには、こちらのストレージ アカウントの例を参照してください。 マネージド HSM を使用したキーの管理の詳細については、「Azure CLI を使用してマネージド HSM を管理する」を参照してください
サービス プロバイダーの顧客に関する考慮事項
- 顧客テナント "テナント 2" で、管理者は、管理者以外のユーザーがアプリケーションをインストールできないようにポリシーを設定できます。 これらのポリシーによって、管理者以外のユーザーがサービス プリンシパルを作成できないようにすることができます。 そのようなポリシーを構成した場合は、サービス プリンシパルを作成するアクセス許可を持ったユーザーの関与が必要になります。
- Azure Key Vault へのアクセスは、Azure RBAC またはアクセス ポリシーを使用して承認できます。 キー コンテナーへのアクセスを許可する場合は、キー コンテナーのアクティブなメカニズムを使用するようにしてください。
- Microsoft Entra アプリケーションの登録には、アプリケーション ID (クライアント ID) が使用されます。 アプリケーションがテナントにインストールされると、サービス プリンシパルが作成されます。 サービス プリンシパルでは、アプリ登録と同じアプリケーション ID が共有されますが、独自のオブジェクト ID が生成されます。 アプリケーションにリソースへのアクセスを承認するには、サービス プリンシパル
Name
またはObjectID
プロパティの使用が必要になる場合があります。
フェーズ 3 - サービス プロバイダーがカスタマー マネージド キーを使用して Azure リソース内のデータを暗号化する
フェーズ 1 と 2 が完了すると、サービス プロバイダーは、顧客のテナント内のキーとキー コンテナーと ISV のテナント内の Azure リソースを使用して、Azure リソース上の暗号化を構成できます。 サービス プロバイダーは、その Azure リソースでサポートされているクライアント ツール、ARM テンプレート、または REST API を使用して、クロステナントのカスタマー マネージド キーを構成できます。
クロステナントのカスタマー マネージド キーを構成する
このセクションでは、クロステナントのカスタマー マネージド キー (CMK) を構成し、顧客データを暗号化する方法について説明します。 Tenant2 のキー コンテナーに格納されている CMK を使用して、Tenant1 のリソース内の顧客データを暗号化する方法について説明します。 Azure portal、Azure PowerShell、または Azure CLI を使用できます。
Azure portal にサインインして、次の手順を実行します。
サービス プロバイダーが ID を構成します
次の手順は、サービス プロバイダーのテナント Tenant1 のサービス プロバイダーによって実行されます。
サービス プロバイダーが新しいマルチテナント アプリ登録を作成します
新しいマルチテナント Microsoft Entra アプリケーションの登録を作成するか、既存のマルチテナント アプリケーションの登録から始めることができます。 既存のアプリケーション登録から始める場合は、アプリケーションのアプリケーション ID (クライアント ID) をメモします。
新しい登録を作成するには、次の手順に従います。
検索ボックスで Microsoft Entra ID を検索します。 Microsoft Entra ID 拡張機能を見つけて選びます。
左ウィンドウで、[管理] > [アプリの登録] を選択します。
[+ 新規登録] を選択します。
アプリケーションの登録の名前を指定して、[任意の組織ディレクトリ内のアカウント (任意の Microsoft Entra ディレクトリ - マルチテナント)] を選びます。
[登録] を選択します。
アプリケーションの ApplicationId/ClientId を メモします。
サービス プロバイダーは、ユーザー割り当てマネージド ID を作成します
フェデレーション ID 資格情報として使用されるユーザー割り当てマネージド ID を作成します。
検索ボックスで「マネージド ID」を検索します。 マネージド ID 拡張機能を見つけて選択します。
[+ 作成] を選択します。
マネージド ID のリソース グループ、リージョン、名前を指定します。
[Review + create](レビュー + 作成) を選択します。
デプロイが成功したら、ユーザー割り当てマネージド ID の Azure ResourceId をメモします。この ID は [プロパティ] にあります。 次に例を示します。
/subscriptions/tttttttt-0000-tttt-0000-tttt0000tttt/resourcegroups/XTCMKDemo/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ConsotoCMKDemoUA
サービス プロバイダーは、ユーザー割り当てマネージド ID をアプリケーションのフェデレーション資格情報として構成します
アプリケーションの ID を借用できるように、アプリケーションのフェデレーション ID 資格情報としてユーザー割り当てマネージド ID を構成します。
[Microsoft Entra ID] > [アプリの登録] > 自分のアプリに移動します。
[証明書とシークレット] を選択します。
[フェデレーション資格情報] を選択します。
[資格情報の追加] を選択します。
[フェデレーション資格情報のシナリオ] で、[カスタマー マネージド キー] を選択します。
[マネージド ID の選択] をクリックします。 ウィンドウからサブスクリプションを選択します。 [マネージド ID] で、[ユーザー割り当てマネージド ID] を選択します。 [選択] ボックスで、先ほど作成したマネージド ID を検索し、ウィンドウの下部にある [選択] をクリックします。
[資格情報の詳細] で、資格情報の名前と説明 (省略可能) を指定し、[追加] を選択します。
サービス プロバイダーがアプリケーション ID を顧客と共有する
マルチテナント アプリケーションのアプリケーション ID (クライアント ID) を見つけて、顧客と共有します。
顧客がサービス プロバイダーのアプリにキー コンテナー内のキーへのアクセスを許可する
次の手順は、顧客のテナント Tenant2 の顧客によって実行されます。 顧客は Azure portal、Azure PowerShell、または Azure CLI を使用できます。
手順を実行するユーザーは、アプリケーション管理者、クラウド アプリケーション管理者、グローバル管理者などの特権ロールを持つ管理者である必要があります。
Azure portal にサインインして、次の手順を実行します。
顧客が顧客テナントにサービス プロバイダー アプリケーションをインストールする
サービス プロバイダーの登録済みアプリケーションを顧客のテナントにインストールするには、登録済みアプリからのアプリケーション ID で、サービス プリンシパルを作成します。 サービス プリンシパルは、次のいずれかの方法で作成できます。
- Microsoft Graph、Microsoft Graph PowerShell、Azure PowerShell、または Azure CLI を使用して、サービス プリンシパルを手動で作成します。
- 管理者の同意 URL を作成し、サービス プリンシパルを作成するためのテナント全体にわたる同意を付与します。 AppId を指定する必要があります。
顧客がキー コンテナーを作成する
キー コンテナーを作成するには、ユーザーのアカウントに Key Vault Contributor ロール、またはキー コンテナーの作成を許可する別のロールを割り当てる必要があります。
Azure portal メニューまたは [ホーム] ページで、[+リソースの作成] を選択します 検索ボックスに「Key Vaults」と入力します。 結果の一覧から [キー コンテナー] を選択します。 [キー コンテナー] ページで、[作成] を選択します。
[基本] タブで、サブスクリプションを選択します。 [リソース グループ] で、[新規作成] を選択し、リソース グループ名を入力します。
キー コンテナーの一意の名前を入力します。
リージョンと価格レベルを選択します。
新しいキー コンテナーの消去保護を有効にします。
[アクセス ポリシー] タブで、[アクセス許可モデル] に [Azure ロールベースのアクセス制御] を選びます。
[確認および作成] 、 [作成] の順に選択します。
キー コンテナーの名前と URI を記録しておきます。キー コンテナーにアクセスするアプリケーションは。この URI を使う必要があります。
詳細については、「クイックスタート - Azure portal を使用して Azure キー コンテナーを作成する」を参照してください。
顧客は、Key Vault Crypto Officer ロールをユーザー アカウントに割り当てます
この手順により、暗号化キーを作成できるようになります。
- キー コンテナーに移動し、左側のウィンドウから [アクセスの制御 (IAM)] を選択します。
- [このリソースへのアクセス権の付与] で [ロールの割り当ての追加] を選択します。
- Key Vault Crypto Officer を検索して選択します。
- [メンバー] タブで、[ユーザー、グループ、またはサービス プリンシパル] を選択します。
- [メンバー] を選択し、ユーザー アカウントを検索します。
- [レビューと割り当て] を選択します。
顧客が暗号化キーを作成する
暗号化キーを作成するには、ユーザーのアカウントに Key Vault Crypto Officer ロール、またはキーの作成を許可する別のロールを割り当てる必要があります。
- Key Vault のプロパティ ページで、[キー] を選択します。
- [Generate/Import](生成/インポート) を選択します。
- [キーの作成] 画面で、キーの名前を指定します。 他の値は既定値のままにしておきます。
- [作成] を選択します
- キー URI をコピーします。
顧客がサービス プロバイダー アプリケーションにキー コンテナーへのアクセスを許可する
キー コンテナーにアクセスできるように、Azure RBAC ロール Key Vault Crypto Service Encryption User をサービス プロバイダーの登録済みアプリケーションに割り当てます。
- キー コンテナーに移動し、左側のウィンドウから [アクセスの制御 (IAM)] を選択します。
- [このリソースへのアクセス権の付与] で [ロールの割り当ての追加] を選択します。
- [Key Vault Crypto Service Encryption User] を検索して選択します。
- [メンバー] タブで、[ユーザー、グループ、またはサービス プリンシパル] を選択します。
- [メンバー] を選択し、サービス プロバイダーからインストールしたアプリケーションのアプリケーション名を検索します。
- [レビューと割り当て] を選択します。
これで、キー コンテナーの URI とキーを使用して、カスタマー マネージド キーを構成できます。
異なるテナントのキーで暗号化される新しい Azure Cosmos DB アカウントを作成する
ここまでは、サービス プロバイダーのテナントでマルチテナント アプリケーションを構成しました。 また、顧客のテナントにアプリケーションをインストールし、キー コンテナーとキーを構成しました。 次に、サービス プロバイダーのテナントに Azure Cosmos DB アカウントを作成し、顧客のテナントのキーを使ってカスタマー マネージド キーを構成できます。
カスタマー マネージド キーを使って Azure Cosmos DB アカウントを作成するときは、顧客が使ったキーにアクセスできることを確認する必要があります。 シングルテナントのシナリオでは、Azure Cosmos DB のプリンシパルにキー コンテナーへの直接アクセス権を付与するか、特定のマネージド ID を使います。 クロステナントのシナリオでは、キー コンテナーは顧客によって管理される別のテナントにあるため、キー コンテナーへの直接アクセスに依存できなくなります。 この制約のために、前のセクションでは、クロステナント アプリケーションを作成し、アプリケーション内にマネージド ID を登録して、顧客のキー コンテナーにアクセスできるようにしました。 このマネージド ID を、クロステナント アプリケーション ID と組み合わせて、クロステナント CMK の Azure Cosmos DB アカウントを作成するときに使います。 詳しくは、この記事の「フェーズ 3 - サービス プロバイダーがカスタマー マネージド キーを使用して Azure リソース内のデータを暗号化する」セクションをご覧ください。
キー コンテナーで新しいバージョンのキーが使用できるようになるたびに、Azure Cosmos DB アカウントでそれが自動的に更新されます。
Azure Resource Manager JSON テンプレートを使用する
次の特定のパラメーターを使って ARM テンプレートをデプロイします。
注意
Azure Resource Manager テンプレートのいずれかでこのサンプルを再作成している場合は、2022-05-15
の apiVersion
を使ってください。
パラメーター | 説明 | 値の例 |
---|---|---|
keyVaultKeyUri |
サービス プロバイダーのキー コンテナーに存在するカスタマー マネージド キーの識別子。 | https://my-vault.vault.azure.com/keys/my-key |
identity |
マネージド ID を Azure Cosmos DB アカウントに割り当てる必要があることを指定するオブジェクト。 | "identity":{"type":"UserAssigned","userAssignedIdentities":{"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity":{}}} |
defaultIdentity |
マネージド ID のリソース ID と、マルチテナント Microsoft Entra アプリケーションのアプリケーション ID の組み合わせ。 | UserAssignedIdentity=/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity&FederatedClientId=aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e |
3 つのパラメーターが構成されたテンプレート セグメントの例を次に示します。
{
"kind": "GlobalDocumentDB",
"location": "East US 2",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity": {}
}
},
"properties": {
"locations": [
{
"locationName": "East US 2",
"failoverPriority": 0,
"isZoneRedundant": false
}
],
"databaseAccountOfferType": "Standard",
"keyVaultKeyUri": "https://my-vault.vault.azure.com/keys/my-key",
"defaultIdentity": "UserAssignedIdentity=/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity&FederatedClientId=aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
}
}
重要
この機能は、Azure PowerShell、Azure CLI、または Azure portal ではまだサポートされていません。
新しい Azure Cosmos DB アカウントを作成するとき、特定のバージョンのキー バージョンでカスタマー マネージド キーを構成することはできません。 キー自体を、バージョンと末尾の円記号を付けないで渡す必要があります。
カスタマー マネージド キーの取り消しや無効化については、Azure Key Vault での Azure Cosmos DB アカウント用のカスタマー マネージド キーの構成に関する記事をご覧ください。