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