欄位層級與列層級安全性

Snowflake 管理、治理與協作

Emily Melhuish

Technical Curriculum Developer, Snowflake

資料表層級存取的問題

具備資料表存取的 Users 資料表

  • Claro 的 users 資料表包含姓名、Email、信用分數與信用等級
  • 對 analyst 角色授與 SELECT 會曝露所有欄位
  • 行銷分析師不需要原始信用分數
  • 資料表層級存取控制無法做出這種區分
Snowflake 管理、治理與協作

什麼是欄位層級安全性?

  • 欄位仍出現在結果中,只是值被替換
  • 特權角色看到真實值;無特權角色看到遮罩值
  • 遮罩於查詢時依查詢角色套用=動態資料遮罩

column_security_v2.png

Snowflake 管理、治理與協作

動態資料遮罩

示意圖:兩個資料表,一個啟用動態資料遮罩,一個未啟用

Snowflake 管理、治理與協作

建立並套用遮罩原則

CREATE MASKING POLICY mask_credit_score
  AS (val NUMBER) RETURNS NUMBER ->
  CASE
    WHEN IS_ROLE_IN_SESSION('CREDIT_ADMIN') THEN val
    ELSE -9999
  END;

ALTER TABLE core.users
  MODIFY COLUMN credit_score
  SET MASKING POLICY mask_credit_score;
  • CURRENT_ROLE 會回傳目前作用中的主要角色
1 https://docs.snowflake.com/en/sql-reference/sql/create-masking-policy#example-normal-masking-policy
Snowflake 管理、治理與協作

外部代碼化(Tokenization)

  • 動態資料遮罩的替代方案
  • 需要第三方代碼(tokenization)供應商與 External Function
  • 將敏感值替換為可跨系統一致的代碼
  • 當需在 Snowflake 之外辨識相同代碼時很實用

external_tokenization_v2.png

1 https://docs.snowflake.com/en/user-guide/security-column-ext-token-use
Snowflake 管理、治理與協作

什麼是列層級安全性?

兩個資料表示範分析師只能看到特定列

Snowflake 管理、治理與協作

列存取原則如何運作

示意圖:US_ANALYST 的查詢經過 users 資料表的 Row Access Policy,只回傳 US 列;EU_ANALYST 用同一查詢只回傳 EU 列

  • 原則會評估查詢角色並套用篩選條件
Snowflake 管理、治理與協作

建立並套用列存取原則

CREATE ROW ACCESS POLICY region_filter
  AS (region_col VARCHAR) RETURNS BOOLEAN ->
  CASE
    WHEN IS_ROLE_IN_SESSION('US_ANALYST') THEN region_col = 'US'
    WHEN IS_ROLE_IN_SESSION('EU_ANALYST') THEN region_col = 'EU'
    ELSE FALSE
  END;

ALTER TABLE core.users
  ADD ROW ACCESS POLICY region_filter ON (region);
Snowflake 管理、治理與協作

同時使用資料遮罩與列存取原則

動態資料遮罩與列存取原則

Snowflake 管理、治理與協作

一起來練習吧!

Snowflake 管理、治理與協作

Preparing Video For Download...