對於資料的保護,不僅需要控制資料的訪問許可權,還需要保護儲存資料的檔案。除了在作業系統層面對檔案進行訪問控制之外,還要確保檔案被竊取後依然可以保護資料不洩露,這就需要對檔案進行加密。即使檔案被竊取,如果不能對檔案進行解密,那麼資料也是安全的。
對於資料的加密,可以使用證照、對稱金鑰和非對稱金鑰,這三種加密機制都是用於保護資料,即使資料被竊取,如果沒有解密的金鑰,那麼資料依舊不可用。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' ) ;
參考文件: