Oracle的安全標(biāo)記算不算bug
ORACLE提供了安全標(biāo)記的功能,即OLS,也就是常說(shuō)的強(qiáng)制訪(fǎng)問(wèn)控制。其模型是建立在BLP安全模型之上,并進(jìn)行了擴(kuò)展。
BLP模型的元素是安全級(jí)別和范圍,即可以對(duì)主客體進(jìn)行安全級(jí)別和范圍的設(shè)定,從而達(dá)到控制數(shù)據(jù)流動(dòng)的目的,即向下讀、向上寫(xiě)的規(guī)則。即用戶(hù)可以讀低于用戶(hù)安全級(jí)別的數(shù)據(jù),寫(xiě)高于用戶(hù)安全級(jí)別的數(shù)據(jù)(當(dāng)然還有范圍的約定,這里不介紹了)。
ORACLE擴(kuò)展了BLP模型,用戶(hù)可以設(shè)置多個(gè)安全級(jí)別,通過(guò)如下接口:
- 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
可以看出,用戶(hù)標(biāo)記可以指定最大、最小、默認(rèn)和行級(jí)四種安全級(jí)別。這些安全級(jí)別之間是有約束關(guān)系的
- min_level<=max_levelmin_level<=def_level<=max_levelmin_level<=row_level<=def_level
如果違法這種規(guī)則的話(huà),執(zhí)行此函數(shù)就會(huì)失敗。了解了這么多之后,我們進(jìn)行實(shí)踐,以L(fǎng)BACSYS進(jìn)行登錄,執(zhí)行如下語(yǔ)句
- --創(chuàng)建策略P1,并為策略添加安全級(jí)別,數(shù)值越大代表安全級(jí)別越高。
- --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');
- --給用戶(hù)SYSMAN設(shè)置用戶(hù)標(biāo)記
- EXEC sa_user_admin.set_levels('P1','SYSMAN','L2', 'L1', 'L2', 'L2');
根據(jù)上面的介紹,這里設(shè)置的四種安全級(jí)別符合要求。我們通過(guò)DBA_SA_USER_LABELS視圖可以查看用戶(hù)的標(biāo)記。
- 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
同時(shí)ORACLE提供了一個(gè)系統(tǒng)函數(shù),用于改變標(biāo)記的值:
- 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.
此時(shí)我們對(duì)L1的標(biāo)記進(jìn)行改寫(xiě)
- EXEC sa_label_admin.alter_label('P1', 'L1', 'L4', TRUE);
執(zhí)行成功,我們查看用戶(hù)標(biāo)記表,發(fā)現(xiàn)如下所示:
- 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,這時(shí)的用戶(hù)標(biāo)記已經(jīng)是不合法的了,在這種情況下,在執(zhí)行相應(yīng)操作時(shí),很多操作會(huì)被禁止,比如對(duì)打了標(biāo)記的表進(jìn)行更新操作,因?yàn)榇藭r(shí)的用戶(hù)標(biāo)記在進(jìn)行訪(fǎng)問(wèn)判斷時(shí)永遠(yuǎn)是恒假值(不過(guò)此時(shí)系統(tǒng)不會(huì)崩潰,有點(diǎn)失望..),以上實(shí)驗(yàn)的版本為11.1.0.6.0
原文鏈接:http://www.cnblogs.com/nocode/archive/2011/05/04/2036873.html
【編輯推薦】
- 淺述當(dāng)前模式讀與一致性讀續(xù)
- 淺述當(dāng)前模式讀與一致性讀的區(qū)別
- 告訴你,如何成就DBA職業(yè)生涯
- 阿里巴巴運(yùn)維部DBA張瑞:Oracle與MySQL搭檔滿(mǎn)足業(yè)務(wù)需求
- Oracle業(yè)務(wù)就緒存儲(chǔ)系統(tǒng)助力企業(yè)實(shí)現(xiàn)存儲(chǔ)升級(jí)