你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用跨租户客户管理的密钥加密托管磁盘

本文介绍了构建一个解决方案,可以使用存储在不同 Microsoft Entra 租户中的 Azure Key Vault 使用客户管理的密钥对托管磁盘进行加密。 此配置适合多种方案,例如,Azure 支持部门为服务提供商提供支持,这些服务提供商希望向客户提供创建自己的加密密钥的功能,而来自服务提供商的租户的资源使用其客户租户的密钥进行加密。

跨租户 CMK 工作流中具有联合标识的磁盘加密集跨服务提供商/ISV 租户资源(磁盘加密集、托管标识和应用注册)和客户租户资源(企业应用、用户角色分配和密钥保管库)。 在这种情况下,源 Azure 资源是服务提供商的磁盘加密集。

如果对使用托管磁盘的跨租户客户托管密钥有疑问,请发送电子邮件至 crosstenantcmkvteam@service.microsoft.com

限制

  • 托管磁盘和客户的密钥保管库必须位于同一 Azure 区域中,但可以位于不同的订阅中。
  • 此功能不支持超级磁盘或 Azure 高级 SSD v2 托管磁盘。
  • 在由世纪互联运营的 Microsoft Azure 云或政府云中,不可使用此功能。

关于跨租户客户管理的密钥

许多在 Azure 上生成软件即服务 (SaaS) 产品/服务的服务提供商都希望为客户提供管理他们自己的加密密钥的方案。 客户管理的密钥允许服务提供商使用加密密钥加密客户的数据,该密钥由服务提供商的客户管理,并且服务提供商无法访问该加密密钥。 在 Azure 中,服务提供商的客户可以使用 Azure Key Vault 管理自己的 Microsoft Entra 租户和订阅中的加密密钥。

由服务提供商所有且驻留在服务提供商租户中的 Azure 平台服务和资源需要访问客户租户中的密钥来执行加密/解密操作。

下图显示了跨服务提供商及其客户的跨租户 CMK 工作流中具有联合标识的静态数据加密。

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

上面的示例中存在两个 Microsoft Entra 租户:一个独立服务提供商的租户(租户 1)和一个客户的租户(租户 2)。 租户 1 托管 Azure 平台服务,租户 2 托管客户的密钥保管库。

多租户应用程序注册由服务提供商在租户 1 中创建联合标识凭据使用用户分配的托管标识在此应用程序上进行创建。 然后,与客户共享应用的名称和应用程序 ID。

具有适当权限的用户可在客户租户即租户 2 中安装服务提供商的应用程序。 然后,用户向已安装应用程序相关的服务主体授予对客户密钥保管库的访问权限。 客户还会将加密密钥或客户管理的密钥存储在密钥保管库中。 客户与服务提供商共享密钥位置(密钥的 URL)。

服务提供商现在拥有:

  • 客户租户中安装的多租户应用程序的应用程序 ID,该应用程序已获得对客户管理的密钥的访问权限。
  • 配置为多租户应用程序凭据的托管标识。
  • 密钥在客户的密钥保管库中的位置。

通过这三个参数,服务提供商可在租户 1 中预配可使用租户 2 中客户管理的密钥进行加密的 Azure 资源。

让我们将上述端到端解决方案划分为三个阶段:

  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 的应用程序注册的应用程序 ID(客户端 ID) 应用程序开发人员
2. 创建用户分配的托管标识(用作联合标识凭据)。
Azure 门户 / Azure CLI / Azure PowerShell/ Azure 资源管理器模板
托管标识参与者
3. 将用户分配的托管标识配置为应用程序上的联合标识凭据,以便它可以模拟应用程序的标识。
图形 API 参考/ Azure 门户/ Azure CLI/ Azure PowerShell
应用程序的所有者
4. 与客户共享应用程序名称和应用程序 ID,以便他们可以安装和授权应用程序。

服务提供商的注意事项

  • 不建议使用 Azure 资源管理器 (ARM) 模板创建 Microsoft Entra 应用程序。
  • 同一多租户应用程序可用于访问任意数量租户中的密钥,例如租户 2租户 3租户 4 等。 在每个租户中,将创建应用程序的独立实例,该实例具有相同的应用程序 ID,但对象 ID 不同。 因此,此应用程序的每个实例都独立获得授权。 请考虑如何使用用于此功能的应用程序对象将所有客户的应用程序分区。
    • 应用程序最多可以有 20 个联合标识凭据,这要求服务提供商在其客户之间共享联合标识。 有关联合标识设计注意事项和限制的详细信息,请参阅配置应用以信任外部标识提供者
  • 在极少数情况下,服务提供商可能会针对各个客户使用单个应用程序对象,但这需要大量维护成本来大规模地管理所有客户的应用程序。
  • 在服务提供商租户中,无法自动执行发布服务器验证

阶段 2 - 客户授权访问密钥保管库

步骤 说明 最低特权 Azure RBAC 角色 最低特权 Microsoft Entra 角色
1.
  • 建议:发送用户以登录到应用。 如果用户可以登录,则应用的服务主体存在于其租户中。
  • 使用 Microsoft GraphMicrosoft Graph PowerShellAzure PowerShellAzure CLI 创建服务主体。
  • 构造管理员同意 URL,并授予租户范围的同意,以使用应用程序 ID 创建服务主体。
  • 有权安装应用程序的用户
    2. 创建 Azure Key Vault 和用作客户管理的密钥的密钥。 必须为用户分配密钥保管库参与者角色才能创建密钥保管库

    必须为用户分配密钥保管库加密管理人员角色才能向密钥保管库添加密钥
    3. 通过分配密钥保管库加密服务加密用户角色,为经同意的应用程序标识授予对 Azure 密钥保管库的访问权限 若要将“密钥保管库加密服务加密用户”角色分配给应用程序,必须已获得用户访问管理员角色。
    4. 将密钥保管库 URL 和密钥名称复制到 SaaS 产品/服务的客户管理的密钥配置中。

    注意

    要授权访问托管 HSM 以使用 CMK 进行加密,请参阅此处的存储帐户示例。 有关使用托管 HSM 管理密钥的详细信息,请参阅使用 Azure CLI 管理托管 HSM

    服务提供商客户的注意事项

    • 在客户租户即租户 2 中,管理员可以设置策略来阻止非管理员用户安装应用程序。 这些策略可以防止非管理员用户创建服务主体。 如果配置了此类策略,则需要涉及有权创建服务主体的用户。
    • 可以使用 Azure RBAC 或访问策略来授权访问 Azure 密钥保管库。 授予对密钥保管库的访问权限时,请确保使用针对密钥保管库的活动机制。
    • Microsoft Entra 应用程序注册具有应用程序 ID(客户端 ID)。 在租户中安装应用程序时,将创建服务主体。 服务主体与应用注册共享相同的应用程序 ID,但会生成自己的对象 ID。 授权应用程序访问资源时,可能需要使用服务主体 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 应用程序注册,也可以从现有多租户应用程序注册开始。 如果从现有应用程序注册开始,请记下应用程序的应用程序 ID(客户端 ID)。

    创建新的注册:

    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.

    服务提供商与客户共享应用程序 ID

    查找多租户应用程序的的应用程序 ID(客户端 ID),并将其与客户共享。

    客户向服务提供商的应用授予对密钥保管库中的密钥的访问权限

    以下步骤由客户在客户的租户 Tenant2 中执行。 客户可以使用 Azure 门户、Azure PowerShell 或 Azure CLI。

    执行这些步骤的用户必须是具有特权角色(例如应用程序管理员云应用程序管理员全局管理员)的管理员。

    登录到 Azure 门户并执行以下步骤。

    客户在客户租户中安装服务提供商应用程序

    若要在客户的租户中安装服务提供商的已注册应用程序,请从已注册的应用创建具有应用程序 ID 的服务主体。 可以通过以下任一方式创建服务主体:

    客户创建密钥保管库

    若要创建密钥保管库,必须为用户帐户分配“密钥保管库参与者”角色或其他允许创建密钥保管库的角色。

    1. 在 Azure 门户菜单或主页中,选择“+ 创建资源”。 在“搜索”框中输入“密钥保管库”。 从结果列表中选择“密钥保管库”。 在“密钥保管库”页上,选择“创建”。

    2. 在“基本信息”选项卡中选择一个订阅。 在“资源组”下选择“新建”,然后输入资源组名称。

    3. 为“密钥保管库”输入唯一的名称。

    4. 选择区域和定价层。

    5. 为新的密钥保管库启用清除保护。

    6. 在“访问策略”选项卡上,为“权限模型”选择“Azure 基于角色的访问控制”。

    7. 选择“查看 + 创建”,然后选择“创建” 。

      Screen shot showing how to create a key vault.

    记下密钥保管库名称和 URI。访问密钥保管库的应用程序必须使用此 URI。

    有关详细信息,请参阅快速入门 - 使用 Azure 门户创建 Azure 密钥保管库

    客户将“密钥保管库加密管理人员”角色分配给用户帐户

    此步骤确保你可以创建加密密钥。

    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

    在正文中使用持有者令牌作为授权标头,并将 application/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>"
      }
    }
    

    后续步骤

    另请参阅: