如何从SQL Server用户数据库中移除透明数据加密(TDE)

790 阅读10分钟

最近,透明数据加密越来越流行,因为每个企业主都在认真保护他们的数据。 每个人都想使用 ,最新的加密 技术,以确保他们的系统更加安全和稳定。SQL Server也提供了一些加密功能来保护客户的数据,如TDE(透明数据加密)、Always Encrypt等。有时,企业希望通过实施其先进的版本或加密技术来改造他们现有的加密解决方案。在实施任何较新的解决方案之前,你必须删除现有的加密解决方案。

今天,我将解释如何从你的SQL Server实例中完全删除TDE,以便你可以为你的SQL Server数据库实施另一种加密解决方案。从SQL Server数据库中删除现有的TDE实现可能有各种原因,比如你正在考虑另一个加密解决方案,你有性能问题,或者你需要将这个数据库副本或其备份发送给其他业务部门,等等。

如果我们按部就班地遵循所有的步骤,删除TDE是一个简单的过程。如果我们不按照推荐的程序,那么我们在删除它的密钥和证书时将会面临问题。我们按照创建TDE配置时的相反顺序进行操作。要从SQL Server数据库中删除TDE,需要遵循以下的活动顺序。

  1. 关闭数据库中的TDE
  2. 删除数据库加密密钥
  3. 删除证书
  4. 删除主密钥

如果你观察删除TDE的过程,你就会知道,与启用TDE的过程相比,我们的活动顺序完全相反。在启用它时,我们首先创建一个主密钥,然后创建一个证书,再创建一个数据库加密密钥,最后我们在数据库上启用透明数据加密,而我们在这里是按照相反的顺序进行的。

如果你在想,如果我们不按照这个顺序,在没有关闭数据库上的TDE的情况下,试图放弃数据库加密密钥或证书或主密钥,会发生什么?除非你按照这个顺序,否则SQL Server将不允许你删除任何密钥或证书。如果你在关闭TDE之前试图放弃它们,你将会得到以下错误。

试图在没有关闭TDE的情况下删除主密钥

Msg 15580, Level 16, State 1, Line 3 Cannot drop master key because certificate ‘TDE_DB_Cert’ is encrypted by it.

试图在不删除数据库加密密钥的情况下删除证书

Msg 3716, Level 16, State 15, Line 3 The certificate ‘TDE_DB_Cert’ cannot be dropped because it is bound to one or more database encryption key.

试图放弃数据库加密密钥而不在数据库上禁用 TDE

MSG 33115, Level 16, State 1, Line 5 Cannot drop the database encryption key because it is currently in use. Database encryption needs to be turned off to be able to drop the database encryption key.

即使你关闭了数据库的透明数据加密,并且你错过了之后的顺序来删除密钥和证书,那么SQL Server也不会允许你删除该密钥,因为主密钥和证书有依赖关系,它们是相互结合的。我们需要首先删除依赖关系,然后再进行删除过程。上述顺序将使我们能够顺利地删除它们而不出现任何问题。

让我们通过删除TDE和它的组件来清理你的系统,这样我们就可以毫无问题地实施另一个加密方案。

前提条件

一旦你决定从SQL Server数据库中删除TDE,你必须考虑以下几点作为删除前计划的一部分。

  • 对主密钥和证书进行备份,并将其保存在一个安全的地方。如果你将来需要借助其旧的备份文件来恢复这个数据库,就会需要这些密钥。
  • 如果该证书被多个数据库共享,而你只想从一个数据库中删除TDE,则不要删除该证书。如果你想从TDE中清理出完整的实例,那么你可以继续进行删除。
  • 如果你有一个临时删除TDE的要求,那么不要删除它的主密钥和证书。你可以直接从数据库中关闭TDE,然后通过运行ALTER语句打开TDE。
  • 如果可能的话,通过删除不需要的数据来减少数据库文件的大小,以减少TDE在移除过程中的扫描时间。
  • 在执行这项工作之前,请确保运行一个完整的数据库备份。
  • 始终在非工作时间执行这项活动,因为TDE删除将在后端启动扫描过程,这将增加数据库系统的负载。

检查SQL服务器实例以验证我们的目标数据库是否启用了TDE。运行下面的T-SQL语句来获得所有加密数据库的详细信息。

----Check TDE on SQL Server Instance
SELECT DB_Name(database_id) As [DB Name, encryption_state, encryption_state_desc
FROM sys.dm_database_encryption_keys
GO
SELECT name, is_encrypted
FROM sys.databases
Go

你可以在下面的图片中看到它的输出。数据库TDE_DB已经启用了加密功能。Tempdb也显示为已加密。我们都知道,如果我们在任何用户数据库上启用TDE,tempdb数据库就会被加密。在这篇文章中阅读更多关于透明数据加密和Tempdb之间的关系,TDE对Tempdb数据库的影响,在这篇文章中我已经解释了在用户数据库TDE启用期间tempdb被加密的原因。

Check Transparent Data Encryption configuration of user databases

你还可以看到相关的证书 TDE_DB_Cert在上图的左侧窗格中。现在,我们必须从这个SQL Server实例的用户数据库中删除TDE。 TDE_DB让我们按照我上面提到的顺序进行。

关闭TDE(透明数据加密)

从任何SQL Server数据库移除TDE的第一步是通过执行下面的ALTER语句来关闭它。

-- Replace “TDE_DB” with your target user database name
USE master;
GO
ALTER DATABASE TDE_DB SET ENCRYPTION OFF;
GO

如果你的数据库规模很大,上述命令将花费一些时间,因为在加密或解密过程中,后端将进行TDE扫描过程。这个过程是资源密集型的,所以要在非工作时间计划这项活动。

一旦上述命令成功执行,那么TDE_DB数据库的加密状态将改变为 未加密如下图所示,而tempdb仍然显示为 加密的.如果你有一个更大的数据库,那么TDE扫描将需要时间并在扫描过程中显示该数据库的加密状态为 解密过程中一旦解密过程完成,这个状态将从 解密过程中未解密而sys.databases系统对象通过将其值从1设为0,立即将其状态设为未加密。

Check Transparent Data Encryption state after removing TDE

我们也可以通过访问数据库属性窗口使用GUI来关闭TDE。你只需要启动 数据库属性窗口,然后点击左侧窗格中的"选项"标签,然后点击左侧窗格中的" "。你可以看到"加密功能已启用"选项设置为 在右侧窗格中的状态部分。只要从这个设置的下拉菜单中选择 假的从这个设置的下拉菜单中选择"",然后点击 "确定"按钮来应用这个改变。你已经使用GUI为一个SQL Server数据库禁用了TDE。

如果你不想删除数据库主密钥和相关证书,那么你可以继续重启SQL Server服务,把tempdb数据库的加密功能也删除。我已经重新启动了SQL Server实例,然后再次检查了透明数据加密状态。

数据库tempdb在两个结果集中不再显示为加密的。尽管如果你想删除TDE和所有相关的密钥和证书,建议在你按顺序完成所有步骤后重新启动SQL Server服务。如果你想暂时禁用TDE,那么根据上面的图片,它已经从你的目标数据库 "TDE_DB "中被禁用。如果你想启用TDE,你可以运行上述ALTER语句中的 将加密设置在选项,如果你想在你的目标数据库中启用它。

Check encryption state after turning off TDE and restarting SQL Server service

因为,DMV sys.dm_database_encryption_keys仍然显示数据库 "TDE_DB "的条目为未加密,这意味着透明数据加密并没有被完全删除,其相关的数据库加密密钥仍然存在。接下来,我们将放弃数据库加密密钥,从数据库中彻底删除TDE。

删除数据库加密密钥

让我们删除数据库加密密钥,因为我们已经关闭了这个数据库的TDE。如果你没有关闭用户数据库的透明数据加密功能,你将无法删除数据库加密密钥,而且你将被抛出错误,正如我在本文中给出的那样。请确保首先按照上面的步骤进行操作。

一旦你关闭了用户数据库中的TDE,运行下面的T-SQL语句来删除数据库加密密钥。

-- Drop Database Encryption key
USE TDE_DB;
GO
DROP DATABASE ENCRYPTION KEY;
GO

下面是输出结果。

Drop database encryption key in order to remove TDE

现在数据库的加密密钥已经被放弃了。让我们再次检查用户数据库的TDE状态,以确保它在上述DMV输出中是否仍然存在。我执行了同样的T-SQL语句来检查删除数据库加密密钥后该数据库的透明数据加密状态。

Check encryption state after removing database encryption key

我们可以看到,现在这个DMV中没有任何条目。这意味着透明数据加密已经从这个用户数据库中完全删除,但它的一些相关文件仍然存在于主数据库中,也就是主密钥及其证书。如果你正在使用主密钥和相同的证书来加密任何其他用户数据库,那么你不应该删除它们,而应该让它们保持原状。但是,如果你想完全删除TDE和它的主密钥/证书,因为你在你的SQL Server实例上没有任何使用TDE加密的数据库,那么你也必须删除它们来清理你的系统。接下来,我将向你展示如何删除它的主密钥和证书来清理SQL Server实例上的透明数据加密组件。

从主数据库中删除TDE证书

运行下面的T-SQL语句,删除为加密数据库TDE_DB而创建的TDE证书。

-- Drop Certificate
USE master
Go
DROP CERTIFICATE TDE_DB_Cert;
Go

上面的命令将放弃TDE证书,因为我们已经在下面的图片中验证了它。

Drop certificate

我已经刷新了 主站数据库,然后展开 安全性 文件夹来查看相关的证书,但我们在上图中看不到我们的目标证书 TDE_DB_Cert在上面的图片中。完成透明数据加密删除过程的最后一步是放弃其主密钥。

删除主密钥

TDE中的主密钥是用来保护与TDE加密相关的证书。由于我们已经决定从SQL Server上禁用TDE,并在上面的步骤中删除了相关的证书,所以在SQL Server实例上保留数据库主密钥是没有用的。

让我们通过在主数据库中运行下面的T-SQL语句来删除主密钥。

-- Drop master key
USE master
Go
DROP MASTER KEY;
GO

上面的T-SQL将删除数据库的主密钥,通过这一步,你就完成了透明数据加密的删除过程。

如果你没有按照我在 "关闭TDE "一节中的建议重新启动SQL Server服务,那么你现在可以重新启动SQL Server服务,为tempdb数据库创建新的文件,而不需要TDE配置。

你必须立即对你的未加密的数据库进行全面备份,以确保你有一个没有任何密钥或证书的健康备份。现在,你可以继续执行你已经决定从你的SQL Server用户数据库中删除TDE的活动。

总结

在这篇文章中,我们学习了如何使用一系列的活动从SQL Server数据库中删除TDE。