Oracle Label Security 採用「一個級別、多個間室、多個組」的三層標籤架構,本文提供每個組件的語義定義、數值範圍、層級關係、存儲過程參數完整說明,並附帶標準化創建腳本模板。
PROCEDURE CREATE_LEVEL (
policy_name IN VARCHAR2, -- 策略名
level_num IN INTEGER, -- 級別數值 (0-9999)
short_name IN VARCHAR2, -- 短名稱 (如 'TS')
long_name IN VARCHAR2 -- 長名稱 (如 'TOP SECRET')
);
BEGIN
SA_COMPONENTS.CREATE_LEVEL('HR_SEC', 9000, 'TS', 'TOP SECRET');
SA_COMPONENTS.CREATE_LEVEL('HR_SEC', 7000, 'S', 'SECRET');
SA_COMPONENTS.CREATE_LEVEL('HR_SEC', 5000, 'C', 'CONFIDENTIAL');
SA_COMPONENTS.CREATE_LEVEL('HR_SEC', 1000, 'U', 'UNCLASSIFIED');
END;
/
PROCEDURE CREATE_COMPARTMENT (
policy_name IN VARCHAR2,
comp_num IN INTEGER, -- 間室數值
short_name IN VARCHAR2, -- 短名稱
long_name IN VARCHAR2 -- 長名稱
);
BEGIN
SA_COMPONENTS.CREATE_COMPARTMENT('HR_SEC', 100, 'FIN', 'FINANCE');
SA_COMPONENTS.CREATE_COMPARTMENT('HR_SEC', 200, 'HR', 'HUMAN RESOURCES');
SA_COMPONENTS.CREATE_COMPARTMENT('HR_SEC', 300, 'IT', 'INFORMATION TECHNOLOGY');
SA_COMPONENTS.CREATE_COMPARTMENT('HR_SEC', 400, 'LGL', 'LEGAL');
END;
/
PROCEDURE CREATE_GROUP (
policy_name IN VARCHAR2,
group_num IN INTEGER, -- 組數值
short_name IN VARCHAR2, -- 短名稱
long_name IN VARCHAR2, -- 長名稱
parent_name IN VARCHAR2 DEFAULT NULL -- 父組短名稱
);
BEGIN
-- 頂層
SA_COMPONENTS.CREATE_GROUP('HR_SEC', 1000, 'HQ', 'HEADQUARTERS', NULL);
-- 一級分支
SA_COMPONENTS.CREATE_GROUP('HR_SEC', 1100, 'APAC', 'ASIA PACIFIC', 'HQ');
SA_COMPONENTS.CREATE_GROUP('HR_SEC', 1200, 'EMEA', 'EUROPE MIDDLE EAST AFRICA', 'HQ');
SA_COMPONENTS.CREATE_GROUP('HR_SEC', 1300, 'AMER', 'AMERICAS', 'HQ');
-- 二級分支
SA_COMPONENTS.CREATE_GROUP('HR_SEC', 1110, 'CN', 'CHINA', 'APAC');
SA_COMPONENTS.CREATE_GROUP('HR_SEC', 1120, 'JP', 'JAPAN', 'APAC');
SA_COMPONENTS.CREATE_GROUP('HR_SEC', 1130, 'SG', 'SINGAPORE', 'APAC');
END;
/
PROCEDURE CREATE_POLICY (
policy_name IN VARCHAR2, -- 策略名
column_name IN VARCHAR2 DEFAULT NULL, -- 標籤列名 (默認 ORA_ROW_LABEL)
default_options IN VARCHAR2 DEFAULT NULL -- 默認選項: READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL...
);
BEGIN
SA_SYSDBA.CREATE_POLICY(
policy_name => 'HR_SEC',
column_name => 'SEC_LABEL',
default_options => 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL,LABEL_DEFAULT'
);
END;
/
LEVEL:COMPARTMENT1,COMPARTMENT2,...,COMPARTMENTn:GROUP1,GROUP2,...,GROUPn
PROCEDURE CREATE_LABEL (
policy_name IN VARCHAR2,
label_tag IN INTEGER, -- 數字標籤標識 (存儲在表中)
label_value IN VARCHAR2, -- 字符串標籤值
data_label IN BOOLEAN DEFAULT TRUE -- 是否為數據標籤 (可被行使用)
);
BEGIN
-- 數字標籤 1000 對應 'S:FIN,HR:APAC,CN'
SA_LABEL_ADMIN.CREATE_LABEL('HR_SEC', 1000, 'S:FIN,HR:APAC,CN', TRUE);
SA_LABEL_ADMIN.CREATE_LABEL('HR_SEC', 2000, 'C:FIN:APAC', TRUE);
SA_LABEL_ADMIN.CREATE_LABEL('HR_SEC', 3000, 'TS:LGL:HQ', TRUE);
END;
/
| 表示形式 | 用途 | 轉換函數 |
|---|---|---|
| 數字標籤 (LABEL_TAG) | 存儲在表的標籤列中,索引、比較高效 | `CHAR_TO_LABEL` / `LABEL_TO_CHAR` |
| 字符串標籤 (LABEL_VALUE) | 人類可讀、API 參數、審計日誌 | 同上 |
-- 1. 創建策略
BEGIN SA_SYSDBA.CREATE_POLICY('FIN_SEC', 'ROW_LABEL', 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL'); END;
/
-- 2. 定義級別
BEGIN
SA_COMPONENTS.CREATE_LEVEL('FIN_SEC', 9000, 'TS', 'TOP SECRET');
SA_COMPONENTS.CREATE_LEVEL('FIN_SEC', 6000, 'S', 'SECRET');
SA_COMPONENTS.CREATE_LEVEL('FIN_SEC', 3000, 'C', 'CONFIDENTIAL');
SA_COMPONENTS.CREATE_LEVEL('FIN_SEC', 1000, 'P', 'PUBLIC');
END;
/
-- 3. 定義間室
BEGIN
SA_COMPONENTS.CREATE_COMPARTMENT('FIN_SEC', 10, 'TRD', 'TRADING');
SA_COMPONENTS.CREATE_COMPARTMENT('FIN_SEC', 20, 'RSK', 'RISK');
SA_COMPONENTS.CREATE_COMPARTMENT('FIN_SEC', 30, 'CMP', 'COMPLIANCE');
END;
/
-- 4. 定義組 (扁平)
BEGIN
SA_COMPONENTS.CREATE_GROUP('FIN_SEC', 100, 'HQ', 'HEADQUARTERS');
SA_COMPONENTS.CREATE_GROUP('FIN_SEC', 200, 'BR1', 'BRANCH_1');
SA_COMPONENTS.CREATE_GROUP('FIN_SEC', 300, 'BR2', 'BRANCH_2');
END;
/
-- 5. 創建常用標籤
BEGIN
SA_LABEL_ADMIN.CREATE_LABEL('FIN_SEC', 1000, 'S:TRD:HQ');
SA_LABEL_ADMIN.CREATE_LABEL('FIN_SEC', 2000, 'C:RSK:CMP:BR1');
SA_LABEL_ADMIN.CREATE_LABEL('FIN_SEC', 3000, 'P::'); -- 僅級別
END;
/
-- 6. 應用至表
BEGIN
SA_POLICY_ADMIN.APPLY_TABLE_POLICY('FIN_SEC', 'FIN', 'TRANSACTIONS', 'READ_CONTROL,WRITE_CONTROL');
END;
/