SQL Server 2008 新增的透明數據加密功能(TDE)

在任何組織中,安全都是備受關注的。數據庫備份很可能會被盜,並且可以在任何等同於或高於備份數據庫版本的SQL Server實例下進行還原。當我們查看SQL Server 2008新功能時,我們發現一個可能很有趣的功能,被稱爲透明加密,其可以用來加密我們的數據庫備份。你想了解一下該如何使用這個新功能嗎?

SQL Server 2008版本開始,新增了透明數據加密Transparent Data Encryption(TDE)功能,其實現的是數據庫級別的加密,這一功能補充了SQL Server 2005中使用的行級別加密。這可以直接或通過在另一個SQL Server實例上恢復數據庫備份來保護數據庫訪問。

在本文中,我們將討論如何實現透明數據加密來保護數據庫備份。

未加密的數據庫容易暴露集團信息

首先讓我們來演示數據庫備份是如何容易遭受安全威脅的。默認情況下,SQL Server備份是不加密的,讓我們先創建test3 庫的完整備份:

BACKUP DATABASE test3
TO DISK='D:\test3_f_20200218.bak'
WITH INIT,STATS=10

查詢test3數據庫中一條特定記錄。稍後,我們將使用此記錄查看數據庫備份的內容:

使用記事本打開test3數據庫的備份,搜索‘Jack’,觀察到文本數據是可讀的:

由於您的本機備份是可讀的,因此它們很容易出現安全風險,因爲它們可以以明文讀取。這使某些人只需查看您的數據庫備份,即能從文件中檢索數據。更糟糕的是,任何人均可以在另外一個SQL Server實例中還原備份文件。我們來演示一下這個程序。

數據庫透明加密

讓我們來在數據庫test3上實施數據透明加密,,首先在服務器上設置加密。爲此,我們在master數據庫上創建主鍵祕鑰

USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD='jC`T?]K,v`{voD<'

然後我們創建用於加密數據庫的服務器級的證書,這裏證書是用數據庫主祕鑰加密的:

CREATE CERTIFICATE Test3Cert
WITH SUBJECT = 'My DEK Certificate for test3 database '

我們將使用我們剛剛創建的證書創建數據庫祕鑰,爲test3數據庫設置加密:

USE test3
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM=AES_128
ENCRYPTION BY SERVER CERTIFICATE Test3Cert
GO

創建完數據庫祕鑰後,會給出一個警告。

警告: 用於對數據庫加密密鑰進行加密的證書尚未備份。應當立即備份該證書以及與該證書關聯的私鑰。如果該證書不可用,或者您必須在另一臺服務器上還原或附加數據庫,則必須對該證書和私鑰均進行備份,否則將無法打開該數據庫。

你可以自己選擇加密算法,有幾個不同配置存在包括 DES, Triple DES, TRIPLE_DES_3KEY, RC2, RC4, 128-bit RC4, DESX, 128-bit AES, 192-bit AES, and 256-bit AES,但在SQL Server 2016後只能使用AES_128 | AES_192 | AES_256三種算法。創建完證書後,我們下面就來備份證書。

備份證書和私鑰

--備份證書和私鑰
USE master
GO
BACKUP CERTIFICATE Test3Cert
TO FILE ='D:\Test3Cert.cer'
WITH PRIVATE KEY(FILE='D:\Test3Cert_Key.pvk',
ENCRYPTION BY PASSWORD='jC`T?]K,v`{voD<')       --這個密碼可以是任意符合複雜度的密碼
GO

啓用數據庫加密

ALTER DATABASE test3
SET ENCRYPTION ON

我們可以通過系統視圖sys.databases 查看哪些用戶開啓了透明加密

--查看是否開啓透明加密,則is_encrypted=1開啓了透明加密
SELECT name,is_encrypted
FROM sys.databases

這次讓我們使用一個不同的文件名備份加密後的test3數據庫:

BACKUP DATABASE test3
TO disk='D:\test3_Encrypted.bak'
with init,stats=10

加密備份的時間將稍微長於未加密的數據庫備份。如果你打開數據庫備份,並搜索“Jack”,您將找不到了。您可以滾動鼠標查看加密後的數據,其將和你未加密之前的備份內容不同:

在另外一個實例上恢復未加密數據庫很容易。事實上,這也是它容易出現安全風險的原因。你可以試着還原加密後的備份數據庫,你將會遇到一個錯誤。我打算在當前實例上還原這個加密備份,所以先刪除數據庫密鑰、證書和主密鑰,然後直接原實例上還原它。

--要刪除主密鑰,需要刪除使用密鑰加密的證書
--要刪除證書,需要刪除和證書關聯的登陸賬號
USE master
GO
--關閉數據庫加密
ALTER DATABASE test3
SET ENCRYPTION OFF
--刪除數據庫密鑰
USE test3
DROP DATABASE ENCRYPTION KEY
USE master
--刪除證書
DROP CERTIFICATE Test3Cert
--刪除主密鑰
DROP  MASTER KEY

刪除數據庫密鑰之前,需要先關閉數據庫加密,否則會報如下錯誤:

消息 33105,級別 16,狀態 1,第 49 行

該數據庫加密密鑰正在使用中,無法刪除。需要關閉數據庫加密,才能刪除該數據庫加密密鑰。

還原test3的加密備份:

USE [master]
RESTORE DATABASE [test3_Encrypted] FROM  DISK = N'D:\test3_Encrypted.bak'
WITH  FILE = 1,
MOVE   'test3' to 'D:\DB\test3_e.mdf',
MOVE 'test3_log' to 'D:\DB\test3_loge.ldf',
NOUNLOAD,  STATS = 5
GO

還原加密數據庫

爲了還原加密數據庫,我們需要將備份的證書和私鑰文件拷貝到新實例所在的服務器。因爲我是打算在本機同一實例上還原加密數據庫,當我導入證書和私鑰時,我僅僅是使用備份證書和私鑰時的路徑。現在,我們在導入證書之前需要創建一個主密鑰:

USE master
GO
--注意這裏創建的主密鑰密碼可以和原數據庫上創建的主密鑰密碼不同
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '[J,XJK8|AwE*rLk'
GO

這裏創建主密鑰使用的密碼和上面原數據庫上創建的主密鑰密碼不同。主密鑰創建完成後,您可以通過導入前面證書的備份文件創建證書和私鑰:

USE master
GO
--注意這裏創建的主密鑰密碼可以和原數據庫上創建的主密鑰密碼不同
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '[J,XJK8|AwE*rLk'
GO
CREATE CERTIFICATE Test3Cert
FROM FILE = 'D:\Test3Cert.cer'
WITH PRIVATE KEY(FILE='D:\Test3Cert_Key.pvk',
       DECRYPTION BY PASSWORD='jC`T?]K,v`{voD<');
GO

注意到在DECRYPTION BY PASSWORD參數指定的密碼和我們備份證書時使用的密碼相同,這是因爲我們將在新的實例上使用相同的證書訪問加密數據庫。此時我們再執行上面的還原腳本,可以正常還原加密數據庫。

值得注意的是加密備份文件還原後的數據庫仍然是加密的,如下圖所示:

最後需要說明的是

  • 因爲沒有備份的證書和私鑰,將不能恢復數據庫,所以需要很好的保管證書、私鑰備份文件及備份時使用的加密文件中私鑰密碼,最好能夠多個服務器備份、本地異地備份同時進行

  • 透明加密是爲了防止數據庫備份文件被盜時數據泄露,所以證書私鑰的備份文件和私鑰密碼不能和數據庫備份文件放在一起

  • 還有一點值得說明的是TDE中數據庫主密鑰和服務器證書之間的關係,創建使用數據庫主密鑰加密的服務器證書前,必須要先創建數據庫主密鑰;我們在還原實例上創建或者還原數據庫主密鑰的密碼並不是原實例上創建數據庫的主密鑰的密碼,而我們在還原實例上仍然能夠使用證書和私鑰文件創建服務器證書,併成功還原加密數據庫備份。這說明數據庫主密鑰加密的證書依賴於數據庫主密鑰,但又不是完全依賴,只要有數據庫主密鑰,就可以使用證書和私鑰文件創建服務器證書。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章