数据加密 第六篇:透明文件加密
对于数据的保护,不仅需要控制数据的访问权限,还需要保护存储数据的文件。除了在操作系统层面对文件进行访问控制之外,还要确保文件被窃取后依然可以保护数据不泄露,这就需要对文件进行加密。即使文件被窃取,如果不能对文件进行解密,那么数据也是安全的。
对于数据的加密,可以使用证书、对称密钥和非对称密钥,这三种加密机制都是用于保护数据,即使数据被窃取,如果没有解密的密钥,那么数据依旧不可用。SQL Server还提供一种加密功能,透明数据加密(Transparent Data Encryption,TDE),用于对数据库的文件(数据文件、日志文件以及备份文件)进行加密。
一,文件级别的加密
TDE对数据和日志文件进行实时IO加密和解密。加密过程使用的是数据库加密密钥(Database Encryption Key,DEK),DEK是对称密钥,存储在数据库的启动记录(boot record)中。DEK由证书来保护,该证书存在服务器的主数据库中;DEK也可以由EKM模块保护的非对称密钥来保护。也就是说,如果数据库文件(mdf、ndf、ldf或bak)被窃取,由于没有完整的解密密钥,数据库是不可使用的。如果master数据库和服务器证书都被窃取,那么就相当于获得了完整的解密密钥,数据已经不安全了。
在底层处理逻辑上,TDE在Page级别对数据库文件进行加密,Page在被写入硬盘之前被加密,并在读入内存之前被解密。也就是说,当启用数据库的TDE功能之后,数据和日志会在写入磁盘前被加密,然后在加载到内存时被解密。这个过程对于用户和应用程序都是透明的,用户和应用程序不会察觉到任何变化。
除了透明之外,TDE不会增加加密数据库的大小,加解密之前数据库的大小是相同的,并且TDE对加解密的开销有很大的调整,对数据库的性能影响较小。
在对数据库文件进行备份时,备份文件是加密之后的数据。要还原到其他的服务器实例上,必须具备完整的解密密钥,否则无法还原。
二,TDE的层次结构
TDE使用master数据库中的证书或EKM中非对称密钥来保护DEK,使用DEK来加密和解密数据。
启用数据库的TDE功能,主要分三步来实现,第一步:在master书库中,创建服务主密钥和证书,其实证书是由服务主密钥来保护的。
USE master; GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>'; go CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate'; go
第二步:切换到特定的数据库中,创建DEK,并使用证书来保护DEK,DEK用于对数据文件进行加密和解密:
USE AdventureWorks2012; GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE MyServerCert; GO
第三步:启用数据库加密,SQL Server会扫描全部数据库文件,读取数据之后,对数据进行加密,然后把加密之后的数据重新写入到数据库文件中。
ALTER DATABASE AdventureWorks2012 SET ENCRYPTION ON; GO
三,数据库加密密钥
数据库加密密钥(Database Encryption Key,DEK)是对称密钥,由证书(存储在master数据库中)或非对称密钥(存储在EKM中)来保护。在启用TDE之前,必须创建DEK。DEK不能导出,只在当前的系统有效。
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = { AES_128 | AES_192 | AES_256 | TRIPLE_DES_3KEY } ENCRYPTION BY SERVER { CERTIFICATE Encryptor_Name | ASYMMETRIC KEY Encryptor_Name }
参数注释: WITH ALGORITHM = { AES_128 | AES_192 | AES_256 | TRIPLE_DES_3KEY }:指定DEK用于加密数据的算法,从SQL Server 2017开始,除了TRIPLE_DES_3KEY之外,AES_128 | AES_192 | AES_256 都已经过时。
用户可以从 sys.dm_database_encryption_keys 的 字段 encryption_state 查看数据库加密的状态:
- 0 = No database encryption key present, no encryption
- 1 = Unencrypted
- 2 = Encryption in progress
- 3 = Encrypted
- 4 = Key change in progress
- 5 = Decryption in progress
- 6 = Protection change in progress (The certificate or asymmetric key that is encrypting the database encryption key is being changed.)
四,TDE数据扫描
为了启用数据库的TDE,SQL Server必须做一个加密扫描,把数据文件中的每个页面读入缓冲池,然后把加密后的页面写回磁盘。为了让您更好地控制加密扫描,SQL Server 2019(15.x)引入了TDE扫描,该扫描具有暂停和恢复语法。 您可以在系统的工作负载很重时或在关键业务时间内暂停扫描,然后稍后再恢复扫描。
使用以下语法开始扫描:
ALTER DATABASE <db_name> SET ENCRYPTION ON;
使用以下语法暂停扫描;
ALTER DATABASE <db_name> SET ENCRYPTION SUSPEND;
使用以下语法继续扫描:
ALTER DATABASE <db_name> SET ENCRYPTION RESUME;
五,对加密数据库的维护
在启用TDE的数据库中,加密和解密使用的是证书,如果证书丢失或者损坏,那么数据库文件基本上就没法使用了,所以必须要备份证书。
BACKUP CERTIFICATE TDECert TO FILE = 'C:\certificates\TDECert' WITH PRIVATE KEY (file='C:\certificates\TDECertKey', ENCRYPTION BY PASSWORD='Pa$$w0rd') ;
如果把加密数据库迁移到其他的服务器上,需要还原解密的密钥:SMK和证书。
在新实例中,创建一个相同密码的服务主密钥,把证书还原到新实例中。
USE master GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ; GO CREATE CERTIFICATE TDECert FROM FILE = 'C:\Certificates\TDECert' WITH PRIVATE KEY ( FILE = 'C:\Certificates\TDECertKey', DECRYPTION BY PASSWORD = 'Pa$$w0rd' ) ;
参考文档: