ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL*Plus安全(一)

SQL*Plus安全(一)

原创 Linux操作系统 作者:realkid4 时间:2011-02-09 21:02:46 0 删除 编辑

 

SQL*Plus是目前Oracle开发、管理人员最常用的开发管理工具。虽然Oracle在10g、11g新版本中,提供了诸多可视化管理工具,来简化Oracle数据库管理和使用,但是SQL*Plus在多种平台上仍占有不可替代的地位。

 

 

安全问题是数据库管理系统的一个重点。对数据进行有效的权限控制管理,是保护数据完整性的一种手段。我们通常熟悉的安全性方法,是借助grant和revoke权限控制语句,将Oracle相关权限附加到某个特定的用户或者角色(用户集合)。我们称这种安全控制附加在用户级别的技术,为user-level security(基于用户安全技术)。

 

 

但是,在某些时候,这种权限控制方式是存在一些漏洞的。比较明显的就是Grant、Revoke和Set Role等命令,这些命令可以动态的将用户数据库访问权限(对象权限、角色权限和系统权限)进行修改。所以,Oracle针对这种问题,提供了程序级别(Product-Level Security)的安全配置,作为User-Level Security的一种补充。

 

 

SQL*PLUS与PUP

 

Product-Level Security技术的基础是基于名为Product_User_Profile(以下简称为PUP)的数据表。这个数据表是在System用户的Schema下,通常随着数据库的创建而一同生成。

 

 

SQL> conn system/system@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

 

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

 

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

 

SQL> desc product_user_profile;

Name          Type          Nullable Default Comments

------------- ------------- -------- ------- --------

PRODUCT       VARCHAR2(30)                           

USERID        VARCHAR2(30)  Y                        

ATTRIBUTE     VARCHAR2(240) Y                        

SCOPE         VARCHAR2(240) Y                        

NUMERIC_VALUE NUMBER(15,2)  Y                        

CHAR_VALUE    VARCHAR2(240) Y                        

DATE_VALUE    DATE          Y                        

LONG_VALUE    LONG          Y                        

 

SQL>

 

 

说明,如果这个数据表不存在,可以手工的执行脚本pupbld.sql,但要注意是使用system用户登录执行。一般这个脚本位置在$ORACLE_HOME/sqlplus/admin目录下。

 

 

PUP的含义就是一组定义规则。定义了某个用户(USERID)在使用某种产品(PRODUCT)的使用,允许执行什么命令和不允许使用什么命令。就SQL*PLUS而言,在用户登录的时候,SQL*PLUS会自动的读取PUP数据表的配置项。

 

注意:这里面有一个技术细节!就是使用配置项的获取点,是在用户login入系统的时候。也就是说如果我们设置了一个新的权限规则,用户只有重新登录入产品才能应用最新的权限规则。

 

 

PUP使用

 

PUP数据表的结构中,每行就是一个规则项目。规定了使用某项产品的时候,某个用户使用的权限。下面是各列的含义和取值(部分参考Oracle官方文档:SQL*PLUS user guide)。

 

PUP列

列信息描述

备注

PRODUCT

必填项目,应用产品的名称。不允许为空;

SQLPLUS使用‘SQL*PLUS’,不支持通配符;

USERID

规则应用的数据库用户ID,来disabled某个用户执行某种操作的能力;

支持使用通配符%;可以为hr、SC%、%;

意味着规则可以对多个用户使用;

必须为大写!

ATTRIBUTE

包括在SQL、PL/SQL和SQL*PLUS中需要禁用的命令。

如果要禁用角色设置功能,则需要加入“ROLES”在字符串中;

SCOPE

无输入,Oracle推荐输入null;

留待其他产品使用;

NUMBERIC_VALUE

无输入,Oracle推荐输入null;

留待其他产品使用;

CHAR_VALUE

如果采用禁用SQL、SQLPLUS和PLSQL命令的方式,输入“DISABLED”;

如果要禁用角色设置功能,必须包括要禁用的角色名称;

DATE_VALUE

无输入,Oracle推荐输入null;

留待其他产品使用;

LONG_VALUE

无输入,Oracle推荐输入null;

留待其他产品使用;

 

 

 

 

从数据列的解析上看,Oracle是希望将PUP作为一个安全体系来进行推广,构建所谓的“Product-Level Security”。虽然目前使用的主要是SQL*PLUS,但以后存在拓展的空间。

 

PUP数据表是在SYSTEM用户下,SYSTEM用户具有全部权限。其他用户只有select权限。这样可以尽可能的保护配置项目安全。

 

下面,我们进行一系列的配置实验。配置PUP的过程是比较简单的,使用简单的insert语句就可以将配置规则插入到其中,不过记住一定是使用system用户登录。

 

//使用system登录

SQL> conn system/system@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

//向数据表中插入数据

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

  2  values ('SQL*PLUS','%','INSERT','DISABLED');

 

1 row inserted

 

SQL> commit; //建立一条规则

……(篇幅原因,略)

 

SQL> col attribute format a10;

SQL> col product format a10;

SQL> col userid format a10;

SQL> col char_value format a10;

SQL> select product,userid,attribute,char_value from product_user_profile;

 

PRODUCT    USERID     ATTRIBUTE  CHAR_VALUE

---------- ---------- ---------- ----------

SQL*PLUS   %          INSERT     DISABLED

SQL*PLUS   %          UPDATE     DISABLED

SQL*PLUS   %          DELETE     DISABLED

SQL*PLUS   SCOTT      HOST       DISABLED

 

 

上面脚本定义了一个规则集合。简要的说,就是所有的用户在使用SQL*PLUS的时候,不能使用insert、update和delete类型的dml语句。用户scott,不允许使用sqlplus命令host(host命令的作用就是在sqlplus中调用操作系统命令行方法)。通配符%表示使用所有用户。下面进行试验:

 

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 2月 9 20:29:44 2011

 

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

 

SQL> conn hr/hr@orcl;

已连接。

SQL> select count(*) from jobs;  //Select命令没有禁止

 

  COUNT(*)

----------

        19

 

SQL> delete from jobs;

SP2-0544: 在产品用户概要文件中禁用命令 "delete"  //报错禁止!

SQL> insert into region values(10,'dkk');

SP2-0544: 在产品用户概要文件中禁用命令 "insert"  //报错禁止!

SQL> update employees set first_name=null;

SP2-0544: 在产品用户概要文件中禁用命令 "update"  //报错禁止!

SQL>

 

SQL> host notepad  //OS命令行工具,可以使用!

 

 

现在我们转换用户为scott。

 

SQL> conn scott/tiger@orcl

已连接。

SQL> delete from emp;      

SP2-0544: 在产品用户概要文件中禁用命令 "delete"  //作为%用户的一员,被禁用!

SQL> host calc

SP2-0544: 在产品用户概要文件中禁用命令 "host"   //针对scott用户的设置,被禁用!

SQL>

 

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

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

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7690599