使用具有 SQL 加密功能的 SQL Server 连接器

适用范围:SQL Server

使用由 Azure 密钥保管库保护的非对称密钥的常见 SQL Server 加密活动包括以下三个方面。

  • 使用 Azure 密钥保管库的非对称密钥实现透明数据加密

  • 通过使用 Key Vault 的非对称密钥加密备份文件

  • 通过使用 Key Vault 的非对称密钥实现列级加密

请先完成主题 Setup Steps for Extensible Key Management Using the Azure Key Vault(使用 Azure 密钥保管库的可扩展密钥管理的设置步骤)的第 I 到 IV 部分,然后执行该主题中的步骤。

注意

已替换版本 1.0.0.440 和更早的版本,且生产环境不再支持这些版本。 要升级至版本 1.0.1.0 或更高版本,请访问 Microsoft 下载中心 ,并参照“升级 SQL Server 连接器”下 SQL Server 连接器维护与故障排除页面上的指南。

注意

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

使用 Azure 密钥保管库的非对称密钥实现透明数据加密

完成主题“Setup Steps for Extensible Key Management Using the Azure Key Vault(使用 Azure 密钥保管库的可扩展密钥管理的设置步骤)”的第 I 到 IV 部分之后,使用 Azure 密钥保管库密钥来加密使用 TDE 的数据库加密密钥。 有关使用 PowerShell 轮换密钥的详细信息,请参阅使用 PowerShell 轮换透明数据加密 (TDE) 保护程序

重要

在滚动更新之后,请勿删除旧版密钥。 轮换更新密钥时,某些数据仍使用以前的密钥进行加密,例如旧版数据库备份、备份的日志文件和事务日志文件。

你需要创建一个凭据和登录名,以及创建一个可以对数据库中的数据和日志进行加密的数据库加密密钥。 若要对数据库进行加密,需要有数据库的 CONTROL 权限。 下图显示了使用 Azure 密钥保管库时的加密密钥的层次结构。

该图显示了使用 Azure Key Vault 时加密密钥的层次结构。

  1. 创建要用于 TDE 的数据库引擎的 SQL Server 凭据

    在数据库加载期间数据库引擎使用 Microsoft Entra 应用程序凭据来访问密钥保管库。 我们建议为数据库引擎创建另一个客户端 ID密钥(按步骤 1 中所述),以限制所授予的密钥保管库权限。

    采用以下方式修改下面的 Transact-SQL 脚本:

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

      • 如果使用“全局 Azure”,请将 IDENTITY 参数替换为第 II 部分中的 Azure Key Vault 的名称
      • 如果你使用的是私有 Azure 云(例如,Azure 政府、由世纪互联或 Azure 德国运营的 Azure),请将 IDENTITY 参数替换为在步骤 3 第 II 部分中的返回的保管库 URI。 保管库 URI 中不能包含 “https://” 。
    • SECRET 参数的第一部分替换为步骤 1 中的 Microsoft Entra 应用程序客户端 ID。 在本示例中,“客户端 ID”EF5C8E094D2A4A769998D93440D8115D

      重要

      必须删除 客户端 ID中的连字符。

    • 使用第 I 部分的“客户端密码”完成 SECRET 参数的第二部分。在本示例中,第 I 部分的“客户端密码”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;  
    
  2. 为适用于 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  
    
  3. 创建数据库加密密钥 (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  
    
  4. 启用 TDE

    -- Alter the database to enable transparent data encryption.  
    ALTER DATABASE ContosoDatabase   
    SET ENCRYPTION ON;  
    GO  
    

    使用 Management Studio,通过对象资源管理器连接到数据库,以确认是否已启用 TDE。 右键单击数据库,指向“任务”,然后单击“管理数据库加密”。

    显示对象资源管理器的屏幕截图,其中已选择“任务”>“管理数据库加密”。

    在“管理数据库加密”对话框中,确认 TDE 处于打开状态,以及使用哪个非对称密钥对 DEK 进行加密。

    “管理数据库加密”对话框的屏幕截图,其中“将数据库加密设置为开”选项处于选中状态,黄色横幅显示“现已启用 TDE”。

    或者,你可以执行以下 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 数据库。

通过使用 Key Vault 的非对称密钥加密备份文件

从 SQL Server 2014 (12.x) 开始,支持加密备份。 以下示例创建并还原了经过数据加密密钥加密的备份文件,其中该加密密钥受到 key vault 中的非加密密钥保护。
在数据库加载期间数据库引擎使用 Microsoft Entra 应用程序凭据来访问密钥保管库。 我们建议为数据库引擎创建另一个客户端 ID密钥(按步骤 1 中所述),以限制所授予的密钥保管库权限。

  1. 创建要用于备份加密的数据库引擎的 SQL Server 凭据

    采用以下方式修改下面的 Transact-SQL 脚本:

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

      • 如果使用“全局 Azure”,请将 IDENTITY 参数替换为第 II 部分中的 Azure Key Vault 的名称
      • 如果你使用的是私有 Azure 云(例如,Azure 政府、由世纪互联或 Azure 德国运营的 Azure),请将 IDENTITY 参数替换为在步骤 3 第 II 部分中的返回的保管库 URI。 保管库 URI 中不能包含 “https://” 。
    • SECRET 参数的第一部分替换为步骤 1 中的 Microsoft Entra 应用程序客户端 ID。 在本示例中,“客户端 ID”EF5C8E094D2A4A769998D93440D8115D

      重要

      必须删除 客户端 ID中的连字符。

    • 使用第 I 部分的 SECRET 客户端密码 完成 参数的第二部分。在此示例中,第 I 部分的 客户端密码Replace-With-AAD-Client-SecretSECRET 参数的最终字符串是一长串 不带连字符的字母和数字。

      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;    
      
  2. 创建要用于备份加密的数据库引擎的 SQL Server 登录名

    创建数据库引擎将用于加密备份的 SQL Server 登录名,然后添加步骤 1 中的凭据。 此 Transact-SQL 示例使用之前导入的相同密钥。

    重要

    如果你已将该非对称密钥用于 TDE (以上示例) 或列级加密 (以下示例),则不能将此同一个密钥用于备份加密。

    此示例使用存储在密钥保管库中的 CONTOSO_KEY_BACKUP 非对称密钥,该密钥可以是之前为 master 数据库导入或创建的,如前面的第 IV 部分第 5 步所述。

    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  
    
  3. 备份数据库

    备份数据库,同时使用密钥保管库中存储的非对称密钥指定加密。

    请注意,在下面的示例中,如果数据库已使用 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  
    
  4. 还原数据库

    若要还原使用 TDE 加密的数据库备份,目标 SQL Server 实例必须先对用于加密的非对称密钥保管库密钥进行复制。 为此,可执行如下操作:

    • 如果用于 TDE 的原始非对称密钥不再位于 Key Vault 中,请还原 Key Vault 密钥备份,或者从本地 HSM 重新导入该密钥。 重要提示:为了让密钥的指纹与数据库备份中记录的指纹匹配,密钥的名称与以前的原始名称必须为同一 Key Vault 密钥名称

    • 对目标 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)

通过使用 Key Vault 的非对称密钥实现列级加密

以下示例创建了受 key vault 中非对称密钥保护的对称密钥。 然后该对称密钥用于对数据库中的数据进行加密。

重要

如果已将该密钥用于备份加密,则不能将此同一个非对称密钥用于列级加密。

此示例使用存储在密钥保管库中的 CONTOSO_KEY_COLUMNS 非对称密钥,该密钥可能是以前导入或创建的,如 Setup Steps for Extensible Key Management Using the Azure Key Vault(使用 Azure 密钥保管库的可扩展密钥管理的设置步骤)的第 3 部分的步骤 3 所述。 若要在 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;  

另请参阅

Setup Steps for Extensible Key Management Using the Azure Key Vault(使用 Azure 密钥保管库的可扩展密钥管理的设置步骤)
使用 Azure Key Vault 的可扩展密钥管理
EKM provider enabled 服务器配置选项
SQL Server 连接器维护与故障排除