共用方式為


使用 Azure Key Vault 為 Azure Cosmos DB 帳戶設定跨租用戶客戶自控金鑰

適用於:NoSQL MongoDB Cassandra Gremlin Table

會使用由 Microsoft 管理的服務管理金鑰,自動對儲存在 Azure Cosmos DB 帳戶中的資料進行縝密的加密。 然而,您可以選擇使用您所管理的金鑰來新增第二層加密。 這些金鑰稱為客戶自控金鑰 (或 CMK)。 客戶自控金鑰會儲存在 Azure Key Vault 執行個體中。

本文逐步說明如何在建立 Azure Cosmos DB 帳戶時,運用客戶自控金鑰來設定加密。 在此範例跨租用戶情節中,Azure Cosmos DB 帳戶位於獨立軟體廠商 (ISV) 所管理的租用戶中,ISV 又稱為服務提供者。 用來加密 Azure Cosmos DB 帳戶的金鑰位於客戶所管理之不同租用戶的金鑰保存庫中。

關於跨租用戶的客戶自控金鑰

許多在 Azure 上建置軟體即服務 (SaaS ) 供應項目的服務提供者都想要為客戶提供用以管理自有加密金鑰的選項。 客戶自控金鑰可讓服務提供者使用服務提供者的客戶所管理的加密金鑰來加密客戶的資料,而且服務提供者無法存取。 在 Azure 中,服務提供者的客戶可以使用 Azure Key Vault,在自己的 Microsoft Entra 租用戶和訂用帳戶中管理其加密金鑰。

服務提供者所擁有的 Azure 平台服務和資源,以及位於服務提供者租用戶的 Azure 平台服務和資源,都需要從客戶的租用戶存取金鑰,才能執行加密/解密作業。

下圖顯示在跨租用戶 CMK 工作流程中,範圍涵蓋服務提供者與客戶的待用資料加密與同盟身分識別。

此螢幕擷取畫面顯示具有同盟身分識別的跨租用戶 CMK。

在上述範例中,有兩個 Microsoft Entra 租用戶:獨立服務提供者的租用戶 (Tenant1),以及客戶的租用戶 (Tenant2)。 Tenant1 裝載 Azure 平台服務,而 Tenant2 裝載客戶的金鑰保存庫。

多租用戶應用程式註冊是由 Tenant1 中的服務提供者建立。 在此應用程式上建立同盟身分識別認證時,所使用的是使用者指派的受控識別。 然後,應用程式的名稱和應用程式識別碼會與客戶共用。

具有適當權限的使用者會在客戶租用戶 Tenant2 中安裝服務提供者的應用程式。 接著,使用者會將與已安裝應用程式存取權相關聯的服務主體授與客戶的金鑰保存庫。 客戶也會將加密金鑰或客戶自控金鑰儲存在金鑰保存庫中。 客戶會與服務提供者共用金鑰位置 (金鑰的 URL)。

服務提供者現在具有:

  • 安裝在客戶租用戶中的多租用戶應用程式的應用程式識別碼,其已獲得客戶自控金鑰的存取權。
  • 在多租用戶應用程式上設定為認證的受控識別。
  • 客戶金鑰保存庫中的金鑰位置。

使用這三個參數,服務提供者會在 Tenant1 中佈建 Azure 資源,其可使用 Tenant2 中的客戶自控金鑰進行加密。

請將上述端對端解決方案分成三個階段:

  1. 服務提供者設定身分識別。
  2. 客戶將服務提供者的多租用戶應用程式存取權授與 Azure Key Vault 中的加密金鑰。
  3. 服務提供者使用 CMK 來加密 Azure 資源中的資料。

階段 1 中的作業是大部分服務提供者應用程式的一次性設定。 階段 2 和 3 中的作業會針對每個客戶重複。

階段 1 - 服務提供者設定 Microsoft Entra 應用程式

步驟 描述 Azure RBAC 中的最低角色 Microsoft Entra RBAC 中的最小角色
1. 建立新的多租用戶 Microsoft Entra 應用程式註冊,或從現有的應用程式註冊開始。 請記下使用 Azure 入口網站Microsoft Graph APIAzure PowerShellAzure CLI 註冊的應用程式識別碼 (用戶端識別碼) 應用程式開發人員
2. 建立使用者指派的受控識別 (以作為同盟身分識別認證)。
Azure 入口網站 / Azure CLI / Azure PowerShell/ Azure Resource Manager 範本
受控身分識別參與者
3. 在應用程式上將使用者指派的受控識別設定為「同盟身分識別認證」,以便模擬應用程式的身分識別。
圖形 API參考/ Azure 入口網站/ Azure CLI/ Azure PowerShell
應用程式的擁有者
4. 與客戶共用應用程式名稱和應用程式識別碼,讓他們可以安裝和授權應用程式。

服務提供者的考量

  • 不建議使用 Azure Resource Manager (ARM) 範本來建立 Microsoft Entra 應用程式。
  • 相同的多租用戶應用程式可以用來存取任意數目之租用戶中的金鑰,例如 Tenant2Tenant3Tenant4 等等。 在每個租用戶中,會建立應用程式的獨立執行個體,該執行個體具有相同的應用程式識別碼,但不同的物件識別碼。 因此,此應用程式的每個執行個體都會獨立獲得授權。 請考慮如何使用此功能的應用程式物件將應用程式分割給所有客戶。
  • 在罕見的情況下,服務提供者可能會根據其客戶使用單一 Application 物件,但這需要大量維護成本,才能跨所有客戶大規模管理應用程式。
  • 在服務提供者租用戶中,無法自動進行發行者驗證 (機器翻譯)。

階段 2 - 客戶授權存取金鑰保存庫

步驟 描述 最低特殊權限的 Azure RBAC 角色 具有最低權限的 Microsoft Entra 角色
1.
  • 建議:將使用者送去登入您的應用程式。 如果使用者可以登入,則應用程式的服務主體存在於其租用戶中。
  • 使用 Microsoft GraphMicrosoft Graph PowerShellAzure PowerShellAzure CLI 來建立服務主體。
  • 建構管理員同意的 URL並授與全租用戶同意,以使用應用程式識別碼建立服務主體。
  • 具有安裝應用程式權限的使用者
    2. 建立 Azure Key Vault,以及作為客戶自控金鑰的金鑰。 使用者必須獲指派金鑰保存庫參與者角色,才能建立金鑰保存庫

    使用者必須獲指派金鑰保存庫密碼編譯人員角色,才能將金鑰新增至金鑰保存庫
    3. 指派金鑰保存庫密碼編譯服務加密使用者角色,以將同意的應用程式身分識別存取權授與 Azure 金鑰保存庫。 若要將 [金鑰保存庫密碼編譯服務加密使用者]角色指派給應用程式,您必須已獲指派使用者存取管理員角色。
    4. 將金鑰保存庫 URL 和金鑰名稱複製至 SaaS 供應項目的客戶自控金鑰設定中。

    注意

    若要使用 CMK 授權存取受控 HSM 以進行加密,請參閱此處的儲存體帳戶範例。 如需使用受控 HSM 管理金鑰的詳細資訊,請參閱使用 Azure CLI 管理受控 HSM

    服務提供者的客戶考量

    • 在客戶租用戶 Tenant2 中,管理員可以設定原則來封鎖非管理使用者安裝應用程式。 這些原則可防止非管理使用者建立服務主體。 如果已設定這類原則,則必須涉及具有建立服務主體權限的使用者。
    • 使用 Azure RBAC 或存取原則可以授權存取 Azure Key Vault。 授與金鑰保存庫的存取權時,請務必使用金鑰保存庫的作用中機制。
    • Microsoft Entra 應用程式註冊具有應用程式識別碼 (用戶端識別碼)。 在您的租用戶中安裝應用程式時,會建立服務主體。 服務主體會共用與應用程式註冊相同的應用程式識別碼,但會產生自己的物件識別碼。 當您授權應用程式能夠存取資源時,可能需要使用服務主體 NameObjectID 屬性。

    階段 3 - 服務提供者使用客戶自控金鑰來加密 Azure 資源中的資料

    在階段 1 和 2 完成之後,服務提供者可以使用客戶租用戶中的金鑰和金鑰保存庫,以及 ISV 租用戶中的 Azure 資源,在 Azure 資源上設定加密。 服務提供者可以使用該 Azure 資源支援的用戶端工具、ARM 範本或 REST API,設定跨租用戶客戶自控金鑰。

    設定跨租用戶的客戶自控金鑰

    本節說明如何設定跨租用戶的客戶自控金鑰 (CMK) 以及加密客戶資料。 您將了解如何使用 Tenant2 的金鑰保存庫中所儲存的 CMK,來加密 Tenant1 的資源中的客戶資料。 您可以使用 Azure 入口網站、Azure PowerShell 或 Azure CLI。

    登入 Azure 入口網站並遵循下列步驟。

    服務提供者設定身分識別

    下列步驟是由服務提供者在其租用戶 Tenant1 中執行。

    服務提供者建立新的多租用戶應用程式註冊

    您可以建立新的多租用戶 Microsoft Entra 應用程式註冊,或從現有的多租用戶應用程式註冊開始。 如果從現有的應用程式註冊開始,請記下應用程式的應用程式識別碼 (用戶端識別碼)。

    若要建立新的註冊:

    1. 在搜尋方塊中,搜尋 Microsoft Entra ID。 找出並選取 Microsoft Entra ID 延伸模組。

    2. 從左窗格中,選取 [管理] > [應用程式註冊]

    3. 選取 + 新增註冊

    4. 提供應用程式註冊的名稱,然後選取 [任何組織目錄中的帳戶 (任何 Microsoft Entra 目錄 – 多租用戶)]

    5. 選取註冊

    6. 請記下應用程式的 ApplicationId/ClientId

      此螢幕擷取畫面顯示如何建立新的多租用戶應用程式註冊。

    服務提供者建立使用者指派的受控識別

    建立使用者指派的受控識別,以作為同盟身分識別認證。

    1. 在搜尋方塊中,搜尋「受控識別」。 找出並選取 [受控識別] 延伸模組。

    2. 選取 + 建立

    3. 提供受控識別的資源群組、區域和名稱。

    4. 選取 [檢閱 + 建立]。

    5. 成功部署時,請記下使用者指派受控識別的 Azure ResourceId,其可在 [屬性] 下取得。 例如:

      /subscriptions/tttttttt-0000-tttt-0000-tttt0000tttt/resourcegroups/XTCMKDemo/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ConsotoCMKDemoUA

      此螢幕擷取畫面顯示如何建立資源群組和使用者指派的受控識別。

    服務提供者將使用者指派的受控識別設定為應用程式上的同盟認證

    將使用者指派的受控識別設定為應用程式的同盟身分識別認證,以模擬應用程式的身分識別。

    1. 瀏覽至 [Microsoft Entra ID] > [應用程式註冊] > [您的應用程式]

    2. 選取 [憑證和秘密]

    3. 選取 [同盟認證]

      此螢幕擷取畫面顯示如何瀏覽至憑證和祕密。

    4. 選取 [+ 新增認證]

    5. 在 [同盟認證案例] 下,選取 [客戶自控金鑰]

    6. 按一下 [選取受控識別]。 從窗格中,選取訂用帳戶。 在 [受控識別] 下,選取 [使用者指派的受控識別]。 在 [選取] 方塊中,搜尋您稍早建立的受控識別,然後按一下窗格底部的 [選取]

      此螢幕擷取畫面顯示如何選取受控識別。

    7. 在 [認證詳細資料] 下,提供認證的名稱和選用描述,然後選取 [新增]

      此螢幕擷取畫面顯示如何新增認證。

    服務提供者與客戶共用應用程式識別碼

    尋找多租用戶應用程式的應用程式識別碼 (用戶端識別碼),並與客戶共用。

    客戶將服務提供者的應用程式存取權授與金鑰保存庫中金鑰

    下列步驟是由客戶在其租用戶 Tenant2 中執行。 客戶可以使用 Azure 入口網站、Azure PowerShell 或 Azure CLI。

    執行這些步驟的使用者必須是具有特殊權限角色的管理員,例如應用程式管理員雲端應用程式管理員全域管理員

    登入 Azure 入口網站並遵循下列步驟。

    客戶在客戶租用戶中安裝服務提供者應用程式

    若要在客戶的租用戶中安裝服務提供者的已註冊應用程式,您可以從已註冊的應用程式建立具有應用程式識別碼的服務主體。 您可以使用下列任一種方式來建立服務主體:

    客戶建立金鑰保存庫

    若要建立金鑰保存庫,必須將「金鑰保存庫參與者」角色或另一個允許建立金鑰保存庫的角色指派給使用者的帳戶。

    1. 從 Azure 入口網站功能表或從首頁,選取 [+ 建立資源]。 在 [搜尋] 方塊中,輸入「金鑰保存庫」。 從結果清單中,選取 [金鑰保存庫]。 在 [金鑰保存庫] 頁面上,選取 [建立]

    2. 在 [基本] 索引標籤上,選擇訂用帳戶。 在 [資源群組] 下,選取 [新建],然後輸入資源群組名稱。

    3. 輸入金鑰保存庫的唯一名稱。

    4. 選取區域和定價層。

    5. 啟用新金鑰保存庫的清除保護。

    6. 在 [存取原則] 索引標籤上,針對 [權限模型] 選取 [Azure 角色型存取控制]

    7. 選取 [檢閱 + 建立],然後選取 [建立]

      此螢幕擷取畫面顯示如何建立金鑰保存庫。

    記下可存取金鑰保存庫的金鑰保存庫名稱和 URI 應用程式必須使用此 URI。

    如需詳細資訊,請參閱快速入門 - 使用 Azure 入口網站建立 Azure Key Vault

    客戶將「金鑰保存庫密碼編譯人員」角色指派給使用者帳戶

    此步驟可確保您可以建立加密金鑰。

    1. 瀏覽至您的金鑰保存庫,然後從左窗格中選取 [存取控制 (IAM)]
    2. 授與此資源的存取權下方,選取新增角色指派
    3. 搜尋並選取 [金鑰保存庫密碼編譯人員]
    4. 在 [成員] 下,選取 [使用者、群組或服務主體]
    5. 選取 [成員],然後搜尋您的使用者帳戶。
    6. 選取 [檢閱 + 指派]

    客戶建立加密金鑰

    若要建立加密金鑰,必須將「金鑰保存庫密碼編譯人員」角色或另一個允許建立金鑰的角色,指派給使用者的帳戶。

    1. 在 [金鑰保存庫屬性] 頁面上,選取 [金鑰]
    2. 選取產生/匯入
    3. 在 [建立金鑰] 畫面上,指定金鑰的名稱。 將其他值保留為其預設值。
    4. 選取 建立
    5. 複製金鑰 URI。

    客戶將金鑰保存庫的存取權授與服務提供者應用程式

    將 Azure RBAC 角色「金鑰保存庫密碼編譯服務加密使用者」指派給服務提供者的已註冊應用程式,以便存取金鑰保存庫。

    1. 瀏覽至您的金鑰保存庫,然後從左窗格中選取 [存取控制 (IAM)]
    2. 授與此資源的存取權下方,選取新增角色指派
    3. 搜尋並選取 [金鑰保存庫密碼編譯服務加密使用者]
    4. 在 [成員] 下,選取 [使用者、群組或服務主體]
    5. 選取 [成員],然後搜尋您從服務提供者安裝之應用程式的應用程式名稱。
    6. 選取 [檢閱 + 指派]

    您現在可以使用金鑰保存庫 URI 和金鑰來設定客戶自控金鑰。

    建立以不同租用戶金鑰加密的新 Azure Cosmos DB 帳戶

    到目前為止,您已在服務提供者的租用戶上設定多租用戶應用程式。 您還在客戶的租用戶上安裝該應用程式,並在客戶的租用戶上設定了金鑰保存庫和金鑰。 接下來,您可以在服務提供者租用戶上建立 Azure Cosmos DB 帳戶,並使用客戶租用戶金鑰來設定客戶自控金鑰。

    使用客戶自控金鑰建立 Azure Cosmos DB 帳戶時,我們必須確定其可存取客戶所使用的金鑰。 在單一租用戶情節中,授與 Azure Cosmos DB 主體的直接金鑰保存庫存取權,或使用特定的受控識別。 在跨租用戶情節中,我們不再依賴對金鑰保存庫的直接存取,因為其在客戶管理的另一個租用戶中。 此限制式是我們在前幾節中建立跨租用戶應用程式,並在應用程式內註冊受控識別,使其能夠存取客戶金鑰保存庫的原因。 此受控識別與跨租用戶應用程式識別碼結合,是建立跨租用戶 CMK Azure Cosmos DB 帳戶時將使用的資訊。 如需詳細資訊,請參閱本文的階段 3 - 服務提供者使用客戶自控金鑰加密 Azure 資源中的資料一節。

    每當金鑰保存庫中有新版本的金鑰可用時,就會在 Azure Cosmos DB 帳戶上自動更新金鑰。

    使用 Azure Resource Manager JSON 範本

    使用下列特定參數部署 ARM 範本:

    注意

    如果您要在其中一個 Azure Resource Manager 範本中重新建立此範例,請使用 2022-05-15apiVersion

    參數 描述 範例值
    keyVaultKeyUri 位於服務提供者金鑰保存庫中的客戶自控金鑰識別碼。 https://my-vault.vault.azure.com/keys/my-key
    identity 指定受控識別應指派給 Azure Cosmos DB 帳戶的物件。 "identity":{"type":"UserAssigned","userAssignedIdentities":{"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity":{}}}
    defaultIdentity 受控識別的資源識別碼與多租用戶 Microsoft Entra 應用程式的應用程式識別碼的組合。 UserAssignedIdentity=/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity&FederatedClientId=aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e

    以下是已設定三個參數的範本區段範例:

    {
      "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 入口網站尚不支援此功能。

    當您建立新的 Azure Cosmos DB 帳戶時,無法使用特定版本的金鑰版本來設定客戶自控金鑰。 金鑰本身必須在不帶版本和尾端反斜線的情況下傳遞。

    若要撤銷或停用客戶自控金鑰,請參閱使用 Azure Key Vault 為 Azure Cosmos DB 帳戶設定客戶自控金鑰

    另請參閱