使用 PowerShell 删除透明数据加密 (TDE) 保护器

适用于: Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics(仅限专用 SQL 池)

本文章介绍如何针对使用 TDE(支持“Azure Key Vault 中的客户托管密钥 - 创建自己的密钥 (BYOK)”)的 Azure SQL 数据库或 Azure Synapse Analytics,响应可能已泄露的 TDE 保护器。 若要详细了解 TDE 的 BYOK 支持,请参阅概述页

注意

本文概述的过程仅应在极端情况下或在测试环境中执行。 请仔细查看相关步骤,因为从 Azure Key Vault 中删除活跃使用的 TDE 保护器将导致数据库不可用。

如果怀疑某个密钥已泄露,以致某个服务或用户在未经授权的情况下访问该密钥,则最好是删除该密钥。

请记住,在 Key Vault 中删除了 TDE 保护器后,在长达 10 分钟的时间内,所有加密数据库将开始拒绝所有带有相应错误消息的连接,并将其状态更改为无法访问

本操作指南介绍了在对入侵事件进行响应后使数据库不可访问的方法。

注意

本文适用于 Azure SQL 数据库、Azure SQL 托管实例和 Azure Synapse Analytics(专用 SQL 池 [以前称为 SQL DW])。 有关 Synapse 工作区内专用 SQL 池的透明数据加密的文档,请参阅 Azure Synapse Analytics 加密

先决条件

  • 必须有一个 Azure 订阅,并且是该订阅的管理员。
  • 必须安装并运行 Azure PowerShell。
  • 本操作指南假设已使用 Azure Key Vault 中的密钥作为 Azure SQL 数据库或 Azure Synapse 的 TDE 保护器。 有关详细信息,请参阅支持 BYOK 的透明数据加密

有关 Az 模块安装说明,请参阅安装 Azure PowerShell。 若要了解具体的 cmdlet,请参阅 AzureRM.Sql。 使用全新 Azure PowerShell Az 模块

检查 TDE 保护程序指纹

以下步骤概述了如何检查给定数据库的虚拟日志文件 (VLF) 仍在使用的 TDE 保护程序指纹。 可以通过运行以下命令来查找数据库的当前 TDE 保护程序的指纹:

SELECT [database_id],
       [encryption_state],
       [encryptor_type], /*asymmetric key means AKV, certificate means service-managed keys*/
       [encryptor_thumbprint]
 FROM [sys].[dm_database_encryption_keys]

下面的查询返回 VLF 和 TDE 保护程序各自使用的指纹。 每个不同的指纹引用 Azure Key Vault (AKV) 中的不同密钥:

SELECT * FROM sys.dm_db_log_info (database_id)

或者,可以使用 PowerShell 或 Azure CLI:

PowerShell 命令 Get-AzureRmSqlServerKeyVaultKey 提供查询中使用的 TDE 保护程序的指纹,因此你可以查看要在 AKV 中保留哪些密钥以及删除哪些密钥。 只能放心地从 Azure Key Vault 中删除数据库不再使用的密钥。

使加密资源保持可访问

  1. 在 Key Vault 中创建新密钥。 请务必在不包含可能已泄露的 TDE 保护器的另一个 Key Vault 中创建此新密钥,因为访问控制是在保管库级别预配的。

  2. 使用 Add-AzSqlServerKeyVaultKeySet-AzSqlServerTransparentDataEncryptionProtector cmdlet 将新密钥添加到服务器,并将其更新为服务器的新 TDE 保护器。

    # add the key from Key Vault to the server  
    Add-AzSqlServerKeyVaultKey -ResourceGroupName <SQLDatabaseResourceGroupName> -ServerName <LogicalServerName> -KeyId <KeyVaultKeyId>
    
    # set the key as the TDE protector for all resources under the server
    Set-AzSqlServerTransparentDataEncryptionProtector -ResourceGroupName <SQLDatabaseResourceGroupName> `
        -ServerName <LogicalServerName> -Type AzureKeyVault -KeyId <KeyVaultKeyId>
    
  3. 确保使用 Get-AzSqlServerTransparentDataEncryptionProtector cmdlet 将服务器和所有副本更新到新的 TDE 保护器。

    注意

    将新 TDE 保护器传播到服务器中的所有数据库和辅助数据库可能需要几分钟时间才能完成。

    Get-AzSqlServerTransparentDataEncryptionProtector -ServerName <LogicalServerName> -ResourceGroupName <SQLDatabaseResourceGroupName>
    
  4. 在 Key Vault 中创建新密钥的备份

    # -OutputFile parameter is optional; if removed, a file name is automatically generated.
    Backup-AzKeyVaultKey -VaultName <KeyVaultName> -Name <KeyVaultKeyName> -OutputFile <DesiredBackupFilePath>
    
  5. 使用 Remove-AzKeyVaultKey cmdlet 从密钥保管库中删除已泄露的密钥。

    Remove-AzKeyVaultKey -VaultName <KeyVaultName> -Name <KeyVaultKeyName>
    
  6. 将来若要使用 Restore-AzKeyVaultKey cmdlet 将密钥还原到 Key Vault:

    Restore-AzKeyVaultKey -VaultName <KeyVaultName> -InputFile <BackupFilePath>
    

使加密的资源不可访问

  1. 删除可能已泄露的密钥所加密的数据库。

    数据库和日志文件会自动备份,因此,随时可对数据库执行时间点还原(只要提供密钥即可)。 必须在删除活动的 TDE 保护器之前删除数据库,以防止最近事务的数据丢失(最长 10 分钟的数据)。

  2. 在 Key Vault 中备份 TDE 保护器的密钥材料。

  3. 从 Key Vault 中删除可能已泄露的密钥。

注意

对密钥保管库进行的任何权限更改都可能需要 10 分钟左右的时间才能生效。 这包括撤销对 AKV 中 TDE 保护程序的访问权限,但让用户在此时间范围内仍具有访问权限。