保護機敏資料的幫手 - SQL Database 動態資料遮罩

本文大綱:

說明

學習目標

準備工作

使用 Azure 入口網站設定動態資料遮罩

使用預覽版入口網站設定動態資料遮罩

讓特定登入(Login)不受動態資料遮罩的限制

結論


說明

Microsoft Azure SQL Database v12 針對未經授權的使用者存取機敏資料時,提供動態資料遮罩(Dynamic Data Masking)功能來防止資料外洩,不論您使用的是 Basic、Standard 或是 Premium 服務層(Service tiers),都可以使用動態資料遮罩功能。

目前這項功能尚在預覽階段,概念上其實很單純,主要提供應用程式或查詢工具查詢 Azure SQL Database 時,針對機敏資料進行部分的遮蔽,以避免直接呈現給前端未經授權的使用者(如下圖)。

動態資料遮罩具備下列特性:

  1. 應用程式不需要過多的修改。

    幾乎只需要修改連線字串就可以讓應用程式使用 SQL Database 的動態資料遮罩功能來隱藏機敏資料。

  2. 原則式安全性(policy-based security)。

    您可以將位於 SQL Database 裡的資料表的資料行名稱,或查詢時所使用的別名(alias name)建立遮罩規則,以保護機敏資料不會直接外洩。

  3. 不須變更資料表結構描述(Table Schema)。

    使用動態資料遮罩不須變更現有的資料表結構描述,因此不用擔心為了使用這項功能而需大費周章修改資料表的設計。

學習目標

  1. 使用 Azure 入口網站設定動態資料遮罩。

  2. 使用預覽版入口網站設定動態資料遮罩。

  3. 讓特定登入(Login)不受動態資料遮罩的限制。

準備工作

首先請利用 Azure 入口網站、Azure PowerShell 或 REST API 建立 SQL Database 伺服器,並將之升級為最新版本(V12)。

下列 PowerShell 指令碼示範使用 New-AzureSqlDatabaseServer cmdlet 建立 SQL Database 伺服器,並搭配 New-AzureSqlDatabaseServerFirewallRule cmdlet 將本機電腦的外部 IP 位址加入 SQL Database 伺服器的防火牆白名單。

接著以 New-AzureSqlDatabase cmdlet 建立 SQL Database 資料庫。

若您已經準備好最新版本(V12)的 SQL Database 伺服器及資料庫,則可忽略本節的內容。

使用 Azure 入口網站設定動態資料遮罩

完成前一節的準備工作您就已經擁有一個測試用的 SQL Database,接著使用 SSMS 連接至前面所建立的資料,執行下列 T-SQL 指令碼建立測試用的資料表。

IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Customers')

    DROP TABLE Customers

GO

 

CREATE TABLE [dbo].[Customers](

        [Name] [nvarchar](5) NOT NULL, --姓名

        [ID] [char](10) NOT NULL, --身分證字號

        [Email] [varchar](50) NOT NULL, --電子郵件

        [Tel] [varchar](20) NOT NULL, --電話

        [Address] [nvarchar](50) NOT NULL, --地址

        [Salary] [money] NOT NULL, --收入

        [CreditCard] [char](19) NOT NULL, --信用卡號

 CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED

(

        [ID] ASC

)

)

 

GO

 

INSERT INTO [dbo].[Customers] ([Name],[ID],[Email],[Tel],[Address],[Salary],[CreditCard])

     VALUES (N'王小明','A123456789','a01@contoso.com','02-23452345',N'台北市大安區和平東路一號',1999999,'1234-5678-5678-1234')

            ,(N'陳大華','B123789456','b02@contoso.com','03-23451234',N'桃園市中山路100號',1480912,'1478-9654-1236-5478')

            ,(N'林中偉','C221987456','c03@contoso.com','04-98761234',N'台中市中正路168號3樓',2139458,'9632-1456-9874-5632')

GO

 

SELECT *

FROM [dbo].[Customers]

未使用動態資料遮罩前,只要有權限存取該資料表或資料行的使用者,就可以瀏覽這些包含機敏資料的內容(如下圖)。

過去您可能在開發或測試階段需要建立假資料,或是自行撰寫程式來模糊化機敏資料,甚至為了防止職務上可以接觸機敏資料的員工外洩資料而煩惱,現在透過 Azure SQL Database 內建的功能,就可以省去這些工作,將精神專注在核心功能的開發。

當您使用 Azure 入口網站來建立動態資料遮罩,可於入口網站點選欲啟用動態資料遮罩功能的資料庫,接著點選稽核與安全性頁籤。

依照需求強制或選擇性的啟用啟用安全性的存取選項,若設定為必要項,則僅能以啟用安全性的連接字串來連接 Azure SQL Database,而動態資料遮罩功能必須搭配啟用安全性的連接字串才能發揮作用,換言之,當您想要使用動態資料遮罩功能,至少應用程式的連線字串必須配合修改。

啟用安全性的連接字串格式為:[伺服器名稱].database.secure.windows.net,1433,Azure 入口網站也貼心地準備各種應用程式所使用的連線字串,舉凡 ADO.NET、ODBC、PHP 及 JDBC 一應俱全。

當啟用安全性的存取設為必要項時,若仍使用一般連線字串連接 SQL Database,則會發生如下圖的錯誤訊息。

動態資料遮罩選項預設為已停用,即不對資料進行任何遮罩動作,請點選已啟用來開啟資料遮罩的功能。

此時下方就會出現新增遮罩的按鈕,點選新增遮罩來定義遮罩規則。

SQL Database 內建六種遮罩功能,您可以依照實際需求選擇適當的遮罩函式,若真的沒有符合的項目,也可以透過自訂字串來客製化遮罩的樣式。

以下我們就針對 Customers 資料表的資料來做示範,介紹幾項常見個人資料透過動態資料遮罩所呈現的效果。

  • 下列動態資料遮罩規則示範在 Customers 資料表的 Name 資料行加入遮罩,讓姓名的中間以【O】字串取代,設定如下:

    • Mask by:選擇資料表和資料行,以直接針對來源資料表進行遮罩。

    • 遮罩項目資料表:輸入來源資料表的名稱。輸入時請勿輸入中括號否則動態資料遮罩規則不會生效。

    • 遮罩項目資料行:輸入來源資料行的名稱。輸入時請勿輸入中括號否則動態資料遮罩規則不會生效。

    • 遮罩功能:選擇自訂字串(首碼[邊框間距]尾碼)。

    • EXPOSED PREFIX 輸入 1、邊框間距字串輸入 O,EXPOSED SUFFIX 輸入 1,表示第一字和最後一個字要忠實呈現,而中間不論有幾個字都以 O 字串來取代。

      規則新增完成後按儲存,重新查詢 Customers 資料表可以得到下圖的結果。

  • 下列動態資料遮罩規則示範在 Customers 資料表的 ID 資料行加入遮罩,讓身份證字號資料行只顯示前後各 2 碼,其餘中間 6 碼以【X】字串取代,設定如下:

    執行結果如下:

  • 下列動態資料遮罩規則示範在 Customers 資料表的 Email 資料行加入遮罩,由於遮罩函式內建 Email 遮罩,因此直接選擇電子郵件遮罩功能,而不需要自行客製,設定如下:

    執行結果如下:

  • 下列動態資料遮罩規則示範在 Customers 資料表的 Tel 資料行加入遮罩,讓客戶電話號碼只顯示前 6 碼的內容,其餘以【?????】字串取代,設定如下:

    執行結果如下:

  • 下列動態資料遮罩規則示範在 Customers 資料表的 Address 資料行加入遮罩,讓地址資料行只顯示前6碼的內容,其餘以【------】字串取代,設定如下:

    執行結果如下:

  • 下列動態資料遮罩規則示範在 Customers 資料表的 Salary 資料行加入遮罩,讓收入資料行呈現 100000 至 10000000 之間的亂數數值,設定如下:

    執行結果如下:

  • 最後的動態資料遮罩規則示範在 Customers 資料表的 CreditCard 資料行加入遮罩,由於信用卡號碼遮罩函式已經內建,因此直接選用即可,設定如下:

    執行結果如下:

    若您跟著上述步驟建立所有遮罩規則,應該會看到如下圖的結果,由此可以看到所有遮罩名稱(以資料表_資料行來命名)及所使用的遮罩功能。

    若要編輯或刪除遮罩規則,只要選取您所要變更的規則,接著點選下方編輯或刪除遮罩的按鈕來維護遮罩規則。

使用預覽版入口網站設定動態資料遮罩

除了前一節所提到的遮罩功能外,SQL Database 內建預設值的遮罩欄位格式,提供最簡單的方式來為機敏資料提供遮罩,針對不同的資料型別有不同的遮罩效果,為此我們以下列 T-SQL 指令碼建立另外一個測試用的資料表。

IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Customers2')

    DROP TABLE Customers2

GO

 

CREATE TABLE [dbo].[Customers2](

        [NcharCol] [nvarchar](5) NOT NULL,           

        [CharCol] [char](10) NOT NULL,                           

        [TinyIntCol] [tinyint] NOT NULL,                   

        [DateTimeCol] [DateTime],                                 

        [SQLVariantCol] SQL_VARIANT,                

        [XmlCol] XML,                                                                              

        [HierarchyidCol] HIERARCHYID                 

 

 CONSTRAINT [PK_Customers2] PRIMARY KEY CLUSTERED

(

        [CharCol] ASC

)

)

 

GO

 

INSERT INTO [dbo].[Customers2] ([NcharCol],[CharCol],[TinyIntCol],[DateTimeCol],[SQLVariantCol],[XmlCol],[HierarchyidCol])

     VALUES (N'王小明','A123456789',10,'20150227',1,(select name from Customers for xml path ('')),CAST('/3/1/' AS hierarchyid))

            ,(N'陳大華','B123789456',201,'20150606',0,(select name from Customers for xml path ('')),CAST('/0.3.-7/' AS hierarchyid))

            ,(N'林中偉','C221987456',255,'20150425',1,(select name from Customers for xml path ('')),CAST('/0.1/0.2/' AS hierarchyid))

GO

 

SELECT *

FROM [dbo].[Customers2]

 

未使用動態資料遮罩前,只要有權限存取該資料表或資料行的使用者,就可以瀏覽這些包含機敏資料的內容(如下圖)。

接下來登入預覽版入口網站來設定動態資料遮罩規則,請在入口網站點選左方的瀏覽並選擇 SQL 資料庫。

在 SQL 資料庫清單中點選要設定動態資料遮罩規則的資料庫。

在資料庫屬性頁面中向下找到動態資料遮罩(Preview)功能,點選該圖示就可以維護動態資料規則。

首先確定動態資料遮罩屬性設定為已啟用,而已啟用安全性存取屬性可以依照需求來設定,但動態資料遮罩的效果必須搭配安全性存取的連線字串才能生效,因此建議可以將之設定為必要。

接著點選新增遮罩來建立動態資料遮罩規則。

遮罩依據欄位仍使用資料表與資料行,資料表欄位輸入本節一開始所建立的測試資料表 Customers2,資料行則輸入該 NcharCol 資料行,遮罩欄位格式則是使用預設值即可,輸入完畢後按上方的儲存。

重複上述步驟將 Customers2 資料表中的所有資料行都建立遮罩規則,建立完成後會看到如下圖的結果,最後按儲存來將這些遮罩規則套用到 SQL Database。

動態資料遮罩規則生效之後,查詢 Customers2 資料表可以看到如下圖的效果,其中 NcharCol 資料行使用 nchar(5) 資料類型,因此呈現 5 個 X 的結果;CharCol 資料行為 char(10) 資料類型,大於 8 個字元,因此呈現 8 個 X 的結果;DateTimeCol資 料行使用 datetime 資料類型,呈現的則是查詢當下的系統時間,其餘 tinyint、sql_variant、xml 及 hierarchyid 則是以預設值或空白值的方式來呈現。

讓特定登入(Login)不受動態資料遮罩的限制

一旦啟用動態資料遮罩之後,所有經由啟用安全性的連接字串連接 SQL Database 的連線都會受到動態資料遮罩所保護,若您想要查看原始資料該如何做?並不是停用動態資料遮罩功能,因為如此一來將會讓所有不該看到真實資料的連線對機敏資料一覽無遺。

比較建議的做法是透過設定有特殊權限的登入的方式,來讓特定登入不受動態遮罩所影響,我們以下列 T-SQL 指令碼來建立兩個登入,並在資料庫中建立使用者並加入 db_datareader 資料庫角色。

--連接到master資料庫

--建立登入

CREATE LOGIN manager1 WITH password='P@ssw0rd'

CREATE LOGIN manager2 WITH password='P@ssw0rd'

 

GO

 

--連接到masd-basic資料庫

--建立使用者

CREATE USER manager1 FROM LOGIN manager1

CREATE USER manager2 FROM LOGIN manager2

 

GO

 

--設定為db_datareader角色

EXEC sp_addrolemember 'db_datareader','manager1'

EXEC sp_addrolemember 'db_datareader','manager2'

 

GO

在開始設定有特殊權限的登入之前,使用 manager1 查詢 Customers2 資料表一樣會受到動態資料遮罩功能所保護。換言之,一旦啟用動態資料遮罩功能,您不用擔心將來有新的登入或資料庫使用者存取機敏資料會不小心看到機敏資料。

若要讓 manager1 和 manager2 查詢 Customers2 資料表不受動態資料遮罩所限制,只要在設定動態資料遮罩的頁面,輸入登入的名稱(若有多個登入則以分號隔開),就可以讓這些登入不受動態資料遮罩所影響。

重新以 manager1 和 manager2 登入查詢 Customers2 資料表,由下圖可見已經可以查到真實的機敏資料,而不會被動態資料遮罩給屏蔽。

結論

遮罩規則儲存後,原則上尚未中斷的連線在下次向 SQL Database 查詢資料時,自動就會套用遮罩規則,但有時會有延遲的狀況發生。若有查詢結果未能依照遮罩規則呈現時,可以檢查資料表、資料行或別名名稱輸入是否與預期相同,或是中斷連線之後再試試看。

另外,啟用使用擴充的限制也可以幫助限制機敏資料的資料量,但對部分應用程式的功能可能會有副作用,因此在使用上應審慎測試後再正式上線。

除了本文所介紹的使用 Azure 入口網站或預覽版入口網站設定動態資料遮罩外,也可以以 REST API 來達到相同目的。

參考資料

  1. What's new in the Latest SQL Database Update V12 (preview)

  2. Get started with SQL Database Dynamic Data Masking

  3. Plan and prepare to upgrade to the Latest SQL Database Update V12 (preview)

  4. Operations for Azure SQL Databases

  5. Limit the exposure of sensitive data in Azure SQL Database using Dynamic Data Masking

  6. Managing Databases and Logins in Azure SQL Database

  7. Microsoft SQL Azure Database Security Best Practices