資料加密 第六篇:透明檔案加密

悅光陰發表於2020-06-07

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

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

相關文章