SQL Server的加密初探(2)-透明資料加密

by adonisy 7. 九月 2020 15:31

作 者:楊先民

為敏感資料實施安全策略時,要考慮的一個重要方面是資料被盜的風險。想像一下一種情況,

其中有惡意意圖的特權用戶使用卸離/附加將資料庫移到新的 SQL Server,以獲取對他們無權查看的資料的使用權限。

或者是,如果惡意用戶獲得對資料庫備份的訪問權限,則他們可以將備份還原到新的 SQL Server上,進從而獲得對資料的

訪問權限。


透明資料加密(TDE)通過對資料庫的資料分頁和交易日誌文件進行加密,並將密鑰(稱為資料庫加密金鑰)儲存在資料庫

的啟動記錄中,來防止出現這些情況。


在資料庫上啟用TDE後,頁面在被寫入磁碟之前將被加密,並且在它們被讀入記憶體時將被解密。


與儲存格層級的加密相比,TDE還具有一些優勢,之後的期數將對此進行討論。


首先,它不會引起資料庫變大的問題。使用TDE加密的資料庫的大小與加密之前的大小相同。同樣的,儘管存在著效能負荷,

但這明顯小於與儲存格層級的加密關聯的效能負荷。


另一個重要的優點是加密對應用程式來說是透明的,這意味著開發人員無需修改其代碼即可訪問資料。在計劃TDE的實施時,

請注意其與其他技術的交互方式。


例如,您可以對使用記憶體內中OLTP的資料庫進行加密,但是記憶體內的文件組中的資料未加密,因為該資料位於記憶體中,

而TDE僅對靜態資料(即磁碟上的資料)進行加密。 


即使未對記憶體優化的資料進行加密,與記憶體事務相關聯的交易日誌記錄也會被加密。


也可以對使用 FILESTREAM的資料庫進行加密,但同樣,FILESTREAM文件組中的資料也不會被加密。如果使用全文索引,則新的全文索引將被加密。

現有全文索引僅在升級過程中導入後才進行加密。但是,在TDE中使用全文本索引被認為是不好的做法。

這是因為在全文索引掃描操作期間,資料以明文形式寫入磁碟,這為攻擊者提供了連結到敏感資料的機會。


啟用了 TDE的資料庫支持資料庫鏡像,AlwaysOn可用性組和log shipping日誌傳送之類的高可用性和災難恢復技術。

副本資料庫上的資料也已加密,日誌中的資料也已加密,這意味著在 SQL Server與 SQL Server服務之間發送資料時無法將其截獲。 

TDE還支持複寫,但是訂閱伺服器中的資料不會自動加密。您必須在訂閱伺服器和散發伺服器上手動啟用TDE。


注意:即使在訂閱伺服器上啟用了 TDE,資料也仍然以純文字的格式儲存在中間文件中。也就是說,與使用FTE(全文索引)相比,

這帶來了更大的風險,因此您應仔細考慮風險/利益方案。


同樣重要的是要注意,為 SQL Server內的任何資料庫啟用 TDE都會導致在TempDB上啟用TDE。這樣做的原因是,在排序操作,TempDB用於儲存中間結果集的用戶資料。

當你使用暫存資料表或發生資料列版本控制操作時,TempDB還會儲存用戶資料。這可能會導致不良後果,即降低尚未啟用TDE的其他用戶資料庫的性能。

從資料庫維護性能的角度來看,還必須注意TDE與即時文件初始化不相容。

即時文件初始化可加快創建或擴展文件的操作,因為不需要將文件清零。


如果您的 SQL Server配置為使用即時文件初始化,則該 SQL Server不再適用於與你加密的任何資料庫關聯的文件。啟用TDE時將文件清零是一項嚴格的技術要求。

實作 TDE

 

要實現透明資料加密,必須首先創建一個資料庫主要金鑰。一旦此金鑰就位,就可以創建證書。你必須使用資料庫主金鑰來加密證書。

如果您嘗試僅使用密碼對證書進行加密,那麼當您嘗試使用它對資料庫加密密鑰進行加密時,它將被拒絕。資料庫加密金鑰是您需要創建的下一個對象,

並且如前面所說,您可以使用證書對它進行加密。

最後,您可以更改資料庫以打開加密。注意可以使用與服務層級的證書相反的非對稱密鑰來加密資料庫加密金鑰,但前提是必須使用EKM模塊保護非對稱金鑰。


為資料庫啟用 TDE後,後端進程將遍訪每個資料文件中的每個頁面並對其進行加密。這不會阻止資料庫這時的使用,但是會取消鎖定,從而停止進行維護操作。

正在進行加密掃描時,無法執行以下操作:


刪除文件

刪除文件組

刪除資料庫

刪除資料庫使數據庫卸離

將資料庫設置為只讀


幸運的是,SQL Server 2019的一項新功能使DBA可以更好地控制此過程可以使用ALTER DATABASE語句

(指定SET ENCRYPTION SUSPEND或SET ENCRYPTION RESTART選項)來暫停和重新啟動加密掃描。


同樣重要的是要注意,如果資料庫中的任何文件組都標記為read_only,則啟用TDE的操作將失敗。

這是因為啟用TDE時,所有文件中的所有頁面都需要加密,這涉及更改頁面中的資料以使其模糊。


下程程式創建了一個名為 Chapter11Encrypted的資料庫,然後創建了一個填充有資料的表。最後,它創建一個資料庫主金鑰和一個服務層級的證書。


CREATE DATABASE Chapter11Encrypted ; GO 

USE Chapter11Encrypted GO 


--Create the table 

CREATE TABLE dbo.SensitiveData ( ID INT PRIMARY KEY IDENTITY, FirstName NVARCHAR(30), LastName NVARCHAR(30), CreditCardNumber VARBINARY(8000) ) ; GO 


--Populate the table 


DECLARE @Numbers TABLE ( Number INT ) ;


WITH CTE(Number) AS ( SELECT 1 Number UNION ALL


SELECT Number + 1 FROM CTE WHERE Number < 100 ) 

INSERT INTO @Numbers SELECT Number FROM CTE ; 


DECLARE @Names TABLE ( FirstName VARCHAR(30), LastName VARCHAR(30) ); 

INSERT INTO @Names VALUES('Peter', 'Carter'), ('Michael', 'Smith'), ('Danielle', 'Mead'), ('Reuben', 'Roberts'),

 ('Iris', 'Jones'), ('Sylvia', 'Davies'), ('Finola', 'Wright'), ('Edward', 'James'), ('Marie', 'Andrews'), 

('Jennifer', 'Abraham'), ('Margaret', 'Jones') ; 


INSERT INTO dbo.SensitiveData(Firstname, LastName, CreditCardNumber) SELECT FirstName, LastName, CreditCardNumber 

FROM (SELECT (SELECT TOP 1 FirstName FROM @Names ORDER BY NEWID()) FirstName ,(SELECT TOP 1 LastName FROM @Names ORDER BY NEWID()) LastName ,

(SELECT CONVERT(VARBINARY(8000) ,(SELECT TOP 1 CAST(Number * 100 AS CHAR(4)) FROM @Numbers WHERE Number BETWEEN 10 AND 99 ORDER BY NEWID()) + '-' + 

(SELECT TOP 1 CAST(Number * 100 AS CHAR(4)) FROM @Numbers WHERE Number BETWEEN 10 AND 99 ORDER BY NEWID()) + '-' + 

(SELECT TOP 1 CAST(Number * 100 AS CHAR(4)) FROM @Numbers WHERE Number BETWEEN 10 AND 99 ORDER BY NEWID()) + '-' + 

(SELECT TOP 1 CAST(Number ∗ 100 AS CHAR(4)) FROM @Numbers WHERE Number BETWEEN 10 AND 99 ORDER BY NEWID()))) CreditCardNumber 

FROM @Numbers a CROSS JOIN @Numbers b CROSS JOIN @Numbers c ) d ;


USE Master GO --Create the Database Master Key 

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd'; GO 

--Create the Server Certificate 

CREATE CERTIFICATE TDECert WITH SUBJECT = 'Certificate For TDE'; GO


現在我們已經創建了資料庫,以及資料庫主金鑰和證書,現在我們可以加密資料庫了。


要通過SQL Server Management Studio做到這一點,我們可以從資料庫上選單中的“工作”下選擇“管理資料庫加密”。

這將出現“管理資料庫加密”精靈,如下圖所示:


您可以看到我們從下拉框中選擇了服務層級的證書,並選擇啟用資料庫加密。在“加密演算法”下拉選項中,我們選擇了AES 128,這是預設的選項。

注意選擇演算法本質上是安全性和性能之間的權衡。較長的加密金鑰會佔用更多的 CPU資源,但更難以破解。

透明資料加密也可以通過T-SQL進行配置。通過執行下面的程式,我們可以通過T-SQL獲得相同的結果。


USE CHAPTER11Encrypted GO 

--Create the Database Encryption Key 

CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE TDECert ; GO 

--Enable TDE on the database 

ALTER DATABASE CHAPTER11Encrypted SET ENCRYPTION ON ; GO

 

管理 TDE

在配置 TDE時,會警告我們尚未備份用於加密資料庫加密金鑰的證書。

備份此證書至關重要,因此應在配置 TDE之前或之後立即進行備份。

如果證書不可用,則無法恢復資料庫中的資料。您可以使用下列的程式來備份證書。


USE Master GO 

BACKUP CERTIFICATE TDECert

 

TO FILE = 'C:\certificates\TDECert' WITH PRIVATE KEY (file='C:\certificates\TDECertKey', ENCRYPTION BY PASSWORD='Pa$$w0rd')

搬移加密的資料庫

根據 TDE的本質,如果我們嘗試將 Chapter11Encrypted資料庫移動到新的 SQL Server,則該操作將失敗,除非將加密工件考慮在內。
下圖說明如果對 Chapter11Encrypted資料庫進行備份並嘗試在新 SQL Server上還原它時收到的消息。


如果我們卸離資料庫並嘗試將其附加到新的 SQL Server,則會收到相同的錯誤。相反,我們必須首先使用相同的密碼創建一個資料庫主金鑰,
然後將服務層級的證書和私鑰還原到新的 SQL Server。我們可以使用之後的程式來還原我們先前創建的服務層級的證書。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ; GO 
CREATE CERTIFICATE TDECert FROM FILE = 'C:\Certificates\TDECert' WITH PRIVATE KEY ( FILE = 'C:\Certificates\TDECertKey', 
DECRYPTION BY PASSWORD = 'Pa$$w0rd' ) ;

提示:確保 SQL Server服務帳戶對操作系統中的證書和密鑰文件具有權限。否則,您將收到一條錯誤消息,指出證書無效,不存在或您沒有此證書的權限。
這意味著您應該立即檢查恢復並定期重複測試。

以上就是本期的主題,透明資料加密。

Tags:

SQL Server資料庫 | 楊先民Adonis Young

不允許評論

NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List