Oracle中,現(xiàn)在保護(hù)每一行的安全介紹
2024-08-29 13:38:19
供稿:網(wǎng)友
Oracle Label Security(Oracle標(biāo)簽安全性)按行來控制用戶的訪問。
絕大多數(shù)商業(yè)應(yīng)用程序都必須處理安全性問題。應(yīng)用程序經(jīng)常需要限制對專用記錄的訪問、建立審計(jì)跟蹤,或者執(zhí)行一個(gè)工作流過程,所有這些都要符合公司的安全策略。構(gòu)建安全的軟件是一個(gè)富有挑戰(zhàn)性且復(fù)雜的工作,在整個(gè)機(jī)構(gòu)內(nèi)治理軟件的安全策略可能會更困難。
作為模式(schema)設(shè)計(jì)人員,你可能會在表中添加安全性列并根據(jù)這些表創(chuàng)建用戶特定的視圖。作為DBA,你可能會創(chuàng)建角色和權(quán)限來保護(hù)數(shù)據(jù)庫對象。而作為開發(fā)人員,你可能會編寫PL/SQL包,將安全事務(wù)處理封裝在應(yīng)用程序內(nèi)。所有這些技術(shù)都很有效,但這些方法也都具有一定的缺點(diǎn)。例如,某人可能會無意中將專用數(shù)據(jù)導(dǎo)出至一個(gè)個(gè)人模式、原有的應(yīng)用程序可能與安全對象不兼容,或者用戶可能會利用SQL*Plus繞過整個(gè)應(yīng)用程序的安全性檢查。
Oracle9i數(shù)據(jù)庫有一個(gè)可以幫助解決這些問題的組件:Oracle Label Security。Oracle Label Security最早引入Oracle8i第三版(8.1.7),它是一個(gè)使你能夠建立并實(shí)施企業(yè)安全性策略的簡捷工具。
Oracle Label Security是內(nèi)置于數(shù)據(jù)庫引擎中的過程與約束條件集,該數(shù)據(jù)引擎實(shí)施對在單個(gè)表或整個(gè)模式上的"行"級訪問控制。要利用Oracle Label Security,需要?jiǎng)?chuàng)建一個(gè)或多個(gè)安全策略,其中每一個(gè)安全策略都包含一組標(biāo)簽。你可以用這些標(biāo)簽來標(biāo)明哪些用戶能夠訪問什么類型數(shù)據(jù)。在創(chuàng)建了一個(gè)策略之后,將該策略應(yīng)用于需要保護(hù)的表,并將這些標(biāo)簽授予你的用戶,這樣,你就完成了整個(gè)過程。Oracle Label Security對查詢的修改是透明的,并且在即時(shí)計(jì)算訪問級別,以執(zhí)行你的新策略。
當(dāng)Oracle9i數(shù)據(jù)庫在解析各個(gè)SQL語句時(shí),它也檢測各個(gè)表是否受到某個(gè)安全策略的保護(hù)。根據(jù)該用戶的訪問權(quán)限,Oracle9i數(shù)據(jù)庫向該語句的WHERE子句中添加安全性謂詞。因?yàn)檫@些都發(fā)生在數(shù)據(jù)庫引擎的內(nèi)部,所以不管該SQL語句的來源如何,用戶都不可能繞過該安全性機(jī)制。
它是如何工作的?
這里有一個(gè)非常簡單的例子,可以說明Oracle Label Security是如何工作的。我們創(chuàng)建了名為documents的表,并向其中填入了4個(gè)記錄,同時(shí)定義了兩個(gè)安全級別:PUBLLIC(公共)與INTERNAL(內(nèi)部)。每個(gè)級別各有一個(gè)數(shù)字值:1000或2000。接著可以為表的每一行指定一個(gè)級別。下面給出對該表進(jìn)行的一個(gè)簡單SELECT:
SQL> SELECT * FROM documents;
DOCID DOCNAME LEVEL DOC_LABEL
----- ----------- -------- ---------
1 SHARE_WARE PUBLIC 1000
2 WEST_PAYROLL INTERNAL 2000
3 EAST_SALES INTERNAL 2000
4 COMP_PAYROLL INTERNAL 2000
現(xiàn)在假定在我們的數(shù)據(jù)庫中有兩個(gè)用戶:EMP與MGR。我們?yōu)檫@些用戶指定如下訪問級別:
EMP 被指定為 PUBLIC只讀。
MGR 被指定為 PUBLIC與INTERNAL 讀/寫。
當(dāng)這兩個(gè)用戶訪問該表時(shí),EMP只能讀取第1行,而MGR可以對所有4行進(jìn)行讀/寫操作。
當(dāng)這兩個(gè)用戶訪問此 documents表時(shí),其內(nèi)部會發(fā)生什么呢?假定EMP用戶運(yùn)行下面的查詢:
SELECT * FROM documents;
Oracle9i數(shù)據(jù)庫對該查詢進(jìn)行解析,并判定該表是受標(biāo)簽安全性的保護(hù)。Oracle Label Security向該查詢中添加一個(gè) WHERE 子句,以確保該EMP只能看到標(biāo)記有 PUBLIC 訪問的行:
SELECT * FROM documents
WHERE doc_label = 1000;
下面是該 EMP 用戶在運(yùn)行此查詢后所看到的內(nèi)容:
DOCID DOCNAME LEVEL DOC_LABEL
----- ---------- ------ ---------
1 SHARE_WARE PUBLIC 1000
你可能想知道:"為什么不根據(jù)某一列值,創(chuàng)建一個(gè)限制訪問的視圖呢?"事實(shí)上,假如你的應(yīng)用程序只需要幾個(gè)級別,并沒有非凡的安全要求要考慮,那么向你的表中添加一個(gè)安全性列,然后再利用視圖就可以了。
但假設(shè)你的系統(tǒng)要求發(fā)生了變化,你現(xiàn)在需要利用對改變數(shù)據(jù)集的定制的讀/寫許可跨多個(gè)機(jī)構(gòu)來治理數(shù)個(gè)級別的用
戶。此外,這些機(jī)構(gòu)位于不同的國家,各自都有自己的法律和安全性限制。假如僅使用視圖,就很難滿足這些要求了。
幸運(yùn)的是,Oracle Label Security就是為了適應(yīng)擴(kuò)展而設(shè)計(jì)的,因此實(shí)施此類應(yīng)用程序安全性可能比你預(yù)計(jì)的更輕易。
一個(gè)練習(xí)示例
實(shí)施Oracle Label Security包括以下10個(gè)步驟:
安裝Oracle Label Security(每個(gè)數(shù)據(jù)庫進(jìn)行一次)
創(chuàng)建安全性策略
定義級別
定義區(qū)間(compartment)(可選)
定義分組(可選)
創(chuàng)建標(biāo)簽
將標(biāo)簽策略應(yīng)用于表
指定用戶標(biāo)簽
指定正常授權(quán)級別的訪問
為表中的行指定合適的標(biāo)簽
在使用Oracle Label Security時(shí),可以利用Oracle EnterPRise Manager的Policy Manager圖形用戶界面(GUI)或者Oracle Label Security PL/SQL包。
在我們的示例實(shí)施中,我們將利用PL/SQL包。相同的概念可以應(yīng)用于上述兩種技術(shù)中的任一種。
步驟1;安裝Oracle Label Security
對于每一個(gè)數(shù)據(jù)庫只需要安裝一次Oracle Label Security。安裝過程包括4個(gè)步驟:
啟動(dòng)Universal Installer。
選擇并安裝該Oracle Label Security選項(xiàng)。
以SYS身份按下面的方式運(yùn)行$ORACLE_HOME/rdbms/ admin/catols.sql:
SQL> CONN sys/passWord AS SYSDBA;
SQL> @?/rdbms/admin/catols
注重:此catols.sql腳本在其最后一步對數(shù)據(jù)庫進(jìn)行SHUTDOWN IMMEDIATE (立即關(guān)閉)。
重新啟動(dòng)實(shí)例并運(yùn)行
SQL> SELECT username FROM dba_users;
你將看到一個(gè)新的包括所有Oracle Label Security對象的 LBACSYS用戶。其缺省口令是LBACSYS (所以一定要更改該口令)。該用戶將治理你的安全策略。
步驟2:創(chuàng)建一個(gè)安全性策略
下一個(gè)任務(wù)是創(chuàng)建一個(gè)安全性策略。一個(gè)策略就是一個(gè)包括所有安全規(guī)則和訪問要求的存儲桶(bUCket)。行級別的數(shù)據(jù)標(biāo)簽和對這些行的模式訪問總是與一個(gè)策略相關(guān)聯(lián)。
在本例中,你需要定義對公司文檔的行級別的訪問。在此步驟內(nèi),創(chuàng)建一個(gè)名為DOC_POLICY的策略。要?jiǎng)?chuàng)建一個(gè)策略,先以LBACSYS身份建立連接,然后利用 sa_sysdb.create_policy過程:
SQL> CONN lbacsys/lbacsys
SQL> EXEC sa_sysdba.create_policy
('DOC_POLICY','DOC_LABEL');
第一個(gè)參數(shù)DOC_POLICY是該策略的名字,第二個(gè)參數(shù)DOC_LABEL是一個(gè)列的名字,Oracle Label Security將把該列添加到你將在標(biāo)簽控制下替換的表內(nèi)。
為了核實(shí)你的策略已經(jīng)創(chuàng)建,可按下面方式查詢DBA_SA_POLICIES :
SQL> SELECT policy_name, status
from DBA_SA_POLICIES;
POLICY_NAME STATUS
----------- -------
DOC_POLICY ENABLED
要禁用、重新啟用或者刪除一個(gè)策略,可利用以下過程:
SQL> EXEC sa_sysdba.disable_policy
('DOC_POLICY');
SQL> EXEC sa_sysdba.enable_policy
('DOC_POLICY');
SQL> EXEC sa_sysdba.drop_policy
('DOC_POLICY');
步驟3:定義級別
每個(gè)安全性策略都必須包含指定訪問表的不同等級的級別。在本例中,創(chuàng)建了兩個(gè)敏感度級別: PUBLIC與 INTERNAL。
SQL> EXEC sa_components.create_level
('DOC_POLICY', 1000,
'PUBLIC', 'Public Level');
SQL> EXEC sa_components.create_level
('DOC_POLICY', 2000,
'INTERNAL', 'Internal Level');
每個(gè)級別都有一個(gè)策略名、一個(gè)數(shù)字ID、一個(gè)縮寫名與一個(gè)全名。該數(shù)字ID表示敏感度級別--編號越高,表明敏感度越高。在本例中,INTERNAL 比PUBLIC的敏感度要高。為了查看你所創(chuàng)建的級別,執(zhí)行下面過程:
SQL> SELECT * FROM dba_sa_levels
ORDER BY level_num;
步驟4:定義區(qū)間(可選)
區(qū)間使你能夠?qū)σ恍袛?shù)據(jù)的訪問精確限定在一個(gè)級別之內(nèi)。在本例中,你具有閱讀敏感度級別相同的文檔,但是某一區(qū)間只能看到該級別的子集。下面你要?jiǎng)?chuàng)建FINANCE 與 HUMAN_RESOURCE區(qū)間:
SQL> EXEC sa_components.create_compartment
('DOC_POLICY', 200,
'FIN', 'FINANCE');
SQL> EXEC sa_components.create_compartment
&nb
sp; ('DOC_POLICY', 100,
'HR', 'HUMAN_RESOURCE');
區(qū)間有一個(gè)策略名、一個(gè)數(shù)字ID、一個(gè)縮寫名與一個(gè)全名。區(qū)間的數(shù)字ID并不指定其敏感度的級別。它僅用于在顯示訪問信息時(shí)對區(qū)間進(jìn)行排序。要了解關(guān)于區(qū)間的信息,可以查詢DBA_SA_COMPARTMENTS視圖。
步驟5:定義分組(可選)
和使用區(qū)間類似,使用分組是將訪問限制在一個(gè)級別內(nèi)的另一個(gè)可選用的方法。當(dāng)有多個(gè)層次的用戶時(shí)(如在一個(gè)公司的機(jī)構(gòu)設(shè)置圖中),組是非常有用的。
在創(chuàng)建一個(gè)分組時(shí),必須定義一個(gè)層次(hierarchy)。在本例中,ALL_REGIONS是父,WEST_REGION和EAST_REGION是ALL_REGIONS的子。
SQL> EXEC sa_components.create_group
('DOC_POLICY', 10,
'ALL', 'ALL_REGIONS');
SQL> EXEC sa_compon