Azure 应用程序配置对敏感信息进行静态加密。 使用客户管理的密钥可以更好地控制加密密钥,从而提供增强的数据保护。 使用托管密钥加密时,应用配置中的所有敏感信息都使用提供的 Azure Key Vault 密钥进行加密。 因此,可以按需轮换加密密钥。 还可以通过撤销应用商店对密钥的访问权限来撤销应用配置存储对敏感信息的访问权限。
概述
应用配置使用 Microsoft 提供的 256 位高级加密标准(AES)加密密钥来加密静态敏感信息。 每个应用配置存储区都有自己的加密密钥,由服务管理,用于加密敏感信息。 敏感信息包括在键值对中找到的值。
在应用配置中使用客户管理的密钥时,将发生以下事件:
- 应用程序配置使用分配给应用程序配置存储的托管标识,通过 Microsoft Entra ID 进行身份验证。
- 托管标识调用 Key Vault 并包装应用程序配置存储的加密密钥。
- 已封装的加密密钥已被存储。
- 未包装的加密密钥在应用配置中缓存一小时。
- 应用配置每小时都会刷新应用配置存储的加密密钥的未包装版本。
此过程确保在正常操作条件下的可用性。
重要
满足以下任一条件时,无法解密存储在应用配置存储中的敏感信息:
- 分配给应用配置存储的标识不再有权解封存储的加密密钥。
- 托管密钥将永久删除。
- 正在使用的托管密钥版本将过期。
可以使用 Key Vault 中的 软删除 功能来缓解意外删除加密密钥的可能性。 若要缓解基础托管密钥过期的可能性,可以在配置托管密钥加密并在 Key Vault 中设置自动密钥轮换时省略密钥版本。 有关详细信息,请参阅本文后面的 密钥轮换。
要求
若要成功为应用配置启用客户管理的密钥功能,需要以下组件。 本文介绍如何设置这些组件。
- 标准层或高级层应用配置存储。
- 已启用软删除和清除保护功能的 Key Vault 实例。
- 密钥保管库中的密钥满足以下要求: - 它使用 Rivest-Shamir-Adleman(RSA)加密或者使用硬件安全模块(RSA-HSM)的 RSA 加密。
- 它未过期。
- 它已启用。
- 它已启用包装和解包功能。
 
本文介绍如何配置这些资源后,将引导你完成以下步骤,以便应用配置存储可以使用 Key Vault 密钥:
- 将托管标识分配给应用配置存储区。
- 授予标识权限以访问 Key Vault 密钥: - 对于使用 Azure 基于角色的访问控制(Azure RBAC)的密钥保管库,请将标识分配给目标密钥保管库上的 Key Vault 加密服务加密用户 角色。
- 对于使用访问策略授权的密钥保管库,请在目标密钥保管库的访问策略中授予标识GET、WRAP和UNWRAP权限。
 
启用客户管理的密钥加密
若要使用客户管理的密钥加密,请执行以下步骤。
创建资源
- 如果您还没有应用配置存储,请在标准级别或高级级别创建一个应用配置存储。 有关说明,请参阅 快速入门:创建 Azure 应用配置存储。 
- 运行以下 Azure CLI 命令,创建已启用清除保护的 Key Vault 实例。 默认启用软删除。 将 - <vault-name>和- <resource-group-name>替换为您自己的唯一值。- az keyvault create --name <vault-name> --resource-group <resource-group-name> --enable-purge-protection- 此命令的输出列出了密钥保管库的资源 ID - id。 请注意其值,其格式如下:- /subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<vault-name>
- 使用 Azure CLI 为自己分配访问权限,以便在密钥保管库中创建密钥。 使用的命令取决于密钥保管库使用的授权系统。 有两种模型可用: - Azure RBAC 模型
- 访问策略模型
 - 对于这两种模型,都需要用户对象 ID 才能运行该命令。 可以使用下列方法之一查找用户对象 ID: - 在 Azure CLI 中使用 - az ad user show --id <user-principal-name>命令,其中- <user-principal-name>是您的用户主体名称(UPN)。
- 使用 Azure 门户: - 选择 Microsoft Entra ID,然后选择“ 管理>用户”。
- 在搜索框中输入姓名,然后在结果中选择用户名。
- 复制 对象 ID 值。
 
 - 通过运行适用于密钥保管库授权系统的命令,为自己分配访问权限: - 将占位符替换为以下值: - 对于 <user-object-ID>,请使用刚刚找到的对象 ID。
- 对于 <role>,请使用 Key Vault Crypto Officer 等角色,该角色提供创建密钥所需的访问权限。 将角色括在引号中。
- 对于 <vault-resource-ID>,请使用上一步中的密钥保管库资源 ID。
 - az role assignment create --assignee <user-object-ID> --role <role> --scope <vault-resource-ID>
- 运行以下命令创建 Key Vault 密钥。 将占位符替换为以下值: - 对于 <key-name>,请使用自己的唯一值。
- 对于 <key-type>:- 使用 RSA进行 RSA 加密。
- 使用RSA-HSM执行RSA-HSM加密。 RSA-HSM 加密仅在高级层中可用。
 
- 使用 
- 对于 <vault-name>,请使用步骤 2 中的密钥保管库的名称。
 - az keyvault key create --name <key-name> --kty <key-type> --vault-name <vault-name>- 此命令的输出列出了生成的密钥的密钥 ID - kid。 请注意其值,其格式如下:- https://<vault-name>.vault.azure.cn/keys/<key-name>/<key-version>- 密钥 ID 包含以下组件: - 密钥保管库 URI: https://<vault-name>.vault.azure.cn
- 密钥保管库密钥名称: <key-name>
- 密钥保管库密钥版本: <key-version>
 
- 对于 
- 使用以下选项之一为您的应用配置存储创建托管标识: - 若要创建用户分配的托管标识,请按照 添加用户分配的标识中的步骤作。 请注意标识的 - clientId和- principalId属性的值。
- 若要创建系统分配的托管标识,请使用以下 Azure CLI 命令。 将占位符替换为以下值: - 对于 <App-Configuration-store-name>,请使用步骤 1 中的应用配置存储区的名称。
- 对于 <resource-group-name>,请使用包含应用配置存储的资源组的名称。
 
- 对于 
 - az appconfig identity assign --name <App-Configuration-store-name> --resource-group <resource-group-name> --identities [system]- 此命令的输出包括系统分配标识的主体 ID - principalId和租户 ID- tenantId。 请注意属性的值- principalID。- { "principalId": <principal-ID>, "tenantId": <tenant-ID>, "type": "SystemAssigned", "userAssignedIdentities": null }
授予访问权限并启用密钥
应用配置存储的托管标识需要访问密钥才能执行密钥验证、加密和解密。 具体而言,托管标识需要访问用于密钥的GET、WRAP和UNWRAP操作。
- 对于使用 Azure RBAC 的密钥保管库,可以通过将 Key Vault 加密服务加密用户 角色分配给托管标识来授予这些权限。
- 对于使用访问策略授权的密钥保管库,可以为这些密钥权限设置策略。
- 使用适用于密钥保管库授权系统的命令授予托管身份访问托管密钥的权限。 对于这两个系统,请将 - <managed-identity-principal-ID>替换为上一步中的主体 ID。- 将 - <key-vault-resource-id>替换为 “创建资源” 步骤 2 中的密钥保管库的资源 ID。- az role assignment create --assignee <managed-identity-principal-ID> --role "Key Vault Crypto Service Encryption User" --scope <key-vault-resource-id>
- 通过运行以下 Azure CLI 命令之一,在服务中启用客户管理的密钥功能。 将占位符替换为以下值: - 对于 <resource-group-name>,请使用包含应用配置存储的资源组的名称。
- 对于 <App-Configuration-store-name>,请使用应用配置存储库的名称。
- 对于 <key-name>和<key-vault-URI>,请使用 “创建资源”步骤 4 中的值。
 - 默认情况下,该命令使用系统分配的托管标识通过密钥保管库进行身份验证。 - 如果使用系统分配的托管标识访问客户管理的密钥,请运行以下命令: - az appconfig update -g <resource-group-name> -n <App-Configuration-store-name> --encryption-key-name <key-name> --encryption-key-vault <key-vault-URI>
- 如果使用用户分配的托管标识访问客户管理的密钥,请运行以下命令,该命令显式指定客户端 ID。 将 - <user-assigned-managed-identity-client-ID>替换为步骤5中- clientId的值。- az appconfig update -g <resource-group-name> -n <App-Configuration-store-name> --encryption-key-name <key-name> --encryption-key-vault <key-vault-URI> --identity-client-id <user-assigned-managed-identity-client-ID>
 
- 对于 
应用配置存储现已配置为使用存储在 Key Vault 中的客户管理的密钥。
禁用客户管理的密钥加密
禁用客户管理的密钥加密时,应用配置存储会还原为使用 Azure 托管密钥。 但在还原到 Azure 托管密钥之前,应用配置使用当前密钥解密所有现有数据。 如果当前密钥已过期或撤消对该密钥的访问权限,则必须首先还原对该密钥的访问权限。
注意
在将应用配置存储配置为使用 Azure 管理的密钥而不是客户管理的密钥进行加密之前,请确保此更改符合组织的安全策略和合规性要求。
- 确保当前客户管理的密钥有效且可作。 
- 使用以下 Azure CLI 命令通过删除客户管理的密钥配置来更新应用配置存储。 将 - <resource-group-name>和- <App-Configuration-store-name>替换为您环境中的值。- az appconfig update -g <resource-group-name> -n <App-Configuration-store-name> --encryption-key-name ""
- 若要验证客户管理的密钥配置是否已禁用,请检查应用配置存储的属性。 - az appconfig show -g <resource-group-name> -n <App-Configuration-store-name> --query "encryption"- 在此命令的输出中, - encryption.keyVaultProperties属性应具有值- null。
应用配置存储现已配置为使用 Azure 管理的密钥进行加密。
访问撤销
在应用配置存储中启用客户管理的密钥功能时,可以控制服务访问敏感信息的能力。 托管密钥用作根加密密钥。
可以通过更改密钥保管库访问策略来撤销应用配置存储对托管密钥的访问权限。 撤消此访问权限时,应用配置将无法在一小时内解密用户数据。 此时,应用配置存储禁止所有访问尝试。
通过再次授予应用配置服务对托管密钥的访问权限,可以恢复这种情况。 在一小时内,应用配置可以解密用户数据,并在正常条件下运行。
注意
所有应用配置数据存储在隔离备份中最多 24 小时。 此数据包括未包装的加密密钥。 此数据不能立即供服务或服务团队使用。 在紧急还原期间,应用配置会再次从托管密钥数据中撤销自己。
密钥轮换
在应用程序配置存储区上配置客户管理的密钥时,需要定期轮换托管密钥,使其不会过期。 若要成功轮换密钥,当前密钥必须有效且可作。 如果当前密钥已过期,或者应用配置对其的访问权限被吊销,则应用配置存储无法解密数据,并且轮换失败。
自动旋转
最佳做法是在 Key Vault 中为客户管理的密钥配置 自动轮换 。 轮换密钥会经常提高安全性。 使用自动旋转时,避免由于缺少旋转而失去访问权限。 此外,无需手动轮换加密密钥。
无版本密钥
客户管理的密钥加密中自动轮换的另一个最佳做法是省略密钥保管库密钥的版本。 如果未配置特定密钥版本,应用配置可在自动轮换时移动到密钥的最新版本。 因此,当当前使用的托管密钥版本过期时,您的应用配置存储可以避免失去访问权限。
设置客户管理的密钥加密时,请在密钥保管库中提供密钥的标识符。 密钥保管库密钥标识符可以具有以下格式:
- 无版本密钥标识符: https://<vault-name>.vault.azure.cn/keys/<key-name>
- 版本密钥标识符(不建议):https://<vault-name>.vault.azure.cn/keys/<key-name>/<key-version>
若要配置无版本密钥,请使用省略版本的标识符格式。
后续步骤
在本文中,你已将应用配置存储配置为使用客户管理的密钥进行加密。 若要详细了解如何将应用服务与 Azure 托管标识集成,请继续执行下一步。