ORACLE資料庫標準審計

atlantisholic發表於2011-07-26

1、什麼是審計

審計(Audit)用於監視使用者所執行的資料庫操作,並且Oracle會將審計跟蹤結果存放到OS檔案(預設位置為$ORACLE_BASE/admin/$ORACLE_SID/adump/)或資料庫(儲存在system表空間中的 SYS.AUD$表中,可通過檢視dba_audit_trail檢視)中。預設情況下審計是沒有開啟的。

不管你是否開啟資料庫的審計功能,以下這些作業系統會強制記錄:用管理員許可權連線Instance;啟動資料庫;關閉資料庫。

 

2、和審計相關的兩個主要引數

AUDIT_SYS_OPERATIONS

AUDIT_SYS_OPERATIONS enables or disables the auditing of operations issued by user SYS, and users connecting with SYSDBA or SYSOPER privileges. The audit records are written to the operating system's audit trail. The audit records will be written in XML format if the AUDIT_TRAIL initialization parameter is set to XML.

AUDIT_TRAIL

AUDIT_TRAIL enables or disables database auditing.

Values:

none

Disables database auditing.

os

Enables database auditing and directs all audit records to the operating system's audit trail.

db

Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table).

db,extended

Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table). In addition, populates the SQLBIND and SQLTEXT CLOB columns of the SYS.AUD$ table.

xml

Enables database auditing and writes all audit records to XML format OS files.

xml,extended

Enables database auditing and prints all columns of the audit trail, including SqlText and SqlBind values.

You can use the SQL statement AUDIT to set auditing options regardless of the setting of this parameter.

 

注:這兩個引數是static引數,需要重新啟動資料庫才能生效。

 

3、審計級別

當開啟審計功能後,可在三個級別對資料庫進行審計:Statement(語句)Privilege(許可權)、object(物件)。

 

Statement

按語句來審計,比如audit table 會審計資料庫中所有的create table,drop table,truncate table語句,alter session by cmy會審計cmy使用者所有的資料庫連線。

 

Privilege

按許可權來審計,當使用者使用了該許可權則被審計,如執行grant select any table to a,當執行了audit select any table語句後,當使用者a 訪問了使用者b的表時(如select * from b.t)會用到select any table許可權,故會被審計。注意使用者是自己表的所有者,所以使用者訪問自己的表不會被審計。

 

Object

按物件審計,只審計on關鍵字指定物件的相關操作,如aduit alter,delete,drop,insert on cmy.t by scott; 這裡會對cmy使用者的t表進行審計,但同時使用了by子句,所以只會對scott使用者發起的操作進行審計。注意Oracle沒有提供對schema中所有物件的審計功能,只能一個一個物件審計,對於後面建立的物件,Oracle則提供on default子句來實現自動審計,比如執行audit drop on default by access;後,對於隨後建立的物件的drop操作都會審計。但這個default會對之後建立的所有資料庫物件有效,似乎沒辦法指定只對某個使用者建立的物件有效,想比 trigger可以對schemaDDL進行審計,這個功能稍顯不足。

 

4、審計的一些其他選項

by access / by session

by access 每一個被審計的操作都會生成一條audit trail

by session 一個會話裡面同型別的操作只會生成一條audit trail,預設為by session

whenever [not] successful

whenever successful 操作成功(dba_audit_trailreturncode欄位為0) 才審計,

whenever not successful 反之。省略該子句的話,不管操作成功與否都會審計。

 

5、和審計相關的檢視

dba_audit_trail:儲存所有的audit trail,實際上它只是一個基於aud$的檢視。

其它的檢視dba_audit_session,dba_audit_object, dba_audit_statement都只是dba_audit_trail的一個子集。

dba_stmt_audit_opts:可以用來檢視statement審計級別的audit options,即資料庫設定過哪些statement級別的審計。

dba_obj_audit_opts,dba_priv_audit_opts檢視功能與之類似

all_def_audit_opts:用來檢視資料庫用on default子句設定了哪些預設物件審計。

 

6、取消審計

將對應審計語句的audit改為noaudit即可,如audit session whenever successful對應的取消審計語句為noaudit session whenever successful;

 

710g中的審計告知一切

Oracle 資料庫 10g 審計以一種非常詳細的級別捕獲使用者行為,它可以消除手動的、基於觸發器的審計。

假定使用者 Joe 具有更新那張表的許可權,並按如下所示的方式更新了表中的一行資料:

update SCOTT.EMP set salary = 12000 where empno = 123456;

您如何在資料庫中跟蹤這種行為呢?在 Oracle 9i 資料庫及其較低版本中,審計只能捕獲執行此操作,而不能捕獲執行了什麼內容。例如,它讓您知道 Joe 更新了 SCOTT 所有的表EMP,但它不會顯示他更新了該表中員工號為 123456 的薪水列。它不會顯示更改前的薪水列的值要捕獲如此詳細的更改,您將不得不編寫您自己的觸發器來捕獲更改前的值,或使用 LogMiner 將它們從存檔日誌中檢索出來。

細粒度審計(FGA),是在 Oracle 9i 中引入的,能夠記錄 SCN 號和行級的更改以重建舊的資料,但是它們只能用於 select 語句,而不能用於 DML,如 update insert delete 語句。因此,對於 Oracle 資料庫 10g 之前的版本,使用觸發器雖然對於以行級跟蹤使用者初始的更改是沒有吸引力的選擇,但它也是唯一可靠的方法。

如果在命令後面新增by user則只對user的操作進行審計,如果省去by使用者,則對系統中所有的使用者進行審計(不包含sys使用者).

例:

AUDIT DELETE ANY TABLE; --審計刪除表的操作

AUDIT DELETE ANY TABLE WHENEVER NOT SUCCESSFUL; --只審計刪除失敗的情況

AUDIT DELETE ANY TABLE WHENEVER SUCCESSFUL; --只審計刪除成功的情況

AUDIT DELETE,UPDATE,INSERT ON user.table by test; --審計test使用者對user.tabledelete,update,insert操作

 

9、精細審計

9.1、建立審計標記

SQL> exec dbms_fga.add_policy(object_schema=>'ryan',object_name=>'test',policy_name=>'chk_test',

statement_types=>'select');

9.2、開啟審計

SQL> exec DBMS_FGA.ENABLE_POLICY(object_schema=>'ryan' ,object_name=>'test' ,policy_name=>'chk_test');

9.3、檢視審計記錄

SQL> conn system/811226@ryan123

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as system

SQL> SELECT session_id,TIMESTAMP,db_user,os_user,userhost,sql_text FROM Dba_Fga_Audit_Trail;

SESSION_ID TIMESTAMP DB_USER OS_USER USERHOST SQL_TEXT

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

201 2008-11-4 2 RYAN Ryan WORKGROUP/LENOVO-C30DA497 select * from test

9.4、關閉審計

SQL> exec DBMS_FGA.DISABLE_POLICY(object_schema=>'ryan' ,object_name=>'TEST' ,policy_name=>'chk_test');

9.5、刪除審計標記

SQL> exec DBMS_FGA.DROP_POLICY(object_schema=>'ryan' ,object_name=>'TEST' ,policy_name=>'chk_test');

設定ORACLE審計


下列步驟可以設定ORACLE的審計功能:


1.
修改引數檔案(init.ora,如果使用伺服器引數檔案使用alter system set= scope=spfile|both,設定AUDIT_TRAIL引數,並且重啟資料庫。AUDIT_TRAIL的取值如下:

 

DB/TRUE:啟動審計功能,並且把審計結果存放在資料庫的SYS.AUD$表中

OS:啟動審計功能,並把審計結果存放在作業系統的審計資訊中

DB_EXTENDED:具有DB/TRUE的功能,另外填寫AUD$SQLBINDSQLTEXT欄位

NONE/FALSE:關閉審計功能

       

2.如果設定AUDIT_TRAIL = OS,還需要修改引數AUDIT_FILE_DEST

如果作業系統支援設定AUDIT_TRAIL=OS,檔案會自動存放在AUDIT_FILE_DEST所指定的目錄下,並且檔名包含程式的PID

 

比如:

AUDIT_FILE_DEST = $ORACLE_HOME/rdbms/audit

$ ls -l $ORACLE_HOME/rdbms/audit

-rw-rw---- 1 ora92   dba       881 Mar 17 09:57 ora_13264.aud

$ ps -ef|grep 13264

ora92 13264 13235 0 09:56:43 ? 0:00 oracleV92 (DESCRIPTION=(LOCAL=Y)

SQL> select spid, program, username from v$process;

SPID PROGRAM                                USERNAME

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

...

13264       oracle@frhp11 (TNS V1-V3)                   ora92

  

注意:WINDOWS NT不使用AUDIT_FILE_DEST引數,如果使用OS設定,那麼審計資訊會存放在WINDOWS NT的事件日誌裡。

 

3.確認審計相關的表是否已經安裝

SQLPLUS> connect / AS SYSDBA

SQLPLUS> select * from sys.aud$; --沒有記錄返回

SQLPLUS> select * from dba_audit_trail;--沒有記錄返回

如果做上述查詢的時候發現表不存在,說明審計相關的表還沒有安裝,需要安裝。


SQLPLUS> connect / as sysdba

SQLPLUS> @$ORACLE_HOME/rdbms/admin/cataudit.sql

審計表安裝在SYSTEM表空間。所以要確保SYSTEM表空間又足夠的空間存放審計資訊。

  

4.關閉並重啟資料庫


5.
設定所需要的審計資訊

下面是一個例子

SQL> connect system/manager

SQL> grant audit system to scott;   

SQL> connect scott/tiger

SQL> audit session;

停止審計:

SQL> noaudit session;

 

 

設定審計的例項:對試圖嘗試口令的訪問的審計

 

本節討論的是一個審計的例項,用於記錄嘗試通過野蠻嘗試法破譯ORACLE帳號口令的例子:


1.
修改審計相關引數2.重啟資料庫

3.設定審計資訊

SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL


4.
查詢AUD$

SQL> select returncode, action#, userid, userhost, terminal,timestamp

from aud$


RETURNCODE   ACTION# USERID USERHOST TERMINAL

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

   1017       100     SCOTT   WPRATA-BR

   1017       100     SCOTT   WPRATA-BR

   1017       100     SCOTT   WPRATA-BR


ORA-1017
的含義為錯誤的使用者名稱口令。通過檢視AUD$表可以清楚地看到WPRATA-BR嘗試破譯SCOTT的口令。可以通過下面一個儲存過程來分析AUD$表,找出可疑的資訊:

 

create or replace procedure AuditLogin(Since Varchar2,Times PLS_Integer)

is

USER_ID VARCHAR2(20);

cursor c1 is select userid,count(*) from sys.aud$ where returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd')

group by userid;

cursor C2 IS Select userhost, terminal,TO_CHAR(timestamp#,'YYYY-MM-DD:HH24:MI:SS')

from sys.aud$ WHERE returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd') AND USERID=USER_ID;

ct PLS_INTEGER;

V_USERHOST VARCHAR2(40);

V_TERMINAL VARCHAR(40);

V_DATE VARCHAR2(40);

BEGIN

   OPEN C1;

   dbms_output.enable(1024000);

   LOOP

     FETCH C1 INTO USER_ID,CT;

     EXIT WHEN C1%NOTFOUND;

     IF(CT>=TIMES) THEN

       DBMS_OUTPUT.PUT_LINE('USER BROKEN ALARM:'||USER_ID);

       OPEN C2;

       LOOP

         FETCH C2 INTO V_USERhOST,V_TERMINAL,V_DATE;

         DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:'||V_USERHOST||',TERM:'||V_TERMINAL||',TIME:'||V_DATE);

         EXIT WHEN C2%NOTFOUND;

       ENDLOOP;

       close c2;

     END IF;

   ENDLOOP;

   close c1;

END;

/

一下是執行結果:

SQL>set serveroutput on;

SQL> execute auditlogin('2004-01-01',2);

USER BROKEN ALARM:SYS

       HOST:,TERM:XUJI,TIME:2004-09-22:11:08:00

       HOST:,TERM:XUJI,TIME:2004-09-22:11:08:01

       HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29

       HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29


PL/SQL
過程已成功完成。

 

 

 

 

將審計相關的表移動到其他表空間

由於AUD$表等審計相關的表存放在SYSTEM表空間,因此為了不影響系統的效能,保護SYSTEM表空間,最好把AUD$移動到其他的表空間上。可以使用下面的語句來進行移動:

實際上sys.aud$表上包含了兩個lob欄位,並不是簡單的move table就可以。
下面是具體的過程:
alter table sys.aud$ move tablespace users;
alter table sys.aud$ move lob(sqlbind) store as( tablespace USERS);
alter table sys.aud$ move lob(SQLTEXT) store as( tablespace USERS);
alter index sys.I_AUD1 rebuild tablespace users;

alter table audit_actions move tablespace ;

alter index i_audit_actions rebuild online tablespace ;

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

相關文章