數據加密 第六篇:透明文件加密

對於數據的保護,不僅需要控制數據的訪問許可權,還需要保護存儲數據的文件。除了在作業系統層面對文件進行訪問控制之外,還要確保文件被竊取後依然可以保護數據不泄露,這就需要對文件進行加密。即使文件被竊取,如果不能對文件進行解密,那麼數據也是安全的。

對於數據的加密,可以使用證書、對稱密鑰和非對稱密鑰,這三種加密機制都是用於保護數據,即使數據被竊取,如果沒有解密的密鑰,那麼數據依舊不可用。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資料庫中的證書來保護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
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)