SQL*PLUS安全(三)

realkid4發表於2011-02-10

 

在上面的兩篇系列中,我們介紹瞭如何使用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)的優勢,作為一般grantrevoke的補充。

 

角色基礎

 

首先我們一起來看下關於role的幾個基礎知識。在使用role的時候,我們通常會使用到三型別命令方式,包括create rolegrant/revokeset role

 

ü         create roleSQL語句中建立一個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 developercommand 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,是使用者沒有的。那麼會怎麼樣呢?在上面的實驗環境中繼續。

 

//如果將scotttest1許可權剔除!

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

相關文章