數據加密 第六篇:透明文件加密
- 2020 年 6 月 7 日
- 筆記
- Security, SQL Server 安全, TDE
對於數據的保護,不僅需要控制數據的訪問許可權,還需要保護存儲數據的文件。除了在作業系統層面對文件進行訪問控制之外,還要確保文件被竊取後依然可以保護數據不泄露,這就需要對文件進行加密。即使文件被竊取,如果不能對文件進行解密,那麼數據也是安全的。
對於數據的加密,可以使用證書、對稱密鑰和非對稱密鑰,這三種加密機制都是用於保護數據,即使數據被竊取,如果沒有解密的密鑰,那麼數據依舊不可用。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)