有關role的一點總結!

warehouse發表於2008-06-27

沒有role完全可以控制許可權的使用,只是不夠靈活和方便而已,那麼角色的作用到底是什麼呢?簡單的歸結為2條:
1)實現批次授權
2)動態控制許可權

[@more@]

1、角色的作用
a)實現批次授權
b)動態控制許可權

2、使role生效或者失效
SQL> create role rl1;

角色已建立。
--可以為role設定password,防止他人隨意設定role
SQL> create role rl2 identified by rl2 ;

角色已建立。

SQL> select * from dba_role_privs where grantee='XYS';

GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
XYS DBA NO YES
XYS RL1 YES YES
XYS RL2 YES YES
--可以動態的設定role使其失效,不過當把帶口令的role設定為none時
不要求輸入password
SQL> set role none;

角色集

SQL> select * from dba_role_privs where grantee='XYS';
select * from dba_role_privs where grantee='XYS'
*
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在


SQL> create table t(id int);
create table t(id int)
*
第 1 行出現錯誤:
ORA-01031: 許可權不足
--===================================

SQL> show user
USER 為 "XYS"
--當把帶口令的role啟用時需要輸入口令
SQL> set role all;
set role all
*
第 1 行出現錯誤:
ORA-01979: 角色 'RL2' 的口令缺失或無效

--all可以和except結合使用,none不能和except結合使用
SQL> set role all except rl2;

角色集

SQL> select * from dba_role_privs where grantee='XYS';

GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
XYS DBA NO YES
XYS RL1 YES YES
XYS RL2 YES YES
--但是all不能和identified by結合使用
SQL> set role all identified by rl2;
set role all identified by rl2
*
第 1 行出現錯誤:
ORA-00933: SQL 命令未正確結束

--不過列舉出來所有role來代替all則可以和identified by結合使用,
需要注意的時儘管沒有為dba,rl1設定password
SQL> set role dba,rl1,rl2 identified by rl2;

角色集
--none不能和except結合使用
SQL> set role none except rl2;
set role none except rl2
*
第 1 行出現錯誤:
ORA-00933: SQL 命令未正確結束

SQL> set role all except rl2;

角色集

SQL> select * from session_roles;

ROLE
------------------------------
DBA
SELECT_CATALOG_ROLE
HS_ADMIN_ROLE
EXECUTE_CATALOG_ROLE
DELETE_CATALOG_ROLE
EXP_FULL_DATABASE
IMP_FULL_DATABASE
GATHER_SYSTEM_STATISTICS
SCHEDULER_ADMIN
WM_ADMIN_ROLE
RL1

ROLE
------------------------------
CONNECT
RESOURCE

已選擇13行。

SQL> set role none;

角色集
--role失效之後,該session就沒有了role所具有的所有許可權,
但是使用者xys透過其他視窗登入oracle時依然具有role的許可權
SQL> select * from session_roles;

未選定行

SQL> show user
USER 為 "XYS"
SQL>
再開一個sqlplus視窗,建立其他session:
因為具有dba role,所以列出來的許可權比較多
C:>sqlplus xys/manager

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 6月 27 14:11:01 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.


連線到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
ALTER SYSTEM
AUDIT SYSTEM
CREATE SESSION
ALTER SESSION
RESTRICTED SESSION
CREATE TABLESPACE
ALTER TABLESPACE
MANAGE TABLESPACE
DROP TABLESPACE
UNLIMITED TABLESPACE
CREATE USER

PRIVILEGE
----------------------------------------
BECOME USER
ALTER USER
DROP USER
CREATE ROLLBACK SEGMENT
ALTER ROLLBACK SEGMENT
DROP ROLLBACK SEGMENT
CREATE TABLE
CREATE ANY TABLE
ALTER ANY TABLE
BACKUP ANY TABLE
DROP ANY TABLE

PRIVILEGE
----------------------------------------
LOCK ANY TABLE
COMMENT ANY TABLE
SELECT ANY TABLE
INSERT ANY TABLE
UPDATE ANY TABLE
DELETE ANY TABLE
CREATE CLUSTER
CREATE ANY CLUSTER
ALTER ANY CLUSTER
DROP ANY CLUSTER
CREATE ANY INDEX

PRIVILEGE
----------------------------------------
ALTER ANY INDEX
DROP ANY INDEX
CREATE SYNONYM
CREATE ANY SYNONYM
DROP ANY SYNONYM
CREATE PUBLIC SYNONYM
DROP PUBLIC SYNONYM
CREATE VIEW
CREATE ANY VIEW
DROP ANY VIEW
CREATE SEQUENCE

PRIVILEGE
----------------------------------------
CREATE ANY SEQUENCE
ALTER ANY SEQUENCE
DROP ANY SEQUENCE
SELECT ANY SEQUENCE
CREATE DATABASE LINK
CREATE PUBLIC DATABASE LINK
DROP PUBLIC DATABASE LINK
CREATE ROLE
DROP ANY ROLE
GRANT ANY ROLE
ALTER ANY ROLE

PRIVILEGE
----------------------------------------
AUDIT ANY
ALTER DATABASE
FORCE TRANSACTION
FORCE ANY TRANSACTION
CREATE PROCEDURE
CREATE ANY PROCEDURE
ALTER ANY PROCEDURE
DROP ANY PROCEDURE
EXECUTE ANY PROCEDURE
CREATE TRIGGER
CREATE ANY TRIGGER

PRIVILEGE
----------------------------------------
ALTER ANY TRIGGER
DROP ANY TRIGGER
CREATE PROFILE
ALTER PROFILE
DROP PROFILE
ALTER RESOURCE COST
ANALYZE ANY
GRANT ANY PRIVILEGE
CREATE MATERIALIZED VIEW
CREATE ANY MATERIALIZED VIEW
ALTER ANY MATERIALIZED VIEW

PRIVILEGE
----------------------------------------
DROP ANY MATERIALIZED VIEW
CREATE ANY DIRECTORY
DROP ANY DIRECTORY
CREATE TYPE
CREATE ANY TYPE
ALTER ANY TYPE
DROP ANY TYPE
EXECUTE ANY TYPE
UNDER ANY TYPE
CREATE LIBRARY
CREATE ANY LIBRARY

PRIVILEGE
----------------------------------------
ALTER ANY LIBRARY
DROP ANY LIBRARY
EXECUTE ANY LIBRARY
CREATE OPERATOR
CREATE ANY OPERATOR
DROP ANY OPERATOR
EXECUTE ANY OPERATOR
CREATE INDEXTYPE
CREATE ANY INDEXTYPE
ALTER ANY INDEXTYPE
DROP ANY INDEXTYPE

PRIVILEGE
----------------------------------------
UNDER ANY VIEW
QUERY REWRITE
GLOBAL QUERY REWRITE
EXECUTE ANY INDEXTYPE
UNDER ANY TABLE
CREATE DIMENSION
CREATE ANY DIMENSION
ALTER ANY DIMENSION
DROP ANY DIMENSION
MANAGE ANY QUEUE
ENQUEUE ANY QUEUE

PRIVILEGE
----------------------------------------
DEQUEUE ANY QUEUE
CREATE ANY CONTEXT
DROP ANY CONTEXT
CREATE ANY OUTLINE
ALTER ANY OUTLINE
DROP ANY OUTLINE
ADMINISTER RESOURCE MANAGER
ADMINISTER DATABASE TRIGGER
MERGE ANY VIEW
ON COMMIT REFRESH
RESUMABLE

PRIVILEGE
----------------------------------------
SELECT ANY DICTIONARY
DEBUG CONNECT SESSION
DEBUG ANY PROCEDURE
FLASHBACK ANY TABLE
GRANT ANY OBJECT PRIVILEGE
CREATE EVALUATION CONTEXT
CREATE ANY EVALUATION CONTEXT
ALTER ANY EVALUATION CONTEXT
DROP ANY EVALUATION CONTEXT
EXECUTE ANY EVALUATION CONTEXT
CREATE RULE SET

PRIVILEGE
----------------------------------------
CREATE ANY RULE SET
ALTER ANY RULE SET
DROP ANY RULE SET
EXECUTE ANY RULE SET
EXPORT FULL DATABASE
IMPORT FULL DATABASE
CREATE RULE
CREATE ANY RULE
ALTER ANY RULE
DROP ANY RULE
EXECUTE ANY RULE

PRIVILEGE
----------------------------------------
ANALYZE ANY DICTIONARY
ADVISOR
CREATE JOB
CREATE ANY JOB
EXECUTE ANY PROGRAM
EXECUTE ANY CLASS
MANAGE SCHEDULER
SELECT ANY TRANSACTION
DROP ANY SQL PROFILE
ALTER ANY SQL PROFILE
ADMINISTER SQL TUNING SET

PRIVILEGE
----------------------------------------
ADMINISTER ANY SQL TUNING SET
CREATE ANY SQL PROFILE
MANAGE FILE GROUP
MANAGE ANY FILE GROUP
READ ANY FILE GROUP
CHANGE NOTIFICATION
CREATE EXTERNAL JOB

已選擇161行。

SQL>
3、使user的role失效或者生效
SQL> show user
USER 為 "XYS"
SQL> create user test identified by test;

使用者已建立。

SQL> grant rl1,rl2 to test;

授權成功。

SQL> select * from dba_role_privs where grantee in ('RL1','RL2');

GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
RL1 CONNECT NO YES
RL1 RESOURCE NO YES

SQL> connect test/test
已連線。
--不能建立表,沒有使用表空間users的許可權,說明unlimited tablespace
沒有隨著resource被授予role RL1而被授予RL1(因為unlimited tablespace不能被授予role)
,為什麼?暫時不知道。當然TEST也沒有unlimited tablespace
許可權
SQL> create table t(id int);
create table t(id int)
*
第 1 行出現錯誤:
ORA-01950: 對錶空間 'USERS' 無許可權


SQL> connect xys/manager
已連線。
--不能把系統許可權unlimited tablespace授予role
SQL> grant unlimited tablespace to rl2;
grant unlimited tablespace to rl2
*
第 1 行出現錯誤:
ORA-01931: 無法將 UNLIMITED TABLESPACE 授予角色


SQL> grant unlimited tablespace to test;

授權成功。

SQL> select * from dba_role_privs where grantee='TEST';

GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
TEST RL1 NO YES
TEST RL2 NO YES

SQL> select * from dba_sys_privs where grantee='TEST';

GRANTEE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
TEST UNLIMITED TABLESPACE NO

SQL> show user
USER 為 "XYS"
SQL> connect test/test
已連線。
SQL> create table t(id int);

表已建立。

SQL> connect xys/manager
已連線。
SQL> alter user test default role none;

使用者已更改。

SQL> connect test/test
ERROR:
ORA-01045: 使用者 TEST 沒有 CREATE SESSION 許可權; 登入被拒絕


警告: 您不再連線到 ORACLE。
SQL> connect xys/manager
已連線。
SQL> select * from dba_role_privs where grantee='TEST';

GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
TEST RL1 NO NO
TEST RL2 NO NO
--此時為什麼不需要輸入rl2的口令?莫非是因為rl2是xys使用者建立的?
其實不是,再來看看alter user xys的default role的效果,發現
透過alter user ...default role...也不需要輸入口令,這裡不知道
是否是orale的漏洞還是這樣設計另有其他目的,不得而知,這樣看來
透過這種方法可以跨過role的password!
SQL> alter user test default role all;

使用者已更改。
SQL> alter user xys default role none;

使用者已更改。

SQL> alter user xys default role all;

使用者已更改。

SQL> set role none;

角色集

SQL> set role all;
set role all
*
第 1 行出現錯誤:
ORA-01979: 角色 'RL2' 的口令缺失或無效

--透過set role all就需要輸入rl2的口令,而透過alter user ...
default role all就不需要輸入口令!
SQL>

SQL> select * from dba_role_privs where grantee='TEST';

GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
TEST RL1 NO YES
TEST RL2
NO YES
--同樣none不能和except結合使用
SQL> alter user test default role none except rl2;
alter user test default role none except rl2
*
第 1 行出現錯誤:
ORA-00922: 選項缺失或無效


SQL> alter user test default role none;

使用者已更改。
--all可以和except結合使用
SQL> alter user test default role all except rl2;

使用者已更改。

SQL> select * from dba_role_privs where grantee='TEST';

GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
TEST RL1 NO YES
TEST RL2 NO NO

SQL>

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

相關文章