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