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角色后单独为用户授予部分系统权限、对象权限。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29821678/viewspace-2112970/
,如需转载,请注明出处,否则将追究法律责任。