【許可權】使用O7_DICTIONARY_ACCESSIBILITY引數實現真正的“select any table”授權
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 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:
5.小結
這個實驗雖然探討了一個在目前的資料庫中可能永遠也不會用到的一個引數。不過從這裡我們可以看出,Oracle在許可權控制方面是積極進取並與時俱進的,這樣既提高了許可權管理的嚴密性,也防止了審計漏洞。
-- The End --
下面我來演示一下這個引數在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 |
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 授權|取消授權MYSQL資料庫使用者許可權MySql資料庫
- 阿里雲RDS的高許可權不是真正的高許可權阿里
- django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解Django框架
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- canal mysql select許可權粒度MySql
- 授權許可權服務設計解析
- [WCF許可權控制]透過擴充套件自行實現服務授權套件
- 許可權管理之多租戶隔離授權
- 為什麼許可權授權很難?- osohq
- 1.7.6. 授權和撤銷管理許可權
- Laravel實現許可權控制Laravel
- 使用動態路由實現許可權管理路由
- 鴻蒙Next許可權申請全攻略:系統授權與使用者授權之道鴻蒙
- MongoDB建立只讀使用者並授權指定集合的查詢許可權MongoDB
- 『學了就忘』Linux許可權管理 — 54、sudo授權Linux
- 許可權之選單許可權
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- Shiro實現使用者授權
- Hyperf 使用 hyperf-permission 元件實現許可權管理元件
- 從0實現RBAC許可權模型模型
- Vue許可權路由實現總結Vue路由
- 基於RBAC實現許可權管理
- 認證鑑權與API許可權控制在微服務架構中的設計與實現:授權碼模式API微服務架構模式
- 許可權系統:一文搞懂功能許可權、資料許可權
- SpringSecurity許可權管理系統實戰—九、資料許可權的配置SpringGse
- SpringBoot(一) 如何實現AOP的許可權控制Spring Boot
- 前端許可權控制系統的實現思路前端
- 微服務中如何設計一個許可權授權服務微服務
- Spring security(五)-完美許可權管理系統(授權過程分析)Spring
- Linux的檔案存取許可權和0644許可權Linux
- Keycloak中授權的實現
- SpringBoot整合SpringSecurityOauth2實現鑑權-動態許可權Spring BootGseOAuth
- 使用OPA實現Spring安全授權 | baeldungSpring
- 【自然框架】許可權的視訊演示(二):許可權到欄位、許可權到記錄框架
- vue許可權路由實現方式總結Vue路由
- 報表如何透過引數控制資料許可權
- Laravel 授權系統 - 自定義引數Laravel
- linux使用者許可權Linux
- [BUG反饋]許可權管理 -> 訪問授權 點選後報錯