# SQL Server 透明資料加密(TDE) 透明資料加密(TDE)是 SQL Server 中的一項功能,用於對資料庫中的數據進行加密。TDE 通過對數據庫的物理文件進行加密,保護數據在儲存時的安全性。當 TDE 啟用後,數據在寫入磁盤之前會被自動加密,在讀取時自動解密。TDE 使用對稱金鑰進行加解密,該金鑰由主要密鑰保護。TDE 提供強大的數據保護,確保數據在儲存和傳輸過程中的機密性。 在早年這功能要用 SQL Enterprise 才能使用此功能,SQL 2019 後這功能下放到 Standard 版了。 ## 現有資料庫啟用 TDE 步驟 ### 啟用金鑰與建立憑證 ```SQL USE master; GO --創建主要金鑰(那個密碼不要忘掉) CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'TDE@0123456789'; GO --創建加密憑證 CREATE CERTIFICATE TdeServerCert WITH SUBJECT = N'透明加密憑證'; GO ``` ### 啟用資料庫TDE功能 ```SQL USE 目標資料庫; GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE TdeServerCert; GO ALTER DATABASE 目標資料庫 SET ENCRYPTION ON; GO ``` ## 啟用 TDE 後 資料庫的備份與移轉 啟用TDE後,資料庫的 .mdf .ldf .bak 等檔案都是受到保護的,直接拿到別臺主機是不能還原與使用的,需要先把原主機上的憑證備份遷移過去。才能還原 bak 或掛載 .mdf .ldf。 ### 備份憑證(在原主機執行) ```SQL BACKUP CERTIFICATE TdeServerCert TO FILE = '/var/MsSqlBackUp/TdeServerCert.bak' WITH PRIVATE KEY ( FILE = '/var/MsSqlBackUp/TdeServerCertKey.pvk', ENCRYPTION BY PASSWORD = 'TDE@9876543210' ); ``` ### 還原憑證(在新主機執行) ```SQL USE master; GO --創建主要金鑰(那個密碼不要忘掉,這邊的主要金鑰可以直接建立新的不需要從原主機備份過來) CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'NEWTDE@0123456789'; GO --還原 TDE 使用憑證.(TdeServerCert.bak TdeServerCertKey.pvk 從原主機備份下來的) CREATE CERTIFICATE TdeServerCert FROM FILE = '/var/MsSqlBackUp/TdeServerCert.bak' WITH PRIVATE KEY ( FILE = '/var/MsSqlBackUp/TdeServerCertKey.pvk', DECRYPTION BY PASSWORD = 'TDE@9876543210' ); --還原資料庫 USE [master] RESTORE DATABASE [目標資料庫] FROM DISK = N'/var/MsSqlBackUp/目標資料庫.bak' WITH FILE = 1, MOVE N'EPB_CEMS' TO N'/var/opt/mssql/user/data/目標資料庫.mdf', MOVE N'EPB_CEMS_log' TO N'/var/opt/mssql/user/data/目標資料庫.ldf', NOUNLOAD, STATS = 5 GO ``` ## 其他作業參考 ### 主要金鑰操作 ```SQL --備份主要金鑰 BACKUP MASTER KEY TO FILE = '/var/MsSqlBackUp/MasterKey.bak' ENCRYPTION BY PASSWORD = 'TDE@9876543210'; /*這邊的密碼是 .bak 檔的密碼,跟原本 CREATE 無關*/ --還原主要金鑰 RESTORE MASTER KEY FROM FILE = '/var/MsSqlBackUp/MasterKey.bak' DECRYPTION BY PASSWORD = 'TDE@9876543210' /*這邊的密碼是 .bak 檔的密碼*/ ENCRYPTION BY PASSWORD = 'TDE@0123456789'; /*這個是日後如果要 OPEN MASTER KEY 時需要用到的密碼*/ --開啟主要金鑰(還原後預設狀態是 CLOSE 的,這時候需要先 OPEN 才能使用,OPEN 的時候需要當初設定的密碼) OPEN MASTER KEY DECRYPTION BY PASSWORD = 'TDE@0123456789'; --關閉主要金鑰,關閉後 TDE 資料庫還是可以操作,但無法在創建的憑證 CLOSE MASTER KEY; --刪除主要金鑰,當金鑰還被某些憑證使用時基本也是刪不掉的 DROP MASTER KEY; --查詢目前主要金鑰的設定狀況 SELECT name, is_master_key_encrypted_by_server FROM sys.databases --- ``` ### 憑證操作參考 ```SQL -- 查詢目前資料庫中已經有哪些憑證 SELECT * FROM sys.certificates -- 刪除憑證(當憑證被作用於某個TDE資料庫時,是刪不掉的) DROP CERTIFICATE TdeServerCert; ``` ### 查詢目前TDE處理的進度 ```SQL select DB_NAME(database_id) , encryption_state_desc, encryption_scan_state_desc, encryption_scan_modify_date, percent_complete from sys.dm_database_encryption_keys ``` ### TDE憑證更新 ```SQL --建立新的憑證 USE [master] GO CREATE CERTIFICATE NewTDECert WITH SUBJECT = 'New TDE DEK Certificate', EXPIRY_DATE = '20181231'; GO --抽換目前使用的憑證 USE [目標資料庫] GO ALTER DATABASE ENCRYPTION KEY ENCRYPTION BY SERVER CERTIFICATE NewTDECert; GO ``` ## 補充說明 啟用 TDE 後幾個重要的東西要備份好,搞丟了光拿到資料庫備份檔也無法使用還原使用。 * MASTER KEY 的密碼 * 備份下來的憑證(有兩個檔案一個憑證一個私鑰) * 備份憑證用的密碼 ## 網路參考資料 * [透明資料加密 (TDE)](https://learn.microsoft.com/zh-tw/sql/relational-databases/security/encryption/transparent-data-encryption?view=sql-server-ver16) * [SQL Server 利用透明資料加密(TDE)對整個資料庫加密](https://dotblogs.com.tw/shadow/2018/03/02/194645) * [[SQL SERVER]瞭解透明資料加密 (TDE)#實做](https://medium.com/ricos-note/sql-server-%E7%9E%AD%E8%A7%A3%E9%80%8F%E6%98%8E%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86-tde-%E5%AF%A6%E5%81%9A-a80e0637b904) * [Updating an expired SQL Server TDE certificate ](https://www.mssqltips.com/sqlservertip/5009/updating-an-expired-sql-server-tde-certificate/)