首页 > Linux操作系统 > Linux操作系统 > SQL*PLUS安全(三)
在上面的两篇系列中,我们介绍了如何使用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)的优势,作为一般grant和revoke的补充。
角色基础
首先我们一起来看下关于role的几个基础知识。在使用role的时候,我们通常会使用到三类型命令方式,包括create role、grant/revoke和set role。
ü create role是SQL语句中创建一个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 developer的command 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,是用户没有的。那么会怎么样呢?在上面的实验环境中继续。
//如果将scott的test1权限剔除!
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博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-686955/ ,如需转载,请注明出处,否则将追究法律责任。