在安全合規或待用資料加密等情境下,推薦使用透明資料加密TDE(Transparent Data Encryption)功能,對資料檔案執行即時I/O加密和解密,確保敏感性資料在寫入磁碟之前進行加密,從磁碟讀入記憶體時進行解密,阻止可能的攻擊者繞過資料庫直接從儲存中讀取敏感資訊,有效提高資料庫中敏感性資料的安全性。使用TDE功能不會增加資料檔案的大小,開發人員無需更改任何應用程式。
TDE加密原理
TDE加密在電腦各個層級的體現大致如下:
作業系統層
Microsoft Data Protection API(DPAPI)是Windows作業系統中的一個API,它提供了加密和解密資料的服務,且使用者無需直接處理加密金鑰和演算法的細節。
DPAPI位於TDE整體加密層級的根部,負責在電腦作業系統層級保護密鑰階層,並用於保護資料庫伺服器執行個體的服務主要金鑰(SMK)。
SQL Server執行個體層
在SQL Server中,服務主要金鑰(Service Master Key,簡稱SMK)是資料庫引擎使用的一種進階加密金鑰。它是SQL Server資料庫引擎的根級密鑰,在SQL Server執行個體搭建好時建立,用於保護較低層級的密鑰和資料。
SMK被DPAPI所保護,並用於保護資料庫主要金鑰DMK。
資料庫層
TDE在資料庫這一層級的加密可再細分為Master庫和User庫兩層。
Master庫
在使用TDE時,會在Master庫中建立一個資料庫主要金鑰(Database Master Key,DMK),並使用該DMK建立一個認證,二者均被儲存在Master庫中。
DMK是用來保護資料庫中敏感資訊的一個對稱金鑰,它被SMK所保護,並用來加密認證。Master庫中的認證則用來對User庫中的DEK進行加密。
User庫
User庫中將建立一個僅作用於TDE的新密鑰,稱為資料庫加密金鑰(Database Encryption Key,DEK),它被儲存在User庫中。
DEK被Master庫中的認證保護,DEK所在的整個User庫中的資料都會被該DEK加密保護。資料寫入過程中,被認證加密後的DEK儲存在資料庫中,而未加密的DEK只存在於記憶體中,用於即時加密和解密資料檔案;資料讀取過程中,SQL Server使用認證的私密金鑰來解密儲存在資料庫中的加密DEK,解密後的DEK被載入到記憶體中,用於即時解密資料檔案中的資料,這一過程對於應用程式和使用者是透明的。
當Master庫中沒有TDE認證時,將無法解密DEK,從而導致啟用TDE的資料庫無法通過備份或附加恢複到執行個體上,這也是TDE功能的初衷。
前提條件
RDS SQL Server執行個體需滿足以下要求:
執行個體大版本:SQL Server 2019 標準版、SQL Server 2022 標準版、SQL Server 企業版
執行個體規格:通用型、獨享型(不支援共用型)
說明不支援SQL Server唯讀執行個體。
如果您使用自有密鑰,請提前準備加密認證、私密金鑰以及密碼。
已使用阿里雲主帳號授權RDS存取金鑰管理服務KMS(Key Management Service)。詳情請參見授權RDS訪問KMS。
注意事項
如果您使用阿里雲提供的服務密鑰,開通TDE後產生的備份不能直接恢複到本地。您可以參見TDE使用的最佳實務教程內的方案解決。
開啟TDE後,會對資料庫效能產生一定影響。具體體現如下:
效能影響範圍:根據微軟官方文檔,TDE對資料庫總體效能影響約在3~5%之間。
記憶體中資料的影響較小:如果訪問的大部分資料已經被儲存在記憶體中,TDE對效能的影響會明顯降低。
CPU使用率和I/O的影響:TDE加密是一個CPU密集型過程,且在I/O上執行。
當伺服器或應用程式的I/O操作較少(低I/O負載)且CPU使用率本就不高時,TDE帶來的效能下降會較小;相反對於高CPU使用率的應用程式而言,啟用TDE將產生較大的效能損失(估計約為28%)。
因此即使是高I/O的應用程式或伺服器,如果CPU使用率足夠低,效能也不會受到太大影響。
使用限制
開啟了TDE的執行個體不支援2008 R2(本地SSD盤)升級為2012或2016、升級核心小版本操作。
開啟了TDE的執行個體建立的備份資料,無法用於重建恢複。
開啟TDE
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側功能表列中單擊資料安全性。
在TDE頁簽單擊未開通左邊滑塊。
說明僅特定執行個體支援TDE功能,請參見前提條件。
選擇密鑰類型,單擊確定,開通TDE。
使用由阿里雲自動生成的密鑰
選中需要加密的資料庫,單擊表徵圖,並單擊確定。
使用內建SQL Server祕密金鑰加密
上傳認證及私密金鑰檔案到OSS。具體操作,請參見控制台上傳檔案。
單擊下一步,配置密鑰相關參數。
參數
取值及說明
OSS Bucket
選擇上傳認證及私密金鑰檔案所在的OSS Bucket。
证书
選擇您上傳到OSS的認證檔案。
私钥
選擇您上傳到OSS的私密金鑰檔案。
密码
輸入您自有SQL Server密鑰的密碼。
單擊下一步進入授權資料庫。
選中需要加密的資料庫,單擊表徵圖,並單擊確定。
關閉TDE
如需解除單個或多個資料庫層級的TDE加密,只需將目標資料庫從已保護資料庫列表中移除即可。
如需關閉單個執行個體層級的TDE加密功能,需要將所有資料庫從已保護資料庫列表中移除,系統會自動關閉執行個體TDE功能。
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側功能表列中單擊資料安全性。
在TDE頁簽下,單擊TDE設定。
在對話方塊右側的已保護資料庫中,選中需要解除TDE加密的資料庫,單擊表徵圖,並單擊確定。
關閉TDE功能涉及到資料庫的多個操作,包括等待上一次備份完成、資料解密、日誌記錄、中繼資料更新等。特別是資料解密操作,作為一個資源密集型操作,它會顯著佔用CPU、記憶體和I/O資源,該操作所耗費的時間與資料量成正比,因此擁有大規模資料的資料庫在關閉TDE功能時可能耗時較長(例如資料庫含有200 GB左右資料時,關閉TDE所需時間可能在40分鐘以上)。
若您在關閉TDE後想要查看當前TDE解密的進度,可以使用如下T-SQL:
SELECT
db_name(database_id) AS DatabaseName,
encryption_state,
percent_complete
FROM
sys.dm_database_encryption_keys;
相關文檔
您還可以使用API開啟透明資料加密,請參見ModifyDBInstanceTDE。
如果您還需要對執行個體訪問鏈路進行加密,可以開啟SSL鏈路加密,請參見設定SSL加密。
如需將開啟了TDE後產生的備份恢複到本地,請參見TDE使用的最佳實務。