跳至主要内容
版本:v2

模擬查詢 (Query Impersonation)

Info

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 這位業務登入系統時,僅能看到自己業績資料,無法看到其他人的業績資料。

1_query_impersonation

資料行層級安全性 (Column-level Security)

資料行層級安全性是一種資料安全的策略,它可以定義資料權限來控制不同條件下使用者所看到的欄位內容。Canner Enterprise 目前支援可以針對工作區中的資料表 (Dataset) 進行資料行層級安全性的制定。

範例

公司內,針對有授權的角色如 Support 單位,可以看到客戶個人資料,針對未授權角色如 Analyst 單位,所看到的個人資料皆已經過資料遮罩的處理。

2_query_impersonation

執行原理

Canner Enterprise 的 SQL Query Engine 中支援以下 User_Context 的函數,幫助使用者在建立資料權限時,可以使用以下的函數,來達成資料列與資料行層級安全性。

FunctionAliasParametersReturn typeDescription
list_groupsN/AN/Alist of stringlist groups of the current_user
has_groupN/Astringbooleangiven a group name, returns true if the user is already in the group
list_token_rolesN/AN/Alist of stringlist roles of the current_user
has_token_roleN/Astringbooleangiven a role name, returns true if the user has assumed the role
get_account_roleN/AN/Astringget the current account role
get_workspace_roleN/AN/Astringget the current workspace role
list_attributeslist_attrsN/Alist of stringlist attributes of the current_user
has_attributehas_attrstringbooleangiven an attribute name, returns true if the user has the attribute
get_attributeget_attrstringstringgiven 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

3_query_impersonation

建立成 View。

4_query_impersonation

切換登入角色,以工作區角色為資料分析師 (Data Analyst) 角色登入,查詢剛建立的 View,因為此角色並非工作區擁有者 (Owner),所以資料表中 address 欄位根據我們所定義的權限,以 *** 進行回傳。

5_query_impersonation

模擬查詢 (Query Impersonation) 執行方式

在了解 Column-level 以及 Row-level Security 後,接著將介紹模擬查詢 (Query Impersonation) 如何進行。在 Canner Enterprise 中,目前支援使用者可以模擬工作區中的其他使用者的權限來執行查詢。我們以 psql 連線至 Canner Enterprise 來介紹整個執行方式。

Step 1: 建立連線

連線方式請參考 psql (CLI),在此以使用系統管理員 (admin) 角色的 Personal Access Token 作為連線進入。

6_query_impersonation

Step 2: 開啟模擬權限

進行模擬查詢 (Query Impersonation) 時,進行連線的角色需要具備模擬權限才可以執行。模擬權限預設為關閉,需要至 Members 頁面開啟此權限。

進入 Members 頁面,點擊 Edit 選項。

7_query_impersonation

Impersonation 選項的開關開啟。當開啟後,此角色就具有模擬其他角色的權限。

8_query_impersonation

Step 3: 選定模擬的使用者

選擇連線的工作區中要模擬的角色

Information

模擬的角色目前僅支援 User,無法針對 Group 進行模擬。

9_query_impersonation

輸入執行模擬的語法。

IMPERSONATE "{CANNER USER NAME}"

以模擬工作區中的使用者 tom 作為範例,當目前使用者具有權限可以模擬時,會看到 IMPERSONATE 字串,接著就可以進行 Query。

10_query_impersonation

若目前使用者未有權限可以進行模擬時,會看到以下錯誤訊息,需到 Members 頁面開啟模擬權限

11_query_impersonation

Step 4: 執行模擬查詢 (Query Impersonation)

以查詢我們先前建立的 View 做為範例,模擬不同的使用者查詢並結合資料行層級安全性 (Column-level Security)。

4_query_impersonation

模擬工作區中的使用者 tom 進行查詢,由於 tom 在工作角色為資料分析師 (Data Analyst),所以 address 欄位所看到的值為 ***

SELECT * FROM demo Limit 5 ;

12_query_impersonation

模擬工作區中的使用者 astro 進行查詢,由於 astro 在工作角色為工作區擁有者 (Owner),所以 address 欄位所看到的值為原本的值。

SELECT * FROM demo Limit 5 ;

13_query_impersonation

活動審查 (Auditing)

透過模擬查詢的 Query,在活動審查頁面中會進行紀錄以利追縱。進入 Activity Log 頁面中,在 Even initiated by 的欄位中可以看到 Impersonated by 的字串代表此查詢是由其他人進行模擬。

14_query_impersonation