适用范围:SQL Server
使用由 Azure 密钥保管库 保护的非对称密钥的常见 SQL Server 加密活动可分为以下三个领域:
- 通过使用 Azure 密钥保管库 中的非对称密钥实现透明数据加密(TDE)。
- 通过密钥库中的非对称密钥加密备份。
- 通过密钥库中的非对称密钥实现列级加密。
在按照本文中的步骤操作之前,请先完成《为 SQL Server 使用 Azure 密钥保管库 设置透明数据加密》中的第 1 到第 4 步。
注意
1.0.0.440及更早版本已被替换,生产环境中不再支持。 升级到1.0.1.0或更高版本。 从Microsoft 下载中心下载当前版本,并按照SQL Server连接器维护与故障排除中“升级SQL Server连接器”部分的说明操作。
注意
Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。
通过使用 Azure 密钥保管库 中的非对称密钥实现透明数据加密
完成“为 SQL Server 使用 Azure 密钥保管库 设置 透明数据加密”的第 1 到第 4 步后,使用 Azure 密钥保管库 密钥通过 TDE 加密数据库加密密钥。 有关使用PowerShell旋转密钥的更多信息,请参见“使用PowerShell旋转透明数据加密(TDE)保护器”。
重要
密钥轮换后,不要删除该密钥的先前版本。 当密钥进行滚动时,部分数据仍使用先前的密钥加密,例如较旧的数据库备份、备份的日志文件和事务日志文件。
你需要创建一个凭据和一个登录名,并创建一个数据库加密密钥来加密数据库中的数据和日志。 加密数据库需要对该数据库具有 CONTROL 权限。 下图显示了使用 Azure 密钥保管库 时加密密钥的层级结构。
为数据库引擎创建用于 TDE 的 SQL Server 凭据
数据库引擎 在数据库加载时使用 Microsoft Entra 应用凭证访问密钥库。 为了限制你授予的密钥保管库权限,请如步骤 1:设置认证模型中所述,为 数据库引擎 创建另一个客户端 ID和Secret。
采用以下方式修改下面的 Transact-SQL 脚本:
编辑
IDENTITY参数 (ContosoDevKeyVault) 以指向 Azure 密钥保管库。- 如果使用 全局 Azure,请将
IDENTITY参数替换为 步骤 2:创建密钥保管库中的 Azure 密钥保管库 的名称。 - 如果你使用私有 Azure 云(例如 Azure 政府、由 21Vianet 运营的 Azure 或 Azure 德国),请将 参数替换为
IDENTITY中返回的 Vault URI。 密钥保管库 URI 中不能包含https://。
- 如果使用 全局 Azure,请将
将
SECRET参数的第一部分替换为步骤 1:设置身份验证模型中的 Microsoft Entra 应用客户端 ID。 在本示例中,“客户端 ID”为EF5C8E094D2A4A769998D93440D8115D。重要
必须删除 客户端 ID中的连字符。
用第一步中的
SECRET完成参数的第二部分。 在这个例子中, 客户端秘密 为ReplaceWithAADClientSecret。参数
SECRET的最后一个字符串是一长串字母和数字,其中不含连字符。
USE master; CREATE CREDENTIAL Azure_EKM_TDE_cred WITH IDENTITY = 'ContosoDevKeyVault', -- for global Azure -- WITH IDENTITY = 'ContosoDevKeyVault.vault.usgovcloudapi.net', -- for Azure Government -- WITH IDENTITY = 'ContosoDevKeyVault.vault.azure.cn', -- for Microsoft Azure operated by 21Vianet -- WITH IDENTITY = 'ContosoDevKeyVault.vault.microsoftazure.de', -- for Azure Germany SECRET = 'EF5C8E094D2A4A769998D93440D8115DReplaceWithAADClientSecret' FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov;为适用于 TDE 的数据库引擎创建 SQL Server 登录名
创建 SQL Server 登录名并添加步骤 1 中的凭据。 此 Transact-SQL 示例使用之前导入的相同密钥。
USE master; -- Create a SQL Server login associated with the asymmetric key -- for the Database engine to use when it loads a database -- encrypted by TDE. CREATE LOGIN TDE_Login FROM ASYMMETRIC KEY CONTOSO_KEY; GO -- Alter the TDE Login to add the credential for use by the -- Database Engine to access the key vault ALTER LOGIN TDE_Login ADD CREDENTIAL Azure_EKM_TDE_cred ; GO创建数据库加密密钥(DEK)
DEK会在数据库实例中加密你的数据和日志文件,然后再由Azure 密钥保管库非对称密钥加密。 你可以使用SQL Server支持的任何算法或密钥长度来创建DEK。
USE ContosoDatabase; GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER ASYMMETRIC KEY CONTOSO_KEY; GO开启TDE
-- Alter the database to enable transparent data encryption. ALTER DATABASE ContosoDatabase SET ENCRYPTION ON; GO通过 Management Studio,使用对象资源管理器连接到数据库,验证 TDE 已启用。 右键点击你的数据库,指向 任务,然后选择 管理数据库加密。
在“管理数据库加密”对话框中,确认 TDE 处于打开状态,以及使用哪个非对称密钥对 DEK 进行加密。
或者,你可以执行以下 Transact-SQL 脚本。 加密状态 3 表示已加密的数据库。
USE MASTER SELECT * FROM sys.asymmetric_keys -- Check which databases are encrypted using TDE SELECT d.name, dek.encryption_state FROM sys.dm_database_encryption_keys AS dek JOIN sys.databases AS d ON dek.database_id = d.database_id;注意
任何数据库只要启用 TDE 就会自动加密
tempdb数据库。
通过密钥库中的非对称密钥加密备份
从 SQL Server 2014 (12.x) 开始,支持加密备份。 以下示例创建并还原一个使用由密钥保管库中的非对称密钥保护的数据加密密钥加密的备份。
数据库引擎 在数据库加载时使用 Microsoft Entra 应用凭证访问密钥库。 为限制你授予的密钥保管库权限,请为数据库引擎另外创建一个客户端 ID 和机密,具体如步骤 1:设置身份验证模型中所述。
为数据库引擎创建SQL Server凭据,用于备份加密
采用以下方式修改下面的 Transact-SQL 脚本:
编辑
IDENTITY参数 (ContosoDevKeyVault) 以指向 Azure 密钥保管库。- 如果使用 全局 Azure,请将
IDENTITY参数替换为 步骤 2:创建密钥保管库中的 Azure 密钥保管库 的名称。 - 如果你使用私有 Azure 云(例如 Azure 政府、由 21Vianet 运营的 Microsoft Azure 或 Azure 德国),请用
IDENTITY中返回的 Vault URI 替换 参数。 密钥保管库 URI 中不能包含https://。
- 如果使用 全局 Azure,请将
将
SECRET参数的第一部分替换为 步骤 1:设置身份验证模型 中 Microsoft Entra 应用的 客户端 ID。 在本示例中,“客户端 ID”为EF5C8E094D2A4A769998D93440D8115D。重要
必须删除 客户端 ID中的连字符。
用步骤 1 中的
SECRET完成参数的第二部分。 在这个例子中,Client Secret 为Replace-With-AAD-Client-Secret。SECRET参数的最终字符串是一长串字母和数字,没有连字符。USE master; CREATE CREDENTIAL Azure_EKM_Backup_cred WITH IDENTITY = 'ContosoDevKeyVault', -- for global Azure -- WITH IDENTITY = 'ContosoDevKeyVault.vault.usgovcloudapi.net', -- for Azure Government -- WITH IDENTITY = 'ContosoDevKeyVault.vault.azure.cn', -- for Microsoft Azure operated by 21Vianet -- WITH IDENTITY = 'ContosoDevKeyVault.vault.microsoftazure.de', -- for Azure Germany SECRET = 'EF5C8E094D2A4A769998D93440D8115DReplace-With-AAD-Client-Secret' FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov;
为数据库引擎创建SQL Server登录以进行备份加密
创建数据库引擎用于加密备份的 SQL Server 登录名,并将步骤 1 中的凭据添加到其中。 此 Transact-SQL 示例使用之前导入的相同密钥。
重要
如果你已经用该密钥做过TDE(前例)或列级加密(下一个例子),你就不能用同一个非对称密钥做备份加密。
此示例使用存储在密钥保管库中的
CONTOSO_KEY_BACKUP非对称密钥,你可以按照步骤 2:创建密钥保管库中所述,提前为master数据库导入或创建该密钥。USE master; -- Create a SQL Server login associated with the asymmetric key -- for the Database engine to use when it is encrypting the backup. CREATE LOGIN Backup_Login FROM ASYMMETRIC KEY CONTOSO_KEY_BACKUP; GO -- Alter the Encrypted Backup Login to add the credential for use by -- the Database Engine to access the key vault ALTER LOGIN Backup_Login ADD CREDENTIAL Azure_EKM_Backup_cred ; GO备份数据库
备份数据库,指定加密,使用存储在密钥库中的非对称密钥。
在以下示例中,注意如果数据库已经用TDE加密,且非对称密钥
CONTOSO_KEY_BACKUP与TDE非对称密钥不同,备份将同时被TDE非对称密钥和CONTOSO_KEY_BACKUP加密。 目标 SQL Server 实例需要两个密钥来解密备份。USE master; BACKUP DATABASE [DATABASE_TO_BACKUP] TO DISK = N'[PATH TO BACKUP FILE]' WITH FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD, ENCRYPTION(ALGORITHM = AES_256, SERVER ASYMMETRIC KEY = [CONTOSO_KEY_BACKUP]); GO恢复数据库
要恢复用TDE加密的数据库备份,目标SQL Server实例必须首先拥有用于加密的非对称密钥保险库密钥的副本。 要提供该副本:
如果用于 TDE 的原始非对称密钥已不在密钥库中,请恢复密钥库的密钥备份或从本地 HSM 重新导入密钥。 为了使密钥的指纹与数据库备份中记录的指纹匹配,密钥必须使用其原本的同一密钥保管库密钥名称。
在目标SQL Server实例上应用步骤1和2。
当目标SQL Server实例获得用于加密备份的非对称密钥后,恢复服务器上的数据库。
示例还原代码:
RESTORE DATABASE [DATABASE_TO_BACKUP] FROM DISK = N'[PATH TO BACKUP FILE]' WITH FILE = 1, NOUNLOAD, REPLACE; GO有关备份选项的详细信息,请参阅BACKUP(Transact-SQL)。
通过使用密钥库中的非对称密钥实现列级加密
以下示例将创建一个由密钥保管库中的非对称密钥保护的对称密钥。 对称密钥随后对数据库中的数据进行加密。
重要
如果你已经用同一把非对称密钥做备份加密,就不能用同一把不对称密钥做列级加密。
此示例使用存储在密钥保管库中的 CONTOSO_KEY_COLUMNS 非对称密钥,你可以按照步骤 2:创建密钥保管库中所述,提前导入或创建该密钥。 要在 ContosoDatabase 数据库中使用该非对称密钥,请再次运行 CREATE ASYMMETRIC KEY 语句,以给 ContosoDatabase 数据库一个指向该密钥的引用。
USE [ContosoDatabase];
GO
-- Create a reference to the key in the key vault
CREATE ASYMMETRIC KEY CONTOSO_KEY_COLUMNS
FROM PROVIDER [AzureKeyVault_EKM_Prov]
WITH PROVIDER_KEY_NAME = 'ContosoDevRSAKey2',
CREATION_DISPOSITION = OPEN_EXISTING;
-- Create the data encryption key.
-- The data encryption key can be created using any SQL Server
-- supported algorithm or key length.
-- The DEK will be protected by the asymmetric key in the key vault
CREATE SYMMETRIC KEY DATA_ENCRYPTION_KEY
WITH ALGORITHM=AES_256
ENCRYPTION BY ASYMMETRIC KEY CONTOSO_KEY_COLUMNS;
DECLARE @DATA VARBINARY(MAX);
--Open the symmetric key for use in this session
OPEN SYMMETRIC KEY DATA_ENCRYPTION_KEY
DECRYPTION BY ASYMMETRIC KEY CONTOSO_KEY_COLUMNS;
--Encrypt syntax
SELECT @DATA = ENCRYPTBYKEY
(
KEY_GUID('DATA_ENCRYPTION_KEY'),
CONVERT(VARBINARY,'Plain text data to encrypt')
);
-- Decrypt syntax
SELECT CONVERT(VARCHAR, DECRYPTBYKEY(@DATA));
--Close the symmetric key
CLOSE SYMMETRIC KEY DATA_ENCRYPTION_KEY;