你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure Key Vault,为 Azure Cosmos DB 帐户配置跨租户客户管理的密钥
适用对象: NoSQL MongoDB Cassandra Gremlin 表
存储在 Azure Cosmos DB 帐户中的数据会使用由 Microsoft 管理的密钥(服务管理的密钥)自动进行无缝加密。 但可根据需要使用自己管理的密钥来添加另一个加密层。 这些密钥称为客户管理的密钥(或 CMK)。 客户管理的密钥存储在 Azure 密钥保管库实例中。
本文介绍如何在创建 Azure Cosmos DB 帐户时使用客户管理的密钥配置加密。 在此跨租户方案示例中,Azure Cosmos DB 帐户驻留在由称为服务商的独立软件供应商 (ISV) 管理的租户中。 用于加密 Azure Cosmos DB 帐户的密钥驻留在密钥保管库中,此密钥保管库位于客户管理的不同租户中。
关于跨租户客户管理的密钥
许多在 Azure 上生成软件即服务 (SaaS) 产品/服务的服务提供商都希望为客户提供管理他们自己的加密密钥的方案。 客户管理的密钥允许服务提供商使用加密密钥加密客户的数据,该密钥由服务提供商的客户管理,并且服务提供商无法访问该加密密钥。 在 Azure 中,服务提供商的客户可以使用 Azure Key Vault 管理自己的 Microsoft Entra 租户和订阅中的加密密钥。
由服务提供商所有且驻留在服务提供商租户中的 Azure 平台服务和资源需要访问客户租户中的密钥来执行加密/解密操作。
下图显示了跨服务提供商及其客户的跨租户 CMK 工作流中具有联合标识的静态数据加密。
上面的示例中存在两个 Microsoft Entra 租户:一个独立服务提供商的租户(租户 1)和一个客户的租户(租户 2)。 租户 1 托管 Azure 平台服务,租户 2 托管客户的密钥保管库。
多租户应用程序注册由服务提供商在租户 1 中创建。 联合标识凭据使用用户分配的托管标识在此应用程序上进行创建。 然后,与客户共享应用的名称和应用程序 ID。
具有适当权限的用户可在客户租户即租户 2 中安装服务提供商的应用程序。 然后,用户向已安装应用程序相关的服务主体授予对客户密钥保管库的访问权限。 客户还会将加密密钥或客户管理的密钥存储在密钥保管库中。 客户与服务提供商共享密钥位置(密钥的 URL)。
服务提供商现在拥有:
- 客户租户中安装的多租户应用程序的应用程序 ID,该应用程序已获得对客户管理的密钥的访问权限。
- 配置为多租户应用程序凭据的托管标识。
- 密钥在客户的密钥保管库中的位置。
通过这三个参数,服务提供商可在租户 1 中预配可使用租户 2 中客户管理的密钥进行加密的 Azure 资源。
让我们将上述端到端解决方案划分为三个阶段:
- 服务提供商配置标识。
- 客户允许服务提供商的多租户应用访问 Azure Key Vault 中的加密密钥。
- 服务提供商使用 CMK 对 Azure 资源中的数据进行加密。
对于大多数服务提供商应用程序来说,阶段 1 中的操作将是一次性设置。 阶段 2 和 3 中的操作将对每个客户重复。
阶段 1 - 服务提供商配置 Microsoft Entra 应用程序
步骤 | 说明 | Azure RBAC 中的最低权限角色 | Microsoft Entra RBAC 中的最低角色 |
---|---|---|---|
1. | 创建新的多租户 Microsoft Entra 应用程序注册或从现有应用程序注册开始。 记下使用 Azure 门户、Microsoft Graph API、Azure PowerShell 或 Azure 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. | 无 | 有权安装应用程序的用户 | |
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。 授权应用程序访问资源时,可能需要使用服务主体
Name
或ObjectID
属性。
阶段 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)。
创建新的注册:
在搜索框中搜索“Microsoft Entra ID”。 找到并选择“Microsoft Entra ID”扩展。
从左窗格中选择“管理”>“应用注册”。
选择“+ 新建注册”。
提供应用程序注册的名称,并选择“任何组织目录中的帐户(任何 Microsoft Entra 目录 - 多租户)”。
选择“注册”。
记下应用程序的 ApplicationId/ClientId。
服务提供商创建用户分配的托管标识
创建用户分配的托管标识,以用作联合标识凭据。
在搜索框中搜索“托管标识”。 找到并选择“托管标识”扩展。
选择“+ 新建”。
提供托管标识的资源组、区域和名称。
选择“查看 + 创建”。
成功部署时,请记下“属性”下的用户分配的托管标识的 Azure ResourceId。 例如:
/subscriptions/tttttttt-0000-tttt-0000-tttt0000tttt/resourcegroups/XTCMKDemo/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ConsotoCMKDemoUA
服务提供商将用户分配的托管标识配置为应用程序上的联合凭据
将用户分配的托管标识配置为应用程序上的联合标识凭据,以便它可以模拟应用程序的标识。
服务提供商与客户共享应用程序 ID
查找多租户应用程序的的应用程序 ID(客户端 ID),并将其与客户共享。
客户向服务提供商的应用授予对密钥保管库中的密钥的访问权限
以下步骤由客户在客户的租户 Tenant2 中执行。 客户可以使用 Azure 门户、Azure PowerShell 或 Azure CLI。
执行这些步骤的用户必须是具有特权角色(例如应用程序管理员、云应用程序管理员或全局管理员)的管理员。
登录到 Azure 门户并执行以下步骤。
客户在客户租户中安装服务提供商应用程序
若要在客户的租户中安装服务提供商的已注册应用程序,请从已注册的应用创建具有应用程序 ID 的服务主体。 可以通过以下任一方式创建服务主体:
- 使用 Microsoft Graph、Microsoft Graph PowerShell、Azure PowerShell或 Azure CLI 手动创建服务主体。
- 构造管理员同意 URL,并授予租户范围的同意,以创建服务主体。 需要向他们提供 AppId。
客户创建密钥保管库
若要创建密钥保管库,必须为用户帐户分配“密钥保管库参与者”角色或其他允许创建密钥保管库的角色。
在 Azure 门户菜单或主页中,选择“+ 创建资源”。 在“搜索”框中输入“密钥保管库”。 从结果列表中选择“密钥保管库”。 在“密钥保管库”页上,选择“创建”。
在“基本信息”选项卡中选择一个订阅。 在“资源组”下选择“新建”,然后输入资源组名称。
为“密钥保管库”输入唯一的名称。
选择区域和定价层。
为新的密钥保管库启用清除保护。
在“访问策略”选项卡上,为“权限模型”选择“Azure 基于角色的访问控制”。
选择“查看 + 创建”,然后选择“创建” 。
记下密钥保管库名称和 URI。访问密钥保管库的应用程序必须使用此 URI。
有关详细信息,请参阅快速入门 - 使用 Azure 门户创建 Azure 密钥保管库。
客户将“密钥保管库加密管理人员”角色分配给用户帐户
此步骤确保你可以创建加密密钥。
- 导航到密钥保管库,然后从左窗格中选择“访问控制(IAM)”。
- 在“授予对此资源的访问权限”下选择“添加角色分配”。
- 搜索并选择“密钥保管库加密管理人员”。
- 在“成员”下,选择“用户、组或服务主体”。
- 选择“成员”并搜索用户帐户。
- 选择“查看 + 分配”。
客户创建加密密钥
若要创建加密密钥,必须为用户帐户分配“密钥保管库加密管理人员”角色或其他允许创建密钥的角色。
- 在密钥保管库属性页中,选择“密钥”。
- 选择“生成/导入”。
- 在“创建密钥”屏幕上,指定密钥的名称。 让其他值保留默认设置。
- 选择“创建”。
- 复制密钥 URI。
客户向服务提供商应用程序授予对密钥保管库的访问权限
将 Azure RBAC 角色“密钥保管库加密服务加密用户”分配给服务提供商的已注册应用程序,以便它可以访问密钥保管库。
- 导航到密钥保管库,然后从左窗格中选择“访问控制(IAM)”。
- 在“授予对此资源的访问权限”下选择“添加角色分配”。
- 搜索并选择“密钥保管库加密服务加密用户”。
- 在“成员”下,选择“用户、组或服务主体”。
- 选择“成员”,然后从服务提供商处搜索已安装的应用程序的应用程序名称。
- 选择“查看 + 分配”。
现在可以使用密钥保管库 URI 和密钥配置客户管理的密钥。
创建使用来自不同租户的密钥加密的新 Azure Cosmos DB 帐户
至此,你已在服务提供商的租户上配置多租户应用程序。 你还在客户的租户上安装了应用程序,并在客户的租户上配置了密钥保管库和密钥。 接下来,可以在服务提供商的租户上创建 Azure Cosmos DB 帐户,并使用来自客户租户的密钥配置客户管理的密钥。
使用客户管理的密钥创建 Azure Cosmos DB 帐户时,我们必须确保它有权访问客户使用的密钥。 在单租户方案中,授予对 Azure Cosmos DB 主体的直接密钥保管库访问权限或使用特定的托管标识。 在跨租户方案中,我们不再依赖对密钥保管库的直接访问权限,因为它位于客户管理的另一个租户中。 因为存在该约束,所以我们在前面部分中创建跨租户应用程序并在应用程序内注册托管标识,以便授予其访问客户的密钥保管库权限。 创建跨租户 CMK Azure Cosmos DB 帐户时,我们将结合使用此托管标识以及跨租户应用程序 ID。 有关详细信息,请参阅本文的阶段 3 - 服务提供商使用客户管理的密钥加密 Azure 资源中的数据部分。
每当密钥保管库中有新版本的密钥时,它都会在 Azure Cosmos DB 帐户上自动更新。
使用 Azure 资源管理器 JSON 模板
使用以下特定参数部署 ARM 模板:
注意
如果要在 Azure 资源管理器模板之一中重新创建此示例,请使用 2022-05-15
的 apiVersion
。
参数 | 说明 | 示例值 |
---|---|---|
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 |
托管标识的资源 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 |
以下是配置了三个参数的模板段示例:
{
"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 帐户配置客户管理的密钥