在安全合規或待用資料加密等情境下,推薦使用透明資料加密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執行個體需滿足以下要求:
執行個體規格:通用型、獨享型(不支援共用型)
計費方式:訂用帳戶或隨用隨付(不支援Serverless執行個體簡介)
執行個體大版本:SQL Server 2019 標準版、SQL Server 2022 標準版、SQL Server 2025 標準版、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(高效能本地碟)升級為2012或2016操作。
開啟TDE後,執行個體產生的備份資料可用於恢複到新執行個體(複製執行個體),但不支援將備份資料恢複到已有執行個體;且無法用於在執行個體進入資源回收筒後通過備份進行重建恢複。
開啟TDE
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側功能表列中單擊資料安全性。
在TDE頁簽單擊未開通左邊滑塊。
說明僅特定執行個體支援TDE功能,請參見前提條件。
選擇密鑰類型,單擊確定,開通TDE。
使用自動生成的密鑰
選中需要加密的資料庫,單擊
表徵圖,並單擊確定。在TDE 設定對話方塊中,依次完成以下操作:
在可選資料庫面板中勾選目標資料庫(如 zht_ssl)。
單擊中間的向右箭頭>按鈕,將所選資料庫移至已保護資料庫面板。
單擊確定。
使用內建SQL Server祕密金鑰加密
上傳認證及私密金鑰檔案到OSS。具體操作,請參見上傳檔案。
上傳檔案到 OSS 的建議:
單個檔案建議通過 OSS 控制台上傳。
多個檔案建議採用斷點續傳方式並調用 OSS OpenAPI。
可利用用戶端形式上傳檔案到 OSS。
單擊下一步,配置密鑰相關參數。
參數
取值及說明
OSS Bucket
選擇上傳認證及私密金鑰檔案所在的OSS Bucket。
證書
選擇您上傳到OSS的認證檔案。
私鑰
選擇您上傳到OSS的私密金鑰檔案。
密碼
輸入您自有SQL Server密鑰的密碼。
單擊下一步進入授權數據庫。
選中需要加密的資料庫,單擊
表徵圖,並單擊確定。在可選資料庫面板中勾選需要加密的資料庫(如 tb1 和 tb2)。
單擊>按鈕將所選資料庫移至已保護資料庫面板。
單擊確定。
關閉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使用的最佳實務。