首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Label Security 實戰:用戶/行/列/表四級標籤授權完整操作指南

     編輯:Oracle 資料庫基礎

Oracle Label Security (OLS) 四級標籤授權實戰手冊

本文聚焦 OLS 實際部署場景,通過標準 PL/SQL 包(`SA_USER_ADMIN`、`SA_POLICY_ADMIN`、`SA_LABEL_ADMIN`)演示用戶級、行級、列級、表級標籤授權的完整操作流程,含代碼模板與常見錯誤規避。

前置條件

  • Enterprise Edition + `LBAC_DBA` 角色
  • 已創建策略:`SA_SYSDBA.CREATE_POLICY('HR_SEC', 'HR_LABEL')`
  • 已定義級別/間室/組:`SA_COMPONENTS.CREATE_LEVEL` 等
  • 已創建標籤:`SA_LABEL_ADMIN.CREATE_LABEL('HR_SEC', 1000, 'HS:P1:G1')`

一、用戶級標籤授權(核心入口)

BEGIN
  -- 授予用戶讀/寫/默認標籤
  SA_USER_ADMIN.SET_USER_LABELS(
    policy_name => 'HR_SEC',
    user_name   => 'SCOTT',
    max_read_label  => 'HS:P1:G1',  -- 最高讀權限
    max_write_label => 'S:P1:G1',   -- 最高寫權限
    def_label       => 'S:P1:G1',   -- 會話默認標籤
    row_label       => 'S:P1:G1'    -- 新行默認標籤
  );
  
  -- 授予特權(可選)
  SA_USER_ADMIN.SET_USER_PRIVS(
    policy_name => 'HR_SEC',
    user_name   => 'SCOTT',
    privileges  => 'READ'  -- 或 'WRITEUP'/'WRITEDOWN'/'COMPACCESS'/'FULL'
  );
END;
/

關鍵規則:

  • 讀標籤 ≥ 寫標籤(級別向下兼容,間室/組向上兼容)
  • 單策略下每用戶僅能有一組讀/寫/默認/行標籤
  • `FULL` 特權將繞過該策略所有檢查,極度謹慎授予

二、行級標籤(隱含列 `ORA_ROW_LABEL`)

建表時自動啟用

BEGIN
  SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
    policy_name => 'HR_SEC',
    schema_name => 'HR',
    table_name  => 'EMPLOYEES',
    default_options => 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL'
  );
END;
/

執行後表自動增加隱含列 `ORA_ROW_LABEL` (NUMBER),存儲數字標籤標識。

插入數據時指定標籤

INSERT INTO HR.EMPLOYEES (EMP_ID, NAME, SALARY, ORA_ROW_LABEL)
VALUES (999, 'TEMP', 5000, 
  CHAR_TO_LABEL('HR_SEC', 'S:P1:G1')  -- 字符串轉數字標籤
);

若省略 `ORA_ROW_LABEL`,默認使用會話行標籤(`SA_USER_ADMIN.SET_USER_LABELS` 的 `row_label` 參數)。

三、列級標籤(敏感列保護)

BEGIN
  SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
    policy_name => 'HR_SEC',
    schema_name => 'HR',
    table_name  => 'EMPLOYEES',
    label_column => 'SEC_LABEL',      -- 顯式標籤列名(可選)
    default_options => 'READ_CONTROL,WRITE_CONTROL'
  );
  
  -- 為敏感列單獨綁定標籤
  SA_POLICY_ADMIN.SET_COLUMN_LABEL(
    policy_name => 'HR_SEC',
    schema_name => 'HR',
    table_name  => 'EMPLOYEES',
    column_name => 'SALARY',
    label       => 'HS:P1:G1'         -- 僅 HS 級用戶可讀薪資
  );
  
  SA_POLICY_ADMIN.SET_COLUMN_LABEL(
    policy_name => 'HR_SEC',
    schema_name => 'HR',
    table_name  => 'EMPLOYEES',
    column_name => 'SSN',
    label       => 'HS:P1:G1'
  );
END;
/

效果:`SELECT SALARY` 時自動檢查用戶讀標籤是否滿足 `HS:P1:G1`,不滿足返回 `NULL` 或報錯(視 `READ_CONTROL` 選項)。

四、表級標籤(整表統一保護)

將所有列綁定相同標籤,等價於表級保護:

BEGIN
  FOR col IN (SELECT column_name FROM all_tab_columns WHERE owner='HR' AND table_name='EMPLOYEES') LOOP
    SA_POLICY_ADMIN.SET_COLUMN_LABEL(
      policy_name => 'HR_SEC',
      schema_name => 'HR',
      table_name  => 'EMPLOYEES',
      column_name => col.column_name,
      label       => 'S:P1:G1'
    );
  END LOOP;
END;
/

優勢:節省行級標籤存儲空間(無 `ORA_ROW_LABEL`),查詢時無需逐行比對標籤,性能最優。

五、關鍵約束與限制

限制項規則
每表策略數最多 1 個
每列策略數最多 1 個(屬於表策略)
行級標籤列每表最多 1 個 (`ORA_ROW_LABEL`)
標籤字符串長度≤ 4000 字符
標籤大小寫不敏感,存儲統一大寫

六、驗證腳本

-- 查看用戶授權
SELECT * FROM DBA_SA_USER_LABELS WHERE POLICY_NAME='HR_SEC';

-- 查看表策略
SELECT * FROM DBA_SA_TABLE_POLICIES WHERE POLICY_NAME='HR_SEC';

-- 查看列標籤
SELECT * FROM DBA_SA_COLUMN_LABELS WHERE POLICY_NAME='HR_SEC';

-- 測試用戶 SCOTT 會話
CONN SCOTT/tiger
SELECT * FROM HR.EMPLOYEES;  -- 自動按標籤過濾

七、避坑指南

  1. 標籤不匹配導致數據「消失」:用戶看到行數少,實際是 `READ_CONTROL` 過濾,檢查 `MAX_READ_LABEL`
  2. 插入報 ORA-20001:寫標籤不滿足 `CHECK_CONTROL`,調整 `MAX_WRITE_LABEL` 或會話 `ROW_LABEL`
  3. 索引失效:列級標籤導致 `INDEX RANGE SCAN` 變 `FULL SCAN`,考慮表級標籤或 `COMPACCESS` 特權
  4. 導出/導入:`EXPDP` 需 `ACCESS_METHOD=DIRECT_PATH` 保留標籤,否則丟失
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved