模擬查詢 (Query Impersonation)
This feature is only available after version 2.4.3
模擬查詢 (Query Impersonation) 主要概念為允許使用者模擬在系統中其他的使用者帳戶進行操作,在 Canner Enterprise 中,透過模擬查詢 (Query Impersonation) 功能可以應用在資料列層級安全性 (Row-level Security) 以及資料行層級安全性 (Column-level Security),來保護資料的安全性。
資料列層級安全性 (Row-level Security)
資料列層級安全性是一種資料安全的策略,它可以定義資料權限來進行資料過濾,讓不同使用者讀取資料表中特定列的資料。Canner Enterprise 目前支援可以針對工作區中的資料表 (Dataset) 進行資料列層級安全性的制定。
範例
公司內不同國家區域的業務人員的業績資料都統一記錄在一張資料表中,透過制定 Row-level Security,可以根據每個地區業務登入的名稱,過濾所能看到的資料。當 Fred 這位業務登入系統時,僅能看到自己業績資料,無法看到其他人的業績資料。
資料行層級安全性 (Column-level Security)
資料行層級安全性是一種資料安全的策略,它可以定義資料權限來控制不同條件下使用者所看到的欄位內容。Canner Enterprise 目前支援可以針對工作區中的資料表 (Dataset) 進行資料行層級安全性的制定。
範例
公司內,針對有授權的角色如 Support 單位,可以看到客戶個人資料,針對未授權角色如 Analyst 單位,所看到的個人資料皆已經過資料遮罩的處理。
執行原理
Canner Enterprise 的 SQL Query Engine 中支援以下 User_Context
的函數,幫助使用者在建立資料權限時,可以使用以下的函數,來達成資料列與資料行層級安全性。
Function | Alias | Parameters | Return type | Description |
---|---|---|---|---|
list_groups | N/A | N/A | list of string | list groups of the current_user |
has_group | N/A | string | boolean | given a group name, returns true if the user is already in the group |
list_token_roles | N/A | N/A | list of string | list roles of the current_user |
has_token_role | N/A | string | boolean | given a role name, returns true if the user has assumed the role |
get_account_role | N/A | N/A | string | get the current account role |
get_workspace_role | N/A | N/A | string | get the current workspace role |
list_attributes | list_attrs | N/A | list of string | list attributes of the current_user |
has_attribute | has_attr | string | boolean | given an attribute name, returns true if the user has the attribute |
get_attribute | get_attr | string | string | given an attribute name, returns the value of the attribute |
範例: 以資料行層級安全性 (Column-level Security) 進行
使用者在 Canner Enterprise 中要建立 View
或是 Materialized View
時,可以在 SQL 語法中加入上述的函數來定義資料權限。
資料權限定義: 當使用者在工作區中權限角色不是工作區擁有者 (Owner) 時,資料表中的 address
欄位會回傳 ***
的值給使用者。
SELECT
(CASE
WHEN get_workspace_role() != 'owner' THEN '***'
ELSE address::text
END)
FROM
customer_27487
建立成 View。
切換登入角色,以工作區角色為資料分析師 (Data Analyst) 角色登入,查詢剛建立的 View,因為此角色並非工作區擁有者 (Owner),所以資料表中 address
欄位根據我們所定義的權限,以 ***
進行回傳。
模擬查詢 (Query Impersonation) 執行方式
在了解 Column-level 以及 Row-level Security 後,接著將介紹模擬查詢 (Query Impersonation) 如何進行。在 Canner Enterprise 中,目前支援使用者可以模擬工作區中的其他使用者的權限來執行查詢。我們以 psql 連線至 Canner Enterprise 來介紹整個執行方式。
Step 1: 建立連線
連線方式請參考 psql (CLI),在此以使用系統管理員 (admin) 角色的 Personal Access Token 作為連線進入。
Step 2: 開啟模擬權限
進行模擬查詢 (Query Impersonation) 時,進行連線的角色需要具備模擬權限才可以執行。模擬權限預設為關閉,需要至 Members 頁面開啟此權限。
進入 Members 頁面,點擊 Edit 選項。
將 Impersonation
選項的開關開啟。當開啟後,此角色就具有模擬其他角色的權限。
Step 3: 選定模擬的使用者
選擇連線的工作區中要模擬的角色
模擬的角色目前僅支援 User,無法針對 Group 進行模擬。
輸入執行模擬的語法。
IMPERSONATE "{CANNER USER NAME}"
以模擬工作區中的使用者 tom 作為範例,當目前使用者具有權限可以模擬時,會看到 IMPERSONATE
字串,接著就可以進行 Query。
若目前使用者未有權限可以進行模擬時,會看到以下錯誤訊息,需到 Members 頁面開啟模擬權限。
Step 4: 執行模擬查詢 (Query Impersonation)
以查詢我們先前建立的 View 做為範例,模擬不同的使用者查詢並結合資料行層級安全性 (Column-level Security)。
模擬工作區中的使用者 tom 進行查詢,由於 tom 在工作角色為資料分析師 (Data Analyst),所以 address
欄位所看到的值為 ***
。
SELECT * FROM demo Limit 5 ;
模擬工作區中的使用者 astro 進行查詢,由於 astro 在工作角色為工作區擁有者 (Owner),所以 address
欄位所看到的值為原本的值。
SELECT * FROM demo Limit 5 ;
活動審查 (Auditing)
透過模擬查詢的 Query,在活動審查頁面中會進行紀錄以利追縱。進入 Activity Log
頁面中,在 Even initiated by
的欄位中可以看到 Impersonated by
的字串代表此查詢是由其他人進行模擬。