数据加密 第六篇:透明文件加密

对于数据的保护,不仅需要控制数据的访问权限,还需要保护存储数据的文件。除了在操作系统层面对文件进行访问控制之外,还要确保文件被窃取后依然可以保护数据不泄露,这就需要对文件进行加密。即使文件被窃取,如果不能对文件进行解密,那么数据也是安全的。

对于数据的加密,可以使用证书、对称密钥和非对称密钥,这三种加密机制都是用于保护数据,即使数据被窃取,如果没有解密的密钥,那么数据依旧不可用。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' 
) ; 

 

 

参考文档:

Transparent Data Encryption (TDE)

posted @ 2020-06-07 15:59  悦光阴  阅读(195)  评论(1编辑  收藏