除了强制要求使用SQL*Plus界面时提供用户名/密码外,Oracle还提供了一个额外的安全机制,该机制涉及一个特殊表product_user_profile的使用。此表的所有者是System用户,它是Oracle数据库的两个超级用户之一。使用product_user_profile表,可以限制访问SQL*Plus和SQL命令,也可以限制访问PL/SQL语句。
当用户登录SQL*Plus会话时,SQL*Plus检査此表査看SQL*Plus会话对此用户有何限制。Oracle如何管理此安全层面稍有些微妙,用户可以拥有数据库插入和删除的权限,但是,由于SQL*Plus的权限高于此权限,因此,Oracle可以拒绝用户使用此权限的操作。
在创建数据库后,应该执行一个特殊的脚本pupbld.sql,此脚本用于支持SQL*Plus的安全性,它位于$ORACLE_HOME/sql/admin目录下,且必须以System用户的身份运行它。此脚本将建立product_user_profile表,它实际上是sqlplus_product_user_profile表的同义词。
DESC product_user_profile
**注解** 在默认情况下,SQL*Plus不对任何用户强加使用限制,因此,当pruduct_user_profile首次创建时,里面没有内容.如果需要在SQL*Plus中限制某些用户的话,System用户必须明确地将限制语句插入到product_user_profile表中.你可以限制一个用户执行以下命令:ALTER、BEGIN,CONNECT.DECLARE.EXEC、EXECUTE、GRANT.HOST、INSERT.SELECT和UPDATE.如果一个用户发布以上命令时你收到错误消息INVALIDCOMMAND,即使product_user_profile表为空,也要以System用户身份运行pupbld.sql脚本,
代码清单4-2说明如何使用product_user_profile表防止用户OE删除、插入或更新数据库中的数据。
INSERT INTO product_user_profile VALUES('SQL*PLUS','OE','INSERT',NULL,NULL,NULL,NULL,NULL);
INSERT INTO product_user_profile VALUES('SQL*PLUS','OE','DELETE',NULL,NULL,NULL,NULL,NULL);
INSERT INTO product_user_profile VALUES('SQL*PLUS','OE','UPDATE',NULL,NULL,NULL,NULL,NULL);
COMMIT;
按以下方式查询 product_user_profile,可看到属于用户OE的项:
SELECT product, attribute FROM product_user_profile WHERE userid='OE';
如果用户OE试图删除表中的数据,即使orders表属于OE模式,结果也将出现以下错误:
SQL> CONNECT oe/oe
SQL> DELETE FROM oe.orders;
SP2-O544: invalid command: delete
如果你想给用户OE授权使其能使用SQL*Plus删除数据,则可以通过删除 product_user_profiie 表的相应行来完成:
DELETE FROM product_user_profiie WHERE userid='OE' and attribute='DELETE';
COMMIT;
ALTER.BEGIN.DECLARE、EXECUTE和GRANT命令是数据定义语言(DDL)和PL/SQL命令。INSERT、SELECT和UPDATE命令是数据操纵语言(DML)的命令。HOST命令在SQL*Plus中是用来访问操作系统并发布操作系统命令的。其实,你并不太愿意让用尸使用简单的HOST命令来发布操作系统命令,因此,如果想拒绝用户salapati使用这个有风险的权限,必须对 product_user_profile 表做以下修改:
INSERT INTO product_user_profile(product,userid,attribute) VALUES('SQL*Plus','salapati','HOST');
恢复权限
DELETE FROM product_user_profile WHERE userid='SALAPATI';
**注解** 请记住,用户将保留授予的任何权限,即使他们不在SQL*Plus会话中使用这些权限也是如此。这意味着,当应用的所有者使用在数据库中存储并执行的程序包和过程时,可以授予他们有关数据对象的权限,而同时,在他们登录SQL*Plus时拒绝他们的这些权限。
**1.****通过****set role****命令控制安全性**
正如所知,用角色来授予和撤销数据库权限的方式优于直接授予权限的方式。但是,角色的使用带来了潜在的安全问题,因为任何用户都可在SQL*Plus中通过简单的SET ROLE命令改变其角色。通过用product_user_profile禁止用户使用set role命令的功能,可以避开这个安全漏洞。
**2.****使用****RESTRICT****命令禁用命令**
另一种防止用户使用某些操作系统命令的方法是使用RESTRICT命令。它的使用效果与使用product_user_profile表相同。除非RESTRICT命令禁用对服务器产生连接的命令,否则其网络效果与使用product_user_profile表的相同,即使不存在服务器连接也是如此。
可在Level1、Level2和Level3三个级别上使用RESTRICT命令。以下例子说明级别1的使用:
**$ sqlplus -RESTRICT 1**
表4.1示出了可使用RESTRICT命令禁用的命令以及3个限制级别之间的区别。
如果你发布RESTRICT -3命令,Oracle不读取login.sql脚本。它读取glogin.sqi脚木,所使用的任何限制命令都不起作用。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




