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

适用范围: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 密钥保管库 时加密密钥的层级结构。

使用Azure 密钥保管库时加密密钥的层级结构图。

  1. 为数据库引擎创建用于 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://。
    • 将 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;  
    
  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 数据库。

通过密钥库中的非对称密钥加密备份

从 SQL Server 2014 (12.x) 开始,支持加密备份。 以下示例创建并还原一个使用由密钥保管库中的非对称密钥保护的数据加密密钥加密的备份。

数据库引擎 在数据库加载时使用 Microsoft Entra 应用凭证访问密钥库。 为限制你授予的密钥保管库权限,请为数据库引擎另外创建一个客户端 ID 和机密,具体如步骤 1:设置身份验证模型中所述。

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

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

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

      • 如果使用 全局 Azure,请将 IDENTITY 参数替换为 步骤 2:创建密钥保管库中的 Azure 密钥保管库 的名称。
      • 如果你使用私有 Azure 云(例如 Azure 政府、由 21Vianet 运营的 Microsoft Azure 或 Azure 德国),请用IDENTITY中返回的 Vault URI 替换 参数。 密钥保管库 URI 中不能包含 https://。
    • 将 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;    
      
  2. 为数据库引擎创建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  
    
  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 的原始非对称密钥已不在密钥库中,请恢复密钥库的密钥备份或从本地 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;