天天看點

oracle中角色中權限剝離

1 Oracle三層權限體系【複習】

1、Oracle的權限體系劃分為三個層次:角色role、系統system和對象object。下面進行簡單的說明:

ü       對象權限(object privilege),是權限體系的最小粒度對象。特點是權限點在對象上。此處的對象,包括Oracle體系下包括資料表、視圖、序列、包、存儲過程等十一種對象的權限。每種對象都有對應的權限點。比如,對資料表有select、update等操作權限;

ü       系統權限(system privilege),是描述Oracle使用者操作的另一個層面。定義了使用者在系統中可以做什麼,如Create table之類。注意,一些系統權限和對象權限可能存在重疊的情況。要小心使用。

ü       角色權限(role privilege),是對象權限和系統權限、甚至包括角色權限的複合體。對象權限和系統權限都是粒度很細的權限單元,一類使用者往往需要相同的對象權限集合和系統權限集合。如果分别進行設定,就可能存在遺漏的可能,依據職責進行role角色設定,之後将角色附加給使用者,是一種更加簡單的方法;

2、對象權限object privilege

對象權限是Oracle的基礎權限,定義了使用者在某個特定對象上可以使用何種權限。注意,此處我們談到的對象權限,是針對已經存在對象的權限。目前,Oracle支援十一種對象的九方面權限,并不是每類型對象都有全部的九個方面權限。詳細如下表:

從上表中可以看出,根據對象的不同,可以進行賦予的權限也是不同的。此外,還有一個隐式的all權限,表示對象可以賦予的全部權限資訊。視圖方面,可以使用user_tab_privilege和table_privilege等視圖檢查對象的通路授權情況。

3、系統權限System Privilege:系統權限是Oracle内置定義的,在Oracle10g中有大約160餘個系統權限

4、角色權限role privilege:角色權限可以接受各種系統權限和對象權限,也可以包括其他的角色權限。在實際開發過程中,我們自定義角色的場景其實不是很多,因為自定義角色權限後,在開發使用時是有很多的限制的。需要注意的問題是,不同版本的Oracle,預定義角色可能存在差異。

2 角色role不能循環賦予

//自定義兩個空權限角色;

SQL> create role r_t;

Role created

SQL> create role r_m;

Role created

//互相嘗試賦予權限;

SQL> grant r_t to r_m;

Grant succeeded

SQL> grant r_m to r_t;

grant r_m to r_t

ORA-01934:檢測到循環的角色授權

實驗結論顯而易見:Oracle在進行grant角色相關授權的時候,會自動進行循環檢測,如果發現循環,就禁止掉操作。

3 角色權限在存儲過程中的剔除效應

角色的确是一種很友善的權限集合組織方式,在很多系統中也是廣泛應用。但是在Oracle中,使用角色權限role privilege是要格外小心的,特别是進行資料庫開發過程中。因為Oracle存儲過程等結構對角色權限有剔除效應。

【實驗】

//建立實驗角色r_cat_role

SQL> create role r_cat_role ;

Role created

//授予系統權限select any dictionary給實驗角色,select any dictionary權限可以通路到Oracle的大部分中繼資料視圖。

SQL> grant select any dictionaryto r_cat_role;

Grant succeeded

//建立使用者

SQL> create user  mytest  identified by mytest;

User created

SQL> grant create session to mytest;

Grant succeeded

SQL> grant r_cat_role to mytest;

Grant succeeded

SQL> grant create procedure to mytest;

Grant succeeded

SQL> conn mytest/mytest@ora11g;

Connected to Oracle Database11gEnterpriseEdition Release11.2.0.1.0

Connected as mytest

SQL> select count(*) fromdba_objects;

 COUNT(*)

----------

    72282

dba_objects視圖是中繼資料字典的一個組成部分。mytest使用者在接受角色權限r_cat_role之後,具有了在SQL中直接使用的權限。下面我們構造存儲過程如下:

SQL> create or replace procedure P_TEST_NC

 2 is

 3 n_res number;

 4 begin

 5   select count(*)

 6   into n_res

 7   from dba_objects;

 8

 9   dbms_output.put_line(to_char(n_res));

 10 end P_TEST_NC;

 11 /

Warning: Procedure created with compilation errors

SQL> select * from user_errors;

NAME      TYPE          SEQUENCE      LINE  POSITION TEXT                                    ATTRIBUTE

---------- ------------ ---------- ---------- ---------- ---------------------------------------- ---------

P_TEST_NC PROCEDURE   1  7 8 PL/SQL: ORA-00942:表或視圖不存在       ERROR   

P_TEST_NC PROCEDURE 2 5  3 PL/SQL: SQL Statement ignored           ERROR

編譯報錯,看起來不可思議。明明mytest使用者具有dba_objects視圖的通路權限,而且在SQL語句直接可以使用。我們說,就是因為通路dba_objects的權限是通過角色授予的。存儲過程等Oracle代碼結構具有一個特性,就是可以将使用者的三層權限(role、system和object)中的role權限剝離掉。

4 系統權限和對象權限沖突

系統權限中包括一部分與對象有關的内容。如select any table、execute any procedure等。這些和對象權限之間存在一些重疊的部分。

【實驗】

SQL> create user mytest identified by mytest;

User created

SQL> grant connect, resource to mytest;

Grant succeeded

SQL> grant select any table to mytest;

Grant succeeded

SQL> conn mytest/mytest@orcl;

Connected to Oracle Database10gEnterpriseEdition Release10.2.0.1.0

Connected as mytest

SQL> select count(*) from scott.emp;

COUNT(*)

----------

      14

嘗試可否從scott使用者上禁止mytest對m的通路。

SQL> conn scott/tiger@orcl;

Connected to Oracle Database10gEnterpriseEdition Release10.2.0.1.0

Connected as scott

SQL> revoke select on t from mytest;

revoke select on t from mytest

ORA-01927:無法REVOKE您未授權的權限

可見看出,對Oracle的revoke而言,隻能revoke授予過的權限。未授予過的權限,或者嘗試對系統權限、對象權限語義的拆分,都是不能做到的。

5

擁有select any table權限,但是對sys使用者下的資料表,是不能通路的。這是Oracle内部對于sys使用者核心對象的一種保護措施。例如sys使用者建立了一張test表,具有select  any  table權限的使用者是無法查詢sys.test表。

此外具有select  any  table 權限的使用者也無法檢視sys schema下的系統視圖,要想檢視,需要把參數o7...設定成true