SQL Server On Linux(12)—— SQL Server On Linux安全性(5)———透明数据加密(TDE)

本人新书上市,请多多关照:《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限制

  了解限制比了解功能更加重要,因为限制只要一个,就足够让你整个过程失败。

  1. 不能加密数据库的子集:必须全库加密
  2. TDE更加重视文件的保护而不是对数据库内数据的保护。
  3. TDE最大的缺点是对FileStream文件不进行加密。
  4. 对SQL Server版本有所要求。只有企业版和开发版才有的功能。

TDE性能

  如上所述,加解密本身就是资源消耗操作。由于TDE不加密在SQL缓冲区中的数据(只对写入文件中的数据进行加密),所以大部分时候,在缓冲区的数据不会受到TDE的影响,对性能的影响微乎其微,但是在flush到磁盘和从磁盘读取到内存的过程中,就确实会存在性能问题。

TDE演示

  下面快速演示一下TDE操作,由于这个技术已经出现了比较久,所以网上资料还是挺多。没有必要在这里花太多时间。
  TDE过程分为4步:

  1. 在Master库中创建主密钥(master key)。
  2. 创建或使用现有证书保护上面的主密钥。
  3. 创建数据库加密密钥,使用上面的证书进行保护。
  4. 启用数据库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的目标是保护文件的安全,其他方面的安全需要其他的功能来保证。不管是数据库文件还是备份文件,它不保证数据本身的安全,使用过程要注意备份好密钥和证书,否则据本人了解,只有通过导数据到新的库来确保数据库的可迁移性。

发布了192 篇原创文章 · 获赞 1268 · 访问量 250万+

猜你喜欢

转载自blog.csdn.net/DBA_Huangzj/article/details/87188750
今日推荐