利用Label Security實現行級安全性 Step By Step

post0發表於2007-02-10
利用Label Security實現行級安全性 Step By Step[@more@]相關閱讀:
利用VPD細粒度訪問策略實現行級安全性 Step By Step

前言:
在Oracle9i中有一個元件稱為Oracle Label Security,這個元件實現了基於自定義策略而對資料庫中的表甚或是整個Schema提供行級安全性功能。實際上Oracle Label Security是在Oracle8.1.7中提出的,在9i版本中功能得到了大幅度增強。

本文透過一個簡單的例子對Oracle Label Security的功能作初步的探討,本文使用的環境是Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 for Windows 32 bit。

流程:
首先我們瞭解一下實現Oracle Label Security的大體流程。
透過Oracle提供的一系列儲存過程,先建立一個policy,然後在policy中建立level,compartment,group,之後透過這些定義好的level,compartment,group再定義label,然後將policy繫結到某張表或者某個schema,最後再給相應的使用者設定label。

其中牽涉到幾個名詞,解釋一下:
Policy:就是安全策略,一個安全策略是level,compartment,group,label的集合。
Level:等級,這是最基礎的安全控制等級,必須設定。
Compartment:分隔(這不是官方翻譯),提供第二級的安全控制,是可選的。
Group:組(這不是官方翻譯),提供第三級的安全控制,是可選的。
Label:標籤,最終體現到每一行上的安全標籤,必須設定。只有使用者被賦予的標籤和此行上的標籤相同或者等級更高的時候,該行才能夠被使用者存取。

方法:
然後再來了解一下Oracle實現Label Security的大體方法。
在設定完Label以後,透過SQL Trace,我們可以看到使用者發出的select語句執行計劃有了變化,即使是全表掃描,也會多出一個filter的操作。
select *
from
documents

Rows Row Source Operation
------- ---------------------------------------------------
5 FILTER (cr=7 pr=0 pw=0 time=184 us)
5 TABLE ACCESS FULL DOCUMENTS (cr=7 pr=0 pw=0 time=131 us)
透過檢視raw trace file可以看到Oracle在parse這個SQL的時候,自動新增了一個條件:
begin :con := LBAC_RLS.READ_FILTER(:sn, :on); end;
而這個條件的具體操作在trace file中也有儲存,此處就不多說了。總之,透過trace我們知道對於設定了label的表的select操作,Oracle自動新增了條件來保證使用者只能選擇到自己能夠看到的記錄。

那麼,對於DML(insert,update,delete)操作呢?其實,Oracle是自動在表上新增了觸發器,這一點我們可以在設定完label以後,透過dba_triggers檢視驗證,新增的是INSERT AFTER EACH ROW,UPDATE AFTER EACH ROW和DELETE BEFORE EACH ROW三個trigger,Oracle的很多功能在內部其實都是透過trigger完成,比如高階複製同樣如此,但是Oracle一直聲稱這些trigger是內部實現的,所以比使用者自定義的trigger效率要高。當然,內部trigger和自定義trigger在實現機制上是否真的不同,還有待驗證。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-899029/,如需轉載,請註明出處,否則將追究法律責任。

相關文章