前言

資料庫檔案外洩的成本往往不在攻擊當下,而在事後。SQL Server 的透明資料加密(Transparent Data Encryption,TDE)能在資料寫入磁碟時自動加密、讀取時自動解密,對應用程式完全透明,不需改一行程式碼。本文從建立主金鑰到啟用加密逐步實作,並說明實務上需要注意的地方。

TDE運作原理

TDE 保護的是磁碟上的靜態資料,也就是 .mdf.ldf 等資料庫檔案本身。寫入磁碟時加密、從磁碟讀取時解密,整個流程發生在資料庫引擎層,應用程式完全不感知。

金鑰階層如下:

資料庫檔案 資料庫引擎 記憶體 資料庫加密金鑰 憑證 加密 解密

TDE優缺點分析

優點

  • 對應用程式透明,不需修改程式碼
  • 保護整個資料庫檔案,包含交易日誌
  • 備份檔案也跟著加密,不需額外設定

缺點

  • 效能略有影響(通常在 5% 以內,I/O 密集的工作負載較明顯)
  • 只保護靜態資料,記憶體中的資料仍是明文
  • 金鑰管理需要額外規劃,搬移到其他執行個體時必須一起帶走憑證

實作步驟

1. 建立主金鑰(Master Key)

1
2
3
4
5
6
-- 在master資料庫建立主金鑰
-- 請修改自己的密碼
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword123!';
GO

2. 建立憑證

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 建立用於TDE的憑證
-- 請記得定期備份憑證
CREATE CERTIFICATE TDECert
WITH SUBJECT = 'TDE Certificate';
GO

-- 備份憑證和私鑰
BACKUP CERTIFICATE TDECert
TO FILE = 'C:\TDECert.cer'
WITH PRIVATE KEY
(
FILE = 'C:\TDECert_PrivateKey.pvk',
ENCRYPTION BY PASSWORD = 'YourStrongPassword123!'
);
GO

3. 建立資料庫加密金鑰

1
2
3
4
5
6
7
8
9
-- 切換到要加密的資料庫
USE YourDatabase;
GO

-- 建立資料庫加密金鑰
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE TDECert;
GO

4. 啟用資料庫加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 啟用資料庫加密
ALTER DATABASE YourDatabase
SET ENCRYPTION ON;
GO

-- 檢查加密狀態
SELECT
db.name,
db.is_encrypted,
dm.encryption_state,
dm.percent_complete,
dm.key_algorithm,
dm.key_length
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dm
ON db.database_id = dm.database_id
WHERE db.name = 'YourDatabase';

效能考量

Microsoft 的測試結果顯示 TDE 的效能影響通常在 5% 以內,但實際情況差異很大。影響最大的因素是實體 I/O 的比例——如果資料大量從記憶體的緩衝池讀取,解密幾乎沒有成本;若大量發生實體讀寫(例如全表掃描、大型備份),影響就會比較明顯。

其他影響因素:

  • CPU 規格與核心數(加解密是 CPU 密集操作)
  • 資料庫大小與存取模式
  • 工作負載類型(OLTP vs 批次報表)

實務注意事項

金鑰備份是頭號優先。 憑證一旦遺失,加密的資料庫就無法還原。備份憑證和私鑰後,把這些檔案存放在與資料庫伺服器分離的安全位置(不要都放在同一台機器上)。

還原到新執行個體必須先還原憑證。 TDE 的備份檔案本身是加密的,還原到另一台 SQL Server 時,必須先在目標執行個體建立主金鑰、還原憑證,再還原資料庫,否則會直接報錯。這一點在 DR 演練時最容易踩到。

定期確認加密狀態。 可以用以下查詢檢查:

1
2
3
4
5
6
7
8
SELECT 
db.name,
db.is_encrypted,
dm.encryption_state,
dm.percent_complete
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dm
ON db.database_id = dm.database_id;

encryption_state = 3 表示完全加密。初次啟用加密時 percent_complete 會從 0 爬升,大型資料庫可能需要幾分鐘到幾小時。

建立金鑰輪換計畫。 憑證建議每年或依公司資安政策定期輪換,輪換後重新備份新憑證。

常見問題

無法啟用 TDE

通常是以下其中一個原因:權限不足(需要 CONTROL DATABASE)、主金鑰不存在、憑證建立失敗。執行前先確認主金鑰與憑證都在 master 資料庫裡,並查 SQL Server 錯誤日誌取得詳細訊息。

啟用加密後效能下降明顯

先確認是 CPU 還是 I/O 瓶頸。若是 I/O,考慮調整緩衝池大小讓更多資料留在記憶體;若是 CPU,檢查有無其他同時跑的高 CPU 作業。TDE 本身不建議降低加密演算法規格來換效能,AES_256 在現代硬體上的負擔已很小。

小結

TDE 的啟用流程本身不複雜,四個步驟就能完成。真正需要花心思的是金鑰管理:憑證備份、還原流程驗證、金鑰輪換週期。這些沒做好,加密反而可能變成資料復原的阻礙。

參考資料

  1. Microsoft官方文件: Transparent Data Encryption (TDE)
  2. SQL Server TDE Best Practices