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

为现有存储帐户配置跨租户客户管理的密钥

Azure 存储对静态存储帐户中的所有数据进行加密。 默认情况下,数据使用 Microsoft 管理的密钥进行加密。 为了更进一步控制加密密钥,你可以管理自己的密钥。 客户管理的密钥必须存储在 Azure Key Vault 或 Azure Key Vault 托管硬件安全模型 (HSM) 中。

本文介绍如何为现有存储帐户配置使用客户管理的密钥的加密。 在跨租户场景中,存储帐户驻留在 ISV 管理的租户中,而用于加密该存储帐户的密钥驻留在客户管理的租户中的密钥保管库中。

若要了解如何为新存储帐户配置客户管理的密钥,请参阅为新存储帐户配置跨租户客户管理的密钥

注意

Azure Key Vault 和 Azure Key Vault 托管 HSM 支持使用相同的 API 和管理接口来配置客户管理的密钥。 Azure Key Vault 支持的任何操作也受 Azure Key Vault 托管 HSM 支持。

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

许多在 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 和密钥配置客户管理的密钥。

    为现有帐户配置客户管理的密钥

    到目前为止,你已在 ISV 的租户上配置了多租户应用程序,在客户的租户上安装了应用程序,并在客户的租户上配置了密钥保管库和密钥。 接下来,可以使用来自客户租户的密钥在现有存储帐户上配置客户管理的密钥。

    本文中的示例演示如何使用用户分配的托管标识授权访问密钥保管库,从而在现有存储帐户上配置客户管理的密钥。 还可以使用系统分配的托管标识在现有存储帐户上配置客户管理的密钥。 在任何一种情况下,托管标识都必须具有访问密钥保管库的相应权限。 有关详细信息,请参阅向 Azure Key Vault 进行身份验证

    使用客户管理的密钥为现有存储帐户配置加密时,只要关联的密钥保管库中有新版本可用,就可以选择自动更新用于 Azure 存储加密的密钥版本。 为此,请省略密钥 URI 中的密钥版本。 也可显式指定在手动更新密钥版本之前用于加密的密钥版本。 在密钥 URI 上包含密钥版本将配置客户管理的密钥,以便手动更新密钥版本。

    重要

    若要轮换密钥,请在 Azure Key Vault 中创建密钥的新版本。 Azure 存储不处理密钥轮换,因此需要管理密钥保管库中的密钥轮换。 可以在 Azure Key Vault 中配置密钥自动轮换,也可以手动轮换密钥。

    Azure 存储每天只会在密钥保管库中检查一次是否存在密钥的新版本。 在 Azure Key Vault 中轮换密钥时,请务必等待 24 小时,然后再禁用旧版本。

    若要在 Azure 门户中为现有存储帐户配置跨租户客户管理的密钥,请执行以下步骤:

    1. 导航到存储帐户。

    2. 在“安全 + 网络”下,选择“加密”。 默认情况下,密钥管理设置为“Microsoft 管理的密钥”,如下图所示。

      Screenshot showing encryption options in Azure portal.

    3. 选择“客户管理的密钥”选项。

    4. 选择“从 Key Vault 中选择”选项。

    5. 选择“输入密钥 URI”,并指定密钥 URI。 如果希望 Azure 存储自动检查是否存在新的密钥版本并更新,请省略 URI 中的密钥版本。

    6. 选择包含密钥保管库和密钥的订阅。

    7. 在“标识类型”字段中,选择“用户分配”,然后使用之前创建的联合标识凭据指定托管标识。

    8. 展开“高级”部分,然后选择之前在 ISV 租户中创建的多租户注册的应用程序。

      Screenshot showing how to configure cross-tenant customer-managed keys for an existing storage account in Azure portal.

    9. 保存更改。

    在客户租户中指定密钥保管库中的密钥后,Azure 门户会指示客户管理的密钥是用该密钥配置的。 它还指示密钥版本的自动更新已启用,并显示当前用于加密的密钥版本。 门户还显示用于授权访问密钥保管库的托管标识的类型、托管标识的主体 ID 和多租户应用程序的应用程序 ID。

    Screenshot showing cross-tenant customer-managed key configuration.

    更改密钥

    你可以在任何时候更改用于 Azure 存储加密的密钥。

    注意

    更改密钥或密钥版本时,根加密密钥的保护会更改,但是 Azure 存储帐户中的数据将始终保持加密状态。 无需执行其他操作即可确保数据受到保护。 更改密钥或轮换密钥版本不会影响性能。 更改密钥或轮换密钥版本不会造成关联性故障时间。

    若要使用 Azure 门户更改密钥,请执行以下步骤:

    1. 导航到你的存储帐户,并显示“加密”设置。
    2. 选择密钥保管库并选择一个新密钥。
    3. 保存更改。

    撤销对使用客户管理的密钥的存储帐户的访问权限

    若要暂时撤销对使用客户管理的密钥的存储帐户的访问权限,请禁用密钥保管库中当前使用的密钥。 禁用和重新启用密钥不会对性能造成影响或导致停机。

    在禁用密钥之后,客户端将无法调用在 Blob 或其元数据中进行读取或写入的操作。 有关哪些操作将会失败的信息,请参阅撤销对使用客户管理的密钥的存储帐户的访问权限

    注意

    禁用密钥保管库中的密钥时,Azure 存储帐户中的数据将保持加密状态,但在重新启用密钥之前,这些数据将无法访问。

    若要使用 Azure 门户禁用客户管理的密钥,请执行以下步骤:

    1. 导航到包含该密钥的密钥保管库。

    2. 选择“对象”下的“密钥”。

    3. 右键单击密钥并选择“禁用”。

      Screenshot showing how to disable a customer-managed key in the key vault.

    切换回 Microsoft 托管密钥

    可以使用 Azure 门户、PowerShell 或 Azure CLI 随时从客户管理的密钥切换回 Microsoft 管理的密钥。

    若要在 Azure 门户中从客户管理的密钥切换回 Microsoft 管理的密钥,请执行以下步骤:

    1. 导航到存储帐户。

    2. 在“安全 + 网络”下,选择“加密”。

    3. 将“加密类型”更改为“Microsoft 管理的密钥”。

      Screenshot showing how to switch to Microsoft-managed keys for a storage account.

    另请参阅