数据库安全是一个内容丰富的体系结构,其中访问控制和操作控制是安全体系的重要内容。Oracle数据库作为目前最成熟的商用数据库产品,其安全访问体系是行业界普遍接受的标准。

Oracle数据库权限体系是一个典型的“许可性权限”,也就是权限单元的含义都是附加许可性的。Oracle从来就是规定某某用户(角色)可以做什么(System Privilege)或者对什么对象做什么(Object Privilege)。Oracle权限体系包括三层组织单元:

ü  系统权限(System Privilege):规定了用户(角色)可以做什么;

ü  对象权限(Object Privilege):规定了用户(角色)可以对某个特定对象做什么;

ü  角色权限(Role Privilege):是三种权限的集合体,在不出现循环结构的情况下,可以进行组合嵌套;

三层权限操作体系构成了Oracle访问控制的基石。下面对一些细节进行试验,做出简单的分析。

1、Role权限的“非即时”设置

我们选择在Oracle 10g上进行试验。

SQL> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE        10.2.0.1.0         Production

角色role的设置并不是即时的。只有在用户重新登录或者手工的设置上角色(set role xxx)的时候,才能让一个用户新加入的角色进行生效。我们首先进行一个全新用户的创建。

SQL> create user tim identified by tim;

User created

--授予一个基本的连接权限

SQL> grant connect to tim;

Grant succeeded

使用新用户权限进行登录。

SQL> conn tim/tim@orcl

已连接。

--没有创建数据表相关权限;

SQL> create table t(id number);

create table t(id number)

*

第 1 行出现错误:

ORA-01031: 权限不足

--查看当前会话用户具有的角色权限;

SQL> select * from session_roles;

ROLE

------------------------------

CONNECT

--查看当前用户具有的系统权限(包括角色权限附加的内容。)

SQL> select * from session_privs;

PRIVILEGE

--------------------------------------

CREATE SESSION

SQL> select * from role_sys_privs where role='CONNECT';

ROLE                           PRIVILEGE                                ADMIN_OPTION

------------------------------ ---------------------------------------- ------------

CONNECT                        CREATE SESSION                           NO

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

GRANTEE                        GRANTED_ROLE                   ADMIN_OPTION DEFAULT_ROLE

------------------------------ ------------------------------ ------------ ------------

TIM                            CONNECT                        NO           YES

角色权限connect只包括一个系统权限create session。

下面,我们尝试去授予TIM resource操作权限。注意,此时的TIM用户保持会话连接。

SQL> grant resource to tim;

Grant succeeded

此时,保持连接的TIM用户权限体系如何呢?

SQL> select * from session_roles;

ROLE

------------------------------

CONNECT

SQL> select * from session_privs;

PRIVILEGE

----------------------------------------

CREATE SESSION

UNLIMITED TABLESPACE

SQL> create table t(id number);

create table t(id number)

*

第 1 行出现错误:

ORA-01031: 权限不足

角色权限是没有出现在列表中,但是经常和resource伴随的一个UNLIMITED TABLESPACE却出现在列表中。同时,我们依然不能创建数据表。说明:在授予role权限之后,用户会话不能主动的获取到权限信息,需要重新登录和set role强制方法。

SQL> set role resource;

角色集

SQL> select * from session_privs;

PRIVILEGE

----------------------------------------

UNLIMITED TABLESPACE

CREATE TABLE

CREATE CLUSTER

CREATE SEQUENCE

CREATE PROCEDURE

CREATE TRIGGER

CREATE TYPE

CREATE OPERATOR

CREATE INDEXTYPE

已选择9行。

SQL> select * from session_roles;

ROLE

------------------------------

RESOURCE

SQL> create table t(id number);

表已创建。

我们可以看到几个现象,通过set role命令,我们的确可以实现将最新设置的角色“启用”给用户。但是,这样做也会将原有的角色替换掉(CONNECT角色消失)。

当TIM重新登录之后,一切恢复正常。

SQL> conn tim/tim@orcl

已连接。

SQL> select * from session_roles;

ROLE

------------------------------

CONNECT

RESOURCE

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行。

刚刚,我们发现了一个奇怪的unlimited tablespace权限,与resource相关。下面,我们就一起来讨论这个权限的内容。

2、从角色权限“分裂”谈起

注意观察的朋友可能都知道,当我们将用户授予resource权限之后,unlimited tablespace权限是附加在用户的权限列表中的。看似是resource中包括了unlimited tablespace,才使得用户具有这个权限。但是,下面的试验证明其中的不同。

我们对TIM用户权限进行操作。

SQL> revoke unlimited tablespace from tim;

Revoke succeeded

SQL> revoke create table from tim;

revoke create table from tim

ORA-01952: 系统权限未授予 'TIM'

SQL> revoke create type from tim;

revoke create type from tim

ORA-01952: 系统权限未授予 'TIM'

看出差异所在了吗?从角色resource中带出的系统权限中,只有unlimited tablespace是可以被收回权限的。

此时,Tim登录的权限情况如下:

SQL> select * from session_privs;

PRIVILEGE

----------------------------------------

CREATE SESSION

CREATE TABLE

CREATE CLUSTER

CREATE SEQUENCE

CREATE PROCEDURE

CREATE TRIGGER

CREATE TYPE

CREATE OPERATOR

CREATE INDEXTYPE

已选择9行。

SQL> select * from session_roles;

ROLE

------------------------------

CONNECT

RESOURCE

两个细节,Unlimited Tablespace的确被剔除了,同时Resource角色权限Oracle同样承认。

我们检查权限视图,可以证明这点。

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

GRANTEE                        GRANTED_ROLE                   ADMIN_OPTION DEFAULT_ROLE

------------------------------ ------------------------------ ------------ ------------

TIM                            RESOURCE                       NO           YES

TIM                            CONNECT                        NO           YES

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

GRANTEE                        PRIVILEGE                                ADMIN_OPTION

------------------------------ ---------------------------------------- ------------

RESOURCE                       CREATE TRIGGER                           NO

RESOURCE                       CREATE SEQUENCE                          NO

RESOURCE                       CREATE TYPE                              NO

RESOURCE                       CREATE PROCEDURE                         NO

RESOURCE                       CREATE CLUSTER                           NO

RESOURCE                       CREATE OPERATOR                          NO

RESOURCE                       CREATE INDEXTYPE                         NO

RESOURCE                       CREATE TABLE                             NO

8 rows selected

这个现象是什么原因呢?我们重新创建一个新用户进行试验。

SQL> create user mt identified by mt;

User created

SQL> grant resource, connect to mt;

Grant succeeded

SQL> conn mt/mt@orcl

已连接。

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行。

SQL> select * from session_roles;

ROLE

------------------------------

CONNECT

RESOURCE

--此时,剔除权限;

SQL> revoke resource from mt;

Revoke succeeded

此时,用户MT重新登录后。

SQL> conn mt/mt@orcl;

已连接。

SQL> select * from session_roles;

ROLE

------------------------------

CONNECT

SQL> select * from session_privs;

PRIVILEGE

----------------------------------------

CREATE SESSION

Unlimited Tablespace权限也跟着连带剔除掉了。那么,这个权限是怎么回事呢?

SQL> select * from dba_sys_privs where grantee='MT' or grantee='RESOURCE';

GRANTEE                        PRIVILEGE                                ADMIN_OPTION

------------------------------ ---------------------------------------- ------------

RESOURCE                       CREATE SEQUENCE                          NO

RESOURCE                       CREATE TRIGGER                           NO

RESOURCE                       CREATE CLUSTER                           NO

RESOURCE                       CREATE PROCEDURE                         NO

RESOURCE                       CREATE TYPE                              NO

MT                             UNLIMITED TABLESPACE                     NO

RESOURCE                       CREATE OPERATOR                          NO

RESOURCE                       CREATE TABLE                             NO

RESOURCE                       CREATE INDEXTYPE                         NO

9 rows selected

从上面的视图里面,我们发现几个问题:

首先,Resource角色集合中,根本就没有包括Unlimited Tablespace系统权限。其次,Unlimited Tablespace是直接赋予给MT用户的。

说明:我们在将resource角色权限赋予给用户的时候,Oracle“偷偷”将这个系统权限Unlimited Tablespace赋予给了用户MT。如果我们收回这个角色权限,Unlimited Tablespace也会“连带”的被取回。两个权限是存在分离的可能的。

问题最后我们想一下:为什么?

笔者猜想:Oracle在这里面对一个两难的局面。角色Resource的原始目的是希望进行一般的数据对象操作和创建的权限。但是,在创建对象中,空间资源Tablespace是不可分开的资源。没有配额的Create Table权限是没有任何意义的。所以,一种直观的做法就是将Unlimited Tablespace授予给Resource角色。

但是,另一方面这样也有问题。在生产环境下,空间使用,特别是每个用户的空间使用都是有严格的管理的。Unlimited Tablespace在空间使用上的权限太大,限制通用化有没有什么很好的方法。在正式生产环境下,用户空间使用一定是通过配额而不是这个系统权限来设置的。

这就遇到两难。如果将这个Unlimited Tablespace放在Resource中,生产环境都不会使用到Resource这个角色了。

这里,Oracle做了一点手脚。Resource和Unlimited Tablespace是可以同时设置和回收的。但是,通过revoke命令,我们是可以单独将Unlimited tablespace进行剔除的。

3、结论

Oracle角色权限有很多的细节和使用特性,需要我们重视和使用好。

角色权限(Role)和系统权限(System)的几个澄清实验相关推荐

  1. Oracle 原理:用户和权限,Profile,系统权限,对象权限,角色

    目录 1.用户的创建 2.用 Profile(概要文件) 管理用户: 3.系统权限 4.对象权限 5.角色管理 -------------------------------------------- ...

  2. oracle角色(role)和权限(privilege)

    0 创建测试用户 create user soctt identified by 11; grant dba to scott;create user one identified by 11; 1 ...

  3. android卸载应用权限管理,使用系统权限静默卸载应用程序

    我的应用有系统权限. 它将在固件内部,现在它位于/ system / app 我能用这篇文章静静地安装应用程序 以编程方式安装/卸载APK(PackageManager vs Intents) 有用的 ...

  4. 系统权限oracle,oracle系统权限

    通过数据字典system_privilege_map来查看所有的oracle系统内置的权限 通过dba_sys_privs来查看用户被赋予的系统权限 在赋予权限的时候可以通过grant privile ...

  5. android版本相机权限,Android 11系统权限收紧,第三方APP仅支持调用原生相机

    Android 和 iOS 本质上的区别在于系统的开源程度,与 iOS 的封闭不同,Android 系统一直都保持着比较开放的环境,给开发者带来了便捷的开发体验,而这也是 Android 系统最大的优 ...

  6. Sys和system用户、sysdba 和sysoper系统权限、dba角色的区别

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  Ø      ...

  7. Oracle的对象权限、角色权限、系统权限

    Oracle的对象权限.角色权限.系统权限 一.用户与模式 用户:对数据库的访问,需要以适当用户身份通过验证,并具有相关权限来完成一系列动作 SYS用户,缺省始终创建,且未被锁定,拥有数据字典及其关联 ...

  8. Oracle中的系统权限管理

    在实际的IT项目管理中,对数据库的管理显得尤为重要,一般情况下,数据库的管理工作会有公司中的DBA人员来负责.但是,不是任何有关数据库的操作都要去联系DBA啦,万一人家不在或有其它事情不能立即处理时该 ...

  9. activexobject对象不能创建_Oracle数据库用户管理之系统权限和对象权限

    [关键术语] Privileges 权限 System privileges 系统权限 Object privileges 对象权限 Grant 授予 Revoke 撤消 2.1 Oracle 权限概 ...

  10. oracle表空间配额(quota)与UNLIMITED TABLESPACE系统权限

    --先大概写一下,后面有时间会整理一下 一:quota相关视图 1)dba_ts_quotas(查看所有用户的表空间配额) BYTES字段表示用户已经使用的空间:MAX_BYTES如果为-1表示没有限 ...

最新文章

  1. 《SVG精髓》笔记(二)
  2. JS 简单实现公告消息自动逐条切换
  3. 中兴存储服务器 操作系统,中兴新支点服务器操作系统:企业级的国内服务器操作系统...
  4. hutool读取和导出excel_Java编程第44讲——非常好用的hutool工具介绍
  5. 如何判断Customer和Administor
  6. setname_Python线程类| setName()方法与示例
  7. MySQL 条件查询
  8. 复选框 ComboBox 1129
  9. mysql怎么显示创表的语句_141张图带你 MySQL 入门
  10. python文件操作笔记
  11. 高通平台Bring-up
  12. 怎样开图纸便宜_在县城开一家儿童乐园怎么样?开多大面积合适?投资需要多少钱?...
  13. 合数阶群与素数阶群的双线性映射
  14. Qt信号与槽机制原理及优缺点
  15. 最细致全面架设单机传奇教程
  16. ask调制流程图_利用卷积神经网络的自动调制分类算法
  17. V831基础-UART
  18. java中是什么意思_java中什么意思?
  19. Android基础之十八显示gif动画,动态图片
  20. 腾讯蚂蚁字节美团后台实习面经

热门文章

  1. 面试官问我 StringBuilder 线程不安全的点在哪儿.....
  2. 蚂蚁开源增强版 SpringBoot,都有哪些骚能力?
  3. 加强版Redis,又一款国产高性能KV存储数据库开源了!
  4. Springboot + redis + 注解 + 拦截器来实现接口幂等性校验
  5. 哈哈哈,这个教人写烂代码的项目在 GitHub 上火了...
  6. Mybatis的工作原理,你了解过吗?
  7. 【特征提取+分类模型】4种常见的NLP实践思路
  8. Coding-数组(Array)
  9. 【pandas学习笔记】Series
  10. 有人从英伟达借了台DGX A100,让神经网络自己造了个GTA5自己玩