SQL Server 2008 新增的透明数据加密功能(TDE)

在任何组织中,安全都是备受关注的。数据库备份很可能会被盗,并且可以在任何等同于或高于备份数据库版本的SQL Server实例下进行还原。当我们查看SQL Server 2008新功能时,我们发现一个可能很有趣的功能,被称为透明加密,其可以用来加密我们的数据库备份。你想了解一下该如何使用这个新功能吗?

SQL Server 2008版本开始,新增了透明数据加密Transparent Data Encryption(TDE)功能,其实现的是数据库级别的加密,这一功能补充了SQL Server 2005中使用的行级别加密。这可以直接或通过在另一个SQL Server实例上恢复数据库备份来保护数据库访问。

在本文中,我们将讨论如何实现透明数据加密来保护数据库备份。

未加密的数据库容易暴露集团信息

首先让我们来演示数据库备份是如何容易遭受安全威胁的。默认情况下,SQL Server备份是不加密的,让我们先创建test3 库的完整备份:

BACKUP DATABASE test3
TO DISK='D:\test3_f_20200218.bak'
WITH INIT,STATS=10

查询test3数据库中一条特定记录。稍后,我们将使用此记录查看数据库备份的内容:

使用记事本打开test3数据库的备份,搜索‘Jack’,观察到文本数据是可读的:

由于您的本机备份是可读的,因此它们很容易出现安全风险,因为它们可以以明文读取。这使某些人只需查看您的数据库备份,即能从文件中检索数据。更糟糕的是,任何人均可以在另外一个SQL Server实例中还原备份文件。我们来演示一下这个程序。

数据库透明加密

让我们来在数据库test3上实施数据透明加密,,首先在服务器上设置加密。为此,我们在master数据库上创建主键秘钥

USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD='jC`T?]K,v`{voD<'

然后我们创建用于加密数据库的服务器级的证书,这里证书是用数据库主秘钥加密的:

CREATE CERTIFICATE Test3Cert
WITH SUBJECT = 'My DEK Certificate for test3 database '

我们将使用我们刚刚创建的证书创建数据库秘钥,为test3数据库设置加密:

USE test3
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM=AES_128
ENCRYPTION BY SERVER CERTIFICATE Test3Cert
GO

创建完数据库秘钥后,会给出一个警告。

警告: 用于对数据库加密密钥进行加密的证书尚未备份。应当立即备份该证书以及与该证书关联的私钥。如果该证书不可用,或者您必须在另一台服务器上还原或附加数据库,则必须对该证书和私钥均进行备份,否则将无法打开该数据库。

你可以自己选择加密算法,有几个不同配置存在包括 DES, Triple DES, TRIPLE_DES_3KEY, RC2, RC4, 128-bit RC4, DESX, 128-bit AES, 192-bit AES, and 256-bit AES,但在SQL Server 2016后只能使用AES_128 | AES_192 | AES_256三种算法。创建完证书后,我们下面就来备份证书。

备份证书和私钥

--备份证书和私钥
USE master
GO
BACKUP CERTIFICATE Test3Cert
TO FILE ='D:\Test3Cert.cer'
WITH PRIVATE KEY(FILE='D:\Test3Cert_Key.pvk',
ENCRYPTION BY PASSWORD='jC`T?]K,v`{voD<')       --这个密码可以是任意符合复杂度的密码
GO

启用数据库加密

ALTER DATABASE test3
SET ENCRYPTION ON

我们可以通过系统视图sys.databases 查看哪些用户开启了透明加密

--查看是否开启透明加密,则is_encrypted=1开启了透明加密
SELECT name,is_encrypted
FROM sys.databases

这次让我们使用一个不同的文件名备份加密后的test3数据库:

BACKUP DATABASE test3
TO disk='D:\test3_Encrypted.bak'
with init,stats=10

加密备份的时间将稍微长于未加密的数据库备份。如果你打开数据库备份,并搜索“Jack”,您将找不到了。您可以滚动鼠标查看加密后的数据,其将和你未加密之前的备份内容不同:

在另外一个实例上恢复未加密数据库很容易。事实上,这也是它容易出现安全风险的原因。你可以试着还原加密后的备份数据库,你将会遇到一个错误。我打算在当前实例上还原这个加密备份,所以先删除数据库密钥、证书和主密钥,然后直接原实例上还原它。

--要删除主密钥,需要删除使用密钥加密的证书
--要删除证书,需要删除和证书关联的登陆账号
USE master
GO
--关闭数据库加密
ALTER DATABASE test3
SET ENCRYPTION OFF
--删除数据库密钥
USE test3
DROP DATABASE ENCRYPTION KEY
USE master
--删除证书
DROP CERTIFICATE Test3Cert
--删除主密钥
DROP  MASTER KEY

删除数据库密钥之前,需要先关闭数据库加密,否则会报如下错误:

消息 33105,级别 16,状态 1,第 49 行

该数据库加密密钥正在使用中,无法删除。需要关闭数据库加密,才能删除该数据库加密密钥。

还原test3的加密备份:

USE [master]
RESTORE DATABASE [test3_Encrypted] FROM  DISK = N'D:\test3_Encrypted.bak'
WITH  FILE = 1,
MOVE   'test3' to 'D:\DB\test3_e.mdf',
MOVE 'test3_log' to 'D:\DB\test3_loge.ldf',
NOUNLOAD,  STATS = 5
GO

还原加密数据库

为了还原加密数据库,我们需要将备份的证书和私钥文件拷贝到新实例所在的服务器。因为我是打算在本机同一实例上还原加密数据库,当我导入证书和私钥时,我仅仅是使用备份证书和私钥时的路径。现在,我们在导入证书之前需要创建一个主密钥:

USE master
GO
--注意这里创建的主密钥密码可以和原数据库上创建的主密钥密码不同
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '[J,XJK8|AwE*rLk'
GO

这里创建主密钥使用的密码和上面原数据库上创建的主密钥密码不同。主密钥创建完成后,您可以通过导入前面证书的备份文件创建证书和私钥:

USE master
GO
--注意这里创建的主密钥密码可以和原数据库上创建的主密钥密码不同
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '[J,XJK8|AwE*rLk'
GO
CREATE CERTIFICATE Test3Cert
FROM FILE = 'D:\Test3Cert.cer'
WITH PRIVATE KEY(FILE='D:\Test3Cert_Key.pvk',
       DECRYPTION BY PASSWORD='jC`T?]K,v`{voD<');
GO

注意到在DECRYPTION BY PASSWORD参数指定的密码和我们备份证书时使用的密码相同,这是因为我们将在新的实例上使用相同的证书访问加密数据库。此时我们再执行上面的还原脚本,可以正常还原加密数据库。

值得注意的是加密备份文件还原后的数据库仍然是加密的,如下图所示:

最后需要说明的是

  • 因为没有备份的证书和私钥,将不能恢复数据库,所以需要很好的保管证书、私钥备份文件及备份时使用的加密文件中私钥密码,最好能够多个服务器备份、本地异地备份同时进行

  • 透明加密是为了防止数据库备份文件被盗时数据泄露,所以证书私钥的备份文件和私钥密码不能和数据库备份文件放在一起

  • 还有一点值得说明的是TDE中数据库主密钥和服务器证书之间的关系,创建使用数据库主密钥加密的服务器证书前,必须要先创建数据库主密钥;我们在还原实例上创建或者还原数据库主密钥的密码并不是原实例上创建数据库的主密钥的密码,而我们在还原实例上仍然能够使用证书和私钥文件创建服务器证书,并成功还原加密数据库备份。这说明数据库主密钥加密的证书依赖于数据库主密钥,但又不是完全依赖,只要有数据库主密钥,就可以使用证书和私钥文件创建服务器证书。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章