前兩天在戍衛京師周邊的任務中,我們分別使用雜湊(hash
)和加密(encrypt
)來保護特定資料表下的敏感性欄位,今天從另外一個儲存層面想,如果想避免資料庫伺服器中的DB實體檔案(.bak、.mdf、.ndf、.ldf
)被不明原因攜出後迅速外洩,在資料庫層級可以考慮使用SQL Server 2008推出的TDE(Transparent Data Encryption
),中文是透明資料加密。
透明資料的加密是屬於資料庫層級(Database level)的保護,主要在Data及Log Page層的I/O執行加密, SQL Server會在Page Buffer flush到硬碟前加密;從磁碟讀取資料時,Database Engine也會在讀取到記憶體(data buffer)時進行解密。
透明資料加密是企業版本(Enterprise Edition)以上的功能,雖然我們從AP層面(ADO.NET,SSMS,Sqlcmd)都能清澈的看到資料,但實體磁碟儲存及tempdb都是加密後的狀態,維護著一定的機密性。
在執行透明資料加密前,我們先把資料庫備份。
BACKUP DATABASE [SecurityDB] TO DISK = N'D:\backup\SecurityDB_ORIG.bak'
WITH NOFORMAT, NOINIT,
NAME = N'SecurityDB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10
GO
--1.建立MASTER KEY
use master
create master key encryption by
password= 'imMKpassword1'
go
--2.建立憑證
use master
create certificate [Cert]
with subject = 'Instance層級測試憑證'
建立資料庫加密金鑰,這邊選擇AES256
演算法,最後啟用資料庫SecurityDB的加密功能。
--3.建立資料庫加密金鑰
use [SecurityDB]
create database encryption key
with algorithm=AES_256
encryption by server certificate [Cert]
--4.啟用資料庫加密
alter database [SecurityDB]
set encryption on
偷偷搬來本機:
試試看附加.mdf資料庫實體檔案!
附加失敗!表示實體檔案初步防護成功。
試試看還原資料庫備份,先備份資料庫
BACKUP DATABASE [SecurityDB] TO DISK = N'D:\Backup\SecurityDB.bak'
WITH NOFORMAT, NOINIT, NAME = N'SecurityDB-完整 資料庫 備份',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
還原資料庫:
失敗!在備份檔案(.bak)的初步防護也成功。
優點
缺點
啟用透明資料前後備份(.bak)檔案
透明資料加密 (TDE)
https://msdn.microsoft.com/zh-tw/library/bb934049.aspx
義大利米蘭市女警
2011.10 攝於Milano,italy