SQL Server 2016:三步配置Always Encrypted安全功能
無論是公司政策,還是行業或政府規定,都有可能要求使用加密措施來保護存儲于數據庫中的敏感數據。為了幫助滿足這些法規需求,SQL Server數據加密功能提供了幾種可選方案,當數據在網絡傳輸時,或進行備份時,或把數據保存到服務器或網絡時,對數據進行加密。
SQL Server數據加密功能可選方案包括:透明數據加密(transparent data encryption)、列級別加密(column-level encryption)、SQL Server對象定義加密、備份加密、SQL Server連接加密,以及通過Windows EFS和BitLocker驅動加密實現的數據庫文件級加密。這些數據加密方案為數據庫和操作系統級別的數據提供了強大的安全支持,有效防止未經授權泄露保密信息的可能性,即使SQL Server基礎設施和數據庫本身遭到破壞。
使用以上這些SQL Server數據加密方法的缺點是,不能直接訪問加密數據或者修改這些數據。要在加密數據上執行操作,必須首先對它們做解密操作,這也就意味著數據在其整個生命周期中不能一直保持加密狀態。
為了解決這個問題,微軟公司在SQL Server 2016中引入了Always Encrypted(全程加密技術)。
什么是Always Encrypted?
Always Encrypted選項使用了增強的ADO.NET客戶端庫和密文來加密和解密數據。使用Always Encrypted,數據永遠是加密狀態,你可以在加密數據上執行操作,無需先對它們解密。這就意味著如果使用了這個特性,加密的敏感信息就不會有機會變為明文。顯然,這一功能與SQL Server的其它數據加密功能不同,它可以確保你的數據永遠保持加密狀態,不管數據是在用還是閑置都是如此。
此外,數據加密和解密是在幕后的應用中實現的,減少了對現有應用的變更工作量。其它關系型數據庫管理系統沒有哪一款可以提供Always Encrypted類似的功能。
Always Encrypted使用兩種類型密鑰:列加密密鑰(CEKs)和列主密鑰(CMKS)。列加密密鑰用來加密存儲在數據庫列中的敏感數據,列主密鑰用來存儲列加密密鑰。我們在創建CEKs之前應該先創建CMKs。我們可以使用一個CEK加密所有列值。關于CMK和CEK的信息存儲在數據庫系統的分類視圖中。你應該在網絡中安全可靠的位置備份CEK。
如何配置Always Encrypted安全功能?
為演示方便,我這里使用了我本機SQL Server實例中的“OUTLANDER”數據庫。
第一步:創建列主密鑰(column master key)
使用SQL Server 2016 對象管理器,打開數據庫文件夾,選擇你想配置Always Encrypted的數據庫。然后,打開“安全”文件夾,找到“全程加密密鑰”(Always Encrypted Keys)文件夾。右擊“列主密鑰定義”(Column Master Key Definitions)文件夾,然后點擊“新建列主密鑰定義”(New Column Master Key Definition),打開“新建列主密鑰定義”對話框(見圖1)。
圖1:新建列主密鑰定義對話框
在“名稱”文本框中,輸入新建CMK的名稱。然后為包含CMK的密鑰存儲指定密鑰存儲提供器,如圖1所示。對于CMK,最好的選擇是使用存儲在本機證書存儲中的證書。例如,我點擊“生成自簽名證書”按鈕生成了自簽名證書,然后把生成的證書放到了我的個人存儲中。最后點擊“確定”按鈕,就在數據庫中創建了CMK。
第二步:創建列加密密鑰(column encryption key)
在“全程加密密鑰”(Always Encrypted Keys)文件夾中,右擊“列加密密鑰”(Column Encryption Keys)文件夾,然后點擊“新建列加密密鑰”(New Column Encryption Key)。這時會彈出“新建列加密密鑰”對話框。
圖2:新建列加密密鑰對話框
在“名稱”文本框中,輸入新建CEK的名稱,并定義其相應的CMK,如圖2所示。點擊“確定”按鈕就創建了新的CEK。
第三步:創建包含加密列的表
在SSMS 2014的查詢編輯器中,輸入建表腳本“CREATE TABLE”T-SQL語句,如圖3所示。該語句將創建“dbo.Contact_AlwaysEncryptedDemo ”表,其中包含有加密列。
需要注意的是,使用確定性加密的列支持等號查找、連接和分組操作,而使用隨機加密的列不支持這些操作。
圖3:T-SQL建表語句
接下來,我們將繼續介紹如何測試Always Encrypted安全特性。