共计 2956 个字符,预计需要花费 8 分钟才能阅读完成。
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 角色后单独为用户授予部分系统权限、对象权限。
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-06/132169.htm
正文完
星哥玩云-微信公众号