ORACLE審計

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可以對schema的DDL進行“審計”,這個功能稍顯不足。

 

4、審計的一些其他選項

by access / by session:

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

by session 一個會話裏面同類型的操作只會生成一條audit trail,默認爲by session。

whenever [not] successful:

whenever successful 操作成功(dba_audit_trail中returncode字段爲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;

 

7、10g中的審計告知一切

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.table的delete,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<sid>.ora,如果使用服務器參數文件使用alter system set<parameter>=<value> scope=spfile|both,設置AUDIT_TRAIL參數,並且重啓數據庫。AUDIT_TRAIL的取值如下:

 

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

OS:啓動審計功能,並把審計結果存放在操作系統的審計信息中

DB_EXTENDED:具有DB/TRUE的功能,另外填寫AUD$的SQLBIND和SQLTEXT字段

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 <new tablespace>;

alter index i_audit_actions rebuild online tablespace <new tablespace>;

 


發佈了168 篇原創文章 · 獲贊 16 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章