首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 10g 列值遮罩:VPD + ALL_ROWS 實現敏感欄位脫敏且返回所有行

     編輯:Oracle 資料庫相關知識

背景

傳統 VPD (Fine-Grained Access Control) 透過 Policy Function 動態附加 WHERE 條件,**過濾掉無權限行**。10g 新增 **Column Masking(列值遮罩)**:返回所有行,但敏感欄位顯示 NULL/遮罩值。

實作步驟

  1. 建立 Policy Function 返回斷言:
CREATE OR REPLACE FUNCTION rls_dept (
  obj_owner IN VARCHAR2, obj_name IN VARCHAR2
) RETURN VARCHAR2 AS
  predicate VARCHAR2(200);
BEGIN
  predicate := 'department_id = 60';
  RETURN predicate;
END;
/
-- 實際應用中可根據 SYS_CONTEXT('USERENV','SESSION_USER') 動態決定部門
  1. 註冊 Policy 並啟用列遮罩:
BEGIN
  DBMS_RLS.ADD_POLICY(
    object_schema      => 'HR',
    object_name        => 'EMPLOYEES',
    policy_name        => 'restrict_dept_policy',
    function_schema    => 'HR',
    policy_function    => 'rls_dept',
    sec_relevant_cols  => 'salary,commission_pct',   -- 敏感欄位清單
    sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS       -- 關鍵:返回所有行
  );
END;
/

效果

  • 用戶執行 SELECT * FROM employees 可見**所有部門員工行**。
  • 若查詢包含 salary 或 commission_pct,**非授權部門行這兩欄顯示 NULL**;授權部門行顯示真實值。
  • 不包含敏感欄位的查詢**不觸發 Policy**,效能無損。

關鍵參數對照

參數作用
SEC_RELEVANT_COLS指定哪些欄位為「安全相關列」,只有查詢這些欄位時才套用遮罩邏輯。
SEC_RELEVANT_COLS_OPT = DBMS_RLS.ALL_ROWS開啟「返回所有行」模式,而非傳統過濾行。

適用場景

  • 報表/BI 工具需顯示完整行集(如員工名單),但薪資等敏感欄位需脫敏。
  • 多租戶 SaaS:同一張表服務多客戶,租戶間行可見但敏感欄位隔離。
  • 合規要求:審計日誌需記錄完整操作上下文,但敏感資料不落盤。

注意事項

  • VPD Policy 適用於 SELECT、INSERT、UPDATE、DELETE、INDEX 範圍掃描。
  • Policy Function 應盡量輕量(無複雜查詢),避免影響所有查詢效能。
  • 12c+ 可結合 DBMS_REDACT(Data Redaction)提供更豐富遮罩格式(部分遮罩、隨機值、正則替換)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved