在 SQL Server 上使用 Azure 密钥保管库 轮换 TDE 的非对称密钥

适用于:SQL Server

本文介绍如何使用可扩展密钥管理(EKM)和Azure 密钥保管库手动轮换透明数据加密(TDE)使用的非对称密钥。

使用 Azure 密钥保管库 配置 TDE 后使用此过程。 有关初始设置说明,请参阅使用SQL Server Azure 密钥保管库设置透明数据加密

Important

SQL Server不会自动轮换用于 TDE 的非对称密钥。 旋转是手动操作。

轮换逻辑 TDE 保护器是一种联机操作,通常快速完成,因为SQL Server只重新加密数据库加密密钥(DEK),而不是整个数据库。

轮换后不要删除以前的密钥版本。 较早版本仍可能是还原旧备份、事务日志或其他恢复文件所必需的。

在您开始之前

  • 完成初始 EKM 和 TDE 设置。
  • 验证SQL Server当前是否可以访问密钥保管库。
  • 确保你有权在SQL Server中创建凭据、登录名和非对称密钥。
  • 确保身份验证模型仍然有效:
    • 服务主体:应用注册和客户端密码有效。
    • 托管标识:SQL Server托管标识仍处于启用状态,并且具有所需的密钥权限。

轮换密钥

选择身份验证模型并按照匹配的步骤进行操作。

  1. 在Azure 密钥保管库或托管 HSM 中,轮换密钥:

    • 创建相同密钥名称的新版本,或
    • 创建新的密钥名称。
  2. 在SQL Server中,根据需要为轮换操作创建凭据。

    CREATE CREDENTIAL <new_credential_name>
       WITH IDENTITY = <key_vault_name_or_uri_without_https>,
       SECRET = '<client_id_without_hyphens><client_secret>'
       FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM;
    
  3. 将凭据添加到创建下一个非对称密钥的设置主体。

    ALTER LOGIN [<domain>\<login>]
       ADD CREDENTIAL [<new_credential_name>];
    
  4. 从 Azure 密钥保管库 创建新的 SQL Server 非对称密钥。

    注释

    对于手动轮换,SQL Server同时支持无版本密钥名称和版本控制密钥引用:

    • 无版本号:使用 <key_name> 让 SQL Server 使用 Azure 密钥保管库 中最高可用的密钥版本。
    • 已版本化:使用 <key_name>/<version> 将加密操作锁定到特定的密钥版本。

    无需为了进行轮换而创建不同的 AKV 密钥名称。 通过创建新的密钥版本,然后创建引用无版本形式或带版本形式的新 SQL Server 非对称密钥来轮换密钥。

    使用无版本密钥名称或特定密钥版本:

    CREATE ASYMMETRIC KEY <new_ekm_key_name>
       FROM PROVIDER [AzureKeyVault_EKM]
       WITH PROVIDER_KEY_NAME = '<key_name_or_key_name/version>',
       CREATION_DISPOSITION = OPEN_EXISTING;
    
  5. 从新的非对称密钥创建新的登录名。

    CREATE LOGIN <new_login_name>
       FROM ASYMMETRIC KEY <new_ekm_key_name>;
    
  6. 将凭据映射从设置登录迁移到新的非对称密钥登录方式。

    ALTER LOGIN [<domain>\<login>]
       DROP CREDENTIAL [<new_credential_name>];
    
    ALTER LOGIN <new_login_name>
       ADD CREDENTIAL [<new_credential_name>];
    
  7. 使用新的非对称密钥重新加密数据库加密密钥(DEK)。

    USE [<database_name>];
    GO
    ALTER DATABASE ENCRYPTION KEY
       ENCRYPTION BY SERVER ASYMMETRIC KEY <new_ekm_key_name>;
    

验证旋转

  1. 验证数据库的加密元数据。

    SELECT encryptor_type,
           encryption_state_desc,
           encryptor_thumbprint
    FROM sys.dm_database_encryption_keys
    WHERE database_id = DB_ID('<database_name>');
    
  2. 验证SQL Server非对称密钥指纹。

    SELECT name,
           algorithm_desc,
           thumbprint
    FROM sys.asymmetric_keys
    WHERE name = '<new_ekm_key_name>';
    
  3. 确认指纹匹配。