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