在数据库中加密 BitLocker 恢复数据时 SQL Always On

对于 SQL Always On,使用加密数据库中的恢复数据中的说明加密 BitLocker 信息时,还需要执行其他步骤。 其他步骤可确保发生故障转移事件时,所有Always On节点都可以自动打开数据库主密钥 (DMK) 。 以下步骤允许无缝检索 BitLocker 密钥,而无需手动干预。

在数据库中加密 BitLocker 恢复数据时的 SQL Always On概述

SQL Server使用分层基础结构加密数据,并在加密层次结构中进行了深入介绍。

  • 站点主密钥 (SMK) - 此密钥是每个实例密钥,对于每个SQL Server Always On节点是唯一的,不会复制。 它用于加密数据库主密钥。
  • 数据库主密钥 (DMK) - 此密钥存储在数据库中并复制。 它用于加密BitLockerManagement_CERT。
  • BitLockerManagement_CERT - 此证书存储在数据库中并复制。 它用于加密某些与 BitLocker 相关的数据,例如恢复密钥。

SMK 对 DMK 密码进行加密。 SMK 特定于节点。 发生故障转移事件时,新的主节点无法解密 DMK 密码,因为它已使用不同的 SMK 进行加密。 在每个节点上设置 DMK 密码允许节点在故障转移时解密密码。

注意

BitLockerManagement_CERT对列执行加密。 如果此证书丢失或删除,或者加密该证书的 DMK 丢失或删除,则必须托管 BitLocker 密钥并重新加密。

如果已知数据库主密钥 (DMK) 密码

在承载 Configuration Manager 数据库的可用性组的每个节点上执行以下命令:

重要

在下面的命令:

  • 将任意位置替换为 password 你选择的强密码。 请确保安全地存储密码以供将来参考。
  • 将 替换为 CM_XXX Configuration Manager (CM) 数据库的名称。
EXEC sp_control_dbmasterkey_password
    @db_name = N'CM_XXX',
    @password = N'password',
    @action = N'add';

此命令将 DMK 密码注册到本地服务主密钥 (SMK) 允许SQL Server在发生故障转移事件时自动打开 DMK。 此过程可确保在故障转移或重启后,可以在该节点上自动解密 DMK。

若要验证所有节点是否可以自动打开数据库主密钥 (DMK) 并解密数据,请参阅本文中的 验证所有节点是否可以自动打开数据库主密钥 (DMK) 并解密数据 部分。

如果现有数据库主密钥 (DMK) 密码未知

如果现有 DMK 密码未知,则必须删除现有 DMK,并使用已知密码创建一个新 DMK。 这些步骤介绍了如何执行此过程。

查找有效的 DMK

如果未知哪个节点具有有效的 DMK,请按照以下步骤确定现有 DMK 的打开位置:

重要

在以下查询和命令中:

  • 将任意位置替换为 password 你选择的强密码。 请确保将密码安全地存储在已知位置以供将来参考。
  • 将 替换为 CM_XXX Configuration Manager (CM) 数据库的名称。
  1. 在主节点上运行以下查询:

    SELECT TOP 5 RecoveryAndHardwareCore.DecryptString(RecoveryKey, DEFAULT)
    FROM RecoveryAndHardwareCore_Keys
    ORDER BY LastUpdateTime DESC
    
  2. 在生成的查询中:

    • 如果 DMK 处于打开状态,查询将返回包含有效键的任何行的纯文本值。 此节点是启动的节点,可以跳过下一步。
    • 如果未打开 DMK,查询将返回所有行的 NULL 值。 当前节点不是打开 DMK 的节点。 按照下一步作,找到打开 DMK 的节点。
  3. 如果查询返回所有 NULL 值,则故障转移到每个辅助节点并重复上述步骤,直到找到可以成功解密 RecoveryAndHardwareCore_Keys 的节点。 此节点是启动的节点。

创建新的数据库主密钥 (DMK)

确定具有打开的 DMK 的正确节点后,请执行以下步骤:

  1. 在前面步骤中标识的节点上,运行以下查询以导出BitLockerManagement_CERT证书及其私钥。 请确保使用强密码:

    BACKUP CERTIFICATE BitLockerManagement_CERT
    TO FILE = 'C:\Windows\Temp\BitLockerManagement_CERT'
    WITH PRIVATE KEY
    (
        FILE = 'C:\Windows\Temp\BitLockerManagement_CERT_KEY',
        ENCRYPTION BY PASSWORD = 'password'
    );
    
  2. 通过运行以下查询导出现有 DMK,备份现有数据库主密钥 (DMK) :

    BACKUP MASTER KEY
    TO FILE = 'C:\Windows\Temp\DMK'
    ENCRYPTION BY PASSWORD = 'password';
    

    注意

    此步骤是可选的,但建议这样做。 请确保将备份保存在安全的已知位置。

  3. 运行以下查询以删除现有证书和 DMK:

    DROP CERTIFICATE BitLockerManagement_CERT;
    DROP MASTER KEY;
    

    此步骤将删除旧密钥。

  4. 运行以下查询以创建新的 DMK。 请确保使用强密码:

    CREATE MASTER KEY
    ENCRYPTION BY PASSWORD = 'password';
    
  5. 运行以下查询,将新的 DMK 密码注册到本地 SMK:

    EXEC sp_control_dbmasterkey_password
        @db_name = N'CM_XXX',
        @password = N'password',
        @action = N'add';
    
  6. 运行以下查询以导入以前导出的BitLockerManagement_CERT证书:

    CREATE CERTIFICATE BitLockerManagement_CERT AUTHORIZATION RecoveryAndHardwareCore
    FROM FILE = 'C:\Windows\Temp\BitLockerManagement_CERT'
    WITH PRIVATE KEY
    (
        FILE = 'C:\Windows\Temp\BitLockerManagement_CERT_KEY',
        DECRYPTION BY PASSWORD = 'password'
    );
    
  7. 运行以下查询以授予对证书所需的控制权限:

    GRANT CONTROL ON CERTIFICATE::BitLockerManagement_CERT TO RecoveryAndHardwareRead;
    GRANT CONTROL ON CERTIFICATE::BitLockerManagement_CERT TO RecoveryAndHardwareWrite;
    
  8. 故障转移到下一个节点。

  9. 运行以下查询,将 DMK 密码注册到本地 SMK。 每个副本 (replica) 执行一次:

    EXEC sp_control_dbmasterkey_password
        @db_name = N'CM_XXX',
        @password = N'password',
        @action = N'add';
    
  10. 在任何剩余节点上执行前两个步骤。

  11. 故障转移到原始节点。

  12. 若要验证所有节点是否可以自动打开数据库主密钥 (DMK) 并解密数据,请参阅下一部分 验证所有节点是否可以自动打开数据库主密钥 (DMK) 并解密数据

验证所有节点是否可以自动打开数据库主密钥 (DMK) 并解密数据

若要验证所有节点是否可以自动打开数据库主密钥 (DMK) 并解密数据,请执行以下作:

  1. 故障转移到节点。

  2. 运行以下查询:

    SELECT TOP 5 RecoveryAndHardwareCore.DecryptString(RecoveryKey, DEFAULT)
    FROM RecoveryAndHardwareCore_Keys
    ORDER BY LastUpdateTime DESC
    
  3. 如果查询返回具有有效密钥的任何行的纯文本值,则节点可以自动打开数据库主密钥 (DMK) 并解密数据。

  4. 对每个附加节点重复上述三个步骤。

提示

为了提高安全性,请安全地存储强 DMK 密码。 例如,在 Azure 密钥保管库或其他安全机密存储中。 此外,避免在脚本或配置文件中以纯文本格式对 DMK 密码进行硬编码。