Oracle对于权限的划分粒度非常精细,为了方便管理条目众多权限,Oracle引入了角色(role)这个逻辑概念,也在系统中预先设置了很多角色。在实际的应用中,应用用户对于权限的需要可能较为复杂,因此为了方便授权,很多应用用户被授予DBA角色,DBA角色拥有较多的系统权限,这对于数据库的管理是非常不利的,违反了权限最小化的安全原则。出于安全的考虑,系统可能需要回收DBA角色,在回收权限的过程中,为了保证应用正常运行,需要注意一些细节,下文将对几个需要注意的点进行讨论。 实验环境说明(本文中的结论适用于10g~11.2.0.4):
- SQL> select * from v$version;
- BANNER
- --------------------------------------------------------------------------------
- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
- PL/SQL Release 11.2.0.3.0 - Production
- CORE 11.2.0.3.0 Production
- TNS for Linux: Version 11.2.0.3.0 - Production
- NLSRTL Version 11.2.0.3.0 - Production
一、grant/revoke role操作的生效时间 - --创建一个新用户,并授予connect角色
- session 1:
- SQL> create user darren identified by darren;
- User created.
- SQL> grant connect to darren;
- Grant succeeded.
- --使用新用户登录数据库
- session 2:
- SQL> conn darren/darren
- Connected.
- SQL> select * from session_privs;
- PRIVILEGE
- ----------------------------------------
- CREATE SESSION
- SQL> select * from session_roles;
- ROLE
- ------------------------------
- CONNECT
保持session 2不退出,在session 1中授予resource角色 - session 1:
- SQL> grant resource to darren;
- Grant succeeded.
- --session 2中查询用户拥有的系统权限和角色
- SQL> select * from session_privs;
- PRIVILEGE
- ----------------------------------------
- CREATE SESSION
- UNLIMITED TABLESPACE --新增加的系统权限
- SQL> select * from session_roles;
- ROLE
- ------------------------------
- CONNECT
退出session,重新登录用户 - SQL> conn darren/darren
- Connected.
- SQL> select * from session_privs;
- PRIVILEGE
- ----------------------------------------
- CREATE SESSION
- UNLIMITED TABLESPACE
- CREATE TABLE
- CREATE CLUSTER
- CREATE SEQUENCE
- CREATE PROCEDURE
- CREATE TRIGGER
- CREATE TYPE
- CREATE OPERATOR
- CREATE INDEXTYPE
- 10 rows selected.
- SQL> select * from session_roles;
- ROLE
- ------------------------------
- CONNECT
- RESOURCE
结论: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 count(*) from session_privs;
- COUNT(*)
- ----------
- 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角色后单独为用户授予部分系统权限、对象权限。