本人新书上市,请多多关照:《SQL Server On Linux运维实战 2017版从入门到精通》
Transparent Data Encryption,TDE,也叫透明数据加密,用于在数据和事务写入磁盘时同步加密,简单来说就是如果没有拿到解密密钥,那么即使得到了数据库或者数据库备份及sa密码,你也用不了数据。这个功能从SQL Server 2008 已经引入,不能算新功能,但是说到安全性,还是有必要提一下,因为这个功能从出现开始,一直被强化,可见微软对其的重视。
开启TDE之后,访问物理数据库文件需要提供证书,在数据写入磁盘时,会同步加密所有数据,在查询数据时再进行解密。TED以8K(即一页)为单位进行加解密。
需要注意的一点是,当实例开启了TDE之后,TempDB自动被加密,即使用户数据库一点都没用到TempDB,因为实际上几乎没有多少正式数据库是不用TempDB(有些大量数据排序、Hash等会自动使用TempDB),哪怕数秒之后就结束,也有可能带来安全风险,所以一并加密。但是我们知道加解密必然需要CPU开销,所以不管是用户库还是TempDB的这部分数据,都必将受到性能影响。
TDE的设置不算复杂,需要一个数据库主密钥(database master key)、一个master库的证书及足够的权限。
了解限制比了解功能更加重要,因为限制只要一个,就足够让你整个过程失败。
如上所述,加解密本身就是资源消耗操作。由于TDE不加密在SQL缓冲区中的数据(只对写入文件中的数据进行加密),所以大部分时候,在缓冲区的数据不会受到TDE的影响,对性能的影响微乎其微,但是在flush到磁盘和从磁盘读取到内存的过程中,就确实会存在性能问题。
下面快速演示一下TDE操作,由于这个技术已经出现了比较久,所以网上资料还是挺多。没有必要在这里花太多时间。
TDE过程分为4步:
下面创建一个TDEDemo数据库进行演示:
--创建演示库TDEDemo
use master
go
create database TDEDemo
GO
创建一个目录用于存放证书,然后进行授权
# mkdir /var/opt/mssql/certs
创建目录后如下图
检查当前权限,因为使用root来操作,所以默认初始权限就是root。
修改权限,使mssql账号及其组能操作。
chown -R mssql:mssql /var/opt/mssql/certs
USE master;
GO
-- 在Master库中创建主密钥
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '!drJP9QXC&Vi%cs';
GO
--创建证书
CREATE CERTIFICATE TDEDemoCert WITH SUBJECT = 'Certificate to implement TDE on TDEDemo';
GO
--重要! 备份证书,把证书备份到刚创建的目录下
BACKUP CERTIFICATE TDEDemoCert TO FILE = '/var/opt/mssql/certs/TDEDemoCert'
WITH PRIVATE KEY ( FILE = '/var/opt/mssql/certs/TDECertPrivateKey' ,
ENCRYPTION BY PASSWORD = 'RISiS8AUl%CByEk6' );--使用其他强密码
GO
--检查加密情况
SELECT DB_NAME(database_id) AS DatabaseName,
key_algorithm AS [Algorithm],
key_length AS KeyLength,
CASE encryption_state
WHEN 0 THEN 'No database encryption key present, no encryption'
WHEN 1 THEN 'Unencrypted'
WHEN 2 THEN 'Encryption in progress'
WHEN 3 THEN 'Encrypted'
WHEN 4 THEN 'Key change in progress'
WHEN 5 THEN 'Decryption in progress'
END AS EncryptionStateDesc,
percent_complete AS PercentComplete
FROM sys.dm_database_encryption_keys;
GO
USE TDEDemo;
GO
-- 创建数据库加密密钥,并使用证书进行加密
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE TDEDemoCert;
GO
-- 开启数据库TDE功能
ALTER DATABASE TDEDemo SET ENCRYPTION ON;
GO
--再次检查
SELECT DB_NAME(database_id) AS DatabaseName,
key_algorithm AS [Algorithm],
key_length AS KeyLength,
CASE encryption_state
WHEN 0 THEN 'No database encryption key present, no encryption'
WHEN 1 THEN 'Unencrypted'
WHEN 2 THEN 'Encryption in progress'
WHEN 3 THEN 'Encrypted'
WHEN 4 THEN 'Key change in progress'
WHEN 5 THEN 'Decryption in progress'
END AS EncryptionStateDesc,
percent_complete AS PercentComplete
FROM sys.dm_database_encryption_keys;
GO
接下来我们来测试一下效果,首先把证书“剪切”到别的地方,目的是做证书备份。
mv /var/opt/mssql/certs/* /tmp
剪切走证书之后,对数据库进行备份
BACKUP DATABASE [TDEDemo] TO DISK = N'/var/opt/mssql/data/TDEDemo.bak'
WITH NOFORMAT, NOINIT, NAME = N'TDEDemo-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
删除数据库,然后把证书也删了,模拟证书被意外删除
USE master
GO
DROP DATABASE TDEDemo;
GO
DROP CERTIFICATE TDEDemoCert;
GO
还原数据库
RESTORE DATABASE [TDEDemo] FILE = N'TDEDemo' FROM DISK = N'/var/opt/mssql/data/TDEDemo.bak'
WITH FILE = 1, MOVE N'TDEDemo' TO N'/data/TDEDemo.mdf', MOVE N'TDEDemo_log' TO N'/data/TDEDemo_0.ldf', NOUNLOAD, STATS = 10
GO
还原过程会出现以下报错,因为它找不到证书。
消息 33111,级别 16,状态 3,第 1 行
Cannot find server certificate with thumbprint ‘0x15496153CE71AFAA5181739F73F2FBC8BA231EEA’.
消息 3013,级别 16,状态 1,第 1 行
RESTORE DATABASE is terminating abnormally.
前面的步骤也可以用来模拟在服务器上获取了备份,不管是正规还是违规,然后在别的服务器进行还原的过程,那么要还原成功,我们需要获取证书和加密密钥。假设已经把这两个文件一并拿回来了。那么下面就要重新创建证书,然后就可以还原。
CREATE CERTIFICATE TDEDemoCert
FROM FILE = '/tmp/TDEDemoCert'
WITH PRIVATE KEY ( FILE = '/tmp/TDECertPrivateKey',
DECRYPTION BY PASSWORD = 'RISiS8AUl%CByEk6')
RESTORE DATABASE [TDEDemo] FILE = N'TDEDemo' FROM DISK = N'/var/opt/mssql/data/TDEDemo.bak'
WITH FILE = 1, MOVE N'TDEDemo' TO N'/data/TDEDemo.mdf', MOVE N'TDEDemo_log' TO N'/data/TDEDemo_0.ldf', NOUNLOAD, STATS = 10
GO
TDE的目标是保护文件的安全,其他方面的安全需要其他的功能来保证。不管是数据库文件还是备份文件,它不保证数据本身的安全,使用过程要注意备份好密钥和证书,否则据本人了解,只有通过导数据到新的库来确保数据库的可迁移性。