天天看點

EnterpriseDB & PostgreSQL RLS & Oracle VPD

postgresql 9.5的rls用法請參照

http://blog.163.com/digoal@126/blog/static/16387704020153984016177/

enterprisedb的rls用法略有差别,因為edb主要為oracle相容性做了很多适配,用法和oracle的vpd用法相似,調用dbms_rls.add_policy來實作rls。

詳細的用法參照:

http://www.enterprisedb.com/docs/en/9.5/oracompat/database_compatibility_for_oracle_developers_guide.1.201.html#pid0e0d5j0ha

例子:

建立一個政策,隻允許使用者操作(select,update,delete,insert) rol=目前使用者名的記錄。

首先要建立一個函數,函數的參數類型和傳回值類型必須使用這種格式。

代表行安全政策要在哪個schema.object對象上應用,以及應用時添加的條件。

函數傳回值就是添加的條件。

例如'rol='||current_user這個會作為附加條件,判斷記錄是否比對這個條件。

建立政策(需超級使用者):

驗證政策是否生效

目前使用者為digoal,隻能插入rol='digoal'的記錄

更換一個名為test的使用者測試:

這樣做到了資料的隔離。

檢視已有的政策:

禁用,生效政策

删除政策

注意edb的政策隻能針對所有使用者,不能像pg那樣隻對某些使用者建立政策。

如果要讓edb的政策有針對性,可以在函數中加上角色判斷,對不同的角色使用不同的傳回值來控制政策的多樣性。

例如

政策還有一個需要注意的地方,靜态和動态。通過add_policy的參數控制,預設是動态。

靜态政策指會話中第一次觸發政策時,編譯成靜态的,以後直接使用記憶體中緩存的政策。

動态政策指每次都重新調用。例如使用current_user這種變量作為return值中的一部分,就需要使用動态政策。

權限問題:

dbms_rls包需要超級使用者才能執行,如果需要給普通使用者執行權限,可以通過封裝,或者将函數的執行權限給普通使用者。

例如:

給普通使用者操作add_policy的風險:

對超級使用者建立的表,普通使用者也能通過add_policy來控制安全政策,這個控制結果有點越權的感覺。

例如使用者建立一個函數如下:

然後把這個函數作為政策函數,在一個超級使用者建立的表上建立政策,超級使用者對這個表的内容就會變成完全不可見狀态。

是非常危險的。不過還好對系統表不起作用,否則問題更嚴重。

安全加強方法:

在封裝函數中過濾需要過濾的表,對這些表不允許建立policy:

使用者再次使用your_add_policy添加政策時,對public.tbl1不起作用。

[參考]

http://www.postgresql.org/docs/9.5/static/sql-createpolicy.html

繼續閱讀