适用于:SQL Server
在本文中,你将安装和配置用于Azure 密钥保管库的 SQL Server 连接器,然后使用Azure 密钥保管库中的密钥配置 透明数据加密 (TDE)。
先决条件
在开始对SQL Server实例使用Azure 密钥保管库之前,请确保满足以下先决条件:
必须拥有 Azure 订阅。
创建 Microsoft Entra 租户。
使用 Azure 密钥保管库查看可扩展密钥管理(EKM)存储的原则。 请参阅使用 Azure 密钥保管库 的可扩展密钥管理(SQL Server)。
可以在SQL Server计算机上修改注册表。
安装基于当前运行的 SQL Server 版本的 Visual Studio C++ Redistributable 版本:
SQL Server 版本 Visual Studio C++ 可再发行组件版本 2008、2008 R2、2012、2014 Visual Studio 2013 的 Visual C++可再发行组件包 2016, 2017, 2019, 2022, 2025 Visual C++可再发行组件,适用于Visual Studio 2015 如果计划在防火墙后面或通过代理服务器使用适用于 Azure 密钥保管库 的 SQL Server 连接器,请阅读 在防火墙后面访问 Azure 密钥保管库。
注释
在 SQL Server 2022(16.x) CU 12 及更高版本中,Linux 上的 SQL Server支持使用 Azure 密钥保管库 进行 TDE 可扩展密钥管理。 Linux 上的 SQL Server 不需要本指南中的步骤 3 和 4。
快速流
- 在步骤 1 中选择身份验证模型 :设置身份验证模型。
- 在步骤 2:创建密钥保管库中创建密钥保管库和密钥。
- 在步骤 3 中安装连接器:安装SQL Server连接器。
- 在 步骤 4:添加注册表项以支持 EKM 提供程序 中配置注册表前提条件。
- 在步骤 5 中配置SQL Server并验证加密:配置SQL Server。
步骤 1:设置身份验证模型
Important
在继续之前选择身份验证模型:
- 对于本地 SQL Server,请使用服务主体选项卡。
- 对于支持托管标识的 Azure VM 上的 SQL Server 或已启用 Azure Arc 的 SQL Server,请使用 托管标识 选项卡。
身份验证模型支持矩阵:
| 身份验证模型 | SQL Server 版本 | 运行SQL Server的位置 | 支持 |
|---|---|---|---|
| 服务主体 | 本文介绍的支持版本 | 本地部署、Azure VM、已启用 Azure Arc 的 SQL Server | 是的 |
| 托管标识 | SQL Server 2022 CU17 及更高版本 | Azure VM | 是的 |
| 托管标识 | SQL Server 2025 及更高版本 | 由Azure Arc启用的SQL Server | 是的 |
| 托管标识 | Any | On-premises | 否 |
要向 Azure 密钥保管库授予 SQL Server 实例访问权限,需要在 Microsoft Entra ID 中具有服务主体帐户。
登录到 Azure 门户,并执行以下步骤之一:
选择“Microsoft Entra ID”按钮。
选择“更多服务”,然后在“所有服务”窗格中键入“Microsoft Entra ID”。
通过执行以下步骤,将应用程序注册到 Microsoft Entra ID。 有关详细的分步说明,请参阅 Azure 密钥保管库 博客文章《Azure 密钥保管库 – Step by Step》中的“获取应用程序标识”部分。
在 Microsoft Entra ID 资源的“管理”一节上,选择“应用注册”。
在“应用注册”页中,选择“新建注册”。
在“注册应用程序”窗格中,输入应用面向用户的名称,然后选择“注册”。
在左窗格中,选择“证书和机密>>”新建客户端机密。
在“添加客户端密码”下,输入说明和适当的到期时间,然后选择“添加”。 不能选择超过 24 个月的过期期限。 有关详细信息,请参阅 “添加客户端密码”。
在“证书和机密”窗格的“值”下,选择客户端机密值旁边的“复制”按钮,以在SQL Server中创建非对称密钥。
在左窗格中,选择“概述”,然后在“应用程序”(客户端)ID 框中复制该值以在SQL Server中创建非对称密钥。
步骤 2:创建密钥保管库
选择要用于创建密钥保管库的方法。
注释
仅支持 Azure 密钥保管库 和 Azure 密钥保管库 托管 HSM。 不支持 Azure 云 HSM。
- Azure 门户
- PowerShell
使用 Azure 门户创建密钥保管库
若要使用 Azure 门户创建密钥保管库,请参阅快速入门:使用 Azure 门户创建密钥保管库。
Azure 基于角色的访问控制
使用Azure基于角色的访问控制(RBAC)管理对Azure 密钥保管库的访问权限。 请勿使用旧访问策略。 旧访问策略具有已知的安全漏洞,缺乏对Privileged Identity Management(PIM)的支持,不应用于关键数据和工作负荷。 有关 Azure 密钥保管库 RBAC 权限的详细信息,请参阅 密钥保管库 数据平面操作的 Azure 内置角色。
转到你创建的密钥保管库资源,然后选择“访问控制 (IAM)”设置。
选择“添加”>“添加角色分配”。
EKM 应用程序或托管标识需要密钥保管库加密服务加密用户角色来执行包装和解包操作。 搜索密钥保管库加密服务加密用户并选择该角色。 选择“下一步”。
在“成员”选项卡中,选择“选择成员”选项,然后搜索在步骤 1 中创建Microsoft Entra应用程序或托管标识。 选择应用程序或托管标识,然后选择 “选择 ”按钮。
选择查看 + 分配两次,以完成角色分配。
创建密钥
创建密钥的用户需要“密钥保管库管理员”角色。 与先前步骤一样,添加创建密钥的成员并分配角色。
在“密钥保管库”窗格中,选择“密钥”,然后选择“生成/导入选项”。 此操作将打开 “创建密钥 ”窗格。 选择“生成”选项并输入密钥的名称。 SQL Server 连接器要求密钥名称只能使用字符 “a-z”、“A-Z”、“0-9” 和 “-”,其长度限制为 26 个字符。
使用 RSA 作为密钥类型,使用 2048 作为“RSA 密钥大小”。 EKM 当前仅支持 RSA 密钥。 根据需要设置激活日期和到期日期并将“是否启用?”设置为”是”。
配置 Azure 密钥保管库 托管式 HSM(可选)
Azure 密钥保管库 托管 HSM(硬件安全模块)在使用最新版本的 SQL Server Connector 时,支持 SQL Server、Azure 虚拟机 (VM) 上的 SQL Server,以及 Azure SQL。 托管 HSM 是一种完全托管、高度可用的单一租户 HSM 服务。 托管 HSM 为加密操作和密钥存储提供了安全的基础。 托管 HSM 旨在满足最严格的安全性和合规性要求。
步骤 2 演示如何在 Azure 密钥保管库 中创建密钥保管库和密钥。 可以选择使用Azure 密钥保管库托管 HSM 来存储或创建SQL Server连接器的密钥。 执行以下步骤:
使用 Azure 门户、Azure CLI、PowerShell 或 ARM 模板创建Azure 密钥保管库托管 HSM。
激活托管 HSM。 只有创建过程中分配的指定管理员才能激活它。 在Azure门户中,选择托管 HSM 资源,然后在“概述”菜单中选择“下载安全域”。 按照任一快速入门中的说明激活托管 HSM。
授予 Microsoft Entra 服务主体或托管标识访问托管 HSM 的权限。 托管 HSM 管理员角色不授予创建密钥的权限。 与 步骤 2 类似,EKM 应用程序或托管标识需要 托管 HSM 加密用户 或 托管 HSM 加密服务加密用户 角色来执行包装和解包操作。 有关详细信息,请参阅托管 HSM 的本地 RBAC 内置角色。
在 Azure 密钥保管库 托管 HSM 服务菜单中的“设置”下,选择“密钥”。 在“密钥”窗口中,选择“生成/导入/还原备份”以创建密钥或导入现有密钥。
注释
从 SQL Server 2022(16.x) 累积更新 13 开始,支持 RSA-HSM_2048 和 RSA-HSM_3072 算法。
Azure 密钥保管库托管 HSM 支持自动密钥轮换。 有关详细信息,请参阅 在 Azure 托管 HSM 中配置密钥自动轮换。
托管 HSM 支持专用终结点连接。 有关详细信息,请参阅 将托管 HSM 与 Azure 专用链接集成。 在此配置中,必须在 Azure 密钥保管库 Managed HSM 的网络设置中启用Microsoft 受信任服务绕过选项。
步骤 3:安装 SQL Server 连接器
让SQL Server管理员从Microsoft 下载中心下载最新版本的 SQL Server Connector for Microsoft Azure 密钥保管库,并运行安装程序。
默认情况下,连接器安装在 C:\Program Files\SQL Server Connector for Microsoft Azure 密钥保管库。 可以在安装过程中更改此位置。 如果对其进行更改,请调整下一部分中的脚本。
成功安装后,会将 Microsoft.AzureKeyVaultService.EKM.dll 放置在该计算机上。 此程序集是加密 EKM 提供程序 DLL。 使用CREATE CRYPTOGRAPHIC PROVIDER语句将它注册到 SQL Server。
安装程序还提供用于SQL Server加密的示例脚本。
有关错误代码说明、配置设置或维护任务,请参阅:
步骤 4:添加注册表项以支持 EKM 提供程序
Warning
只有确切知道自己在做什么的 SQL Server 管理员才应该修改注册表。 不正确的更改可能会导致严重的问题。 在进行任何更改之前备份注册表,以便在出现问题时还原注册表。
运行 regedit 以打开注册表编辑器。
在
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQL Server Cryptographic Provider处创建SQL Server Cryptographic Provider注册表项。右键单击
SQL Server Cryptographic Provider注册表项,然后选择“ 权限”。授予对运行SQL Server服务的用户帐户的密钥的
SQL Server Cryptographic Provider。
依次选择“应用”、“确定” 。
关闭注册表编辑器并重启 SQL Server 服务。
注释
如果在故障转移群集实例上将 TDE 与 EKM 或 Azure 密钥保管库 配合使用,还应将
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.常见问题解答。
阶段 1:在 master 中配置加密提供程序和凭据
选择身份验证模型并按照匹配的步骤进行操作。
运行 sqlcmd 或打开 SQL Server Management Studio。
通过运行以下 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;在 SQL Server 中将 SQL Server 连接器注册为 EKM 提供程序。
使用 SQL Server 连接器(Azure 密钥保管库的 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 个字符。
为 SQL Server 登录名设置 SQL Server 凭据以使用密钥保管库。
为每个使用密钥保管库中的密钥执行加密的登录名添加一个凭据。 凭据和登录名之间存在一对一映射 - 每个登录名必须具有唯一凭据。
通过以下方式修改此 Transact-SQL 脚本:
编辑
IDENTITY参数 (DocsSampleEKMKeyVault) 以指向 Azure 密钥保管库。- 如果使用 全局 Azure,请将
IDENTITY参数替换为 步骤 2:创建密钥保管库中的 Azure 密钥保管库 的名称。 - 如果你使用的是专用 Azure 云(例如 Azure 政府、由世纪互联运营的 Microsoft Azure 或 Azure 德国),请将
IDENTITY参数替换为 使用 PowerShell 创建密钥保管库和密钥中返回的保管库 URI。 密钥保管库 URI 中不能包含https://。
- 如果使用 全局 Azure,请将
将
SECRET参数的第一部分替换为来自 步骤 1:设置身份验证模型 的 Microsoft Entra 客户端 ID。 在本示例中,“客户端 ID”为d956f6b9xxxxxxx。Important
从应用(客户端)ID 中删除连字符。
使用步骤 1 中的客户端密钥补全
SECRET参数的第二部分。 最后一个字符串是一个长序列的字母和数字,没有连字符(客户端机密本身中的任何连字符除外)。
USE master; CREATE CREDENTIAL sysadmin_ekm_cred -- Set IDENTITY to the vault name (public Azure) or full vault hostname without https:// (sovereign clouds / Managed HSM) -- See https://dotnet.territoriali.olinfo.it/azure/key-vault/general/about-keys-secrets-certificates#dns-suffixes-for-base-url WITH IDENTITY = 'DocsSampleEKMKeyVault', --<----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;有关使用变量和以编程方式从客户端 ID 中删除连字符的示例,请参阅 CREATE CREDENTIAL。
在SQL Server实例中打开Azure 密钥保管库密钥。
无论你是在步骤 2:创建密钥保管库中创建了新密钥,还是导入了非对称密钥,都请使用
CREATE ASYMMETRIC KEY在 SQL Server 中打开该密钥。Important
在执行此步骤之前,请完成注册表先决条件。
在以下示例中:
- 将
EKMSampleASYKey替换为你想在 SQL Server 中使用的名称。 - 将
ContosoRSAKey0替换为 Azure 密钥保管库 或托管 HSM 中的密钥名称。
使用无版本密钥名称(建议用于大多数方案):
CREATE ASYMMETRIC KEY EKMSampleASYKey FROM PROVIDER [AzureKeyVault_EKM] WITH PROVIDER_KEY_NAME = 'ContosoRSAKey0', CREATION_DISPOSITION = OPEN_EXISTING;需要将操作固定到一个版本时,请使用特定的密钥版本:
CREATE ASYMMETRIC KEY EKMSampleASYKey FROM PROVIDER [AzureKeyVault_EKM] WITH PROVIDER_KEY_NAME = 'ContosoRSAKey0/1a4d3b9b393c4678831ccc60def75379', CREATION_DISPOSITION = OPEN_EXISTING;在此示例中,
1a4d3b9b393c4678831ccc60def75379是SQL Server用于数据库操作的特定密钥版本。- 将
使用在前面步骤中创建的 SQL Server 非对称密钥来创建新的登录名。
-- Create a login that associates the asymmetric key with this login CREATE LOGIN TDE_Login FROM ASYMMETRIC KEY EKMSampleASYKey;将凭据映射从原始管理员登录名移动到从非对称密钥创建的登录名。
SQL Server使用从非对称密钥 (
TDE_Login) 创建的登录名执行 EKM 操作。 为了确保 SQL Server 在加密和恢复操作期间可以访问 Azure 密钥保管库,请将凭据映射到TDE_Login,而不是原始安装登录名。-- Remove the service principal credential from the original setup login ALTER LOGIN [<domain>\<login>] DROP CREDENTIAL sysadmin_ekm_cred; -- Map the service principal credential to the login created from the asymmetric key ALTER LOGIN TDE_Login ADD CREDENTIAL sysadmin_ekm_cred;
阶段 2:加密和验证用户数据库
配置要加密的用户数据库
使用Azure 密钥保管库密钥创建要加密的测试数据库。
-- Create a test database for the TDE example. CREATE DATABASE TestTDE;使用服务器非对称密钥 (
EKMSampleASYKey) 创建数据库加密密钥。USE TestTDE; -- Create a DEK protected by the EKM asymmetric key. CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER ASYMMETRIC KEY EKMSampleASYKey;通过设置
ENCRYPTION ON在数据库上启用 TDE。-- Enable TDE for the database. ALTER DATABASE TestTDE SET ENCRYPTION ON;
验证密钥使用情况和加密状态
在
master数据库中,执行以下 Transact-SQL 查询,验证 EKM 非对称密钥是否存在并捕获其指纹。SELECT name, algorithm_desc, thumbprint FROM sys.asymmetric_keys;该语句返回如下所示的输出:
name algorithm_desc thumbprint EKMSampleASYKey RSA_2048 <key thumbprint>在用户数据库中(
TestTDE),执行以下 Transact-SQL 查询来验证是否已启用 TDE,并且数据库加密密钥是否受非对称密钥的保护。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>确认是否
encryptor_thumbprint与从sys.asymmetric_keys中返回的指纹匹配。 不匹配通常表示数据库加密密钥受到与预期不同的密钥的保护。
清理
使用与配置的身份验证模型匹配的清理步骤。
清理在此过程中创建的测试对象。
-- CLEAN UP: shared objects + service principal credential USE master; GO ALTER DATABASE [TestTDE] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [TestTDE]; GO DROP LOGIN [TDE_Login]; GO DROP ASYMMETRIC KEY [EKMSampleASYKey]; DROP CRYPTOGRAPHIC PROVIDER [AzureKeyVault_EKM]; GO DROP CREDENTIAL [sysadmin_ekm_cred]; GO查看是否应删除
SQL Server Cryptographic Provider注册表项。Important
删除 EKM 密钥后,
SQL Server Cryptographic Provider注册表项不会自动删除。仅当不再需要实例中的 EKM 时,才删除此注册表项。 删除它太早可能会中断 EKM 功能和恢复操作。
注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SQL Server Cryptographic Provider
使用 Azure 密钥保管库 轮换 TDE 的非对称密钥
对密钥轮换步骤使用专用操作指南,包括特定于身份验证的脚本、验证和安全检查:
Important
在轮换之后,不要删除旧版密钥。 恢复较旧的备份、日志文件和恢复工件时,仍可能需要较早版本。