使用 Azure Key Vault 中客户管理的密钥进行透明数据加密的常见错误

适用于:Azure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics

本文介绍了如何发现和解决 Azure Key Vault 密钥访问问题,这些问题导致配置为结合使用透明数据加密 (TDE) 和 Azure Key Vault 中的客户托管密钥的数据库变得无法访问。

注意

Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。

介绍

如果 TDE 配置为使用 Azure Key Vault 中的客户托管密钥,必须持续访问此 TDE 保护程序,才能让数据库保持联机状态。 如果逻辑 SQL Server 或托管实例在 Azure Key Vault 中失去对客户托管 TDE 保护程序的访问权限,数据库就会开始拒绝所有带有相应错误消息的连接,并将其在 Azure 门户中的状态更改为“无法访问”

在最初的 30 分钟内,如果基础 Azure Key Vault 密钥访问问题得到解决,数据库就会自动恢复并自动联机。 也就是说,对于所有间歇性和临时网络故障情况,无需执行任何用户操作,数据库就会自动联机。 在大多数情况下,需要执行用户操作来解决基础密钥保管库密钥访问问题。

如果不再需要无法访问的数据库,可以立即删除它,以停止产生成本。 在恢复对 Azure Key Vault 密钥的访问权限,且数据库恢复联机之前,不允许对数据库执行其他任何操作。 在无法访问使用客户托管密钥加密的数据库期间,也不可能在服务器上将 TDE 选项从客户托管密钥更改为服务托管密钥。 这是必要的,可以在对 TDE 保护程序的权限遭撤销期间保护数据免遭未经授权的访问。

如果数据库无法访问的时长超过 30 分钟,便无法再自动恢复。 如果那期间之后所需的 Azure Key Vault 密钥访问已恢复,必须手动重新验证对密钥的访问,这样数据库才能恢复联机。 在这种情况下让数据库恢复联机可能需要相当长的时间(具体视数据库大小而定)。 在数据库恢复联机后,以前配置的设置(如故障转移组、PITR 历史记录和任何标记)则会丢失。 因此,建议使用操作组实现通知系统,以便尽快了解并解决基础密钥保管库密钥访问问题。

导致数据库无法访问的常见错误

使用 Key Vault 进行 TDE 时,发生的大多数问题都是由下列错误配置之一引起的:

密钥保管库不可用或不存在

  • 密钥保管库遭意外删除。
  • 为 Azure Key Vault 配置的防火墙禁止访问 Microsoft 服务。
  • 间歇性网络错误导致密钥保管库不可用。

无权访问密钥保管库或密钥不存在

  • 密钥遭意外删除、禁用或密钥已到期。
  • 服务器的托管标识(系统分配或用户分配)被意外删除。
  • 服务器已移动到其他订阅。 服务器已移动到其他订阅,必须将新的托管标识(系统分配或用户分配)分配给服务器。
  • 向服务器的托管标识授予的密钥权限不足(即不包括“获取、包装和取消包装”权限)。
  • 已从密钥保管库撤消服务器托管标识的权限。

发现和解决常见错误

此部分列出了最常见错误的疑难解答步骤。

缺少服务器标识

错误消息

401 AzureKeyVaultNoServerIdentity - 在服务器上配置的服务器标识不正确。 请联系客户支持。

检测

使用以下 cmdlet 或命令确保已向服务器分配标识:

缓解

使用以下 cmdlet 或命令为服务器配置用户分配的或系统分配的托管标识:

在 Azure 门户中,依次转到密钥保管库和“访问策略”。 完成以下步骤:

  1. 使用“新增”按钮,为上一步中创建的服务器添加 AppId。
  2. 分配以下密钥权限:Get、Wrap 和 Unwrap

若要了解详细信息,请参阅为服务器分配托管标识

重要

如果在使用密钥保管库对 TDE 进行初始配置后,将 Azure SQL 数据库的逻辑服务器或 Azure SQL 托管实例移至新的 Microsoft Entra 租户,则必须在新租户中重做此托管标识配置。

缺少密钥保管库

错误消息

503 AzureKeyVaultConnectionFailed - 无法在服务器上完成操作,因为尝试连接到 Azure Key Vault 失败。

检测

若要标识密钥 URI 和密钥保管库,请执行以下操作:

  1. 使用以下 cmdlet 或命令获取特定服务器实例的密钥 URI:

  2. 使用密钥 URI 来标识密钥保管库:

    • Azure PowerShell:你可以检查 $MyServerKeyVaultKey 变量的属性,以获取密钥保管库的详细信息。

    • Azure CLI:检查返回的服务器加密保护程序,以获取密钥保管库的详细信息。

缓解

确认密钥保管库是否可用:

  • 确保密钥保管库可用且服务器具有访问权限。
  • 如果密钥保管库位于防火墙后,请务必选中允许 Microsoft 服务访问密钥保管库的复选框。
  • 如果密钥保管库已遭意外删除,必须从头开始完成配置。

缺少密钥

错误消息

404 ServerKeyNotFound - 在当前订阅上找不到请求的服务器密钥。

409 ServerKeyDoesNotExists - 服务器密钥不存在。

检测

若要标识密钥 URI 和密钥保管库,请执行以下操作:

  • 使用缺少密钥保管库中的 cmdlet 或命令,以标识添加到逻辑 SQL Server 实例的密钥 URI。 运行这些命令会返回密钥列表。

缓解

确认密钥保管库中是否有 TDE 保护程序:

  1. 标识密钥保管库,然后在 Azure 门户中转到密钥保管库。
  2. 确保密钥 URI 标识的密钥存在。

缺少权限

错误消息

401 AzureKeyVaultMissingPermissions - 服务器缺少对 Azure Key Vault 的必需权限。

检测

若要标识密钥 URI 和密钥保管库,请执行以下操作:

  • 使用缺少密钥保管库中的 cmdlet 或命令,以标识逻辑 SQL Server 实例使用的密钥保管库。

缓解

确认服务器具有密钥保管库权限以及访问密钥的正确权限:

  • 在 Azure 门户中,依次转到密钥保管库和“访问策略”>。 查找服务器的托管标识(系统分配或用户分配)。
  • 如果服务器标识存在,请确保它具有以下密钥权限:Get、WrapKey 和 UnwrapKey。
  • 如果服务器标识不存在,请使用“新增”按钮进行添加。

从活动日志中获取 TDE 状态

为了监视由于 Azure Key Vault 密钥访问问题而导致的数据库状态,以下事件将根据 Azure 资源管理器 URL 记录到活动日志中,以获取资源 ID。

注意

出现密钥保管库访问问题后,可能需要至少 15-30 分钟,事件才会显示在活动日志中。

当服务失去对 Azure Key Vault 密钥的访问权限时发生的事件

Azure SQL 数据库

事件名称:MakeDatabaseInaccessible

状态: 已启动

说明:服务器 {server_name} 上的数据库 {database_name} 已失去对 Azure Key Vault 密钥的访问权限,现在正在转换为不可访问状态。

Azure SQL 托管实例

事件名称:MakeManagedDbInaccessible

状态: 已启动

说明:托管服务器 {server_name} 上的数据库 {database_name} 已失去对 Azure Key Vault 密钥的访问权限,现在正在转换为不可访问状态。

当在 30 分钟内未解决问题且必须手动验证 Azure Key Vault 密钥访问时发生的事件

Azure SQL 数据库

事件名称:MakeDatabaseInaccessible

状态:已成功

描述:数据库无法访问,要求用户修复 Azure Key Vault 错误,并使用重新验证密钥重新建立对 Azure Key Vault 密钥的访问权限。

Azure SQL 托管实例

事件名称:MakeManagedDbInaccessible

状态:已成功

说明:托管服务器 {server_name} 上的数据库 {database_name} 无法访问,要求用户重新建立对 Azure Key Vault 密钥的访问权限。

当已成功重新验证 Azure Key Vault 密钥访问且数据库恢复联机时发生的事件

Azure SQL 数据库

事件名称:MakeDatabaseAccessible

状态: 已启动

说明:已重新建立对 Azure Key Vault 密钥的访问权限,并且已启动使服务器 {server_name} 上的数据库 {database_name} 可供访问的操作。

Azure SQL 托管实例

事件名称:MakeManagedDatabaseAccessible

状态: 已启动

说明:已重新建立对 Azure Key Vault 密钥的访问权限,并且已启动使托管服务器 {server_name} 上的数据库 {database_name} 的操作可供访问的操作。

当数据库成功恢复联机时发生的事件

Azure SQL 数据库

事件名称:MakeDatabaseAccessible

状态:已成功

说明:已重新建立对 Azure Key Vault 密钥的访问权限,并且服务器 {server_name} 上的数据库 {database_name} 现已联机。

Azure SQL 托管实例

事件名称:MakeManagedDatabaseAccessible

状态:已成功

说明:已重新建立对 Azure Key Vault 密钥的访问权限,并且托管服务器 {server_name} 上的数据库 {database_name} 现已联机。

当重新验证 Azure Key Vault 密钥访问失败时发生的事件

Azure SQL 数据库

事件名称:MakeDatabaseAccessible

状态:失败

说明:已重新建立对 Azure Key Vault 密钥的访问权限,并且使服务器 {server_name} 上的数据库 {database_name} 可供访问的操作失败

Azure SQL 托管实例

事件名称:MakeManagedDatabaseAccessible

状态:失败

说明:已重新建立对 Azure Key Vault 密钥的访问权限,并且使托管服务器 {server_name} 上的数据库 {database_name} 可供访问的操作失败

后续步骤

  • 了解 Azure 资源运行状况
  • 操作组设置为,根据偏好设置(例如,电子邮件/短信/推送/语音、逻辑应用、Webhook、ITSM 或自动化 Runbook)接收通知和警报。