全部產品
Search
文件中心

ApsaraDB RDS:TDE使用的最佳實務

更新時間:Jan 04, 2025

RDS SQL Server支援透明資料加密(Transparent Data Encryption,簡稱TDE)功能增強資料保護,允許您使用阿里雲內建密鑰或使用者內建密鑰進行加密,但開啟TDE後產生的備份自動加密且無法直接用於恢複。本文介紹如何開啟TDE,並在兩種不同加密情境下如何將開啟了TDE的SQL Server資料庫從阿里雲RDS恢複到本地環境中。同時,若您開啟TDE時使用了使用者內建密鑰的加密方式,也可參考本文情境二方案使用您自己配置的認證和密碼恢複備份資料。

TDE加密原理

TDE功能通過在資料庫層執行待用資料加密,阻止可能的攻擊者繞過資料庫直接從儲存中讀取敏感資訊。經過資料庫身分識別驗證的應用和使用者可以繼續透明地訪問應用資料(不需要更改應用代碼或配置),而嘗試讀取資料表空間檔案中的敏感性資料的OS使用者以及嘗試讀取磁碟或備份資訊的未知使用者將不允許訪問明文資料。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功能的初衷。

開啟或關閉TDE

開啟TDE

前提條件

  • RDS SQL Server執行個體需滿足以下要求:

    • 執行個體規格:通用型、獨享型(不支援共用型

    • 計費方式:訂用帳戶或隨用隨付(不支援Serverless執行個體

    • 執行個體大版本:SQL Server 2019 標準版、SQL Server 2022 標準版、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使用率足夠低,效能也不會受到太大影響。

使用限制

操作步驟

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側功能表列中單擊資料安全性

  3. TDE頁簽單擊未開通左邊滑塊。

    說明

    僅特定執行個體支援TDE功能,請參見前提條件

  4. 選擇密鑰類型,單擊確定,開通TDE。

    使用由阿里雲自動生成的密鑰

    選中需要加密的資料庫,單擊表徵圖,並單擊確定TDE設定

    使用內建SQL Server祕密金鑰加密
    1. 上傳認證及私密金鑰檔案到OSS。具體操作,請參見控制台上傳檔案上傳檔案到OSS

    2. 單擊下一步,配置密鑰相關參數。選擇內建密鑰

      參數

      取值及說明

      OSS Bucket

      選擇上傳認證及私密金鑰檔案所在的OSS Bucket。

      证书

      選擇您上傳到OSS的認證檔案。

      私钥

      選擇您上傳到OSS的私密金鑰檔案。

      密码

      輸入您自有SQL Server密鑰的密碼。

    3. 單擊下一步進入授權資料庫

      選中需要加密的資料庫,單擊表徵圖,並單擊確定授權資料庫

關閉TDE

說明
  • 如需解除單個或多個資料庫層級的TDE加密,只需將目標資料庫從已保護資料庫列表中移除即可。

  • 如需關閉單個執行個體層級的TDE加密功能,需要將所有資料庫從已保護資料庫列表中移除,系統會自動關閉執行個體TDE功能。

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側功能表列中單擊資料安全性

  3. TDE頁簽下,單擊TDE設定

  4. 在對話方塊右側的已保護資料庫中,選中需要解除TDE加密的資料庫,單擊表徵圖表徵圖,並單擊確定

    image

說明

關閉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;

應用情境一:開啟TDE(阿里雲自動產生的密鑰)後產生的備份恢複到本地

步驟一:關閉TDE

在RDS控制台執行個體詳情頁的資料安全性頁面中,將想要備份的資料庫從TDE功能中移除。

說明
  • 如需解除單個或多個資料庫層級的TDE加密,只需將目標資料庫從已保護資料庫列表中移除即可。

  • 如需關閉單個執行個體層級的TDE加密功能,需要將所有資料庫從已保護資料庫列表中移除,系統會自動關閉執行個體TDE功能。

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側功能表列中單擊資料安全性

  3. TDE頁簽下,單擊TDE設定

  4. 在對話方塊右側的已保護資料庫中,選中需要解除TDE加密的資料庫,單擊表徵圖表徵圖,並單擊確定

    image

說明

關閉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;

步驟二:執行一次全量備份

關閉TDE後,還存在部分未解密的交易記錄,此時下載的備份檔案仍處於加密狀態,無法直接用於恢複,因此在關閉TDE後還需再完成一次全量備份。更多資訊,請參見Database Encryption in SQL Server 2008 Enterprise Edition

您可以手動備份產生一個全量備份。具體操作,請參見手動備份SQL Server

說明

手動發起備份時,可按需備份整個完整的執行個體、或僅備份指定資料庫(僅備份機製為物理備份時)。

步驟三:下載備份並恢複到本地

在RDS執行個體詳情頁的備份恢複頁面中將最新產生的全量備份下載到本地,再使用壓縮包中的.bak檔案自行恢複即可。下載方法,請參見下載備份

應用情境二:開啟TDE(內建SQL Server密鑰)後產生的備份恢複到本地

您可以參考情境一方案關閉目標資料庫的TDE功能,再進行全量備份並下載備份恢複到本地。本模組介紹另一種恢複方案,按需選擇即可。

步驟一:建立主要金鑰

首先使用自訂的密碼在目標伺服器執行個體上的master庫中建立資料庫主要金鑰,密碼無需與原始伺服器中用於建立主要金鑰的密碼相同。

說明

本操作需要使用用戶端串連RDS SQL Server執行個體。串連方法,請參見串連SQL Server執行個體

以下SQL會先檢查目標伺服器執行個體中是否已存在主要金鑰,如果已存在則不會建立新的主要金鑰,您直接執行步驟二即可;如果不存在則會建立新密鑰。

USE master; 
GO 
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourPassword'; --此處自訂密碼
END;

步驟二:建立認證

使用開啟TDE時內建的認證和私密金鑰建立認證,並應用到目標伺服器執行個體。

USE MASTER;
GO
CREATE CERTIFICATE TDE_Certificate
FROM FILE = 'C:\cert\tde_cert.cer' --此處修改為認證實際路徑
WITH PRIVATE KEY (FILE = 'C:\cert\tde_privatekey.pvk', --此處修改為私密金鑰實際路徑
DECRYPTION BY PASSWORD = 'YourTDEPassword' ); --此處修改為實際密碼

步驟三:下載備份並恢複到本地

在RDS執行個體詳情頁的備份恢複頁面中找到目標備份組,將目標備份下載到本地,再使用壓縮包中的.bak檔案自行恢複即可。下載方法,請參見下載備份

說明

將恢複資料到本機資料庫時,如果遇到報錯The media family on device '<backup file name>' is incorrectly formed. SQL Server cannot process this media family.,該報錯是因為在高核心小版本的RDS SQL Server執行個體中,資料庫開啟TDE後產生的壓縮備份檔案可能採用了不向後相容的新格式,導致在低核心小版本的本地SQL Server資料庫上恢複時會報錯。具體詳情,請參見微軟官方文檔

為避免此類報錯,建議確保RDS SQL Server執行個體與本地SQL Server資料庫的大版本與小版本都保持一致。您可以在RDS執行個體詳情頁的基本資料頁面查看RDS SQL Server執行個體的版本資訊。

相關文檔

RDS SQL Server支援的其他加密方式,請參見資料安全與加密