ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【权限】使用O7_DICTIONARY_ACCESSIBILITY参数实现真正的“select any table”授权

【权限】使用O7_DICTIONARY_ACCESSIBILITY参数实现真正的“select any table”授权

原创 Linux操作系统 作者:secooler 时间:2009-10-18 21:26:39 0 删除 编辑
Oracle 8之前的数据库,具有“select any table”权限的用户可以查询数据字典。因为这样会存在安全隐患,所以,在Oracle 8及以后的版本中,Oracle引入了这个O7_DICTIONARY_ACCESSIBILITY参数。该参数的默认值是FALSE,表示用户即使被授予“select any table”权限也不允许查询SYS用户下的数据字典,及不是真正的“select any table”权限。

下面我来演示一下这个参数在10g数据库中生效方法和效力。这里仅仅是演示而已,您没有必要在自己的系统中做这样的调整,Oracle之所以引入这个参数目的也只是向前(Oracle 7)兼容而已,可以说,Oracle已经放弃了原有“select any table”权限含义,Oracle的权限控制向更深更细的道路发展。

1.先来看看在10gR2环境中这个参数的默认内容和注释信息
1)Oracle版本信息
sys@ora10g> select * from v$version where rownum<2;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi

2)使用show parameter命令查看参数内容
sys@ora10g> show parameter O7_DICTIONARY_ACCESSIBILITY

NAME                         TYPE      VALUE
---------------------------- --------- -------------------
O7_DICTIONARY_ACCESSIBILITY  boolean   FALSE

3)使用比较高级的方法查看一下这个参数在数据库中的注释信息,注释中已经说明,这个参数在Oracle 7版本中使用
sys@ora10g> select a.ksppinm name,b.ksppstvl value,a.ksppdesc description
  2    from x$ksppi a,x$ksppcv b
  3   where a.indx = b.indx
  4     and a.ksppinm = 'O7_DICTIONARY_ACCESSIBILITY'
  5  /

NAME                        VALUE  DESCRIPTION
--------------------------- ------ -------------------------------------------
O7_DICTIONARY_ACCESSIBILITY FALSE  Version 7 Dictionary Accessibility Support


2.我们首先将“select any table”权限授予普通用户sec,在sec用户下尝试查询SYS用户下的V$SESSION视图
sec@ora10g> conn / as sysdba
Connected.
sys@ora10g> grant select any table to sec;

Grant succeeded.

sys@ora10g> conn sec/sec
Connected.
sec@ora10g> select * from v$session;
select * from v$session
              *
ERROR at line 1:
ORA-00942: table or view does not exist

sec@ora10g> select count(*) from sys.v_$session;
select count(*) from sys.v_$session
                         *
ERROR at line 1:
ORA-00942: table or view does not exist

结果是显然的,在O7_DICTIONARY_ACCESSIBILITY参数为“FALSE”的情况下,sec用户即使有了“select any table”权限,也无法得到SYS用户中数据字典信息。

3.我们尝试将O7_DICTIONARY_ACCESSIBILITY参数修改为“TRUE”后,再尝试一次
1)第一次尝试,参数修改失败,原因是该参数被限制为不可轻易的被修改,即该参数是一个静态参数。需要使用停启数据库的方式(下面将使用spfile修改方式,当然,也可以使用pfile修改的方式)进行修改。
sys@ora10g> alter system set O7_DICTIONARY_ACCESSIBILITY=true;
alter system set O7_DICTIONARY_ACCESSIBILITY=true
                 *
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified

2)使用spfile修改方式对O7_DICTIONARY_ACCESSIBILITY参数进行修改,修改后重新启动数据库使之生效(真实生产环境中启停数据库的代价是非常高的)
sys@ora10g> alter system set O7_DICTIONARY_ACCESSIBILITY=true scope = spfile;

System altered.

sys@ora10g> startup force;
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size                  2074152 bytes
Variable Size             637536728 bytes
Database Buffers         1493172224 bytes
Redo Buffers               14700544 bytes
Database mounted.
Database opened.

3)确认一下O7_DICTIONARY_ACCESSIBILITY是否真正的被修改为“TRUE”
sys@ora10g> show parameter O7_DICTIONARY_ACCESSIBILITY

NAME                         TYPE      VALUE
---------------------------- --------- ---------
O7_DICTIONARY_ACCESSIBILITY  boolean   TRUE

4)在确认参数修改成功之后,再次在sec用户中尝试查询v$session视图。没有问题,这次在O7_DICTIONARY_ACCESSIBILITY参数的作用下,sec用户的权限被放大了,已经可以查看“任何表”了。
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> select count(*) from v$session;

  COUNT(*)
----------
        19

sec@ora10g> select count(*) from sys.v_$session;

  COUNT(*)
----------
        20

4.Oracle 10gR2官方文档中关于
O7_DICTIONARY_ACCESSIBILITY参数的解释,供参考

O7_DICTIONARY_ACCESSIBILITY

Property Description
Parameter type Boolean
Default value false
Modifiable No
Range of values true | false

O7_DICTIONARY_ACCESSIBILITY controls restrictions on SYSTEM privileges. If the parameter is set to true, access to objects in the SYS schema is allowed (Oracle7 behavior). The default setting of false ensures that system privileges that allow access to objects in "any schema" do not allow access to objects in the SYS schema.

For example, if O7_DICTIONARY_ACCESSIBILITY is set to false, then the SELECT ANY TABLE privilege allows access to views or tables in any schema except the SYS schema (data dictionary tables cannot be accessed). The system privilege EXECUTE ANY PROCEDURE allows access on the procedures in any schema except the SYS schema.

If this parameter is set to false and you need to access objects in the SYS schema, then you must be granted explicit object privileges. The following roles, which can be granted to the database administrator, also allow access to dictionary objects:
  • SELECT_CATALOG_ROLE

  • EXECUTE_CATALOG_ROLE

  • DELETE_CATALOG_ROLE


5.小结

这个实验虽然探讨了一个在目前的数据库中可能永远也不会用到的一个参数。不过从这里我们可以看出,Oracle在权限控制方面是积极进取并与时俱进的,这样既提高了权限管理的严密性,也防止了审计漏洞。

-- The End --

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

请登录后发表评论 登录
全部评论
Oracle ACE 总监,阿里云MVP,北京大学理学硕士,恩墨学院创始人,教育专家,中国区 Cloudera 首位官方授权大数据讲师,金牌培训专家,BDA大数据联盟创始人,OCM联盟创始人,ACCUG创始人、ACOUG核心专家,Blogger。

注册时间:2008-03-16

  • 博文量
    797
  • 访问量
    7975142