DATABASE VAULT授權的安全隱患

yangtingkun發表於2009-01-01

在前面一篇文章中討論DATABASE VAULT和授權之間的關係,隨後想到了一點安全隱患。

DATABASE VAULT對許可權的影響:http://yangtingkun.itpub.net/post/468/476369

 

 

還是利用上一篇文章的例子:

SQL> SELECT * FROM V$OPTION
  2  WHERE PARAMETER = 'Oracle Database Vault';

PARAMETER                                VALUE
---------------------------------------- ------------------------------
Oracle Database Vault                    TRUE

SQL> SELECT * FROM V$VERSION;

BANNER
-------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE    11.1.0.6.0      Production
TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

建立3個使用者:

SQL> SHOW USER
USER
"DVSYS"
SQL> GRANT CONNECT TO U1 IDENTIFIED BY U1;

授權成功。

SQL> GRANT CONNECT TO U2 IDENTIFIED BY U2;

授權成功。

SQL> GRANT CONNECT TO U3 IDENTIFIED BY U3;

授權成功。

SQL> CONN SYS@YTK111 AS SYSDBA
輸入口令: ****
已連線。
SQL> GRANT RESOURCE TO U1;

授權成功。

SQL> GRANT SELECT ANY TABLE TO U3;

授權成功。

SQL> CONN U1/U1@YTK111
已連線。
SQL> CREATE TABLE T (ID NUMBER);

表已建立。

SQL> GRANT SELECT ON T TO U2;

授權成功。

在預設情況下U2U3都可以訪問U1的表,以為U2U1直接授權訪問T表,而U3具有SELECT ANY TABLE系統許可權:

SQL> CONN U2/U2@YTK111
已連線。
SQL> SELECT * FROM U1.T;

未選定行

SQL> CONN U3/U3@YTK111
已連線。
SQL> SELECT * FROM U1.T;

未選定行

下面將U1放到REALM中:

SQL> CONN DVSYS@YTK111
輸入口令: ****
已連線。
SQL> EXEC DBMS_MACADM.CREATE_REALM('R_U1', 'REALM FOR U1', 'Y', 0)

PL/SQL 過程已成功完成。

SQL> EXEC DBMS_MACADM.ADD_OBJECT_TO_REALM('R_U1', 'U1', '%', '%')

PL/SQL 過程已成功完成。

再次透過U2U3訪問U1T表:

SQL> CONN U2/U2@YTK111
已連線。
SQL> SELECT * FROM U1.T;

未選定行

SQL> CONN U3/U3@YTK111
已連線。
SQL> SELECT * FROM U1.T;
SELECT * FROM U1.T
                 *
1 行出現錯誤:
ORA-01031:
許可權不足

REALM已經禁止了SELECT ANY TABLE許可權,而直接授權仍然可以訪問。

SQL> CONN SYS@YTK111 AS SYSDBA
輸入口令: ****
已連線。
SQL> GRANT SELECT ON U1.T TO U3;
GRANT SELECT ON U1.T TO U3
                   *
1 行出現錯誤:
ORA-00604:
遞迴 SQL 級別 1 出現錯誤
ORA-47401: grant object privilege (
U1.T ) 的領域違規
ORA-06512:
"DVSYS.AUTHORIZE_EVENT", line 55
ORA-06512:
line 31

可以看到,利用SYS來直接授權是被REALM所禁止的。

到目前而止都是重複上一篇文章的例子,而且目前看來資料也是安全的,SYS也好,U3也好都不能透過SELECT ANY TABLE來直接獲取REALM所包含的U1使用者下的T表。而且SYS也沒有許可權來將U1T表的查詢許可權直接授權給其他使用者,那麼U1使用者下的物件確實是很安全的。

問題不是出在這裡,問題在於SYS可以對其他沒有被REALM保護的物件授予直接訪問的許可權:

SQL> GRANT RESOURCE TO U2;

授權成功。

SQL> CONN U2/U2@YTK111
已連線。
SQL> CREATE TABLE T (ID NUMBER);

表已建立。

SQL> CONN SYS@YTK111 AS SYSDBA
輸入口令: ****
已連線。
SQL> GRANT SELECT ON U2.T TO U3;

授權成功。

下面將U2使用者使用REALM保護起來:

SQL> CONN DVSYS@YTK111
輸入口令: ****
已連線。
SQL> EXEC DBMS_MACADM.ADD_OBJECT_TO_REALM('R_U1', 'U2', '%', '%')

PL/SQL 過程已成功完成。

SQL> CONN U3/U3@YTK111
已連線。
SQL> SELECT * FROM U2.T;

未選定行

SQL> SELECT * FROM U1.T;
SELECT * FROM U1.T
                 *
1 行出現錯誤:
ORA-01031:
許可權不足

可以看到,同樣是被REALM所保護的U1U2,由於U2的表在被REALM保護之前,被DBA使用者直接授權給其他使用者,使得REALM保護後,U2的表仍然可以被其他使用者所訪問。這種直接授權並不會被取消,Oracle不會判斷,這個直接授權是使用者自己進行的授權,還是其他許可權使用者執行的授權。所以這裡存在著安全隱患。DBA雖然無法透過ANY許可權進行訪問,但是可以透過提前顯式授權的方式,留下一個後門。

因此使用者或物件被REALM保護後,並非一定是安全的,應該在REALM保護髮生後,徹底檢查所有的授權,確保當前所有的顯式授權都是合法的,否則就會留下安全的隱患。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-524926/,如需轉載,請註明出處,否則將追究法律責任。

相關文章