天天看點

我的Oracle 9i學習日志(23)-- 角色管理

<b>角色的特點:</b>

• 可以通過授予和撤消系統權限所用的指令來授予和撤消使用者的角色。

• 可以将角色授予任何使用者或角色。但是,不能将角色授予它本身,也不能循環授予(例如:将角色A-&gt;B-&gt;C-&gt;A)。

• 角色可以由系統權限和對象權限組成(角色也可包含其他角色)。

• 對于被授予某種角色的每個使用者來說,該角色可以啟用,也可以禁用。

• 角色可要求通過密碼啟用。

• 在現有的使用者名和角色名中,每個角色名必須唯一。

• 角色不屬于任何人。

• 在資料字典中存儲了有關角色的說明。

<b>角色的優點:</b>

•輕松權限管理

•動态權限管理

•可選擇權限可用性:

可啟用和禁用角色以暫時打開和關閉權限。還可以通過啟用角色驗證使用者是否已被授予該角色。

•可以通過作業系統授予

<b>建立角色:</b>

使用CREATE ROLE 語句可建立角色。必須具有CREATE ROLE 系統權限才能建立角色。

建立類型為NOT IDENTIFIED、IDENTIFIED EXTERNALLY 或BY password 的角色時,通過ADMIN 選項為該角色授權。

使用下列指令建立角色:

CREATE ROLE role [NOT IDENTIFIED(預設) | IDENTIFIED

{BY password | EXTERNALLY | GLOBALLY | USING package}]

其中:

role:是角色的名稱

NOT IDENTIFIED:表明啟用該角色時,不需要進行驗證

IDENTIFIED:表明啟用該角色時,需要進行驗證

BY password:提供使用者在啟用角色時必須指定的密碼

USING package:建立應用程式角色,該角色隻能由使用授權的程式包的應用程式啟用

EXTERNALLY:表明在啟用該角色之前,使用者必須由外部服務(例如作業系統或第三方服務)授權

GLOBALLY:表明通過SET ROLE 語句啟用角色之前或登入時,必須由企業目錄服務授權使用者使用該角色

<b>預定義角色:</b>

<a target="_blank" href="http://blog.51cto.com/attachment/201004/124858461.png"></a>

圖1

<b>修改角色:</b>

修改角色時,隻能更改其驗證方法。而且,您的角色必須通過ADMIN 選項進行授予,或

者您必須具有ALTER ANY ROLE 系統權限。

使用下列指令修改角色:

ALTER ROLE role {NOT IDENTIFIED | IDENTIFIED

{BY password |USING package| EXTERNALLY | GLOBALLY }};

<b>配置設定角色:</b>

可使用為使用者授予系統權限所用的文法指令為使用者授予角色:

GRANT role [, role ]...

TO {user|role|PUBLIC}

[, {user|role|PUBLIC} ]...

[WITH ADMIN OPTION]

role:是要授予的角色集合

PUBLIC:将角色授予所有使用者

WITH ADMIN OPTION:使被授予者能夠為其他使用者或角色授予角色。(如果使用該選項授予角色,被授予者将能夠授予和撤消其他使用者的角色,并可改變或删除角色。)預設情況下,對于建立角色的使用者,系統将通過ADMIN OPTION 為其配置設定角色。沒有通過ADMIN OPTION 被授予角色的使用者需要具有GRANT ANY ROLE 系統權限才能授予和撤消其它角色。

SQL&gt; select * from dba_role_privs where granted_role='R1';

GRANTEE                        GRANTED_ROLE           ADM DEF

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

SYS                            R1                     YES YES

USER1                          R1                     NO YES

#角色建立後,預設授予sys。

注:使用者可啟用的資料庫角色的最多數目由初始化參數MAX_ENABLED_ROLES 設定。

SQL&gt; show parameter max_enabled

NAME                                 TYPE        VALUE

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

max_enabled_roles                    integer     30

<b>預設角色:</b>

例:

ALTER USER scott DEFAULT ROLE hr_clerk, oe_clerk;

ALTER USER scott DEFAULT ROLE ALL;

ALTER USER scott DEFAULT ROLE ALL EXCEPT hr_clerk;

ALTER USER scott DEFAULT ROLE NONE;

可以為一個使用者配置設定多個角色。預設角色是使用者登入時自動啟用的角色的子集。預設情況下,登入時自動啟用配置設定給使用者的所有角色,而無需密碼。使用ALTER USER 指令可以限制使用者的預設角色的數目。

DEFAULT ROLE 子句隻适用于已認證GRANT 語句直接授予使用者的角色。DEFAULT ROLE子句不能用來啟用下列角色:

•未授予使用者的角色

•通過其它角色授予的角色

•由外部服務(如作業系統)管理的角色

使用下列文法配置設定使用者的預設角色:

ALTER USER user DEFAULT ROLE

{role [,role]... | ALL [EXCEPT role [,role]... ] | NONE}

user:是被授予角色的使用者的名稱

role:是作為使用者預設角色的角色

ALL:除EXCEPT 子句中列出的角色外,将授予使用者的所有角色都設定為預設角色(這是預設設定。)

EXCEPT:表明後随角色不應包括在預設角色中

NONE:授予使用者的任何角色都不作為預設角色(使用者登入時擁有的唯一權限是直接配置設定給該使用者的權限。)

由于角色必須被授予後才有可能作為預設角色,是以不能使用CREATE USER 指令設定預設角色。

SQL&gt; grant r2 to user1;

Grant succeeded.

SQL&gt; select * from dba_role_privs where grantee='USER1'; 

GRANTEE             GRANTED_ROLE                   ADM DEF

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

USER1               R1                             NO YES

USER1              R2                             NO YES

SQL&gt; alter user user1 default role r1;

User altered.

GRANTEE             GRANTED_ROLE                   ADM DEF

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

SYS                  R1                             YES YES

USER1               R1                             NO YES

SQL&gt; conn user1/user1

Connected.

SQL&gt; select * from session_privs;

PRIVILEGE

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

CREATE SESSION

SQL&gt; select * from session_roles;

ROLE

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

R1

<b>啟用和禁用角色</b>

啟用或禁用角色可暫時激活和不激活與角色關聯的權限。必須首先為使用者授予角色,然後才能啟用該角色。

啟用角色時,使用者可以使用授予該角色的權限。如果禁用角色,使用者将不能使用與該角色關聯的權限,除非将該權限直接授予使用者或授予為該使用者啟用的另一個角色。角色的啟用針對的是一個會話。在下一個會話中,使用者的活動角色将恢複為預設角色。

指定要啟用的角色:

SET ROLE 指令和DBMS_SESSION.SET_ROLE 過程将啟用包含在指令中的全部角色,并禁用所有其它角色。可以通過任何允許使用PL/SQL 指令的工具或程式啟用角色;但不能在存儲過程中啟用角色。

可以使用ALTER USER...DEFAULT ROLE 指令指出使用者登入時将啟用的角色。所有其它角色都将被禁用。

啟用角色時可能需要密碼。SET ROLE 指令中必須包含密碼才能啟用角色。配置設定給使用者的預設角色不需要密碼,這些角色同沒有密碼的角色一樣在登入時啟用。

限制:

不能在存儲過程中啟用角色,因為該操作可能會改變安全域(權限集),安全域允許首先調用存儲過程。是以,在PL/SQL 中,可以在匿名塊和應用程式過程(如Oracle Forms 過程)中啟用和禁用角色,但不能在存儲過程中執行該操作。如果存儲過程包含了SET ROLE 指令,運作時會産生下列錯誤:

ORA-06565: cannot execute SET ROLE from within stored procedure

SET ROLE 指令關閉授予使用者的任何其它角色(隻啟用該指令中指定的role)。

SET ROLE {role [ IDENTIFIED BY password ]

[, role [ IDENTIFIED BY password ]]...

| ALL [ EXCEPT role [, role ] ...]

| NONE }

IDENTIFIED BY password:提供啟用角色時所需的密碼

ALL:除了EXCEPT 子句中列出的角色外,啟用授予目前使用者的全部角色(不能使用

該選項啟用帶密碼的角色。)

EXCEPT role:不啟用這些角色

NONE:禁用目前會話的全部角色(隻有直接授予使用者的權限是活動的。)

隻有在啟用的每個角色都沒有密碼時,不帶EXCEPT 子句的ALL 選項才有效。

SQL&gt; set role r2 ;

set role r2

*

ERROR at line 1:

ORA-01979: missing or invalid password for role 'R2'

SQL&gt; set role r2 identified by r2;

Role set.

CREATE TABLE

R2

SQL&gt; set role r2 identified by r2, r1;

SQL&gt;

<b>撤消使用者角色</b>

使用SQL 語句REVOKE 可撤消使用者角色。通過ADMIN 選項擷取角色的任何使用者都可撤消任何其他資料庫使用者或角色的角色。此外,具有GRANT ANY ROLE 權限的使用者也可以撤消任何角色。

REVOKE role [, role ]

FROM {user|role|PUBLIC}

[, {user|role|PUBLIC} ]

其中

role:是要撤消的角色或從其撤消角色的角色

user:要撤消其系統權限或角色的使用者

PUBLIC:撤消所有使用者的權限或角色

SQL&gt; conn /as sysdba

SQL&gt; grant r1 to user1 with admin option;

SQL&gt; select * from dba_role_privs where grantee like(USER%);

GRANTEE                        GRANTED_ROLE                   ADM DEF

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

USER1                          R1                             YES YES

USER1                          R2                             NO NO

USER2                          R2                             NO YES

3 rows selected.

SQL&gt; grant r1 to user2;

SQL&gt; revoke RESOURCE from luo;

revoke RESOURCE from luo

ORA-01031: insufficient privileges

<b>删除角色</b>

使用下列文法從資料庫中删除角色:

DROP ROLE role

删除角色時,Oracle 伺服器從所有使用者和被授予該角色的角色中及資料庫中撤消該角色。

必須通過ADMIN OPTION 被授予了角色或具有DROP ANY ROLE 系統權限才能删除角色。

<b>角色建立原則</b>

<a target="_blank" href="http://blog.51cto.com/attachment/201004/124920462.png"></a>

圖2

因為角色包含執行任務所需的權限,是以,角色名通常就是應用程式任務或職稱。圖中的示例就使用應用程式任務與職稱作為角色名。請按下列步驟建立、配置設定和授予使用者角色:

1. 為每個應用程式任務建立一個角色。應用程式角色名對應于應用程式任務,如PAYROLL。

2. 為應用程式角色配置設定執行任務所需的權限。

3. 為每種使用者類型建立一個角色。使用者角色名對應于職稱,如PAY_CLERK。

4. 将應用程式角色授予使用者角色。

5. 将使用者角色授予使用者。

如果應用程式的修改要求使用新的權限執行工資表任務,則DBA 隻需向應用程式角色PAYROLL 配置設定新的權限。目前正在執行該任務的所有使用者都将接收到新的權限。

<b>使用密碼與預設角色的原則</b>

<a target="_blank" href="http://blog.51cto.com/attachment/201004/124933351.png"></a>

圖3

啟用角色時密碼提供了額外的安全級。例如,在啟用PAY_CLERK 角色時,應用程式可能要求使用者輸入密碼,因為可以使用該角色發出支票。

通過使用密碼,隻能通過應用程式來啟用角色。在圖3示例中對這種技術做了說明。

• DBA 授予了使用者兩個角色:PAY_CLERK 和PAY_CLERK_RO。

• PAY_CLERK 已被授予執行工資表職員功能所需的全部權限。

• PAY_CLERK_RO(RO 表示隻讀)僅被授予了在表上執行工資表職員功能所需的SELECT 權限。

•使用者可以登入到SQL* Plus 進行查詢,但是不能修改任何資料,這是由于PAY_CLERK 不是一個預設角色,使用者并不知道PAY_CLERK 的密碼。

•當使用者登入到工資表應用程式時,該程式提供密碼以啟用PAY_CLERK。密碼已編入程式中,系統不會提示使用者輸入密碼。

<b>應用程式角色</b>

CREATE ROLE 語句中的USING package 子句用來建立應用程式角色。應用程式角色隻

能由使用授權的PL/SQL 程式包的應用程式啟用。應用程式開發人員無需在應用程式内嵌

入密碼來保護角色。他們可建立應用程式角色并指定授權哪個PL/SQL 程式包可以啟用該

角色。

SQL&gt; CREATE ROLE admin_role IDENTIFIED USING hr.employees;

本例中,admin_role 是一個應用程式角色,隻有在hr.employee PL/SQL 程式包内定

義的子產品才能啟用該角色。

 詳見:10grelease2聯機文檔-&gt;book-&gt;secure-&gt;Security Guide-&gt;13.4

 擷取資訊: 

• DBA_ROLES:資料庫中存在的所有角色

• DBA_ROLE_PRIVS:授予使用者和角色的角色

• ROLE_ROLE_PRIVS:授予角色的角色

• DBA_SYS_PRIVS:授予使用者和角色的系統權限

• ROLE_SYS_PRIVS:授予角色的系統權限

• ROLE_TAB_PRIVS:授予角色的對象權限

• SESSION_ROLES:使用者目前啟用的角色

本文轉自 d185740815 51CTO部落格,原文連結:http://blog.51cto.com/luotaoyang/297613,如需轉載請自行聯系原作者