ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL*PLUS安全(三)

SQL*PLUS安全(三)

原创 Linux操作系统 作者:realkid4 时间:2011-02-10 13:05:58 0 删除 编辑

 

在上面的两篇系列中,我们介绍了如何使用PUP数据表禁用SQL*PLUS命令。禁用的范围包括SQL语句、SQL*PLUS命令和PL/SQL命令。在本篇里,我们介绍一下PUP的另一种用途,角色ROLE剔除。

 

角色Role是我们基于角色权限控制的一个重要部分。简单的说,就是在用户和诸多复杂的权限之间建立一个role层。基于业务管理需要,为role设置相应的权限集合,之后将role附加给特定的用户(或者多个用户)。这种方式,极大便利的管理,同时建立了与业务场景很好的映射关系。

 

PUP提供的对role的控制,主要体现在这样的需求:一个用户user具有某种角色role。但是sql*plus登录的时候,不允许使用这个角色role的权限。也就是说,当这个用户使用sqlplus的时候,不能使用这个角色权限登录。但是,他在其他产品中,是可以使用这个权限的。

 

这种时候,就可以体现出产品级别安全(product-level security)的优势,作为一般grantrevoke的补充。

 

角色基础

 

首先我们一起来看下关于role的几个基础知识。在使用role的时候,我们通常会使用到三类型命令方式,包括create rolegrant/revokeset role

 

ü         create roleSQL语句中创建一个role的作用。默认情况下,我们创建的role只是一个集合代名词。从sql语法中,我们是可以创建出带密码的role

ü         grant/roke命令,就是将create出的角色赋给特定的用户(或角色);

ü         set role是一个sql*plus上使用的命令。当一个role已经grant给用户,但是由于某些原因,用户是可以动态使用set role命令重新设置上角色的;

 

 

PUP与角色

 

首先我们构建实验环境。

 

SQL> conn sys/acca@otstest as sysdba; //使用dba创建角色test1

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

 

SQL> create role test1;

 

Role created

 

SQL> grant select on dba_objects to test1; //为角色授权,可以访问dba_objects视图对象;

 

Grant succeeded

 

SQL> grant test1 to scott; //授权给scott用户

 

Grant succeeded

 

 

配置PUP规则,要求scott用户登录使用sqlplus的时候,不能使用test1角色。

 

 

SQL> select * from product_user_profile;

……(无数据行)

//设置PUP规则项目;

SQL> insert into product_user_profile (product,userid,attribute,char_value)

  2  values ('SQL*PLUS','SCOTT','ROLES','TEST1');

 

1 row inserted

 

SQL> commit;

 

Commit complete

 

 

请注意PUP取值配置项。当使用role剔除的时候,要将attribute设置为字符串“ROLES”,char_value不再是书写“DISABLED”,而是希望剔除的角色。上面的配置规则,含义是:对SCOTT用户,在使用SQLPLUS的时候,要剔除其上的TEST1角色权限。

 

下面我们来看效果,首先看在非SQL*PLUS环境下,选择pl/sql developercommand windows

 

 

SQL> conn scott/tiger@otstest;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

 

SQL> select count(*) from dba_objects; //明显是test1权限作用;

 

  COUNT(*)

----------

     53294

 

 

当我们使用Sql*plus产品的时候。

 

//sqlplus界面上

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2 10 11:24:48 2011

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

SQL> conn scott/tiger@otstest; //登录,应用规则

已连接。

SQL> select count(*) from dba_objects;

select count(*) from dba_objects

                     *

1 行出现错误:

ORA-00942: 表或视图不存在 //SCOTT身上的TEST1角色被剔除!

 

SQL> set role test1;  //手工应用角色test1,成功

 

角色集

 

SQL> select count(*) from dba_objects; //Test1重新回到了Scott身上。

 

  COUNT(*)

----------

     53294

 

SQL>

 

 

上面的例子,给我们下面的结论:

 

首先,使用roles剔除功能后。当用户登录产品时,sqlplus会自动将剔除的roles从用户身上剔除掉(限制在当前的session中,并不是真正影响用户的角色配置,只是不许使用);

 

其次,当用户登录后,如果尝试使用被剔除角色的权限,会报错。

 

最后,也是roles剔除的一个漏洞。在登录过程中,如果用户使用set role语句,是可以恢复这个角色的。这样,PUP的意义也就失去了。

 

那么,怎么样应对set role的问题呢?同样是使用PUP技术,需要对用户的set role命令进行禁用。也就是设置规则,禁止用户在sqlplus中使用set role命令。

 

 

//要禁止set role的使用

 

SQL> insert into product_user_profile (product,userid,attribute,char_value)

  2  values ('SQL*PLUS','SCOTT','SET ROLE','DISABLED');

 

1 row inserted

 

SQL> commit;

 

Commit complete

 

SQL> select * from product_user_profile;

 

PRODUCT                        USERID                         ATTRIBUTE                                                                        SCOPE                                                                                NUMERIC_VALUE CHAR_VALUE                                                                       ------------------------------ ------------------------------ --------------------------------------------------------------------------------

SQL*PLUS                       SCOTT      ROLES  TEST1                                                             

SQL*PLUS                       SCOTT      SET ROLE   DISABLED          

 

//切换回sqlplus窗口

 

SQL> conn scott/tiger@otstest;

已连接。

SQL> select count(*) from dba_objects;

select count(*) from dba_objects

                     *

1 行出现错误:

ORA-00942: 表或视图不存在

 

SQL> set role test1;

SP2-0544: 在产品用户概要文件中禁用命令 "set role" //这样set role的漏洞就别弥补!

SQL>

 

 

 

 

最后,我们研究两个细节。

 

首先,如果我们剔除的role,是用户没有的。那么会怎么样呢?在上面的实验环境中继续。

 

//如果将scotttest1权限剔除!

SQL> conn sys/acca@otstest as sysdba;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

 

SQL> revoke test1 from scott;

 

Revoke succeeded

 

 

此时,回到sqlplus窗口中,Scott用户在登录时报错。

 

--登录时报错

SQL> conn scott/tiger@otstest;

ERROR:

ORA-01919: 角色 'TEST1' 不存在

 

SP2-0557: 禁用产品用户配置文件中的角色时出现错误。

已连接。

SQL>

 

 

第二个细节,就是role如果是设置有密码,那么在set role的时候,会发生什么呢?

 

//密码角色设置

SQL> conn system/acca@otstest;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

 

SQL> delete product_user_profile where attribute='SET ROLE'; //先允许scott进行set role操作

1 row deleted

 

SQL> commit;

 

Commit complete

 

SQL> create role test1  identified by test1; //密码为test1

 

Role created

 

SQL> grant select on dba_objects to test1;

 

Grant succeeded

 

SQL> grant test1 to scott;

 

Grant succeeded

 

 

回到sqlplus上。

 

--尝试登录

SQL> conn scott/tiger@otstest;

已连接。

SQL> select count(*) from dba_objects;

select count(*) from dba_objects  //角色test1被剔除

                     *

1 行出现错误:

ORA-00942: 表或视图不存在

 

 

SQL> set role test1;  //SET ROLE需要输入密码

set role test1

*

1 行出现错误:

ORA-01979: 角色 'TEST1' 的口令缺失或无效

 

 

SQL> set role test1 identified by test1; //转换格式,输入密码test1

 

角色集

 

SQL> select count(*) from dba_objects; //角色应用上!

 

  COUNT(*)

----------

     53294

 

 

 

结论:角色role基于不同产品的切换应用,有时候是比较常见的。借助PUP,我们可以方便的实现这种需求。但是要注意一点,如果设置角色剔除PUP,一定将SET ROLE命令一并禁用,不要保留这种安全漏洞!

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-686955/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7744312