分类: Oracle
2016-01-22 22:29:31
数据库安全是一个内容丰富的体系结构,其中访问控制和操作控制是安全体系的重要内容。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角色权限有很多的细节和使用特性,需要我们重视和使用好。