使用PRODUCT_USER_PROFILE表增强SQL*Plus的安全性

[复制链接]
查看11 | 回复1 | 2014-2-19 11:55:14 | 显示全部楼层 |阅读模式
作者:NinGoo | 【转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】
地址:http://www.ningoo.net/html/2008/ ... lplus_security.html
在oracle中,我们一般通过授权和角色来控制用户的权限,但是某些情况下,比如想限制以dev开头的所有用户不能在sql*plus中执行alter命令,则通过grant授权的方式无法实现。这里要介绍另外一种能简单的实现上述需求的方式,就是PRODUCT_USER_PROFILE表,通过在该表中插入相应的记录,可以限制某些用户(可以使用通配符)在SQL*Plus中使用某些命令,但这只是SQL*Plus提供的特性,而不是数据库本身的控制,所以在其他连接到数据库的客户端中该限制将不可用。
在oracle9i开始提供该特性,如果创建的数据库中没有默认创建PRODUCT_USER_PROFILE表,也可以通过执行以下脚本手工创建(以system用户):
SYS@ning>conn system/password
SYSTEM@NinGoo>@$ORACLE_HOME/sqlplus/admin/pupbld.sql
SYSTEM@ning>desc product_user_profile
Name
Null?Type
----------------------------------------- -------- ----------------------------
PRODUCT
NOT NULL VARCHAR2(30)
USERID
VARCHAR2(30)
ATTRIBUTE
VARCHAR2(240)
SCOPE
VARCHAR2(240)
NUMERIC_VALUE
NUMBER(15,2)
CHAR_VALUE
VARCHAR2(240)
DATE_VALUE
DATE
LONG_VALUE
LONG
简单介绍一下这个表中的列:
* PRODULE:要限制的命令类型,比如SQL*Plus表示不能SQL*Plus命令如spool,SQL则表示SQL命令如alert,PL/SQL表示PL/SQL命令如BEGIN。不能使用通配符或者NULL。
* USERID:要限制的用户名,可以使用通配符如DEV%
* ATTRIBUTE:要限制的命令,必须是完整的SQL*Plus、SQL或者PL/SQL命令,不能使用通配符。如果是禁用某个角色,则必须为ROLES
* SCOPE:未使用,设为NULL
* NUMERIC_VALUE:未使用,设为NULL
* CHAR_VALUE:如果禁用的是SQL*Plus、SQL或者PL/SQL命令,必须为DISABLED。如果是禁用某个角色,则为角色的名字
* DATE_VALUE:未使用,设为NULL
* LONG_VALUE:未使用,设为NULL
假如我们要限制用户NinGoo不能执行SQL*Plus命令spool,则:
SYSTEM@ning>insert into product_user_profile(product,userid,attribute,char_value)
2values('SQL*Plus','NINGOO','SPOOL','DISABLED');
1 row created.
然后以NinGoo用户登陆执行SPOOL命令,发现报错:
SYSTEM@ning>conn NinGoo/NinGoo
Connected.
NINGOO@ning>spool
SP2-0544: Command "spool" disabled in Product User Profile
假如限制使用test角色:
SYSTEM@ning>create role test;
Role created.
SYSTEM@ning>grant select on ning.test to test;
Grant succeeded.
SYSTEM@ning>insert into product_user_profile(product,userid,attribute,char_value)
2values('SQL*Plus','NINGOO','ROLES','TEST');
1 row created.
这条记录的意思是,用户NinGoo登陆到SQL*Plus时会自动执行以下命令:
set roles all except test;
所以,如果原来没有将角色授予NinGoo,则登陆的时候会报错:
SYSTEM@ning>conn NinGoo/NinGoo
ERROR:
ORA-01919: role 'TEST' does not exist
SP2-0557: Error in disabling roles in product user profile.
Connected.
但是这里由于没有限制用户执行set role命令,所以实际上用户可以通过set role启用该角色
NINGOO@ning>conn system/password
Connected.
SYSTEM@ning>grant test to NinGoo;
Grant succeeded.
SYSTEM@ning>conn NinGoo/NinGoo
Connected.
NINGOO@ning>select * from ning.test;
select * from ning.test

*
ERROR at line 1:
ORA-00942: table or view does not exist
NINGOO@ning>set role test;
Role set.
NINGOO@ning>select * from ning.test;
I
----------
1
要彻底对该用户禁用test角色,则可以在PRODUCT_USER_PROFILE中禁用SET ROLE命令。如果要去除限制,则删除表中相应的记录即可。
可以禁用的SQL*Plus命令:
ACCEPT DEFINE
PASSWORD SHUTDOWN
APPEND DEL
PAUSESPOOL
ARCHIVELOG DESCRIBEPRINTSTART (@, @@)
ATTRIBUTEDISCONNECTPROMPT STARTUP
BREAK
EDIT
RECOVERSTORE
BTITLE EXECUTE REMARK TIMING
CHANGE EXIT/QUIT REPFOOTERTTITLE
CLEAR
GET
REPHEADERUNDEFINE
COLUMN HELP (?)RUN
VARIABLE
COMPUTEHOST
SAVE WHENEVER OSERROR
CONNECTINPUT SET
WHENEVER SQLERROR
COPY LIST (;)SHOW XQUERY
可以禁用的SQL命令:
ALTERDELETE MERGE SET CONSTRAINTS
ANALYZEDISASSOCIATE NOAUDIT SET ROLE
ASSOCIATEDROP
PURGE SET TRANSACTION
AUDITEXPLAIN
RENAMETRUNCATE
CALL FLASHBACKREVOKEUPDATE
COMMENTGRANT
ROLLBACKVALIDATE
COMMIT INSERT SAVEPOINT
CREATE LOCK
SELECT
可以禁用的PL/SQL命令:
BEGIN DECLARE
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
不错,也天天看你博客,写的很好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行