我們在開發上都有這樣的需求:對部分敏感數據進行屏蔽,如身份證信息,名字的一部分等
顯示如:
在開發上,一般來是取出相應的文字后進行替換,如可以用下面的方法。
function plusXing (str,StartLen,endLen) {
var len = str.length-StartLen -endLen;
var xing = '';
for (vari=0;i<len;i++) {
xing+='*';
}
return str.substr(0,StartLen)+xing+str.substr(str.length-endLen);
}
如輸入 plusXing(“18023456789”,3,4)
返回結果:180****6789
但是這樣的方法存在安全隱患,因為讀取出來的源數據是明文。因此在SQL2016和Azure SQL中有了一個數據掩碼(Azure SQL翻譯為動態數據掩碼,Technet上面翻譯為動態數據屏蔽)的新功能幫助解決這樣的問題。
下面我們來看看能實現什么好玩的功能:
先在本地做個測試:
創建一張表
createTABLE Membership
(MemberIDintIDENTITYPRIMARYKEY,
FirstName varchar(100)MASKEDWITH (FUNCTION='default()')NULL, ----啟用默認掩碼
LastName varchar(100)NOTNULL,
Phone# varchar(13)MASKEDWITH (FUNCTION='partial(1,"XXXXXXX",0)')NULL, ---啟動動態屏蔽,從第一個字符開始使用XXXXX替換,最后不顯示
Email varchar(100)MASKEDWITH (FUNCTION='email()')NULL); ----啟用email掩碼
插入數據:
INSERT Membership(FirstName, LastName, Phone#, Email)VALUES
('張','三豐','13980040000','zhangsanfeng@contoso.com'),
('王','一箭','13698000000','wangyijian@contoso.com.co'),
('獨孤','九劍','13599999999','dugujiujian@contoso.net');
SELECT*FROM Membership;
分配一個testuser用戶賦予查詢權限
CREATEUSER TestUserWITHOUTLOGIN;
GRANTSELECTON MembershipTO TestUser;
使用testuser身份進行查詢
EXECUTEASUSER='TestUser';
SELECT*FROM Membership;
REVERT;
結果如下:
更改掩碼
ALTERTABLE Membership
ALTERCOLUMN Phone#varchar(13)MASKEDWITH(FUNCTION='partial(3,"****",4)'); ---更改為從第三位開始,使用*來做掩碼,最后顯示4位
ALTERTABLE Membership
ALTERCOLUMN Phone#varchar(13)MASKEDWITH(FUNCTION='partial(3,"****",5)'); ---更改為從第三位開始,使用*來做掩碼,,最后顯示5位
授予UNMASK權限即可讓 TestUser
查看未經屏蔽的數據
GRANT UNMASKTO TestUser;
EXECUTEASUSER='TestUser';
SELECT*FROM Membership;
REVERT;
刪除未屏蔽權限
-- Removingthe UNMASK permission
REVOKE UNMASKTO TestUser;
以下語句將刪除上述示例中創建的針對FirstName列的屏蔽:
ALTER TABLE Membership
ALTER COLUMNFirstName DROP MASKED;
通過以下語句可以查詢到那些列使用了屏蔽
SELECT c.name, tbl.nameas table_name, c.is_masked, c.masking_function
FROMsys.masked_columnsAS c
JOINsys.tablesAS tbl
ON c.[object_id]= tbl.[object_id]
WHERE is_masked= 1;
![]()
以上是在SQL 2016上完成的,再來看看azure SQL上怎么玩
第一種方法也使用上面的代碼,用SQLmanagement studio連接azureSQL 如圖
![]()
一樣執行之前的代碼,看看結果
createTABLE Membership
(MemberIDintIDENTITYPRIMARYKEY,
FirstName varchar(100)MASKEDWITH (FUNCTION='default()')NULL, ----啟用默認掩碼
LastName varchar(100)NOTNULL,
Phone# varchar(13)MASKEDWITH (FUNCTION='partial(3,"****",4)')NULL, ---啟動動態屏蔽,
Email varchar(100)MASKEDWITH (FUNCTION='email()')NULL); ----啟用email掩碼
INSERT Membership(FirstName, LastName, Phone#, Email)VALUES
('張','三豐','13980040000','zhangsanfeng@contoso.com'),
('王','一箭','13698000000','wangyijian@contoso.com.co'),
('獨孤','九劍','13599999999','dugujiujian@contoso.net');
SELECT*FROM Membership;
CREATEUSER TestUserWITHOUTLOGIN;
GRANTSELECTON MembershipTO TestUser;
EXECUTEASUSER='TestUser';
SELECT*FROM Membership;
REVERT;
![]()
查看掩碼情況
SELECT c.name, tbl.nameas table_name, c.is_masked, c.masking_function
FROMsys.masked_columnsAS c
JOINsys.tablesAS tbl
ON c.[object_id]= tbl.[object_id]
WHERE is_masked = 1
![]()
第二種方法,在ARM界面下,選擇Azure SQL,數據的選項里面就有動態數據掩碼選項。
點擊后
已經展示了使用個掩碼的情況,也可以在此界面進行添加,更加簡單。
也可以在這個界面進行修改
SQL數據庫動態數據掩碼通過對非特權用戶模糊化敏感數據來限制此類數據的泄露。
?不對其進行屏蔽的 SQL用戶 - 一組可以在 SQL 查詢結果中獲取非屏蔽數據的 SQL用戶或 AAD 標識。 請注意,始終不會對擁有管理員權限的用戶進行屏蔽,這些用戶可以查看沒有任何屏蔽的原始數據。
?屏蔽規則 -一組規則,定義將要屏蔽的指定字段,以及要使用的屏蔽函數。 可以使用數據庫架構名稱、表名稱和列名稱定義指定的字段。
?屏蔽函數 -一組方法,用于控制不同情況下的數據透露。
函數 | 說明 | 示例 |
默認 | 根據指定字段的數據類型進行完全屏蔽。對于字符串數據類型,可以使用 XXXX或者在字段不到 4 個字符長的情況下使用更少的 X(char、nchar、varchar、nvarchar、text、ntext)。對于數字數據類型,可使用零值(bigint****bit****decimal、int、money、numeric、smallint、smallmoney、tinyint、float、real)。對于日期和時間數據類型,可使用 01.01.1900 00:00:00.0000000(date、datetime2、datetime、datetimeoffset、smalldatetime、time)。對于二進制數據類型,可使用單字節的 ASCII值 0(binary、varbinary、image)。 | 列定義語法示例: |
電子郵件 | 該屏蔽方法公開電子郵件地址的第一個字母,以及電子郵件地址格式中的常量后綴“.com”。 。 | 定義語法示例: |
隨機 | 一種隨機屏蔽函數,適用于任何數字類型,可以在指定范圍內使用隨機值來屏蔽原始值。 | 定義語法示例: |
自定義字符串 | 該屏蔽方法公開第一個和最后一個字母,在中間添加自定義填充字符串。 | 定義語法示例: |
不需任何特殊權限即可使用動態數據屏蔽來創建表,只需標準的CREATE TABLE權限以及對架構的 ALTER權限。
添加、替換或刪除對列的屏蔽,需要ALTER ANY MASK權限以及對表的 ALTER權限。 可以將 ALTER ANY MASK權限授予安全負責人。
具有表的SELECT權限的用戶可以查看表數據。列在被定義為“已屏蔽”后,將顯示屏蔽后的數據。 對于需要從定義了屏蔽的列中檢索非屏蔽數據的用戶,可授予其UNMASK權限。
針對數據庫的CONTROL權限包括 ALTER ANYMASK和 UNMASK權限。
安全說明:可使用推斷或暴力技術繞過屏蔽
上面的例子中,我可以這樣進行暴力推斷
也就是說動態掩碼是一個障眼法,不能阻止你去窺探數據的本身。上面的例子就是testuser看到數據,但是他可以推測出了姓“張”的數據。
總結:
動態數據屏蔽 (DDM)通過對非特權用戶屏蔽敏感數據來限制敏感數據的公開。 它可以用于顯著簡化應用程序中安全性的設計和編碼。
動態數據屏蔽允許用戶在盡量減少對應用程序層的影響的情況下,指定需要披露的敏感數據,從而防止對敏感數據的非授權訪問。 DDM可以在數據庫上進行配置,以隱藏對指定數據庫字段進行查詢時獲得的結果集中的敏感數據,同時不會更改數據庫中的數據。 可以輕松地對現有應用程序使用動態數據屏蔽,因為屏蔽規則是應用于查詢結果。許多應用程序可以屏蔽敏感數據,而無需修改現有查詢。
一個中央數據屏蔽策略直接對數據庫中的敏感字段起作用。
指定有權訪問敏感數據的特權用戶或角色。
DDM采用完全屏蔽和部分屏蔽功能,以及用于數值數據的隨機屏蔽。
簡單Transact-SQL命令定義和管理掩碼。
例如,呼叫中心支持人員通過身份證號或信用卡號的幾個數字就可以辨識呼叫者,但系統不會將這些數據內容完全公開給該支持人員。 可以通過定義屏蔽規則來屏蔽查詢結果集中身份證號或信用卡號最后四位數字以外的所有數字。另一個例子就是,在需要進行故障排除時,開發人員可以通過對數據進行適當的數據屏蔽來保護個人身份信息 (PII)數據,因此可以在不違反遵從性法規的情況下,對生產環境進行查詢。
動態數據屏蔽旨在限制敏感數據的公開,防止沒有訪問權限的用戶查看敏感數據。 動態數據屏蔽并不是要防止數據庫用戶直接連接到數據庫并運行可以公開敏感數據的詳盡查詢。動態數據屏蔽是對其他 SQL Server安全功能(審核、加密、行級別安全性…)的補充,因此,強烈建議你將此功能與上述功能一起使用,以便更好地保護數據庫中的敏感數據
新聞熱點
疑難解答