本文系統整理 Oracle Label Security 的讀/寫訪問規則判定邏輯、八大細粒度特權豁免類型、授權語法與實戰場景,為安全審計與合規配置提供標準參考。
OLS 內部兼容 DB2 LBAC 規則語義,分讀規則與寫規則:
| 組件類型 | 規則常量 | 判定條件(用戶標籤 vs 對象標籤) | 口訣 |
|---|---|---|---|
| ARRAY (LEVEL) | DB2LBACREADARRAY | 用戶級別 ≥ 對象級別 | 向下讀 |
| SET (COMPARTMENT) | DB2LBACREADSET | 用戶集合 ⊇ 對象集合 | 全包含讀 |
| TREE (GROUP) | DB2LBACREADTREE | 用戶節點為對象節點或其祖先 | 祖先讀後代 |
| 組件類型 | 規則常量 | 判定條件 | 口訣 |
|---|---|---|---|
| ARRAY (LEVEL) | DB2LBACWRITEARRAY | 用戶級別 = 對象級別 | 同級寫 |
| SET (COMPARTMENT) | DB2LBACWRITESET | 同讀規則(用戶 ⊇ 對象) | 全包含寫 |
| TREE (GROUP) | DB2LBACWRITETREE | 同讀規則(祖先寫後代) | 祖先寫後代 |
核心原則:「同級寫,向下讀」(ARRAY),「全包含讀寫」(SET/TREE)。
通過 `GRANT EXEMPTION ON RULE
| 特權常量 | 適用規則 | 效果 | 風險等級 |
|---|---|---|---|
| DB2LBACREADARRAY | 讀-級別 | 忽略級別向下讀限制 | 高 |
| DB2LBACREADSET | 讀-間室 | 忽略間室包含關係檢查 | 中 |
| DB2LBACREADTREE | 讀-組 | 忽略組織祖先關係檢查 | 中 |
| DB2LBACWRITEARRAY WRITEDOWN | 寫-級別向下 | 允許寫入低於用戶級別的數據 | 極高 |
| DB2LBACWRITEARRAY WRITEUP | 寫-級別向上 | 允許寫入高於用戶級別的數據 | 極高 |
| DB2LBACWRITESET | 寫-間室 | 忽略間室包含關係檢查 | 高 |
| DB2LBACWRITETREE | 寫-組 | 忽略組織祖先關係檢查 | 高 |
| ALL | 所有規則 | 完全繞過該策略所有 MAC 檢查 | 致命 |
OLS 採用三大類別特權,粒度更粗但管理更簡單:
| 特權 | 含義 | 典型授予對象 |
|---|---|---|
| FULL | 完全繞過策略所有檢查(等價 DB2 `ALL`) | DBA、審計工具、ETL 批處理帳號 |
| PROFILE_ACCESS | 忽略用戶標籤,使用會話標籤(`SA_SESSION.SET_LABEL` 設置) | 中間件連接池、應用代理用戶 |
| COMPACCESS | 跨間室/組訪問(需配合組件定義) | 跨部門報表用戶、數據分析師 |
-- 授予
GRANT EXEMPTION ON RULE DB2LBACREADSET FOR HR_SEC TO SCOTT;
-- 回收
REVOKE EXEMPTION ON RULE DB2LBACREADSET FOR HR_SEC FROM SCOTT;
BEGIN
SA_USER_ADMIN.SET_USER_PRIVS('HR_SEC', 'SCOTT', 'COMPACCESS');
-- 或移除特權
SA_USER_ADMIN.SET_USER_PRIVS('HR_SEC', 'SCOTT', NULL);
END;
/
| 業務場景 | 推薦特權 | 理由 |
|---|---|---|
| DBA 日常維護 | FULL | 需繞過所有檢查執行 DDl/統計收集 |
| 應用連接池用戶 | PROFILE_ACCESS | 會話級動態設置標籤,用戶無固定標籤 |
| 跨部門報表查詢 | COMPACCESS | 需讀取多個 GROUP/COMPARTMENT 數據 |
| 數據歸檔/遷移腳本 | WRITEDOWN + WRITEUP | 需寫入不同級別目標表 |
| 合規審計查詢 | READARRAY + READSET + READTREE | 僅讀,需看見所有級別數據 |
-- 查看用戶細粒度豁免
SELECT * FROM DBA_SA_USER_PRIVS WHERE POLICY_NAME='HR_SEC';
-- 查看用戶原生特權
SELECT * FROM DBA_SA_USER_LEVELS WHERE POLICY_NAME='HR_SEC';
-- 檢查是否存在高風險 FULL/WRITEUP 授予
SELECT GRANTEE, PRIVILEGE FROM DBA_SA_USER_PRIVS
WHERE POLICY_NAME='HR_SEC' AND PRIVILEGE IN ('FULL','WRITEUP','WRITEDOWN');