Oracle对于权限的划分粒度非常精细,为了方便管理条目众多权限,Oracle引入了角色(role)这个逻辑概念,也在系统中预先设置了很多角色。在实际的应用中,应用用户对于权限的需要可能较为复杂,因此为了方便授权,很多应用用户被授予DBA角色,DBA角色拥有较多的系统权限,这对于数据库的管理是非常不利的,违反了权限最小化的安全原则。出于安全的考虑,系统可能需要回收DBA角色,在回收权限的过程中,为了保证应用正常运行,需要注意一些细节,下文将对几个需要注意的点进行讨论。
实验环境说明(本文中的结论适用于10g~11.2.0.4):
一、grant/revoke role操作的生效时间
保持session 2不退出,在session 1中授予resource角色
退出session,重新登录用户
结论:1、UNLIMITED TABLESPACE系统权限会随resource角色授予用户,由于是作为单独的系统权限,因此会立即生效;
2、grant/revoke角色不会立即生效,需要使用set role或者重新登录才生效(直接授予系统权限、对象权限是立即生效)。
二、回收DBA角色时的影响
继续上面的实验,在session 1中授予和回收用户DBA角色,session 2重新登录用户
session 1:
SQL> grant dba to darren;
Grant succeeded.
SQL> revoke dba from darren;
Revoke succeeded.
session 2:
SQL> conn darren/darren
Connected.
SQL> select (*) from session_privs;
(*)
----------
9
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE
SQL> select * from session_privs; --注意,这里没有了UNLIMITED TABLESPACE权限
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
在session 2中创建表并插入数据
SQL> create table test1(a varchar2(20),b varchar2(10)); --这里能创建成功是由于11g的延迟段创建特性,在这里并没有在表空间中实际生成segment
Table created.
SQL> insert into test1 values('a','b');
insert into test1 values('a','b')
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'
结论:1、在回收DBA角色时,UNLIMITED TABLESPACE权限会被回收;
2、回收UNLIMITED TABLESPACE权限后用户的表空间quota立即耗尽,即无法使用tablespace的存储空间。
三、回收DBA权限后的处理
1、由于回收DBA权限后用户的UNLIMITED TABLESPACE系统权限被回收,可以按下列方式之一给用户授权,以便用户能正常使用表空间:
SQL> grant RESOURCE to DARREN;
SQL> alter user DARREN quota unlimited on USERS;
SQL> grant UNLIMITED TABLESPACE to DARREN;
2、如果应用用户有特殊的权限需求,需要在回收DBA角色后单独为用户授予部分系统权限、对象权限。
三、回收DBA权限后的处理
1、由于回收DBA权限后用户的UNLIMITED TABLESPACE系统权限被回收,可以按下列方式之一给用户授权,以便用户能正常使用表空间:
: