暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL server-TDE研究及测试

原创 从小就很霸道的胖虎 2023-07-18
569

一、背景:

接公司需求,为保障数据库安全,防止数据泄露,需要对军工类数据库(多为SQL server)加密保护。目前市面上优秀的数据库加密厂家有安华金和、亿赛通、安策科技等,已完成部分测试。另外SQL server、Oracle数据库有自带的加密功能,经初步研究,完全满足公司需求。

公司要求是在不影响系统正常使用的前提下,对数据文件,备份文件加密,防止文件丢失造成数据泄露。无列加密的需求。刚好对应数据库透明加密技术TDE(Oracle Transparent Data Encryption)。经过调研决定放弃采购,自研透明加密。

二、要点

1、SQL server对已经存在的数据库可直接透明加密,Oracle只能在创建表空间时对表空间进行透明加密。

2、还原备份文件时,数据库版本要一致(特别时SQL server,至少不能降版本)

3、按照脚本对数据库进行透明加密,操作无难度。关键是理解透明加密原理、熟悉透明加密过程。

4、经测试,SQL server透明加密备份后,备份文件增大(数据文件40G,备份文件70G),所以在正式环境配置TDE之前,请充分考虑磁盘容量。

三、过程

1、SQL server-TDE加密过程

1.1、创建master数据库下的主数据库密钥


1.2、创建证书用来保护 数据库加密密钥 (DEK),备份证书,防止丢失。


1.3、数据库加密


1.4、备份数据库


2、加密效果(未加密环境测试)

2.1、备份文件(bak)加密后,在普通环境无法被还原,可以防止bak文件丢失造成数据泄露问题。


2.2、数据文件(mdf)被分离拿到普通环境,无法被附加成功,可以防止mdf文件丢失造成数据泄露问题。


3、加密效果(加密环境测试)

3.1、备份文件(bak)加密后,加密环境下,正常被还原。


3.2、被还原的数据正常。

 

3.3数据文件(mdf)被分离拿到普通环境,被附加成功。



结论:

SQL server-TDE满足公司数据安全需求,对数据文件、备份文件均可实现加密。数据库运维人员掌握开通加密功能,完成功能测试,可择期开通。

附件(脚本详情)

脚本链接:

SQLServer的TDE加密 - PowerCoder - 博客园 (cnblogs.com)

 

KEY DECRYPTION BY PASSWORD = '1qaz@WSX3edc$RFV';

--备份master系统数据库的CERTIFICATE

BACKUP CERTIFICATE master_server_certficate TO FILE = 'D:\MSSQL_TDE_Keys\master_server_certficate.cer'

WITH PRIVATE KEY (

FILE = 'D:\MSSQL_TDE_Keys\master_server_certficate.pvk' ,

ENCRYPTION BY PASSWORD = '1qaz@WSX3edc$RFV');

--关闭数据库连接MASTER KEY

CLOSE MASTER KEY

GO

--首先创建SQL Server中master系统数据库的MASTER KEY和CERTIFICATE:

USE [master];

GO

--查看master数据库是否被加密

SELECT name,is_master_key_encrypted_by_server FROM

sys.databases;

--创建master数据库下的主数据库密钥

CREATE MASTER KEY ENCRYPTION BY PASSWORD = N'7qaz_WSX3edc$RFV';

--如果创建后要删除master数据库下的主数据库密钥,可以使用下面的语句

--DROP MASTER KEY

--查看master数据库下的密钥信息

SELECT * FROM sys.symmetric_keys;

--创建证书用来保护 数据库加密密钥 (DEK)

CREATE CERTIFICATE master_server_certficate WITH

SUBJECT = N'Master Protect DEK Certificate';

--如果创建后要删除master数据库下的证书,可以使用下面的语句

--DROP CERTIFICATE master_server_certficate

创建测试数据库TestDbEncryption,该数据库将会开启TDE加密:

CREATE DATABASE TestDbEncryption;

GO

接下来启用数据库TestDbEncryption的DEK 数据库加密密钥 (对称密钥)

USE TestDbEncryption;

GO

--创建由master_server_cert保护的DEK 数据库加密密钥 (对称密钥)

CREATE DATABASE ENCRYPTION KEY

WITH ALGORITHM = AES_128

ENCRYPTION BY SERVER CERTIFICATE master_server_certficate;

--如果创建后,要删除TestDbEncryption数据库上的DEK 数据库加密密钥,可以使用下面的语句

--DROP DATABASE ENCRYPTION KEY

--执行上面的CREATE DATABASE ENCRYPTION KEY语句以后出现:

/*Warning: The certificate used for encrypting the database encryption key has not been backed up. You should immediately back up the certificate and the private key associated with the certificate. If the certificate ever becomes unavailable or if you must restore or attach the database on another server, you must have backups of both the certificate and the private key or you will not be able to open the database.*/

--提示你,立刻备份证书;这里备份证书,不比制定加密私钥的 对称密钥了.因为他的密钥是通过master数据库的主数据库密钥加密了.

 

执行上面CREATE DATABASE ENCRYPTION KEY会提示备份master系统数据库的CERTIFICATE,所以接下来我们备份master系统数据库的MASTER KEY和CERTIFICATE:

USE master;

GO

--打开数据库连接MASTER KEY

OPEN MASTER

USE master;

GO

--相应的,我们也备份一下数据库主密钥(master)

--打开数据库连接MASTER KEY

OPEN MASTER KEY DECRYPTION BY PASSWORD = '1qaz@WSX3edc$RFV';

BACKUP MASTER KEY TO FILE = 'D:\MSSQL_TDE_Keys\master.cer'

ENCRYPTION BY PASSWORD = '1qaz@WSX3edc$RFV';

 

--关闭数据库连接MASTER KEY

CLOSE MASTER KEY

GO

之后在SQL Server服务器的D:\MSSQL_TDE_Keys路径下会出现三个文件,保存好这三个文件,如下所示:

下面我们就要开启测试数据库TestDbEncryption的TDE加密了:

USE TestDbEncryption

GO

--生产环境下,设置成单用户在运行加密

ALTER DATABASE TestDbEncryption SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

GO

--开启TDE 加密

ALTER DATABASE TestDbEncryption SET ENCRYPTION ON;

GO

--设置多用户访问

ALTER DATABASE TestDbEncryption SET MULTI_USER WITH ROLLBACK IMMEDIATE;

GO

--再次开启TDE 加密,解释下为什么在上面设置多用户访问后,这里还要执行一次SET ENCRYPTION ON,因为不知道是不是SQL Server的一个BUG,如果只执行上面一次SET ENCRYPTION ON,后面查询SELECT DB_NAME(database_id),encryption_state FROM sys.dm_database_encryption_keys时,encryption_state的值永远为2

ALTER DATABASE TestDbEncryption SET ENCRYPTION ON;

GO

如果开启数据库TestDbEncryption的TDE加密后,之后想要关闭TDE加密,可以使用下面的语句:

USE TestDbEncryption

GO

--生产环境下,设置成单用户在运行加密

ALTER DATABASE TestDbEncryption SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

GO

--关闭TDE 加密

ALTER DATABASE TestDbEncryption SET ENCRYPTION OFF;

GO

--设置多用户访问

ALTER DATABASE TestDbEncryption SET MULTI_USER WITH ROLLBACK IMMEDIATE;

GO

--再次关闭TDE 加密,解释下为什么在上面设置多用户访问后,这里还要执行一次SET ENCRYPTION OFF,因为不知道是不是SQL Server的一个BUG,如果只执行上面一次SET ENCRYPTION OFF,后面查询SELECT DB_NAME(database_id),encryption_state FROM sys.dm_database_encryption_keys时,encryption_state的值永远为5

ALTER DATABASE TestDbEncryption SET ENCRYPTION OFF;

GO

查看TestDbEncryption数据库是否被加密:

--查看TestDbEncryption数据库是否被加密 encryption_state:3 TDE加密了

SELECT DB_NAME(database_id),encryption_state FROM sys.dm_database_encryption_keys;

/*发现tempdb也被加密了。MSDN解释是:如果实例中有一个数据库启用了TDE加密,那么tempdb也被加密*/

 

查询结果为:

之后我们先备份已启用TDE的测试数据库TestDbEncryption到数据库备份文件TestDbEncryption.bak:

USE master;

GO

--打开数据库连接MASTER KEY

OPEN MASTER KEY DECRYPTION BY PASSWORD=N'7qaz_WSX3edc$RFV';

BACKUP DATABASE TestDbEncryption

TO DISK='D:\MSSQL_Backup\TestDbEncryption.bak'

--关闭数据库连接MASTER KEY

CLOSE MASTER KEY

接下来,找另外一台机器或者实例来测试,如果数据库备份文件被盗走了,防止被还原。这时就要用到我们前面生成的三个文件了:

先在另外一台机器还原MASTER KEY:

USE master;

GO

--先在另外一台机器还原了MASTER KEY (该机器master数据库无master key)

RESTORE MASTER KEY

FROM FILE = 'D:\MSSQL_TDE_Keys\master.cer'

DECRYPTION BY PASSWORD = '1qaz@WSX3edc$RFV'

ENCRYPTION BY PASSWORD = '1qaz@WSX3edc$RFV';

GO

 再还原CERTIFICATE:

USE master;

GO

--打开数据库连接MASTER KEY

OPEN MASTER KEY DECRYPTION BY PASSWORD=N'1qaz@WSX3edc$RFV';

--创建证书

CREATE CERTIFICATE master_server_certficate

FROM FILE = 'D:\MSSQL_TDE_Keys\master_server_certficate.cer'

WITH PRIVATE KEY (FILE = 'D:\MSSQL_TDE_Keys\master_server_certficate.pvk',

DECRYPTION BY PASSWORD = '1qaz@WSX3edc$RFV');

GO

--关闭数据库连接MASTER KEY

CLOSE MASTER KEY

最后使用前面准备的数据库备份文件TestDbEncryption.bak,还原数据库TestDbEncryption:

USE master;

GO

--打开数据库连接MASTER KEY

OPEN MASTER KEY DECRYPTION BY PASSWORD=N'1qaz@WSX3edc$RFV';

RESTORE DATABASE TestDbEncryption FROM DISK='D:\MSSQL_Backup\TestDbEncryption.bak'

WITH MOVE 'TestDbEncryption'

TO 'D:\MSSQL_Data\TestDbEncryption.mdf',

MOVE 'TestDbEncryption_log'

TO 'D:\MSSQL_Log\TestDbEncryption_log.ldf'

GO

--关闭数据库连接MASTER KEY

CLOSE MASTER KEY

如果要直接附加启用TDE的数据库mdf和ldf文件到SQL Server,可以采用下面的语句:

USE master;

GO

--打开数据库连接MASTER KEY

OPEN MASTER KEY DECRYPTION BY PASSWORD=N'1qaz@WSX3edc$RFV';

--附加数据库

CREATE DATABASE TestDbEncryption

ON PRIMARY (FILENAME=N'C:\Users\Administrator\Desktop\TestDbEncryption.mdf')

LOG ON (FILENAME=N'C:\Users\Administrator\Desktop\TestDbEncryption_log.ldf')

FOR ATTACH ;

GO

 

--关闭数据库连接MASTER KEY

CLOSE MASTER KEY

在还原或附加数据库TestDbEncryption后,最好用下面的语句检查下数据库文件是否有错误:

USE master;

GO

 

--打开数据库连接MASTER KEY

OPEN MASTER KEY DECRYPTION BY PASSWORD=N'1qaz@WSX3edc$RFV';

DBCC CHECKDB([TestDbEncryption]) WITH NO_INFOMSGS

 

--关闭数据库连接MASTER KEY

CLOSE MASTER KEY

首先,当你在新的SQL Server服务器或实例还原MASTER KEY和CERTIFICATE后,执行下面的SQL语句:

USE master;

GO

--查看master数据库是否被加密

SELECT name,is_master_key_encrypted_by_server FROM

sys.databases;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论