透明資料加密 (TDE)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

透明資料加密 (TDE) 可將 SQL Server、Azure SQL Database 與 Azure Synapse Analytics 資料檔案加密。 此加密稱為加密待用資料。

為協助保護使用者資料庫安全,您可採取以下預防措施:

  • 設計安全的系統。
  • 加密機密資產。
  • 在資料庫伺服器周圍建置防火牆。

但是竊取磁碟機或備份磁帶等實體媒體的惡意人士,可以還原或附加資料庫,並瀏覽其中的資料。

解決方案之一是加密資料庫中的敏感性資料,並使用憑證來保護加密資料的金鑰。 這個解決方案可防止沒有金鑰的人使用該資料。 但這種防護必須事先規劃。

TDE 會執行資料和記錄檔的即時 I/O 加密和解密。 加密使用資料庫加密金鑰 (DEK)。 資料庫開機記錄會儲存金鑰以供復原時使用。 DEK 是對稱金鑰,由伺服器 master 資料庫存放區的憑證或 EKM 模組所保護的非對稱金鑰提供安全保障。

TDE 會保護待用資料,亦即資料檔和記錄檔。 這讓您必須遵循不同行業建立的許多法令、規章和指導方針。 此功能可讓軟體開發人員使用 AES 和 3DES 加密演算法來加密資料,而無需變更現有的應用程式。

注意

TDE 不適用於系統資料庫, 無法用來加密 mastermodelmsdbtempdb 會在使用者資料庫啟用 TDE 時自動加密,但無法直接加密。

TDE 不提供跨通訊通道的加密。 如需有關如何跨通訊通道加密資料的詳細資訊,請參閱設定 SQL Server 資料庫引擎來加密連線

相關主題:

關於 TDE

資料庫檔案的加密會在頁面層級執行。 加密資料庫中的頁面會在寫入磁碟前即已加密,並在讀入記憶體時解密。 TDE 不會增加加密資料庫的大小。

適用於 SQL Database 的資訊

將 TDE 與 Azure SQL Database 搭配使用時,SQL Database 會自動建立儲存在 master 資料庫中的伺服器層級憑證。 若要移動 SQL Database 上的 TDE 資料庫,無需為移動作業解密資料庫。 如需將 TDE 與 SQL Database 搭配使用的詳細資訊,請參閱使用 Azure SQL Database 的透明資料加密

適用於 SQL Server 的資訊

保護資料庫之後,即可使用正確的憑證來還原資料庫。 如需有關憑證的詳細資訊,請參閱< SQL Server Certificates and Asymmetric Keys>。

啟用 TDE 之後,請立即備份憑證及其相關聯的私密金鑰。 如果憑證無法使用,或您在另一部伺服器上還原或附加資料庫,則需要使用備份的憑證和私密金鑰。 否則,即無法開啟資料庫。 儲存在自主系統資料庫中的憑證也應該備份。

即使資料庫已停用 TDE,仍請保留加密憑證。 雖然資料庫未加密,但部分交易記錄檔可能仍受到保護。 在執行完整資料庫備份之前,執行某些作業可能也需要憑證。

已超過到期日的憑證仍可與 TDE 搭配用來加密和解密資料。

加密階層

Windows 資料保護 API (DPAPI) 位於加密樹狀結構的根,可保護機器層級的金鑰階層,並用於保護資料庫伺服器執行個體的服務主要金鑰 (SMK)。 SMK 會保護儲存在使用者資料庫層級的資料庫主要金鑰 (DMK),以及憑證和非對稱金鑰。 這些金鑰則會為用於保護資料的對稱金鑰提供保障。 一直到憑證為止,TDE 都會使用類似的階層。 使用 TDE 時,DMK 和憑證都必須儲存在 master 資料庫中。 系統會建立僅用於 TDE 的新資料庫加密金鑰 (DEK),然後儲存在使用者資料庫中。

下圖顯示 TDE 加密的架構。 在 SQL Database 中使用 TDE 時,使用者只能設定資料庫層級項目 (資料庫加密金鑰和 ALTER DATABASE 部分)。

Diagram showing the transparent data encryption architecture.

啟用 TDE

若要使用 TDE,請遵循下列步驟。

適用於:SQL Server。

  1. 建立建立主要金鑰。
  2. 建立或取得受主要金鑰保護的憑證。
  3. 建立資料庫加密金鑰,並使用憑證保護金鑰。
  4. 設定資料庫以使用加密。

下例示範使用安裝在伺服器上名為 MyServerCert 的憑證來加密和解密 AdventureWorks2022 資料庫。

USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>';
GO
CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate';
GO
USE AdventureWorks2022;
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE MyServerCert;
GO
ALTER DATABASE AdventureWorks2022
SET ENCRYPTION ON;
GO

SQL Server 會將加密和解密作業排定在背景執行緒上。 請使用本文中稍後出現的資料表目錄檢視和動態管理檢視,以檢視這些作業的狀態。

警告

啟用了 TDE 的資料庫備份檔案也會使用 DEK 來加密。 因此,當要還原這些備份時,必須可以使用用來保護 DEK 的憑證。 所以,除了備份資料庫以外,請務必也要維護伺服器憑證的備份。 如果無法再使用此憑證,即會遺失資料。

如需詳細資訊,請參閱 SQL Server Certificates and Asymmetric Keys

命令與函式

若要讓下列陳述式接受 TDE 憑證,請使用資料庫主要金鑰來加密憑證。 如果只用密碼來加密憑證,則其陳述式會拒絕將憑證作為加密程式。

重要

如果在 TDE 使用憑證後以密碼保護憑證,則在重新開機之後,即無法存取資料庫。

下表提供 TDE 命令與函式的連結及說明:

命令或函數 目的
CREATE DATABASE ENCRYPTION KEY 建立用於加密資料庫的金鑰
ALTER DATABASE ENCRYPTION KEY 變更用於加密資料庫的金鑰
DROP DATABASE ENCRYPTION KEY 移除用於加密資料庫的金鑰
ALTER DATABASE SET 選項 說明啟用 TDE 所用的 ALTER DATABASE 選項

目錄檢視和動態管理檢視

下表顯示 TDE 目錄檢視和動態管理檢視 (DMV)。

目錄檢視或動態管理檢視 目的
sys.databases 顯示資料庫資訊的目錄檢視
sys.certificates 目錄檢視,其顯示資料庫中的憑證
sys.dm_database_encryption_keys 動態管理檢視,其提供資料庫加密金鑰的資訊及加密狀態

權限

如先前的資料表中所述,每項 TDE 功能和命令都有個別的權限需求。

若要檢視與 TDE 有關的中繼資料,則需要具有憑證的 VIEW DEFINITION 權限。

考量

當資料庫加密作業的重新加密掃描正在進行時,對資料庫的維護作業將會停用。 您可使用資料庫的單一使用者模式設定來執行維護作業。 如需詳細資訊,請參閱將資料庫設定為單一使用者模式

您可以使用 sys.dm_database_encryption_keys 動態管理檢視了解資料庫加密狀態。 如需詳細資訊,請參閱本文先前的目錄檢視和動態管理檢視部分。

在 TDE 中,資料庫內的所有檔案和檔案群組都會加密。 如果資料庫中有任何檔案群組標示為 READ ONLY,則資料庫加密作業將會失敗。

如果在資料庫鏡像或記錄傳送中使用資料庫,則兩個資料庫都會加密。 在兩者之間傳送記錄交易時會予以加密。

重要

設定資料庫加密時,即會加密全文檢索索引。 在 SQL Server 2005 (9.x) 和較早版本中建立的此類索引會由 SQL Server 2008 (10.0.x) 和更新版本匯入資料庫,並由 TDE 加密。

提示

若要監視資料庫的 TDE 狀態變更,請使用 SQL Server Audit 或 Azure SQL 資料庫稽核。 SQL Server 將 TDE 追蹤記錄放在稽核動作群組 DATABASE_OBJECT_CHANGE_GROUP 下,此群組位於 SQL Server 稽核動作群組和動作中。

限制

在初始資料庫加密、金鑰變更或資料庫解密期間,不允許下列作業:

  • 從資料庫的檔案群組中卸除檔案
  • 卸除資料庫
  • 讓資料庫離線
  • 卸離資料庫
  • 將資料庫或檔案群組轉換成 READ ONLY 狀態

CREATE DATABASE ENCRYPTION KEYALTER DATABASE ENCRYPTION KEYDROP DATABASE ENCRYPTION KEYALTER DATABASE...SET ENCRYPTION 陳述式中不允許執行下列作業:

  • 從資料庫的檔案群組中卸除檔案
  • 卸除資料庫
  • 讓資料庫離線
  • 卸離資料庫
  • 將資料庫或檔案群組轉換成 READ ONLY 狀態
  • 使用 ALTER DATABASE 命令
  • 啟動資料庫或資料庫檔案備份
  • 啟動資料庫或資料庫檔案還原
  • 建立快照集

下列作業或條件會導致 CREATE DATABASE ENCRYPTION KEYALTER DATABASE ENCRYPTION KEYDROP DATABASE ENCRYPTION KEYALTER DATABASE...SET ENCRYPTION 陳述式無法運作:

  • 資料庫是唯讀的,或具有唯讀的檔案群組。
  • ALTER DATABASE 命令正在執行。
  • 正在執行資料備份。
  • 資料庫為離線或還原狀態。
  • 快照集正在進行中。
  • 正在執行資料庫維護工作。

建立資料庫檔案時,如果啟用 TDE 即無法使用立即檔案初始化功能。

為了使用非對稱金鑰來加密 DEK,此非對稱金鑰必須位在可延伸的金鑰管理提供者上。

TDE 掃描

若要啟用資料庫上的 TDE,SQL Server 必須執行加密掃描。 掃描會將資料檔案的每一頁都讀入緩衝集區,然後將加密的頁面寫回磁片。

為了協助您更充分掌控加密掃描,SQL Server 2019 (15.x) 導入有暫止和繼續語法的 TDE 掃描。 您可在系統工作負載過重或業務忙碌時段暫停掃描,再於稍後時間繼續掃描。

使用下列語法可暫停 TDE 加密掃描:

ALTER DATABASE <db_name> SET ENCRYPTION SUSPEND;

您也可以使用下列語法繼續 TDE 加密掃描:

ALTER DATABASE <db_name> SET ENCRYPTION RESUME;

sys.dm_database_encryption_keys 動態管理檢視中已新增 encryption_scan_state 資料行。 其顯示加密掃描目前的狀態。 另有稱為 encryption_scan_modify_date 的新資料行,其包含上次加密掃描狀態變更的日期和時間。

如果 SQL Server 執行個體在加密掃描暫止期間重新啟動,啟動期間錯誤記錄檔中便會記錄一則訊息。 該訊息會指出現有的掃描已暫停。

重要

Azure SQL 資料庫、Azure SQL 受控執行個體和 Azure Synapse Analytics 目前無法使用暫停和繼續 TDE 掃描功能。

TDE 和交易記錄

TDE 可保護待用資料檔案和記錄檔。 在未加密的資料庫上啟用 TDE 後加密整個資料庫是一個相當大的資料作業,所需的時間取決於此資料庫執行的系統資源。 sys.dm_database_encryption_keys DMV 可用於判斷資料庫的加密狀態。

開啟 TDE 時,資料庫引擎會強制建立新的交易記錄,而新的交易記錄將由資料庫加密密鑰加密。 先前的交易或目前長時間執行的交易在 TDE 狀態變更之間交錯產生的任何記錄都不會加密。

可以使用 sys.dm_db_log_info DMV 監視交易記錄,此 DMV 也使用 Azure SQL、SQL Server 2019 (15.x) 及更新版本中提供的 vlf_encryptor_thumbprint 資料行顯示記錄檔是否已加密。 若要使用 encryption_state 檢視中的 sys.dm_database_encryption_keys 資料行來尋找記錄檔的加密狀態,以下是範例查詢:

USE AdventureWorks2022;
GO
/* The value 3 represents an encrypted state
   on the database and transaction logs. */
SELECT *
FROM sys.dm_database_encryption_keys
WHERE encryption_state = 3;
GO

如需有關 SQL Server 記錄檔架構的詳細資訊,請參閱交易記錄

在 DEK 變更之前,先前的 DEK 會加密寫入交易記錄的所有資料。

如果您變更 DEK 兩次,必須先執行記錄備份,然後才能再次變更 DEK。

TDE 與 tempdb 系統資料庫

此外,如果 SQL Server 執行個體上有任一其他資料庫使用 TDE 進行加密,tempdb 系統資料庫也會加密。 這加密可能會影響相同 SQL Server 執行個體上未加密的資料庫效能。 如需 tempdb 系統資料庫的詳細資訊,請參閱 tempdb 資料庫

TDE 和複寫

複寫不會自動以加密形式複寫啟用 TDE 的資料庫資料。 如果想要保護散發資料庫和訂閱者資料庫,請分別啟用 TDE。

快照式複寫可將資料儲存在未加密的中繼檔案中,例如 BCP 檔案。 異動複寫和合併式複寫的初始資料散發亦可。 在這類複寫期間,您可啟用加密來保護通訊通道。

如需詳細資訊,請參閱針對加密連線設定 SQL Server 資料庫引擎

TDE 與可用性群組

您可以將加密的資料庫新增至 Always On 可用性群組

若要加密屬於可用性群組的資料庫,請先在所有次要複本上建立主要金鑰和憑證或非對稱金鑰 (EKM),再於主要複本上建立資料庫加密金鑰

如果使用憑證保護 DEK,請備份在主要複本上建立的憑證,然後先在所有次要複本上使用檔案建立憑證,再於主要複本上建立 DEK。

TDE 和 FILESTREAM 資料

即使啟用 TDE 也不會加密 FILESTREAM 資料。

TDE 與備份

透明資料加密經常會使用憑證保護 DEK。 這個憑證必須在 master 資料庫中建立。 啟用了 TDE 的資料庫備份檔案也會使用 DEK 來加密。 因此,還原這些備份時,您必須要能使用保護 DEK 的憑證。 換句話說,除了備份資料庫以外,您也必須維護伺服器憑證的備份,以免資料遺失。 如果此憑證無法再使用,就會造成資料遺失。

移除 TDE

使用 ALTER DATABASE 陳述式移除資料庫的加密。

ALTER DATABASE <db_name> SET ENCRYPTION OFF;

若要檢視資料庫的狀態,請使用 sys.dm_database_encryption_keys 動態管理檢視。

等候解密完成,然後使用 DROP DATABASE ENCRYPTION KEY 來移除 DEK。

重要

將用於 TDE 的主要金鑰和憑證備份至安全位置。 需有主要金鑰和憑證才能還原以 TDE 加密資料庫時所取得的備份。 移除 DEK 之後,先進行記錄備份,然後再建立已解密資料庫的全新完整備份。

TDE 與緩衝集區延伸

使用 TDE 加密資料庫時,不會加密與緩衝集區延伸模組 (BPE) 相關的檔案。 針對這些檔案,請在檔案系統層級使用 Bitlocker 或 EFS 等加密工具。

TDE 和記憶體內部 OLTP

您可對具有記憶體中 OLTP 物件的資料庫啟用 TDE。 在 SQL Server 2016 (13.x) 與 Azure SQL Database 中,一旦啟用 TDE,記憶體內部 OLTP 記錄和資料都會加密。 在 SQL Server 2014 (12.x) 中,一旦啟用 TDE,記憶體內部 OLTP 記錄就會加密,但 MEMORY_OPTIMIZED_DATA 檔案群組中的檔案不會加密。

TDE 使用憑證的管理方針

當資料庫已為 TDE 啟用,且用於記錄傳送或資料庫鏡像時,您必須備份憑證和資料庫主要金鑰。 儲存在自主系統資料庫中的憑證也應該備份。

用於保護 DEK 的憑證不應從 master 資料庫中卸除。 否則會無法存取已加密資料庫。

如果命令中使用的憑證尚未備份,執行 CREATE DATABASE ENCRYPTION KEY 後便會觸發類似下列訊息 (錯誤 33091) 的訊息。

警告

用來加密資料庫加密金鑰的憑證尚未備份。 您應該立即備份此憑證和與此憑證關聯的私密金鑰。 如果此憑證無法使用或是您必須在另一部伺服器上還原或附加資料庫,您必須同時擁有此憑證和私密金鑰的備份,否則將無法開啟資料庫。

以下查詢可用於在 TDE 使用的憑證中識別出建立後從未備份過的憑證。

SELECT pvt_key_last_backup_date,
    Db_name(dek.database_id) AS encrypteddatabase,
    c.name AS Certificate_Name
FROM sys.certificates c
INNER JOIN sys.dm_database_encryption_keys dek
    ON c.thumbprint = dek.encryptor_thumbprint;

如果資料行 pvt_key_last_backup_dateNULL,代表對應至該資料列的資料庫已為 TDE 啟用,但用於保護其 DEK 的憑證尚未備份。 如需有關備份憑證的詳細資訊,請參閱 BACKUP CERTIFICATE