SQL*PLUS安全(三)
在上面的兩篇系列中,我們介紹瞭如何使用PUP資料表禁用SQL*PLUS命令。禁用的範圍包括SQL語句、SQL*PLUS命令和PL/SQL命令。在本篇裡,我們介紹一下PUP的另一種用途,角色ROLE剔除。
角色Role是我們基於角色許可權控制的一個重要部分。簡單的說,就是在使用者和諸多複雜的許可權之間建立一個role層。基於業務管理需要,為role設定相應的許可權集合,之後將role附加給特定的使用者(或者多個使用者)。這種方式,極大便利的管理,同時建立了與業務場景很好的對映關係。
PUP提供的對role的控制,主要體現在這樣的需求:一個使用者user具有某種角色role。但是sql*plus登入的時候,不允許使用這個角色role的許可權。也就是說,當這個使用者使用sqlplus的時候,不能使用這個角色許可權登入。但是,他在其他產品中,是可以使用這個許可權的。
這種時候,就可以體現出產品級別安全(product-level security)的優勢,作為一般grant和revoke的補充。
角色基礎
首先我們一起來看下關於role的幾個基礎知識。在使用role的時候,我們通常會使用到三型別命令方式,包括create role、grant/revoke和set role。
ü create role是SQL語句中建立一個role的作用。預設情況下,我們建立的role只是一個集合代名詞。從sql語法中,我們是可以建立出帶密碼的role;
ü grant/roke命令,就是將create出的角色賦給特定的使用者(或角色);
ü set role是一個sql*plus上使用的命令。當一個role已經grant給使用者,但是由於某些原因,使用者是可以動態使用set role命令重新設定上角色的;
PUP與角色
首先我們構建實驗環境。
SQL> conn sys/acca@otstest as sysdba; //使用dba建立角色test1
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
SQL> create role test1;
Role created
SQL> grant select on dba_objects to test1; //為角色授權,可以訪問dba_objects檢視物件;
Grant succeeded
SQL> grant test1 to scott; //授權給scott使用者
Grant succeeded
配置PUP規則,要求scott使用者登入使用sqlplus的時候,不能使用test1角色。
SQL> select * from product_user_profile;
……(無資料行)
//設定PUP規則專案;
SQL> insert into product_user_profile (product,userid,attribute,char_value)
2 values ('SQL*PLUS','SCOTT','ROLES','TEST1');
1 row inserted
SQL> commit;
Commit complete
請注意PUP取值配置項。當使用role剔除的時候,要將attribute設定為字串“ROLES”,char_value不再是書寫“DISABLED”,而是希望剔除的角色。上面的配置規則,含義是:對SCOTT使用者,在使用SQLPLUS的時候,要剔除其上的TEST1角色許可權。
下面我們來看效果,首先看在非SQL*PLUS環境下,選擇pl/sql developer的command windows。
SQL> conn scott/tiger@otstest;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott
SQL> select count(*) from dba_objects; //明顯是test1許可權作用;
COUNT(*)
----------
53294
當我們使用Sql*plus產品的時候。
//到sqlplus介面上
SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 2月 10 11:24:48 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn scott/tiger@otstest; //登入,應用規則
已連線。
SQL> select count(*) from dba_objects;
select count(*) from dba_objects
*
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在 //SCOTT身上的TEST1角色被剔除!
SQL> set role test1; //手工應用角色test1,成功
角色集
SQL> select count(*) from dba_objects; //Test1重新回到了Scott身上。
COUNT(*)
----------
53294
SQL>
上面的例子,給我們下面的結論:
首先,使用roles剔除功能後。當使用者登入產品時,sqlplus會自動將剔除的roles從使用者身上剔除掉(限制在當前的session中,並不是真正影響使用者的角色配置,只是不許使用);
其次,當使用者登入後,如果嘗試使用被剔除角色的許可權,會報錯。
最後,也是roles剔除的一個漏洞。在登入過程中,如果使用者使用set role語句,是可以恢復這個角色的。這樣,PUP的意義也就失去了。
那麼,怎麼樣應對set role的問題呢?同樣是使用PUP技術,需要對使用者的set role命令進行禁用。也就是設定規則,禁止使用者在sqlplus中使用set role命令。
//要禁止set role的使用
SQL> insert into product_user_profile (product,userid,attribute,char_value)
2 values ('SQL*PLUS','SCOTT','SET ROLE','DISABLED');
1 row inserted
SQL> commit;
Commit complete
SQL> select * from product_user_profile;
PRODUCT USERID ATTRIBUTE SCOPE NUMERIC_VALUE CHAR_VALUE ------------------------------ ------------------------------ --------------------------------------------------------------------------------
SQL*PLUS SCOTT ROLES TEST1
SQL*PLUS SCOTT SET ROLE DISABLED
//切換回sqlplus視窗
SQL> conn scott/tiger@otstest;
已連線。
SQL> select count(*) from dba_objects;
select count(*) from dba_objects
*
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在
SQL> set role test1;
SP2-0544: 在產品使用者概要檔案中禁用命令 "set role" //這樣set role的漏洞就別彌補!
SQL>
最後,我們研究兩個細節。
首先,如果我們剔除的role,是使用者沒有的。那麼會怎麼樣呢?在上面的實驗環境中繼續。
//如果將scott的test1許可權剔除!
SQL> conn sys/acca@otstest as sysdba;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
SQL> revoke test1 from scott;
Revoke succeeded
此時,回到sqlplus視窗中,Scott使用者在登入時報錯。
--登入時報錯
SQL> conn scott/tiger@otstest;
ERROR:
ORA-01919: 角色 'TEST1' 不存在
SP2-0557: 禁用產品使用者配置檔案中的角色時出現錯誤。
已連線。
SQL>
第二個細節,就是role如果是設定有密碼,那麼在set role的時候,會發生什麼呢?
//密碼角色設定
SQL> conn system/acca@otstest;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as system
SQL> delete product_user_profile where attribute='SET ROLE'; //先允許scott進行set role操作
1 row deleted
SQL> commit;
Commit complete
SQL> create role test1 identified by test1; //密碼為test1
Role created
SQL> grant select on dba_objects to test1;
Grant succeeded
SQL> grant test1 to scott;
Grant succeeded
回到sqlplus上。
--嘗試登入
SQL> conn scott/tiger@otstest;
已連線。
SQL> select count(*) from dba_objects;
select count(*) from dba_objects //角色test1被剔除
*
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在
SQL> set role test1; //SET ROLE需要輸入密碼
set role test1
*
第 1 行出現錯誤:
ORA-01979: 角色 'TEST1' 的口令缺失或無效
SQL> set role test1 identified by test1; //轉換格式,輸入密碼test1
角色集
SQL> select count(*) from dba_objects; //角色應用上!
COUNT(*)
----------
53294
結論:角色role基於不同產品的切換應用,有時候是比較常見的。藉助PUP,我們可以方便的實現這種需求。但是要注意一點,如果設定角色剔除PUP,一定將SET ROLE命令一併禁用,不要保留這種安全漏洞!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-686955/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL*Plus安全(一)SQL
- SQL*Plus安全(二)SQL
- SQL*PLUS安全(四)SQL
- 使用sql*plus時的一個安全小問題SQL
- SQL*Plus菜鳥筆記之第三篇SQL筆記
- 使用SQL*PlusSQL
- 【sqlplus】SQL*Plus命令使用大全SQL
- SQL*Plus Substitution VariablesSQL
- set autotrace in SQL*PlusSQL
- sql*plus入門SQL
- 使用sql*plus編輯sql文字SQL
- ORACLE SQL and SQL*PLUS (strong recommend)OracleSQL
- sql之27 using sql*plusSQL
- sql之26 using sql*plusSQL
- SQL入門之6 sql*plusSQL
- 【SQL*Plus】使用SQL*Plus的Preliminary方式連線資料庫SQL資料庫
- 【SQL*Plus】在SQL*Plus中謹慎使用Ctrl+S快捷鍵SQL
- 【SQL*Plus】使用SQL*Plus的-S選項精簡輸出資訊SQL
- SQL * Plus Copy 命令SQL
- sql_plus操作命令SQL
- 常用的sql*plus命令:SQL
- 在sql*plus裡編輯SQL命令SQL
- 【SQL*Plus】處理 SQL*Plus的標頭無法顯示問題SQL
- 使用OEM,SQL*Plus,iSQL*Plus 管理Oracle例項SQLOracle
- 1.3.2. 關於SQL*PlusSQL
- plustrce.sql的作用SQL
- sql plus命令使用總結SQL
- SQL*PLUS 環境變數SQL變數
- SQL/PLUS 常用命令SQL
- sql*plus 常用命令SQL
- SQL/PLUS命令的使用大全SQL
- SQL*PLUS命令的使用大全SQL
- SQL*PLUS -L選項巧用SQL
- SQL*PLUS命令, set命令大全SQL
- 設定sql plus 的autotraceSQL
- 定製SQL*Plus環境SQL
- 詳解sql*plus spool命令SQL
- Oracle 11g系列:SQL Plus與PL/SQLOracleSQL