使用 Azure Key Vault 设置 SQL Server TDE 可扩展密钥管理

适用范围:SQL Server

本文介绍如何安装和配置用于 Azure Key Vault 的 SQL Server 连接器。

注意

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

从 SQL Server 2022 (16.x) 累积更新 12 开始,使用 Azure Key Vault (AKV) 的可扩展密钥管理适用于 Linux 上的 SQL Server 环境。 按照相同的说明操作,但跳过步骤 3 和步骤 4。

先决条件

在开始将 Azure 密钥保管库与 SQL Server 实例配合使用之前,请确保已满足以下先决条件:

注意

在 SQL Server 2022 (16.x) CU 14 及更高版本中,Linux 上的 SQL Server 支持使用 Azure Key Vault 进行 TDE 可扩展密钥管理。 Linux 上的 SQL Server 不需要本指南中的步骤 3 和 4。

步骤 1:设置 Microsoft Entra 服务主体

要向 Azure 密钥保管库授予 SQL Server 实例访问权限,需要在 Microsoft Entra ID 中具有服务主体帐户。

  1. 登录 Azure 门户,然后执行以下任一操作:

    • 选择“Microsoft Entra ID”按钮。

      “Azure 服务”窗格的屏幕截图。

    • 选择“更多服务”,然后在“所有服务”窗格中键入“Microsoft Entra ID”

  2. 按照以下步骤使用 Microsoft Entra ID 注册应用程序。 有关详细的分步说明,请参阅 Azure Key Vault 博客文章中的“获取应用程序的标识”一节:Azure Key Vault – 分步说明

    1. 在 Microsoft Entra ID 资源的“管理”一节上,选择“应用注册”

      Azure 门户中的 Microsoft Entra ID 概述页面的屏幕截图。

    2. 在“应用注册”页面,选择“新增注册”。

      屏幕截图,其中显示了 Azure 门户中的“应用注册”窗格。

    3. 在“注册应用程序”窗格中,输入应用面向用户的名称,然后选择“注册”

      “注册应用程序”窗格的屏幕截图。

    4. 在左窗格中,选择“证书和机密”>“客户端机密”>“新建客户端机密”

      屏幕截图,其中显示了 Azure 门户中应用的“证书和密码”窗格。

    5. 在“添加客户端密码”下,输入说明和适当的到期时间,然后选择“添加”。 不能选择超过 24 个月的过期期限。 有关详细信息,请参阅添加客户端密码

      屏幕截图,其中显示了 Azure 门户中应用的“添加客户端密码”部分。

    6. 在“证书和密码”窗格的“值”下,选择要用于在 SQL Server 中创建非对称密钥的客户端密码值旁边的“复制”按钮。

      屏幕截图,其中显示了 Azure 门户中的机密值。

    7. 在左侧窗格中,选择“概述”,然后在“应用程序(客户端) ID”框中,复制要用于在 SQL Server 中创建非对称密钥的值。

      “概述”窗格中“应用程序(客户端) ID”值的屏幕截图。

步骤 2:创建密钥保管库

选择要用于创建密钥保管库的方法。

使用 Azure 门户创建密钥保管库

可以使用 Azure 门户创建密钥保管库,然后向其中添加 Microsoft Entra 主体。

  1. 创建资源组。

    通过 Azure 门户创建的所有 Azure 资源都必须包含在创建的资源组中,该资源组用于承载密钥保管库。 此示例中的资源名称为 DocsSampleRG。 选择你自己的资源组和密钥保管库名称,因为所有密钥保管库名称都必须是全局唯一的。

    在“创建资源组”窗格的“项目详细信息”下,输入值,然后选择“查看 + 创建”

    屏幕截图,其中显示了 Azure 门户中的“创建资源组”窗格。

  2. 在 Azure 门户中,搜索或选择“密钥保管库”服务以创建密钥保管库。 选择创建

    在“创建密钥保管库”窗格中,选择“基本信息”选项卡,然后输入该选项卡的相应值。我们还建议启用清除保护。

    屏幕截图,其中显示了 Azure 门户中的“创建密钥保管库”窗格。

  3. “访问配置”选项卡上,可以选择“Azure 基于角色的访问控制”或“保管库访问策略”。 我们会简介这两个选项,但建议使用“Azure 基于角色的访问控制”选项。 有关详细信息,请参阅访问权限模型概述

    屏幕截图,其中显示了 Azure 门户中的“创建密钥保管库”窗格和“访问配置”选项卡。

  4. 可以将“网络”选项卡保留为默认值,也可以为密钥保管库配置网络设置。 如果对密钥保管库使用防火墙,则必须启用“允许受信任的 Microsoft 服务绕过防火墙”选项,除非使用的是专用终结点连接。 有关详细信息,请参阅配置 Azure Key Vault 防火墙和虚拟网络

  5. 选择“查看 + 创建”并创建密钥保管库。

Azure 基于角色的访问控制

建议的方法是使用 Azure 基于角色的访问控制 (RBAC) 将权限分配给密钥保管库。 此方法使你能够更精细的级别向用户、组和应用程序分配权限。 可以通过管理平面(Azure 角色分配)和数据平面(密钥保管库访问策略)向密钥保管库分配权限。 如果只能使用访问策略,则可以跳过本节并转到“保管库访问策略”一节。 有关 Azure Key Vault RBAC 权限的详细信息,请参阅 Key Vault 数据平面操作的 Azure 内置角色

  1. 转到你创建的密钥保管库资源,然后选择“访问控制 (IAM)”设置。

  2. 选择“添加”>“添加角色分配”。

    屏幕截图,其中显示了 Azure 门户“访问控制 (IAM)”窗格上的“添加角色分配”按钮。

  3. EKM 应用程序需要“密钥保管库加密服务加密用户”角色来执行包装和解包操作。 搜索并选择“密钥保管库加密服务加密用户”。 选择下一步

    屏幕截图,其中显示了在 Azure 门户中选择角色分配。

  4. 在“成员”选项卡中,选择“选择成员”选项,然后搜索在步骤 1 中创建的 Microsoft Entra 应用程序。 选择此应用程序,然后选择“选择”按钮。

    屏幕截图,其中显示了 Azure 门户中用于添加角色分配的“选择成员”窗格。

  5. 选择“查看 + 分配”两次,以完成角色分配。

  6. 创建密钥的用户需要“密钥保管库管理员”角色。 搜索“密钥保管库管理员”,并选择该角色。 选择下一步

  7. 与先前步骤一样,添加创建密钥的成员并分配角色。

保管库访问策略

注意

如果使用“Azure 基于角色的访问控制”选项,可以跳过本节。 如果要更改权限模型,可以通过转到密钥保管库的“访问权限配置”菜单来执行此操作。 请确保你拥有管理和访问密钥保管库的正确权限。 有关详细信息,请参阅对密钥保管库启用 Azure RBAC 权限

  1. 在“访问配置”选项卡上,选择“保管库访问策略”。 如果使用现有的密钥保管库,可以从密钥保管库资源中选择“访问策略”菜单,然后选择“创建”。

  2. “创建访问策略”窗格中,从“密钥管理操作”选项中选择“获取”“列出”权限。 从“加密操作”选项中选择“解包密钥”和“包装密钥”权限。 选择下一个

    “访问策略”窗格中“添加访问策略”链接的屏幕截图。

  3. “主体”选项卡上,选择在步骤 1 中创建的应用程序。

    “主体”窗格中应用程序搜索框的屏幕截图。

  4. 选择“下一步”,然后选择“创建”。

创建密钥

  1. “密钥保管库”窗格中,选择“密钥”,然后选择“生成/导入选项”。 随即打开“创建密钥”窗格。 输入密钥保管库名称。 选择“生成”选项并输入密钥的名称。 SQL Server 连接器要求密钥名称只能使用字符 “a-z”、“A-Z”、“0-9” 和 “-”,其长度限制为 26 个字符。

  2. 使用 RSA 作为密钥类型,使用 2048 作为“RSA 密钥大小”。 EKM 当前仅支持 RSA 密钥。 根据需要设置激活日期和到期日期并将“是否启用?”设置为”是”

    “创建密钥”窗格的屏幕截图。

最佳做法

为了确保快速恢复密钥并能够访问 Azure 外的数据,建议采用以下最佳做法:

  • 在本地硬件安全模块 (HSM) 设备上创建加密密钥。 确保使用非对称 RSA 2048 或 3072 密钥,以便得到 SQL Server 的支持。

  • 将加密密钥导入到 Azure 密钥保管库。 此过程在后续部分中介绍。

  • 在首次使用 Azure 密钥保管库中的密钥之前,请使用 Backup-AzureKeyVaultKey PowerShell cmdlet,进行 Azure 密钥保管库密钥备份。

  • 每次更改密钥(例如添加 ACL、标记或密钥属性)时,务必再进行一次 Azure 密钥保管库密钥备份。

    注意

    备份密钥是一项 Azure Key Vault 密钥操作,将返回一个可在任意位置保存的文件。

    如果流量被延迟或阻止,则使用防火墙或代理服务器后面的用于 Azure Key Vault 的 SQL Server 连接器可能会影响性能。 熟悉访问防火墙后面的 Azure 密钥保管库,确保制定正确的规则。

可选 - 配置 Azure Key Vault 托管 HSM(硬件安全模块)

使用最新版本的 SQL Server 连接器以及 Azure SQL 时,SQL Server 和 Azure 虚拟机 (VM) 上的 SQL Server 支持 Azure Key Vault 托管 HSM(硬件安全模块)。 托管 HSM 是一种完全托管、高度可用的单租户 HSM 服务。 托管 HSM 为加密操作和密钥存储提供了安全的基础。 托管 HSM 旨在满足最严格的安全性和合规性要求。

第 2 步中,我们学习了如何在 Azure Key Vault 中创建密钥保管库和密钥。 可以选择使用 Azure Key Vault 托管 HSM 来存储或创建要用于 SQL Server 连接器的密钥。 步骤如下:

  1. 创建 Azure Key Vault 托管 HSM。 这可以通过使用 Azure 门户搜索 Azure Key Vault 托管 HSM 服务并创建新资源来完成,也可通过 Azure CLIPowerShellARM 模板来完成。

  2. 激活托管 HSM。 只有托管 HSM 创建期间分配的指定管理员才能激活 HSM。 要完成此操作,可以在 Azure 门户中选择该托管 HSM 资源,然后在该资源的“概述”菜单中选择“下载安全域”, 然后按照任意一项激活托管 HSM 快速入门的说明操作即可。

  3. 为 Microsoft Entra 服务主体授予访问托管 HSM 的权限。 托管 HSM 管理员 角色不会授予创建密钥的权限。 与第 2 步类似,EKM 应用程序使用托管 HSM 加密用户托管 HSM 加密服务加密用户角色才能执行打包和解包操作。 添加角色分配的主体时,请选择“企业应用程序”类型。 有关详细信息,请参阅托管 HSM 的本地 RBAC 内置角色

  4. 在 Azure Key Vault 托管 HSM 服务菜单中的“设置”下,选择“密钥”。 在“密钥”窗口中,选择“生成/导入/还原备份”以创建密钥或导入现有密钥。

    注意

    创建用于访问托管 HSM 的凭证时,标识为 <name of Managed HSM>.managedhsm.azure.net(可在 Azure Key Vault 托管 HSM“概述”中找到),在 Azure 门户中用作“HSM URI”

    Azure Key Vault 托管 HSM 支持自动密钥轮换。 有关详细信息,请参阅在 Azure 托管 HSM 中配置密钥自动轮换

    要使用 SQL Server 连接器版本 15.0.2000.440 或更高版本才能支持 Azure Key Vault 托管 HSM。

    托管 HSM 支持专用终结点连接。 有关详细信息,请参阅将托管 HSM 与 Azure 专用链接集成。 在此配置中,必须为 Azure 密钥库托管 HSM“网络”设置启用“Microsoft 受信任的服务绕过”选项。

步骤 3:安装 SQL Server 连接器

Microsoft 下载中心下载 SQL Server 连接器。 此下载操作应由 SQL Server 计算机的管理员完成。

注意

  • 已替换 SQL Server 连接器版本 1.0.0.440 及更低版本,且生产环境不再支持这些版本,并按照升级 SQL Server 连接器下的 SQL Server 连接器维护与故障排除页上的说明进行操作。
  • 从版本 1.0.3.0 开始,SQL Server 连接器向 Windows 事件日志报告相关错误消息,以便进行故障排除。
  • 从版本 1.0.4.0 开始,支持私有 Azure 云,包括由世纪互联、Azure 德国和 Azure 政府运营的 Azure。
  • 1.0.5.0 版在指纹算法方面进行了一项重大更改。 升级到 1.0.5.0 后,可能会遇到数据库还原失败的问题。 有关详细信息,请参阅知识库文章 447099
  • 从版本 1.0.5.0(时间戳:2020 年 9 月)开始,SQL Server 连接器支持筛选消息和网络请求重试逻辑。
  • 从更新的版本 1.0.5.0(时间戳:2020 年 11 月)开始,SQL Server 连接器支持 RSA 2048、RSA 3072、RSA-HSM 2048 和 RSA-HSM 3072 密钥。
  • 从更新的版本 1.0.5.0(时间戳:2020 年 11 月),可以在 Azure Key Vault 中引用特定密钥版本。

SQL Server 连接器安装向导的屏幕截图。

默认情况下,连接器安装在 C:\Program Files\SQL Server Connector for Microsoft Azure Key Vault。 可在设置过程中更改此位置。 如果更改了此位置,请在下一部分中调整脚本。

连接器没有接口,但如果安装成功,将在计算机上安装 Microsoft.AzureKeyVaultService.EKM.dll。 此程序集是加密 EKM 提供程序 DLL,需要使用 CREATE CRYPTOGRAPHIC PROVIDER 语句在 SQL Server 中注册。

SQL Server 连接器安装还允许你选择性地下载用于 SQL Server 加密的示例脚本。

若要查看 SQL Server 连接器的错误代码说明、配置设置或维护任务,请参阅:

步骤 4:添加注册表项以支持 EKM 提供程序

警告

修改注册表应由确切了解其所执行的操作的用户执行。 如果注册表修改不正确,可能会发生严重问题。 作为额外保护措施,请在修改注册表之前先将其备份。 如果之后出现问题,您就可以还原注册表。

  1. 确保 SQL Server 已安装且正在运行。

  2. 打开regedit,以打开注册表编辑器。

  3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft 上创建注册表项 SQL Server Cryptographic Provider。 完整路径为 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQL Server Cryptographic Provider

  4. 右键单击 SQL Server Cryptographic Provider 注册表项,然后选择“权限”。

  5. 将注册表项 SQL Server Cryptographic Provider 的“完全控制”权限委托给运行 SQL Server 服务的用户帐户。

    注册表编辑器中“EKM 注册表项”的屏幕截图。

  6. 依次选择“应用”、“确定” 。

  7. 关闭注册表编辑器并重启 SQL Server 服务。

    注意

    如果通过 EKM 或 Azure Key Vault 将 TDE 用于故障转移群集实例,必须执行一个额外步骤,将 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQL Server Cryptographic Provider 添加到群集注册表检查点例程,这样注册表才能跨节点同步。 同步有助于在故障转移和密钥轮换后进行数据库恢复。

    若要将注册表项添加到群集注册表检查点例程,请在 PowerShell 中运行以下命令:

    Add-ClusterCheckpoint -RegistryCheckpoint "SOFTWARE\Microsoft\SQL Server Cryptographic Provider" -Resourcename "SQL Server"

步骤 5:配置 SQL Server

有关此部分中每个操作所需的最低权限级别的说明,请参阅 B. 常见问题

配置 master 数据库

  1. 运行 sqlcmd 或打开 SQL Server Management Studio。

  2. 通过运行以下 Transact-SQL 脚本,将 SQL Server 配置为使用 EKM:

    -- Enable advanced options.
    USE master;
    GO
    
    EXEC sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    
    -- Enable EKM provider
    EXEC sp_configure 'EKM provider enabled', 1;
    GO
    RECONFIGURE;
    
  3. 在 SQL Server 中将 SQL Server 连接器注册为 EKM 提供程序。

    使用 SQL Server 连接器(Azure Key Vault的 EKM 提供程序)创建加密提供程序。 在本示例中,提供程序名称为 AzureKeyVault_EKM

    CREATE CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM
    FROM FILE = 'C:\Program Files\SQL Server Connector for Microsoft Azure Key Vault\Microsoft.AzureKeyVaultService.EKM.dll';
    GO
    

    注意

    文件路径长度不能超过 256 个字符。

  4. 为 SQL Server 登录名设置 SQL Server 凭据以使用密钥保管库。

    必须将凭据添加到要使用密钥保管库中的密钥执行加密的每个登录名。 这些登录名可能包括:

    • 使用密钥保管库来设置和管理 SQL Server 加密方案的 SQL Server 管理员登录名。

    • 可能启用 TDE 或其他 SQL Server 加密功能的其他 SQL Server 登录名。

    凭据和登录名之间是一对一的映射关系。 也就是说,每个登录名必须具有唯一的凭据。

    通过以下方式修改此 Transact-SQL 脚本:

    • 编辑 IDENTITY 参数 (DocsSampleEKMKeyVault) 以指向 Azure 密钥保管库。

    • SECRET 参数的第一部分替换为步骤 1:设置 Microsoft Entra 服务主体中的 Microsoft Entra 客户端 ID。 在本示例中,“客户端 ID”d956f6b9xxxxxxx

      重要

      确保删除“应用(客户端) ID”中的连字符。

    • 使用步骤 1:设置 Microsoft Entra 服务主体中的“客户端密码”完成 SECRET 参数的第二部分。 在本示例中,“客户端密码”为 yrA8X~PldtMCvUZPxxxxxxxx。 参数的最后一个字符串 SECRET 将是一个长序列的字母和数字,没有连字符(客户端机密部分除外,以防客户端机密包含任何连字符)。

      USE master;
      CREATE CREDENTIAL sysadmin_ekm_cred
          WITH IDENTITY = 'DocsSampleEKMKeyVault',                            -- for public Azure
          -- WITH IDENTITY = 'DocsSampleEKMKeyVault.vault.usgovcloudapi.net', -- for Azure Government
          -- WITH IDENTITY = 'DocsSampleEKMKeyVault.vault.azure.cn',          -- for Microsoft Azure operated by 21Vianet
          -- WITH IDENTITY = 'DocsSampleEKMKeyVault.vault.microsoftazure.de', -- for Azure Germany
          -- WITH IDENTITY = '<name of Managed HSM>.managedhsm.azure.net',    -- for Managed HSM (HSM URI in the Azure portal resource)
                 --<----Application (Client) ID ---><--Microsoft Entra app (Client) ID secret-->
          SECRET = 'd956f6b9xxxxxxxyrA8X~PldtMCvUZPxxxxxxxx'
      FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM;
      
      -- Add the credential to the SQL Server administrator's domain login
      ALTER LOGIN [<domain>\<login>]
      ADD CREDENTIAL sysadmin_ekm_cred;
      

    有关使用 CREATE CREDENTIAL 参数的变量和以编程方式从客户端 ID 中移除连字符的示例,请参阅 CREATE CREDENTIAL

  5. 在 SQL Server 实例中打开 Azure Key Vault 密钥。

    无论是创建新密钥,还是按照步骤 2:创建密钥保管库所述导入非对称密钥,都需要打开该密钥。 可通过在以下 Transact-SQL 脚本中提供密钥名称来打开它。

    重要

    请务必首先完成此步骤的注册表先决条件。

    • EKMSampleASYKey 替换为希望该密钥在 SQL Server 中使用的名称。
    • ContosoRSAKey0 替换为 Azure Key Vault 或托管 HSM 中密钥的名称。 下面是无版本密钥的示例。
    CREATE ASYMMETRIC KEY EKMSampleASYKey
    FROM PROVIDER [AzureKeyVault_EKM]
    WITH PROVIDER_KEY_NAME = 'ContosoRSAKey0',
    CREATION_DISPOSITION = OPEN_EXISTING;
    

    从 SQL Server 连接器的更新版本 1.0.5.0 开始,可以在 Azure Key Vault 中引用特定的密钥版本:

    CREATE ASYMMETRIC KEY EKMSampleASYKey
    FROM PROVIDER [AzureKeyVault_EKM]
    WITH PROVIDER_KEY_NAME = 'ContosoRSAKey0/1a4d3b9b393c4678831ccc60def75379',
    CREATION_DISPOSITION = OPEN_EXISTING;
    

    在前面的示例脚本中,1a4d3b9b393c4678831ccc60def75379 表示将使用的密钥的特定版本。 如果使用此脚本,那么是否使用新版本来更新密钥就不重要了。 (例如)将始终为数据库操作使用密钥版本 1a4d3b9b393c4678831ccc60def75379

  6. 使用在前面步骤中创建的 SQL Server 非对称密钥来创建新的登录名。

    --Create a Login that will associate the asymmetric key to this login
    CREATE LOGIN TDE_Login
    FROM ASYMMETRIC KEY EKMSampleASYKey;
    
  7. 根据 SQL Server 中的非对称密钥创建新的登录名。 删除步骤 5:配置 SQL Server 中的凭据映射,以便将凭据映射到新的登录名。

    --Now drop the credential mapping from the original association
    ALTER LOGIN [<domain>\<login>]
    DROP CREDENTIAL sysadmin_ekm_cred;
    
  8. 更改新登录名,然后将 EKM 凭据映射到新登录名。

    --Now add the credential mapping to the new Login
    ALTER LOGIN TDE_Login
    ADD CREDENTIAL sysadmin_ekm_cred;
    

配置要加密的用户数据库

  1. 创建将使用 Azure Key Vault 密钥加密的测试数据库。

    --Create a test database that will be encrypted with the Azure Key Vault key
    CREATE DATABASE TestTDE;
    
  2. 使用 ASYMMETRIC KEY (EKMSampleASYKey) 创建数据库加密密钥。

    USE <DB Name>;
    --Create an ENCRYPTION KEY using the ASYMMETRIC KEY (EKMSampleASYKey)
    CREATE DATABASE ENCRYPTION KEY
    WITH ALGORITHM = AES_256
    ENCRYPTION BY SERVER ASYMMETRIC KEY EKMSampleASYKey;
    
  3. 加密测试数据库。 通过设置 ENCRYPTION ON 启用 TDE。

    --Enable TDE by setting ENCRYPTION ON
    ALTER DATABASE TestTDE
    SET ENCRYPTION ON;
    

注册表详细信息

  1. master 数据库中执行以下 Transact-SQL 查询,以显示所使用的非对称密钥。

    SELECT name, algorithm_desc, thumbprint FROM sys.asymmetric_keys;
    

    该语句返回:

    name            algorithm_desc    thumbprint
    EKMSampleASYKey RSA_2048          <key thumbprint>
    
  2. 在用户数据库中 (TestTDE) 执行以下 Transact-SQL 查询以显示使用的加密密钥。

    SELECT encryptor_type, encryption_state_desc, encryptor_thumbprint
    FROM sys.dm_database_encryption_keys
    WHERE database_id = DB_ID('TestTDE');
    

    该语句返回:

    encryptor_type encryption_state_desc encryptor_thumbprint
    ASYMMETRIC KEY ENCRYPTED             <key thumbprint>
    

清理

  1. 清理测试对象。 删除在此测试脚本中创建的所有对象。

    -- CLEAN UP
    USE master;
    GO
    ALTER DATABASE [TestTDE] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE [TestTDE];
    GO
    
    ALTER LOGIN [TDE_Login] DROP CREDENTIAL [sysadmin_ekm_cred];
    DROP LOGIN [TDE_Login];
    GO
    
    DROP CREDENTIAL [sysadmin_ekm_cred];
    GO
    
    USE master;
    GO
    DROP ASYMMETRIC KEY [EKMSampleASYKey];
    DROP CRYPTOGRAPHIC PROVIDER [AzureKeyVault_EKM];
    GO
    

    有关示例脚本,请参阅博客 SQL Server Transparent Data Encryption and Extensible Key Management with Azure Key Vault(使用 Azure 密钥保管库的 SQL Server 透明数据加密和可扩展密钥管理)。

  2. 删除密钥或所有 EKM 密钥后,系统不自动清理 SQL Server Cryptographic Provider 注册表项。 必须手动清理。 应谨慎地清理注册表项,因为过早地清理注册表可能会中断 EKM 功能。 若要清理注册表项,请删除 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft 上的 SQL Server Cryptographic Provider 注册表项。

故障排除

如果未创建注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQL Server Cryptographic Provider 或未授予所需的权限,以下 DDL 语句将失败:

CREATE ASYMMETRIC KEY EKMSampleASYKey
FROM PROVIDER [AzureKeyVault_EKM]
WITH PROVIDER_KEY_NAME = 'ContosoRSAKey0',
CREATION_DISPOSITION = OPEN_EXISTING;
Msg 33049, Level 16, State 2, Line 65
Key with name 'ContosoRSAKey0' does not exist in the provider or access is denied. Provider error code: 2058.  (Provider Error - No explanation is available, consult EKM Provider for details)

即将过期的客户端机密

如果凭据的客户端机密即将过期,可以为该凭据分配新机密。

  1. 更新最初在步骤 1:设置 Microsoft Entra 服务主体中创建的密码。

  2. 通过以下代码,使用相同的标识和新机密来更改凭据: 替换为 <New Secret> 新机密:

    ALTER CREDENTIAL sysadmin_ekm_cred
    WITH IDENTITY = 'DocsSampleEKMKeyVault',
    SECRET = '<New Secret>';
    
  3. 重启 SQL Server 服务。

注意

如果在可用性组(AG)中使用 EKM,则需要更改凭据,并在 AG 的所有节点上重启 SQL Server 服务。

使用新的 AKV 密钥或新的 AKV 密钥版本来轮换非对称密钥

注意

  • 手动轮换 AKV 密钥时,SQL Server 支持无 AKV 版本密钥或版本控制密钥,而无需使用不同的 AKV 密钥。
  • 可以轮换原始 AKV 密钥,从而创建一个新版本,从而替换在 SQL Server 中创建的上一个密钥。
  • 对于手动密钥轮换,必须创建新的 SQL Server 非对称密钥,来引用 AKV 中轮换的无版本密钥或版本控制密钥。 对于新的 SQL Server 非对称密钥,将使用 AKV 中最高的密钥版本,自动选择无版本 AKV 密钥。 对于版本控制密钥,必须使用语法 WITH PROVIDER_KEY_NAME = <key_name>/<version> 标记 AKV 中的最高版本。 可以更改数据库加密密钥,以便使用新的非对称密钥重新加密。 可将同一密钥名称(版本控制或无版本)用于 AKV 轮换策略。 对于版本控制密钥,必须添加当前版本。 对于无版本密钥,可使用相同的密钥名称。

SQL Server 没有自动轮换用于 TDE 的非对称密钥的机制。 手动轮换非对称密钥的步骤如下。

  1. 初始设置中使用的凭证 (sysadmin_ekm_cred) 也可以重用于密钥轮换。 (可选)为新的非对称密钥创建新凭证。

    CREATE CREDENTIAL <new_credential_name>
        WITH IDENTITY = <key vault>,
        SECRET = 'existing/new secret'
        FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM;
    
  2. 将凭证添加到主体:

    ALTER LOGIN [domain\userName];
    ADD CREDENTIAL <new_credential_name>;
    
  3. 基于新密钥创建新的非对称密钥(在轮换密钥后)。 新密钥可以是无版本密钥(我们示例中的 ContosoRSAKey0),也可以是版本控制密钥(ContosoRSAKey0/1a4d3b9b393c4678831ccc60def75379,其中 1a4d3b9b393c4678831ccc60def75379 为 AKV 中更新的密钥版本):

    CREATE ASYMMETRIC KEY <new_ekm_key_name>
     FROM PROVIDER [AzureKeyVault_EKM]
     WITH PROVIDER_KEY_NAME = <new_key_from_key_vault>,
     CREATION_DISPOSITION = OPEN_EXISTING;
    
  4. 基于 SQL Server 中的非对称密钥创建新的登录名:

    CREATE LOGIN <new_login_name>
    FROM ASYMMETRIC KEY <new_ekm_key_name>;
    
  5. 从主体中删除凭证:

    ALTER LOGIN [domain\username]
    DROP CREDENTIAL <new_credential_name>;
    
  6. 将 AKV 凭据映射到新登录名:

    ALTER LOGIN <new_login_name>;
    ADD CREDENTIAL <new_credential_name>;
    
  7. 更改数据库加密密钥 (DEK) ,以便使用新的非对称密钥重新加密:

    USE [databaseName];
    GO
    ALTER DATABASE ENCRYPTION KEY ENCRYPTION BY SERVER ASYMMETRIC KEY <new_ekm_key_name>;
    
  8. 可以验证数据库中使用的新的非对称密钥和加密密钥:

    SELECT encryptor_type, encryption_state_desc, encryptor_thumbprint
    FROM sys.dm_database_encryption_keys
    WHERE database_id = DB_ID('databaseName');
    

    此指纹应与路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQL Server Cryptographic Provider\Azure Key Vault\<key_vault_url>\<thumbprint> 下的注册表项匹配,并提供用于轮换密钥的 KeyUri

重要

为服务器轮换逻辑 TDE 保护器,意味着切换到用于保护服务器加密密钥 (DEK) 的新非对称密钥或证书。 密钥轮换是一种在线操作,应该只需数秒即可完成,因为此操作只在解密 DEK 后重新将其加密,而不是对整个数据库进行操作。

在轮换之后,不要删除旧版密钥。 轮换密钥时,某些数据仍使用以前的密钥进行加密,例如旧版数据库备份、备份的日志文件、虚拟日志文件 (VLF) 和事务日志文件。 数据库恢复或数据库还原可能需要使用以前的密钥。