内容简介:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DBA_Huangzj/article/details/87188750
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DBA_Huangzj/article/details/87188750
本人新书上市,请多多关照: 《SQL Server On Linux运维实战 2017版从入门到精通》
Transparent Data Encryption,TDE,也叫透明数据加密,用于在数据和事务写入磁盘时同步加密,简单来说就是如果没有拿到解密密钥,那么即使得到了数据库或者数据库备份及sa密码,你也用不了数据。这个功能从SQL Server 2008 已经引入,不能算新功能,但是说到安全性,还是有必要提一下,因为这个功能从出现开始,一直被强化,可见微软对其的重视。
TDE简介
开启TDE之后,访问物理数据库文件需要提供证书,在数据写入磁盘时,会同步加密所有数据,在查询数据时再进行解密。TED以8K(即一页)为单位进行加解密。
需要注意的一点是,当实例开启了TDE之后,TempDB自动被加密,即使用户数据库一点都没用到TempDB,因为实际上几乎没有多少正式数据库是不用TempDB(有些大量数据 排序 、Hash等会自动使用TempDB),哪怕数秒之后就结束,也有可能带来安全风险,所以一并加密。但是我们知道加解密必然需要CPU开销,所以不管是用户库还是TempDB的这部分数据,都必将受到性能影响。
TDE的设置不算复杂,需要一个数据库主密钥(database master key)、一个master库的证书及足够的权限。
TDE限制
了解限制比了解功能更加重要,因为限制只要一个,就足够让你整个过程失败。
- 不能加密数据库的子集:必须全库加密
- TDE更加重视文件的保护而不是对数据库内数据的保护。
- TDE最大的缺点是对FileStream文件不进行加密。
- 对SQL Server版本有所要求。只有企业版和开发版才有的功能。
TDE性能
如上所述,加解密本身就是资源消耗操作。由于TDE不加密在 SQL 缓冲区中的数据(只对写入文件中的数据进行加密),所以大部分时候,在缓冲区的数据不会受到TDE的影响,对性能的影响微乎其微,但是在flush到磁盘和从磁盘读取到内存的过程中,就确实会存在性能问题。
TDE演示
下面快速演示一下TDE操作,由于这个技术已经出现了比较久,所以网上资料还是挺多。没有必要在这里花太多时间。
TDE过程分为4步:
- 在Master库中创建主密钥(master key)。
- 创建或使用现有证书保护上面的主密钥。
- 创建数据库加密密钥,使用上面的证书进行保护。
- 启用数据库TDE。
环境准备
下面创建一个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
检查权限是否修改成功
master库中创建主密钥
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
检查是否创建成功
创建数据库加密密钥并开启TDE
--检查加密情况 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
结果如下,TDEDemo和tempdb已经开启了加密
测试TDE
接下来我们来测试一下效果,首先把证书“剪切”到别的地方,目的是做证书备份。
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的目标是保护文件的安全,其他方面的安全需要其他的功能来保证。不管是数据库文件还是备份文件,它不保证数据本身的安全,使用过程要注意备份好密钥和证书,否则据本人了解,只有通过导数据到新的库来确保数据库的可迁移性。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 在Windows和Azure中使用加密证书提高web.config的安全性
- Swift 中的安全性
- 浅谈Docker安全性支持
- 【Java并发】线程安全性
- ArrayList 线程安全性学习
- Docker 容器安全性分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。