【SQL Server 2016動(dòng)態(tài)數(shù)據(jù)屏蔽入門(mén)】配置動(dòng)態(tài)數(shù)據(jù)屏蔽
動(dòng)態(tài)數(shù)據(jù)屏蔽(Dynamic data masking)是SQL Server 2016諸多新增安全功能之一,Azure SQL數(shù)據(jù)庫(kù)V12預(yù)覽版中也提供了這個(gè)功能。該功能支持對(duì)普通用戶隱藏部分?jǐn)?shù)據(jù),例如,應(yīng)用可能會(huì)要求顯示社會(huì)安全號(hào)(編者注:美國(guó)的社會(huì)安全號(hào),即SSN,類(lèi)似中國(guó)的身份證號(hào)碼),除了后四位數(shù)字以外都要隱藏掉。也就是說(shuō),不會(huì)顯示“123-45-6789”,而是“XXX-XX-6789”。如果是特權(quán)用戶查看信息,則不會(huì)顯示掩碼。這個(gè)功能不同于加密。數(shù)據(jù)在存儲(chǔ)設(shè)備上是沒(méi)有屏蔽的,只是根據(jù)請(qǐng)求者是普通用戶還是特權(quán)用戶而對(duì)輸出進(jìn)行隱藏或者混淆。該功能提供的不是完整的安全解決方案,但是它可以作為安全策略的一部分進(jìn)行部署。
動(dòng)態(tài)數(shù)據(jù)屏蔽在一些場(chǎng)合很有用。最明顯的場(chǎng)景是在規(guī)則遵從方面。不管法規(guī)是政府的,還是行業(yè)機(jī)構(gòu)制定的,往往都會(huì)要求保護(hù)敏感數(shù)據(jù)不外顯,這也是一種常見(jiàn)的最佳實(shí)踐。還有一種場(chǎng)景,該功能可以用于內(nèi)部開(kāi)發(fā)人員。開(kāi)發(fā)人員為了開(kāi)發(fā)和測(cè)試目的索要正式數(shù)據(jù)進(jìn)行測(cè)試的情況是很普遍的。在這種情況下提供數(shù)據(jù)時(shí),通常提供方應(yīng)該處理敏感數(shù)據(jù),不管是表面混淆還是真實(shí)刪除都可以。處理數(shù)據(jù)可能會(huì)影響測(cè)試的有效性,因?yàn)椴樵兘Y(jié)果不是完全一致的。但是如果在這種情況下應(yīng)用了動(dòng)態(tài)數(shù)據(jù)屏蔽功能,數(shù)據(jù)就可以被保護(hù)起來(lái),同時(shí)又保證提供了更真實(shí)的測(cè)試環(huán)境。大多數(shù)情況,屏蔽功能會(huì)用在這種場(chǎng)合,不過(guò)傳統(tǒng)靜態(tài)屏蔽會(huì)把數(shù)據(jù)以真正屏蔽的格式存儲(chǔ),而不是只在輸出顯示時(shí)屏蔽,因此這種方法會(huì)帶來(lái)其它問(wèn)題,比如破壞數(shù)據(jù)完整性。
本文我們將通過(guò)例子了解SQL Server 2016 CTP2和Azure SQL數(shù)據(jù)庫(kù)V12版本中如何設(shè)置動(dòng)態(tài)數(shù)據(jù)屏蔽。動(dòng)態(tài)數(shù)據(jù)測(cè)試吸引人的地方在于,它可以對(duì)表添加定義約束而無(wú)需重寫(xiě)應(yīng)用程序代碼。
配置動(dòng)態(tài)數(shù)據(jù)屏蔽
本文示例基于公開(kāi)發(fā)布的SQL Server 2016 CTP 2.2版本運(yùn)行,配置動(dòng)態(tài)數(shù)據(jù)屏蔽的第一步是要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)和測(cè)試表,如圖1。
創(chuàng)建測(cè)試表
圖1:測(cè)試數(shù)據(jù)屏蔽所用的示例數(shù)據(jù)庫(kù)
插入幾行測(cè)試數(shù)據(jù)
圖2:插入測(cè)試數(shù)據(jù)的SQL腳本
驗(yàn)證測(cè)試數(shù)據(jù)有效存在
圖3:檢驗(yàn)測(cè)試數(shù)據(jù)確實(shí)已有效保存
這里尚未定義屏蔽規(guī)則,所以所有數(shù)據(jù)都是可見(jiàn)的。
創(chuàng)建測(cè)試用戶并配置訪問(wèn)該表的測(cè)試權(quán)限
圖4:數(shù)據(jù)未經(jīng)屏蔽的員工信息表
因?yàn)樯形炊x屏蔽功能,所以“TestUser”用戶可以看到所有數(shù)據(jù)。
在SQL Server 2016中,屏蔽配置是表定義的一部分
圖5:屏蔽“HomePhone”字段信息之后的員工信息表
修改員工信息表(“Employee”)定義后給“HomePhone”字段增加了自定義的屏蔽(如圖5)。本例中我們使用的是“partial”函數(shù)。“partial(0,"XXX-XXX-",4) ”語(yǔ)句的意思是從字段最左邊第0位開(kāi)始用指定字符串替換(前面顯示字符數(shù)為0),后面只顯示該字段最后四個(gè)字符。以上格式中提到的那些“X”以及連字符沒(méi)有實(shí)際意義。屏蔽字符串與字段中已有數(shù)據(jù)結(jié)構(gòu)是類(lèi)似的。我們來(lái)看看給“WorkPhone”字段用稍有差異的字符串屏蔽以后是什么效果。(編者注:在計(jì)算機(jī)領(lǐng)域,第一位置的編號(hào)通常用0表示,這里所說(shuō)的第0位指的就是從第一個(gè)字符開(kāi)始。)
圖6:?jiǎn)T工表中的“HomePhone”和“WorkPhone”字段顯示屏蔽碼
“WorkPhone”字段的屏蔽碼定義與“HomePhone”字段定義類(lèi)似,只是替換所用字符不同。
現(xiàn)在我們已經(jīng)展示了每個(gè)電話號(hào)碼字段如何使用屏蔽功能,那么針對(duì)包含有屏蔽列的表運(yùn)行查詢語(yǔ)句能按條件查詢到對(duì)應(yīng)結(jié)果嗎?我們一起來(lái)看看。
圖7:查詢屏蔽數(shù)據(jù)
因?yàn)槠帘沃皇亲饔糜跀?shù)據(jù)的顯示功能,屏蔽列的搜索是不受影響的。
下面我們給SSN添加屏蔽。
圖8:給“HomePhone”、“WorkPhone”和“SSN”字段添加屏蔽后的員工信息表
給字段添加屏蔽有一些預(yù)定義的功能。例如,有針對(duì)電子郵件格式的預(yù)定義屏蔽。請(qǐng)看下圖。
圖9:設(shè)置“HomePhone”、“WorkPhone”、“SSN”和“Workemail”字段添加屏蔽后的員工表
請(qǐng)注意,上圖中電子郵件預(yù)定義屏蔽后只顯示了該字段的第一個(gè)字母,而其他字母屏蔽為“XXX@XXXX.com ”,把整個(gè)域名隱藏起來(lái)了。
那么屏蔽功能會(huì)破壞查詢語(yǔ)句排序效果嗎?我們來(lái)看一下。
圖10:對(duì)員工表執(zhí)行排序查詢
排序效果是正常的,不過(guò)屏蔽后第一個(gè)字母仍然展示出來(lái)了(如圖10)。如果我們不使用預(yù)定義的屏蔽功能,對(duì)該電子郵件地址字段使用自定義屏蔽會(huì)是什么效果呢?
圖11:使用自定義屏蔽字段排序后的員工表
如上圖所示,數(shù)據(jù)排序仍然正常。這里還要注意,我去掉了“workemail”字段的預(yù)定義屏蔽,取而代之使用“partial”函數(shù)自定義了屏蔽格式。
接下來(lái),我演示了屏蔽字段用于“where”條件從句搜索指定數(shù)據(jù)的情況,仍然支持正確排序。如果開(kāi)發(fā)人員希望獲得無(wú)屏蔽數(shù)據(jù),該怎么做呢(圖12)?
圖12:無(wú)屏蔽數(shù)據(jù)
我需要在“dbo”模式中提供更多權(quán)限給“TestUser”,不過(guò)“SELECT INTO”會(huì)把未屏蔽數(shù)據(jù)復(fù)制到另一個(gè)表中。未屏蔽數(shù)據(jù)現(xiàn)在復(fù)制到另一個(gè)表里了。
之后我們將繼續(xù)介紹《Azure SQL 數(shù)據(jù)庫(kù)V12(預(yù)覽版)中的動(dòng)態(tài)數(shù)據(jù)屏蔽》和《定義屏蔽》。
【責(zé)任編輯:honglu TEL:(010)68476606】