Chinaunix首页 | 论坛 | 博客
  • 博客访问: 144097
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 224
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-28 01:08
文章分类
文章存档

2020年(1)

2019年(1)

2017年(1)

2016年(18)

2015年(32)

我的朋友

分类: Oracle

2016-01-22 22:29:31

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

 

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

 

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

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

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

 

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

 

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

 

我们选择在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做了一点手脚。ResourceUnlimited Tablespace是可以同时设置和回收的。但是,通过revoke命令,我们是可以单独将Unlimited tablespace进行剔除的。

 

3、结论

 

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

阅读(1245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~