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