一、 用途
透明数据加密(TDE)用于对SQL Server,Azure SQL数据库和Azure SQL数据仓库数据文件进行加密,称为静态加密数据。您可以采取一些预防措施来保护数据库,例如设计安全系统,加密机密资产以及构建防火墙。但是,在物理介质(例如备份磁带)被盗的情况下,恶意方可以通过恢复或附加数据库查看数据。一种解决方案是加密数据库中的敏感数据并保护用于使用证书加密数据的密钥,这可以防止没有密钥的人使用数据。
二、 SQL Server加密层次结构
SQL Server使用分层加密和密钥管理基础结构对数据进行加密。每层使用证书、非对称密钥和对称密钥的组合来加密其下层(如下图),对层次结构起始的访问通常受密码保护。非对称密钥和对称密钥可以存储在SQL Server外部的可扩展密钥管理(EKM)模块中。
注意:
- 为获得最佳性能,请使用对称密钥而不是证书或非对称密钥来加密数据。
- 数据库主密钥(DMK)受服务主密钥(SMK)保护。SMK由SQL Server安装程序创建,并使用Windows Data Protection API(DPAPI)进行加密。
- 可扩展密钥管理(EKM)模块在SQL Server外部保存对称或非对称密钥。
- 服务主密钥和所有数据库主密钥都是对称密钥。
- 在此图中,箭头表示常见的加密层次结构。
- EKM中的对称和非对称密钥可以保护对SQL Server中存储的对称和非对称密钥的访问。与EKM关联的虚线表示EKM中的键可以替换存储在SQL Server中的对称和非对称密钥。
三、 TDE架构及原理
- 透明数据加密(TDE)是使用对称密钥加密的特殊情况。
- TDE对数据和日志文件执行实时I/O加解密。数据库文件的加密在页级别执行。已加密数据库中的页在写入磁盘之前会进行加密,在读入内存时会进行解密。加密使用数据库加密密钥(DEK),该密钥存储在数据库引导记录中,以供恢复时使用。DEK是使用存储master数据库中的证书保护的对称密钥,或由EKM模块保护的非对称密钥。
- TDE不会增加已加密数据库的大小。
四、 使用透明数据加密(单实例)
主要步骤:
- 创建主密钥
- 创建或获取受主密钥保护的证书
- 创建数据库加密密钥并通过证书进行保护
- 将数据库设置为使用加密
-- 创建主密钥
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'xxx';
GO
-- 创建受主密钥保护的证书
USE master;
GO
CREATE CERTIFICATE TDECert WITH SUBJECT = 'TDE Certificate';
GO
-- 备份证书到os
USE master;
GO
BACKUP CERTIFICATE TDECert TO FILE='D:\TDE\TDECert_backup' WITH PRIVATE KEY (FILE='D:\TDE\TDECert_key',ENCRYPTION BY PASSWORD='xxx')
GO
-- 创建受证书保护的DEK,使用AES 128算法加密
USE PlanError;
GO
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE TDECert;
GO
--将DB设置为加密
ALTER DATABASE PlanError SET ENCRYPTION ON;
GO
检查DB是否加密
SELECT name,is_encrypted FROM sys.databases WHERE name='TDE';
测试异机还原加密数据库,发现会有以下报错
测试异机附加数据库
五、 迁移开启TDE的数据库
如果确实需要移动到异机(还原或附加)应该怎么做?
1. 迁移前准备
在目标端创建master key(若已有则忽略,例如建镜像或无域alwayson时已创建)
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'xxx'
GO
将源端证书备份拷到目标端
利用证书备份在目标端创建新证书
CREATE CERTIFICATE TDECert
FROM FILE = 'C:\TDE\TDECert_backup'
WITH PRIVATE KEY (FILE = 'C:\TDE\TDECert_key',
DECRYPTION BY PASSWORD = 'xxx');
GO
2. 测试还原数据库
可以看到这次选择文件后没有报错
还原成功
3. 测试附加数据库
可以看到选择后也无报错
附加成功
那如果想把TDE加密的库加入alwayson可以直接加吗?
可以看到是不行的,always on应该如何使用TDE?参考
六、 性能对比
1. 增删改查性能
TDE Enabled | TDE not Enabled | |||||||
CPU (ms) | READS | WRITES | DURATION (ms) | CPU (ms) | READS | WRITES | DURATION (ms) | |
SELECT | 7390 | 121576 | 18 | 26037103 | 3062 | 121397 | 1 | 23409175 |
INSERT | 125 | 784 | 16 | 1509177 | 32 | 798 | 16 | 1254881 |
UPDATE | 500 | 2181 | 31 | 1376947 | 108 | 2215 | 24 | 1080074 |
DELETE | 502 | 2380 | 30 | 1271479 | 63 | 2417 | 29 | 708979 |
2. 备份性能
TDE Enabled | TDE not Enabled | |||||||
CPU (ms) | READS | WRITES | DURATION (ms) | CPU (ms) | READS | WRITES | DURATION (ms) | |
With compression | 234 | 319 | 14 | 57264 | 195 | 298 | 13 | 51632 |
No compression | 203 | 319 | 14 | 70384 | 171 | 300 | 13 | 55714 |
3. Index Rebuid性能
CPU (ms) | READS | WRITES | DURATION (ms) | |
TDE Enabled | 14936 | 347345 | 46028 | 21898 |
TDE not Enabled | 7420 | 347116 | 46190 | 17133 |
七、 目录视图和动态管理视图
目录视图或动态管理视图 | 用途 |
显示数据库信息的目录视图。 | |
显示数据库中证书的目录视图。 | |
动态管理视图,提供有关数据库中使用的加密密钥的信息以及数据库的加密状态。 |
八、 透明数据加密与事务日志
- 使用TDE会强制切换至下一个虚拟事务日志,以保证设置加密后事务日志中不会留下明文。
可以通过查看sys.dm_database_encryption_keys视图中的encryption_state列来查找日志文件加密状态:
USE AdventureWorks2012;
GO
-- The value 3 represents an encrypted state on the database and transaction logs.
SELECT * FROM sys.dm_database_encryption_keys WHERE encryption_state = 3;
- 更改DEK时,更改之前写入事务日志的所有数据都将使用以前的DEK进行加密。
- 修改DEK两次后,必须先执行日志备份,然后才能再次修改DEK。
九、 透明数据加密与TempDB
使用TDE加密SQL Server实例上的任何数据库,将也加密tempdb。这可能会对同一实例上的未加密数据库产生性能影响。
有关tempdb系统数据库的详细信息,请参阅tempdb数据库。
十、 透明数据加密和In-Memory OLTP
- 可以在具有In-Memory OLTP对象的数据库上启用TDE。
- 如果对SQL Server 2016及Azure SQL 的In-Memory OLTP数据库启用TDE,将会加密数据和日志记录。
- 如果对SQL Server 2014的In-Memory OLTP数据库启用TDE,会加密日志记录,但不加密MEMORY_OPTIMIZED_DATA文件组中的文件。
十一、 注意事项
1. 启用TDE时,会加密数据库中的所有文件和文件组。如果数据库中的任何文件组为READ ONLY,加密操作将失败。
2. 如果在数据库镜像、日志传送、AlwaysOn中启用TDE,则主从数据库都将被加密,事务日志在它们之间发送时将被加密。
3. 在初始数据库加密,密钥更改或数据库解密期间,不允许执行以下操作
- 从数据库中的文件组中删除文件
- 删除数据库
- 使数据库脱机
- 分离数据库
- 将数据库或文件组转为READ ONLY状态
4. 在执行CREATE DATABASE ENCRYPTION KEY,ALTER DATABASE ENCRYPTION KEY,DROP DATABASE ENCRYPTION KEY或ALTER DATABASE ... SET ENCRYPTION语句时,不允许执行以下操作
- 从数据库中的文件组中删除文件
- 删除数据库
- 使数据库脱机
- 分离数据库
- 将数据库或文件组转为READ ONLY状态。
- 执行ALTER DATABASE命令
- 启动数据库或数据库文件备份
- 启动数据库或数据库文件还原
- 创建快照
反过来说,在以下操作或条件下,无法执行CREATE DATABASE ENCRYPTION KEY,ALTER DATABASE ENCRYPTION KEY,DROP DATABASE ENCRYPTION KEY或ALTER DATABASE ... SET ENCRYPTION语句。
- 数据库是只读的或具有任何只读文件组。
- 正在执行ALTER DATABASE命令
- 正在进行数据备份/还原
- 数据库处于脱机状态
- 快照正在进行中
- 数据库维护任务进行中
5. 若启用TDE,创建数据库文件时将无法进行即时文件初始化。
参考