通过 Azure Key Vault 为 Azure Cosmos DB 帐户配置客户管理的密钥

适用对象: NoSQL MongoDB Cassandra Gremlin

存储在 Azure Cosmos DB 帐户中的数据将使用 Azure 管理的密钥(服务托管密钥)自动无缝地进行加密。 或者,你可以选择使用你管理的密钥(客户管理的密钥或 CMK)添加另一层加密。

Diagram of the layers of encryption around customer data.

必须将客户管理的密钥存储在 Azure Key Vault 中,并为每个使用客户管理的密钥启用的 Azure Cosmos DB 帐户提供一个密钥。 此密钥用于加密存储在该帐户中的所有数据。

注意

客户管理的密钥目前仅适用于新的 Azure Cosmos DB 帐户。 应在创建帐户期间配置这些密钥。 在现有帐户上启用客户管理的密钥的功能在预览版中提供。 有关更多详细信息,请参阅此处的链接

警告

如果帐户使用客户管理的密钥,以下字段名称会保留在该帐户中的 Cassandra API 表上:

  • id
  • ttl
  • _ts
  • _etag
  • _rid
  • _self
  • _attachments
  • _epk

如果未启用客户管理的密钥,则仅保留以 __sys_ 开头的字段名称。

先决条件

注册到 Azure Cosmos DB 资源提供程序

如果 Microsoft.DocumentDB 资源提供程序尚未注册,则应首先注册此提供程序。

  1. 登录到 Azure 门户,转到 Azure 订阅,并在 “设置” 选项卡下选择 “资源提供程序”

    Screenshot of the Resource providers option in the resource navigation menu.

  2. 搜索“Microsoft DocumentDB”资源提供程序。 确认该资源提供程序是否标记为已注册。 如果不是,请选择该资源提供程序,然后选择“注册”:

    Screenshot of the Register option for the Microsoft.DocumentDB resource provider.

配置 Azure Key Vault 实例

重要

Azure 密钥保管库实例必须可通过公共网络访问进行访问,或者允许受信任的 Azure 服务绕过其防火墙。 只能通过专用终结点访问的实例不能用于托管客户管理的密钥。

将客户管理的密钥与 Azure Cosmos DB 结合使用时,需要在计划用于托管加密密钥的 Azure Key Vault 实例上设置两个属性: “软删除”“清除保护”

  1. 如果创建新的 Azure Key Vault 实例,请在创建过程中启用以下属性:

    Screenshot of Azure Key Vault options including soft delete and purge protection.

  2. 如果使用的是现有 Azure Key Vault 实例,则可以通过查看 Azure 门户中的“属性”部分来验证是否已启用这些属性。 如果未启用任一属性,请参阅以下文章中的“启用软删除”和“启用清除保护”部分:

选择首选的安全模型

启用清除保护和软删除后,可以在“访问策略”选项卡上选择要使用的首选权限模型。 默认设置访问策略,但也支持 Azure 基于角色的访问控制。

必须提供必要的权限才能允许 Cosmos DB 使用加密密钥。 根据 Azure 密钥保管库使用的是访问策略还是基于角色的访问控制,此步骤也有所不同。

注意

请务必注意,一次只能有一个安全模型处于活动状态,因此如果 Azure Key Vault 设置为使用访问策略,则无需植入基于角色的访问控制,反之亦然)

添加访问策略

在此变体中,使用 Azure Cosmos DB 主体创建具有相应权限的访问策略。

  1. 在 Azure 门户中,转到你打算用来托管加密密钥的 Azure Key Vault 实例。 在左侧菜单中选择“访问策略”:

    Screenshot of the Access policies option in the resource navigation menu.

  2. 选择“+ 添加访问策略”

  3. 在“密钥权限”下拉菜单中,选择“获取”、“解包密钥”和“包装密钥”权限:

    Screenshot of access policy permissions including Get, Unwrap key, and Wrap key.

  4. 在“选择主体”下,选择“未选择任何项”。

  5. 搜索“Azure Cosmos DB”主体并将其选中(为了便于查找,对于任何由世纪互联运营的 Azure 区域,还可以按应用程序 ID a232010e-820c-4083-83bb-3ace5fc29d0b 进行搜索)。

    提示

    这样便可在 Azure Key Vault 访问策略中注册 Azure Cosmos DB 第一方标识。 如果“Azure Cosmos DB”主体不在列表中,则可能需要重新注册“Microsoft.DocumentDB”资源提供程序。

  6. 选择底部的“选择”。

    Screenshot of the Select principal option on the Add access policy page.

  7. 选择“添加”以添加新的访问策略

  8. 在密钥保管库实例上选择“保存”,以保存所有更改。

添加基于角色的访问控制角色

  1. 在 Azure 门户中,转到你打算用来托管加密密钥的 Azure Key Vault 实例。 从左侧菜单中选择“访问控制 (IAM)”,然后选择“授予对此资源的访问权限”。

    Screenshot of the Access control option in the resource navigation menu.

    Screenshot of the Grant access to this resource option on the Access control page.

  2. 搜索“密钥保管库管理员角色”并将其分配给自己。 要完成此分配,首先要从列表中搜索角色名称,然后单击“成员”选项卡。进入选项卡后,从单选按钮中选择“用户、组或服务主体”选项,然后查找 Azure 帐户。 选择帐户后,可以分配角色。

    Screenshot of the Key vault administrator role in the search results.

    Screenshot of a role assignment on the Access control page.

  3. 然后,必须将必要的权限分配给 Cosmos DB 的主体。 因此,与上一个角色分配一样,请转到分配页,但这次查找“密钥保管库加密服务加密用户”角色,并在成员选项卡上查找 Cosmos DB 的主体。 如需找到主体,可以搜索并选择“Azure Cosmos DB”主体。

    Screenshot of the Azure Cosmos DB principal being assigned to a permission.

  4. 选择“查看 + 分配”,角色将分配给 Cosmos DB。

验证角色是否已正确设置

接下来,使用访问控制页确认已正确配置所有角色。

  1. 分配角色后,在“访问控制 IAM”页上选择“查看对此资源的访问权限”,以验证是否已正确设置所有内容。

    Screenshot of the View access to resource option on the Access control page.

  2. 在页面上,将范围设置为“此资源”,并验证你是否具有“密钥保管库管理员”角色,以及 Cosmos DB 主体具有“密钥保管库加密用户”角色。

    Screenshot of the scope adjustment option for a role assignment query.

在 Azure Key Vault 中生成密钥

在此处,使用 Azure 密钥保管库创建新密钥并检索唯一标识符。

  1. 在 Azure 门户中,转到你打算用来托管加密密钥的 Azure Key Vault 实例。 然后,从左侧菜单中选择“密钥”

    Screenshot of the Keys option in the resource navigation menu.

  2. 选择“生成/导入”,为新密钥提供名称,并选择一个 RSA 密钥大小。 建议至少使用 3072,以获得最佳安全性。 然后选择“创建”

    Screenshot of the dialog to create a new key.

    提示

    或者,可以使用 Azure CLI 使用以下方法生成密钥:

    az keyvault key create \
        --vault-name <name-of-key-vault> \
        --name <name-of-key>
    

    有关使用 Azure CLI 管理密钥保管库的详细信息,请参阅使用 Azure CLI 管理 Azure 密钥保管库

  3. 创建密钥后,选择新创建的密钥,然后选择其当前版本。

  4. 复制密钥的密钥标识符(最后一个正斜杠之后的部分除外):

    Screenshot of the key identifier field and the copy action.

创建新的 Azure Cosmos DB 帐户

使用 Azure 门户或 Azure CLI 创建新的 Azure Cosmos DB 帐户。

当你从 Azure 门户创建新的 Azure Cosmos DB 帐户时,请选择“加密”步骤中“客户管理的密钥”。 在“密钥 URI”字段中,粘贴从上一步复制的 Azure Key Vault 密钥的 URI/密钥标识符:

Screenshot of the Encryption page with a custom-managed key URI configured.

使用 Azure Key Vault 访问策略中的托管标识

此访问策略确保你的 Azure Cosmos DB 帐户可以访问你的加密密钥。 访问策略通过授予对特定 Microsoft Entra 标识的访问权限来实现。 支持两种类型的标识:

  • Azure Cosmos DB 的第一方标识,可用于授予对 Azure Cosmos DB 服务的访问权限。
  • Azure Cosmos DB 帐户的托管标识,可用于专门授予对帐户的访问权限。

不可用

将客户管理的密钥与连续备份配合使用

可以通过使用 Azure CLI 或 Azure 资源管理器模板来创建一个连续备份帐户。

目前,仅支持使用用户分配的托管标识来创建连续备份帐户。

创建帐户后,可以将标识更新为系统分配的托管标识。

或者,用户还可以先创建一个具有定期备份模式的系统标识,然后按照将 Azure Cosmos DB 帐户从定期备份模式迁移到连续备份模式中的说明将帐户迁移到连续备份模式

不可用

还原通过托管标识配置的连续帐户

用户分配的标识是还原请求中必需的,因为源帐户托管标识(用户分配的标识和系统分配的标识)无法自动传递到目标数据库帐户。

不可用

客户管理的密钥和双重加密

使用客户管理的密钥时,存储在 Azure Cosmos DB 帐户中的数据最终会加密两次:

  • 通过 Microsoft 托管密钥执行的默认加密一次。
  • 通过客户管理的密钥执行额外加密一次。

双重加密仅适用于主 Azure Cosmos DB 事务存储。 某些功能涉及将数据内部复制到不提供双重加密的第二层存储,即使使用客户管理的密钥也是如此。 这些功能包括:

密钥轮换

可以通过两种方式来轮换 Azure Cosmos DB 帐户使用的客户管理的密钥。

  • 创建当前在 Azure Key Vault 中使用的密钥的新版本:

    Screenshot of the New Version option in the Versions page of the Azure portal.

  • 通过更新帐户上的密钥 URI,将当前使用的密钥替换为其他密钥。 在 Azure 门户中转到你的 Azure Cosmos DB 帐户,然后在左侧菜单中选择“数据加密”:

    Screenshot of the Data Encryption option on the resource navigation menu.

    然后,将“密钥 URI”替换为要使用的新密钥,并选择“保存”:

    Screenshot of the Save option on the Key page.

    下面介绍如何在 PowerShell 中实现相同的结果:

    # Variable for resource group name
    $RESOURCE_GROUP_NAME = "<resource-group-name>"
    
    # Variable for account name
    $ACCOUNT_NAME = "<multiple-regionally-unique-account-name>"
    
    # Variable for new key URI in the key vault
    $NEW_KEY_VAULT_KEY_URI="https://<key-vault-name>.vault.azure.cn/keys/<new-key-name>"
    
    $parameters = @{
        ResourceGroupName = $RESOURCE_GROUP_NAME 
        Name = $ACCOUNT_NAME
        ResourceType = "Microsoft.DocumentDb/databaseAccounts"
    }
    $ACCOUNT = Get-AzResource @parameters
    
    $ACCOUNT.Properties.keyVaultKeyUri = $NEW_KEY_VAULT_KEY_URI
    
    $ACCOUNT | Set-AzResource -Force
    

可以在 Azure Key Vault 审核日志不再显示该密钥或密钥版本 Azure Cosmos DB 中的活动之后禁用以前的密钥或密钥版本。 在密钥轮换 24 小时后,不应在以前的密钥或密钥版本上进行更多活动。

错误处理。

如果 Azure Cosmos DB 中客户管理的密钥有任何错误,Azure Cosmos DB 会在响应中返回错误详细信息以及 HTTP 子状态代码。 可以使用 HTTP 子状态代码来调试问题的根本原因。 请参阅 Azure Cosmos DB 的 HTTP 状态代码一文,获取支持的 HTTP 子状态代码的列表。

常见问题

此处包含有关在 Azure Cosmos DB 中设置客户管理的密钥的常见问题。

启用客户管理的密钥是否需要支付更多费用?

否,启用此功能不收取任何费用。

客户管理的密钥如何影响容量计划?

数据库操作使用的请求单位有所增加,以反映在使用客户管理的密钥时执行数据加密和解密所需的额外处理。 额外的 RU 消耗可能会导致预配容量的利用率略高。 使用此表作为指导:

操作类型 请求单位增加
点读取(按 ID 获取项) 每个操作 + 5%
任何写入操作 每次操作 + 6% | 每个索引属性大约 + 0.06 RU
查询、读取更改源或冲突源 每个操作 + 15%

哪些数据是通过客户管理的密钥加密的?

Azure Cosmos DB 帐户中存储的所有数据都是通过客户管理的密钥加密的,以下元数据除外:

现有的 Azure Cosmos DB 帐户是否支持客户管理的密钥?

此功能目前仅适用于新帐户。

能否将客户管理的密钥与 Azure Cosmos DB 分析存储结合使用?

可以,Azure Synapse Link 仅支持使用 Azure Cosmos DB 帐户的托管标识配置客户管理的密钥。 在帐户上启用 Azure Synapse Link 之前,必须在 Azure Key Vault 访问策略中使用 Azure Cosmos DB 帐户的托管标识。 有关如何启用托管标识并在访问策略中使用它的操作指南,请参阅使用托管标识从 Azure Cosmos DB 访问 Azure Key Vault

是否有计划支持比帐户级别密钥更精细的粒度?

目前没有,但正在考虑容器级别的密钥。

如何判断是否在 Azure Cosmos DB 帐户上启用了客户管理的密钥?

在 Azure 门户中,转到 Azure Cosmos DB 帐户,并在左侧菜单中查看“数据加密”项;如果此项存在,则在帐户中启用了客户管理的密钥:

Screenshot of the Data encryption option in the resource navigation menu.

还可通过编程方式提取 Azure Cosmos DB 帐户的详细信息,并查找 keyVaultKeyUri 属性是否存在。

客户管理的密钥如何影响定期备份?

Azure Cosmos DB 将定期自动备份存储在帐户中的数据。 此操作可备份加密的数据。

若要成功还原定期备份,必须满足以下条件:

  • 需要备份时使用的加密密钥,并且 Azure Key Vault 中必须提供该密钥。 此条件要求不进行任何吊销,并且备份时使用的密钥版本仍处于启用状态。
  • 如果在访问策略中使用了系统分配的托管标识,请在恢复数据之前暂时授予对 Azure Cosmos DB 第一方标识的访问权限。 存在此要求是因为系统分配的托管标识是特定于某个帐户,并且不能在目标帐户中重复使用。 将数据完全还原到目标帐户后,可以设置所需的标识配置,并从 Key Vault 访问策略中删除第一方标识。

客户管理的密钥如何影响连续备份?

Azure Cosmos DB 提供了在帐户上配置连续备份的选项。 通过连续备份,你可以将数据还原到过去 30 天内的任何时间点。 若要在启用了客户管理的密钥的帐户上使用连续备份,必须在 Key Vault 访问策略中使用系统分配的或用户分配的托管标识。 使用连续备份的帐户当前不支持 Azure Cosmos DB 第一方标识。

已启用客户管理的密钥的帐户更新用户分配的标识所要执行的先决条件步骤。

  • 将用户分配的标识添加到 Cosmos DB 帐户,并在密钥保管库访问策略中授予权限。
  • 通过 Azure CLI 或 ARM 将用户分配的标识设为默认标识。
az cosmosdb update --resource-group MyResourceGroup --name MyAccountName --default-identity UserAssignedIdentity=/subscriptions/MySubscriptionId/resourcegroups/MyResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/MyUserAssignedIdentity

成功执行时间点还原需要满足以下条件:

  • 需要备份时使用的加密密钥,并且 Azure Key Vault 中必须提供该密钥。 此要求意味着不会进行任何吊销,并且备份时使用的密钥版本仍处于启用状态。
  • 必须确保在源帐户上最初使用的用户分配的托管标识仍在 Key Vault 访问策略中声明。

重要

如果在删除帐户之前撤销了加密密钥,帐户的备份可能会遗漏在吊销前 1 小时内写入的数据。

如何吊销加密密钥?

密钥吊销是通过禁用密钥的最新版本来完成的:

Screenshot of a disabled custom key version.

或者,若要从 Azure Key Vault 实例撤消所有密钥,可以删除授予 Azure Cosmos DB 主体的访问策略:

Screenshot of the Delete option for an access policy.

吊销客户管理的密钥后可执行哪些操作?

吊销加密密钥后,删除帐户是唯一可执行的操作。

将新的托管标识分配给还原的数据库帐户,以继续访问或恢复对数据库帐户的访问权限

用户分配的标识绑定到指定的 Cosmos DB 帐户,每当我们向帐户分配用户分配的标识时,ARM 都会将请求转发给托管服务标识以建立此连接。 目前,在 CMK + 用户分配的标识的还原(针对连续和定期备份还原)过程中,我们会将用户标识信息从源数据库帐户转移到目标数据库帐户,

因为标识元数据与源数据库帐户绑定,还原工作流不会将标识范围重新限定为目标数据库帐户。 这将导致还原的数据库帐户处于错误状态,并在删除源帐户和标识的续订时间过期后变得不可访问。

分配新托管标识的步骤:

  1. 创建新的、用户分配的托管标识。
  2. 授予 KeyVault 密钥对此标识的访问权限。
  3. 将此新标识分配给还原的数据库帐户。

后续步骤