使用跨租用戶的客戶自控金鑰加密受控磁碟

本文說明如何運用儲存在不同 Microsoft Entra 租用戶中的 Azure Key Vault,建置使用客戶自控金鑰加密受控磁碟的解決方案。 此設定適用於數個案例,其中一個範例是針對想要為服務提供者提供自備加密金鑰給其客戶的服務提供者 Azure 支援,其中服務提供者租用戶的資源會使用其客戶的租用戶金鑰來加密。

跨租用戶 CMK 工作流程中具有同盟身分識別的磁碟加密集會跨越服務提供者/ISV 租用戶資源 (磁碟加密集、受控識別和應用程式註冊) 和客戶租用戶資源 (企業應用程式、使用者角色指派和金鑰保存庫)。 在此情況下,來源 Azure 資源是服務提供者的磁碟加密集。

如果您對跨租用戶客戶自控金鑰與受控磁碟有任何問題,請傳送電子郵件至 crosstenantcmkvteam@service.microsoft.com

限制

  • 受控磁碟和客戶的 Key Vault 必須位於相同 Azure 區域,但可位於不同的訂用帳戶。
  • 此功能不支援 Ultra 磁碟或 Azure 進階 SSD v2 受控磁碟。
  • 由 21Vianet 或政府雲端操作的 Microsoft Azure 無法使用這項功能。

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

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

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

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

Screenshot showing a cross-tenant CMK with a federated identity.

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

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

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

服務提供者現在具有:

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

服務提供者會使用這三個參數,在 Tenant 1 中佈建 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 應用程式。
  • 相同的多租用戶應用程式可以用來存取任意數目之租用戶中的金鑰,例如 Tenant 2、Tenant 3、Tenant 4 等等。 在每個租用戶中,會建立應用程式的獨立執行個體,該執行個體具有相同的應用程式識別碼,但不同的物件識別碼。 因此,此應用程式的每個執行個體都會獨立獲得授權。 請考慮如何使用此功能的應用程式物件將應用程式分割給所有客戶。
  • 在罕見的情況下,服務提供者可能會根據其客戶使用單一應用程式物件,但這需要花費大量維護成本,才能大規模管理所有客戶的應用程式。
  • 在服務提供者租用戶中,無法自動進行發行者驗證 (機器翻譯)。

階段 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 (機器翻譯)

    服務提供者的客戶考量

    • 在客戶租用戶 Tenant 2 中,管理員可以設定原則以禁止非管理使用者安裝應用程式。 這些原則可防止非管理使用者建立服務主體。 如果已設定這類原則,則必須讓具有建立服務主體權限的使用者加入。
    • 使用 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

      Screen shot showing how to create a new multi-tenant application registration.

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

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

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

    2. 選取 + 建立

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

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

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

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

      Screen shot showing how to create a resource group and a user-assigned managed identity.

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

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

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

    2. 選取 [憑證和秘密]

    3. 選取 [同盟認證]

      Screen shot showing how to navigate to Certificate and secrets.

    4. 選取 [+ 新增認證]

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

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

      Screen shot showing how to select a managed identity.

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

      Screen shot showing how to add a credential.

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

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

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

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

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

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

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

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

    客戶建立金鑰保存庫

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

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

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

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

    4. 選取區域和定價層。

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

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

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

      Screen shot showing how to create a key vault.

    記下可存取金鑰保存庫的金鑰保存庫名稱和 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 Key Vault 並執行必要的 Microsoft Entra 設定後,請部署設定為跨租用戶運作的磁碟加密集,並將其與金鑰保存庫中的金鑰建立關聯。 您可以使用 Azure 入口網站、Azure PowerShell 或 Azure CLI 執行此作業, 也可以使用 ARM 範本 (機器翻譯) 或 REST API (機器翻譯)。

    若要使用 Azure 入口網站,請登入網站並遵循下列步驟操作。

    1. 選取 [+ 建立資源],搜尋「磁碟加密集」,再依序選取 [建立] > [磁碟加密集]

    2. 在 [專案詳細資料] 下方選取要在其中建立磁碟加密集的訂用帳戶和資源群組。

    3. 在 [執行個體詳細資料] 下方,提供磁碟加密集的名稱。

      Screenshot showing how to enter the project and instance details to create a new disk encryption set.

    4. 選取要在建立磁碟加密集的區域

    5. 在 [加密類型]中,選取 [使用客戶自控金鑰進行待用加密]

    6. 在 [加密金鑰] 下方,選取 [從 URI 輸入金鑰] 選項按鈕,然後輸入客戶租使用者中建立之金鑰的金鑰 URI。

    7. 在 [使用者指派的身分識別] 下方,選擇 [選取身分識別]

    8. 選取您先前在 ISV 租用戶中建立的使用者指派受控識別,再選擇 [新增]

    9. 在 [多租用戶應用程式] 下方,選擇 [選取應用程式]

    10. 選取您先前在 ISV 租用戶中建立的多租用戶註冊應用程式,然後按一下 [選取]。

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

    使用 ARM 範本

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "desname": {
          "defaultValue": "<Enter ISV disk encryption set name>",
          "type": "String"
        },
        "region": {
          "defaultValue": "WestCentralUS",
          "type": "String"
        },
        "userassignedmicmk": {
          "defaultValue": "/subscriptions/<Enter ISV Subscription Id>/resourceGroups/<Enter ISV resource group name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<Enter ISV User Assigned Identity Name>",
          "type": "String"
        },
        "cmkfederatedclientId": {
          "defaultValue": "<Enter ISV Multi-Tenant App Id>",
          "type": "String"
        },
        "keyVaultURL": {
          "defaultValue": "<Enter Client Key URL>",
          "type": "String"
        },
        "encryptionType": {
          "defaultValue": "EncryptionAtRestWithCustomerKey",
          "type": "String"
        }
      },
      "variables": {},
      "resources": [
        {
          "type": "Microsoft.Compute/diskEncryptionSets",
          "apiVersion": "2021-12-01",
          "name": "[parameters('desname')]",
          "location": "[parameters('region')]",
          "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
              "[parameters('userassignedmicmk')]": {}
            }
          },
          "properties": {
            "activeKey": {
              "keyUrl": "[parameters('keyVaultURL')]"
            },
            "federatedClientId": "[parameters('cmkfederatedclientId')]",
            "encryptionType": "[parameters('encryptionType')]"
          }
        }
      ]
    }
    

    使用 REST API

    在 BODY 中使用持有人權杖做為授權標頭和應用程式/JSON 做為內容類型。 ([網路] 索引標籤,在入口網站上執行任何 ARM 要求時篩選至 management.azure。)

    PUT https://management.azure.com/subscriptions/<Enter ISV Subscription Id>/resourceGroups/<Enter ISV Resource Group Name>/providers/Microsoft.Compute/diskEncryptionSets/<Enter ISV Disk Encryption Set Name>?api-version=2021-12-01
    Authorization: Bearer ...
    Content-Type: application/json
    
    {
      "name": "<Enter ISV disk encryption set name>",
      "id": "/subscriptions/<Enter ISV Subscription Id>/resourceGroups/<Enter ISV resource group name>/providers/Microsoft.Compute/diskEncryptionSets/<Enter ISV disk encryption set name>/",
      "type": "Microsoft.Compute/diskEncryptionSets",
      "location": "westcentralus",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
    "/subscriptions/<Enter ISV Subscription Id>/resourceGroups/<Enter ISV resource group name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<Enter ISV User Assigned Identity Name>
    ": {}
        }
      },
      "properties": {
        "activeKey": {
          "keyUrl": "<Enter Client Key URL>"
        },
        "encryptionType": "EncryptionAtRestWithCustomerKey",
        "federatedClientId": "<Enter ISV Multi-Tenant App Id>"
      }
    }
    

    下一步

    請參閱: