登陸觸發器AFTER LOGON ON DATABASE對具有DBA許可權的不起作用

聽海★藍心夢發表於2012-02-10

現在假設已經建立了一個SCOTT模式,下面來看看如何保護該模式。在Oracle 10g這個版本之前,在建立SCOTT模式後,一般都可以透過“tiger”這個眾所周知的密碼進行訪問,而且賬號也不會被鎖定。

  

假設需要做的是在維護SCOTT模式中資料的同時,仍然需要阻止使用者登入這個賬號。在Oracle 9i及其之後的版本中,可以透過鎖定賬號實現這一目的;這裡,則是利用一些其他的措施對這個方法進行一定的擴充套件。首先,建立資料庫登入觸發器以阻止某些使用者登入SCOTT模式:

sec_mgr@KNOX10g> CREATE OR REPLACE TRIGGER logon_check

2 AFTER LOGON ON DATABASE

3 BEGIN

4 IF (SYS_CONTEXT ('USERENV', 'SESSION_USER') = 'SCOTT')

5 THEN

6 raise_application_error (-20001,

7 'Unauthorized Login');

8 END IF;

9 END;

10 /

Trigger created.

當試圖連線SCOTT模式時,會產生如下結果:

sec_mgr@KNOX10g> conn scott/tiger

ERROR:

ORA-00604: error occurred at recursive SQL level 1

ORA-20001: Unauthorized Login

ORA-06512: at line 4

Warning: You are no longer connected to ORACLE.

在利用登入觸發器這個方法時,需要補充說明兩點:首先,雖然登入觸發器有助於增加一定的安全性,但登入觸發器會拒絕每一位試圖登入的使用者,從而會增加登入資料庫的連線時間。在上述的例子中,可能不會感覺到連線時間的增加,但是,如果觸發器程式碼需要查詢表或者進行內部呼叫,那麼時間的增加將會非常明顯,從而使這個措施成為不可承受的解決辦法。

  

當資料庫登入觸發器最初在Oracle 8i釋出時,觸發器會丟擲異常從而阻止使用者的登入,一般情況下,丟擲的異常既非使用者可以干預的,又不能合適地對其進行處理,所產生的結果就是所有的使用者都不能登入資料庫。而惟一能使使用者重新登入資料庫的方法是利用SYSDBA(外部的)建立連線,然後撤銷或禁用登入觸發器。

  

為了防止出現這種非故意的不能登入的情況,在Oracle 9i資料庫中作了改變:即使登入觸發器丟擲了異常,也不能阻止擁有ADMINISTER DATABASE TRIGGER系統許可權的使用者登入。這個許可權被授予了DBA角色,所以任何擁有DBA角色的使用者都可以繞過登入觸發器。可以利用以下查詢程式碼來決定誰可以避免登入觸發器丟擲異常,而查詢的結果將會列出被授予上述許可權的使用者和角色:

SELECT grantee

FROM dba_sys_privs

WHERE PRIVILEGE = 'ADMINISTER DATABASE TRIGGER';

 

GRANTEE

------------------------------

DBA

SYS

XDB

MDSYS

WKSYS

CTXSYS

IMP_FULL_DATABASE

 

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

相關文章