【許可權】使用O7_DICTIONARY_ACCESSIBILITY引數實現真正的“select any table”授權

secooler發表於2009-10-18
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章