使用客户管理的密钥加密应用程序配置数据

Azure 应用程序配置对敏感信息进行静态加密。 通过使用客户管理的密钥,可以管理加密密钥,从而提供增强的数据保护。 使用托管密钥加密时,将使用用户提供的 Azure Key Vault 密钥对应用程序配置中的所有敏感信息进行加密。 这样就可以根据需要轮换加密密钥。 还可以通过撤消应用程序配置实例对密钥的访问权限,来撤消 Azure 应用程序配置对敏感信息的访问权限。

概述

Azure 应用程序配置使用 Microsoft 提供的 256 位 AES 加密密钥对静态敏感信息进行加密。 每个应用程序配置实例都有其自己的加密密钥,该密钥由服务管理并用于加密敏感信息。 敏感信息包括在键值对中找到的值。 启用客户管理的密钥功能后,应用程序配置将使用分配给应用程序配置实例的托管标识通过 Microsoft Entra ID 进行身份验证。 然后,托管标识调用 Azure Key Vault 并包装应用程序配置实例的加密密钥。 然后存储已包装的加密密钥,并在应用程序配置中将已解包的加密密钥缓存一小时。 应用程序配置每小时会刷新应用程序配置实例的加密密钥的解包版本。 此过程确保在正常操作条件下的可用性。

重要

如果分配给应用程序配置实例的标识不再有权解包实例的加密密钥,或者如果永久删除了托管密钥,则将无法再对存储在应用程序配置实例中的敏感信息进行解密。 通过使用 Azure Key Vault 的软删除功能,可降低意外删除加密密钥的概率。

当用户在其 Azure 应用程序配置实例上启用客户管理的密钥功能时,他们将控制服务访问其敏感信息的能力。 托管密钥用作根加密密钥。 用户可以通过更改其密钥保管库访问策略来撤销其应用程序配置实例对其托管密钥的访问。 撤消此访问权限时,应用程序配置将在一小时内失去解密用户数据的能力。 此时,应用程序配置实例将禁止所有访问尝试。 可通过再次向服务授予对托管密钥的访问权限来从这种情况中恢复。 在一小时内,应用程序配置将能够对用户数据进行解密,并在正常情况下运行。

注意

所有 Azure 应用程序配置数据都可在独立备份中存储最多 24 小时。 这包括已解包的加密密钥。 此数据不能立即供服务或服务团队使用。 发生紧急还原时,Azure 应用程序配置将再次从托管密钥数据中撤销自身。

要求

若要成功启用 Azure 应用程序配置的客户管理的密钥功能,需要以下组件:

  • 标准层或高级层 Azure 应用配置实例。
  • 已启用软删除和清除保护功能的 Azure Key Vault。
  • Key Vault 中的 RSA 或 RSA-HSM 密钥。
    • 此密钥不能过期,必须启用,并且必须同时启用包装和解包功能。

配置这些资源后,请使用以下步骤,以便 Azure 应用程序配置可以使用 Key Vault 密钥:

  1. 将托管标识分配到 Azure 应用程序配置实例。
  2. 向标识授予权限,以便能够访问密钥保管库密钥。
    • 对于已启用 Azure RBAC 的密钥保管库,请向标识分配目标密钥保管库上的 Key Vault Crypto Service Encryption User 角色。
    • 对于使用访问策略授权的密钥保管库,请向标识授予目标密钥保管库访问策略中的 GETWRAPUNWRAP 权限。

为 Azure 应用程序配置存储启用客户管理的密钥加密

  1. 在标准或高级层中创建应用配置存储(如果没有)。

  2. 使用 Azure CLI 创建一个启用了清除保护的 Azure 密钥保管库。 默认启用软删除。 vault-nameresource-group-name 均由用户提供,并且必须是唯一的。 在这些示例中,我们使用 contoso-vaultcontoso-resource-group

    az keyvault create --name contoso-vault --resource-group contoso-resource-group --enable-purge-protection
    
  3. 创建 Key Vault 密钥。 为此密钥提供唯一的 key-name,并替换在第 2 步中创建的密钥保管库的名称 (contoso-vault)。 指定你首选 RSA 还是 RSA-HSM 加密(RSA-HSM 仅在高级层中可用)。

    az keyvault key create --name key-name --kty {RSA or RSA-HSM} --vault-name contoso-vault
    

    此命令的输出显示生成的密钥的密钥 ID (kid)。 请记录密钥 ID 以便在本练习的后面使用。 密钥 ID 的格式为:https://{my key vault}.vault.azure.cn/keys/{key-name}/{key-version}。 密钥 ID 包含三个重要组件:

    1. 密钥保管库 URI:https://{my key vault}.vault.azure.cn
    2. 密钥保管库密钥名称:{key-name}
    3. 密钥保管库密钥版本:{key-version}
  4. 使用 Azure CLI 创建系统分配的托管标识,替换前面步骤中使用的应用程序配置实例和资源组的名称。 托管标识将用于访问托管密钥。 我们使用 contoso-app-config 来说明应用程序配置实例的名称:

    az appconfig identity assign --name contoso-app-config --resource-group contoso-resource-group --identities [system]
    

    此命令的输出包括系统分配的标识的主体 ID ("principalId") 和租户 ID ("tenantId")。 这些 ID 将用于向标识授予对托管密钥的访问权限。

    {
        "principalId": {Principal Id},
        "tenantId": {Tenant Id},
        "type": "SystemAssigned",
        "userAssignedIdentities": null
    }
    
  5. Azure 应用程序配置实例的托管标识需要访问密钥才能执行密钥验证、加密和解密。 它需要访问的特定操作集包括:密钥的 GETWRAPUNWRAP。 可以通过为已启用 Azure RBAC 的密钥保管库分配 Key Vault Crypto Service Encryption User 角色来授予这些权限。 对于使用访问策略授权的密钥保管库,请为上述密钥权限设置策略。 授予访问权限需要应用程序配置实例的托管标识的主体 ID。 将下面显示为 contoso-principalId 的值替换为在上一步中获取的主体 ID。 使用命令行向托管密钥授予权限:

    对于启用了 Azure RBAC 的密钥保管库,请使用以下命令。

    az role assignment create --assignee contoso-principalId --role "Key Vault Crypto Service Encryption User" --scope key-vault-resource-id
    
  6. 现在 Azure 应用程序配置实例可以访问托管密钥了,因此我们可以使用 Azure CLI 在服务中启用客户管理的密钥功能。 请记住在密钥创建步骤的过程中记录的以下属性:key name key vault URI

    az appconfig update -g contoso-resource-group -n contoso-app-config --encryption-key-name key-name --encryption-key-version key-version --encryption-key-vault key-vault-Uri
    

现在,Azure 应用程序配置实例已配置为使用存储在 Azure Key Vault 中的客户管理的密钥。

后续步骤

本文介绍了如何配置 Azure 应用程序配置实例,令其使用客户管理的密钥进行加密。 若要详细了解如何将应用服务与 Azure 托管标识集成,请继续执行下一步。