Oracle提供了安全標記的功能,即OLS,也就是常說的強制訪問控制。其模型是建立在BLP安全模型之上,並進行了擴展。
BLP模型的元素是安全級別和范圍,即可以對主客體進行安全級別和范圍的設定,從而達到控制數據流動的目的,即向下讀、向上寫的規則。即用戶可以讀低於用戶安全級別的數據,寫高於用戶安全級別的數據(當然還有范圍的約定,這裡不介紹了)。
Oracle擴展了BLP模型,用戶可以設置多個安全級別,通過如下接口:
- SA_USER_ADMIN.SET_LEVELS
- Syntax:
- PROCEDURE SET_LEVELS (policy_name IN VARCHAR2,
- user_name
- IN VARCHAR2,
- max_level
- IN VARCHAR2,
- min_level
- IN VARCHAR2 DEFAULT NULL,
- def_level
- IN VARCHAR2 DEFAULT NULL,
- row_level
- IN VARCHAR2 DEFAULT NULL);
- Parameter Meaning
- policy_name SpecifIEs the policy
- user_name SpecifIEs the user name
- max_level The highest level for read and write Access
- min_level The lowest level for write Access def_level SpecifIEs the default level (equal to or
- greater than the minimum level, and equal to or less than the maximum level)
- row_level SpecifIEs the row level (equal to or greater than the minimum level, and equal to or
可以看出,用戶標記可以指定最大、最小、默認和行級四種安全級別。這些安全級別之間是有約束關系的
- min_level<=max_levelmin_level<=def_level<=max_levelmin_level<=row_level<=def_level
如果違法這種規則的話,執行此函數就會失敗。了解了這麼多之後,我們進行實踐,以LBACSYS進行登錄,執行如下語句
- --創建策略P1,並為策略添加安全級別,數值越大代表安全級別越高。
- --L1<L2<L3<L4
- EXEC sa_sysdba.create_policy('P1','LABEL_COL');
- EXEC sa_components.create_level('P1', 10, 'L1', 'L1');
- EXEC sa_components.create_level('P1', 20, 'L2', 'L2');
- EXEC sa_components.create_level('P1', 30, 'L3', 'L3');
- EXEC sa_components.create_level('P1', 40, 'L4', 'L4');
- --給用戶SYSMAN設置用戶標記
- EXEC sa_user_admin.set_levels('P1','SYSMAN','L2', 'L1', 'L2', 'L2');
根據上面的介紹,這裡設置的四種安全級別符合要求。我們通過DBA_SA_USER_LABELS視圖可以查看用戶的標記。
- SQL> SELECT USER_NAME, LABELS FROM DBA_SA_USER_LABELS;
- USER_NAME
- --------------------------------------------------------------------------------
- LABELS
- --------------------------------------------------------------------------------
- SYSMAN
- MAX READ LABEL='L2',MAX WRITE LABEL='L2',MIN WRITE LABEL='L1',DEFAULT READ LABEL
- ='L2',DEFAULT WRITE LABEL='L2',DEFAULT ROW LABEL='L2'
可以看到MIN WRITE LABEL = L1
同時Oracle提供了一個系統函數,用於改變標記的值:
- Syntax:
- PROCEDURE ALTER_LABEL (
- policy_name IN VARCHAR2,
- label_tag IN INTEGER,
- new_label_value IN VARCHAR2 DEFAULT NULL,
- new_data_label IN BOOLEAN DEFAULT NULL);
- PROCEDURE ALTER_LABEL (
- policy_name IN VARCHAR2,
- label_value IN VARCHAR2,
- new_label_value IN VARCHAR2 DEFAULT NULL,
- new_data_label IN BOOLEAN DEFAULT NULL);
- Table 6–18 Parameters for SA_LABEL_ADMIN.ALTER_LABEL
- Parameter Name Parameter Description
- policy_name SpecifIEs the name of an existing policy
- label_tag IdentifIEs the integer tag assigned to the label to be altered
- label_value IdentifIEs the existing character string representation of the label to be altered
- new_label_value SpecifIEs the new character string representation of the label value. If NULL, the existing value is not changed.
此時我們對L1的標記進行改寫
- EXEC sa_label_admin.alter_label('P1', 'L1', 'L4', TRUE);
執行成功,我們查看用戶標記表,發現如下所示:
- SQL> SELECT USER_NAME, LABELS FROM DBA_SA_USER_LABELS;
- USER_NAME
- --------------------------------------------------------------------------------
- LABELS
- --------------------------------------------------------------------------------
- SYSMAN
- MAX READ LABEL='L2',MAX WRITE LABEL='L2',MIN WRITE LABEL='L4',DEFAULT READ LABEL
- ='L2',DEFAULT WRITE LABEL='L2',DEFAULT ROW LABEL='L2'
可以看出MIN WRITE LABEL變成了L4,其他的LABEL還是L2,這時的用戶標記已經是不合法的了,在這種情況下,在執行相應操作時,很多操作會被禁止,比如對打了標記的表進行更新操作,因為此時的用戶標記在進行訪問判斷時永遠是恆假值(不過此時系統不會崩潰,有點失望..),以上實驗的版本為11.1.0.6.0