程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> DBA_Oracle Audit基本概念(概念)(數據庫審計和細粒度監控增刪改),dba_oracleaudit

DBA_Oracle Audit基本概念(概念)(數據庫審計和細粒度監控增刪改),dba_oracleaudit

編輯:Oracle教程

DBA_Oracle Audit基本概念(概念)(數據庫審計和細粒度監控增刪改),dba_oracleaudit


2014-08-15 BaoXinjian

1、什麼是審計


(1). 簡單來講,就是把對數據庫的操作記錄下來。不管你是否打開數據庫的審計功能,以下這些操作系統會強制記錄。

  • 用管理員權限連接Instance
  • 啟動數據庫
  • 關閉數據庫

(2).記錄對數據對象的所有操作。什麼時候,什麼用戶對對象做出了什麼類型的操作。默認情況下審計是關閉的。

  • 可以記錄對數據庫對象的所有操作。什麼時候,什麼用戶對什麼對象進行了什麼類型的操作。
  • 但是無法得知操作的細節,比如到底數據更新成了1還是2。
  • 不過現在新出現的精細審計(Fine grained Auditing),好像也可以記錄DML語句了。

(3). 審計的一些理解

1. 對於權限審計和大部分語句,by session無效,無論指定by session/by access還是不指定,審計都自動為by access。

2. 審計的語句級可以指定ALL,但是ALL只包括大部分語句,它不包括下面這些語句。

ALTER SEQUENCE,ALTER TABLE, COMMENT TABLE, DELETE TABLE, EXECUTE PROCEDURE, GRANT DIRECTORY, GRANT PROCEDURE, GRANT SEQUENCE, GRANT TABLE, GRANT TYPE, INSERT TABLE, LOCK TABLE, SELECT SEQUENCE, SELECT TABLE, UPDATE TABLE

3. 對於語句和權限審計,生效從執行語句後下一個登陸用戶開始,當前的所有session不受影響。而對象的審計,則從審計語句開始後對當前所有的用戶生效。

4. 可以使用NOAUDIT ALL、NOAUDIT ALL PRIVILEGE取消所有的語句、權限的審計,但是如果在審計的時候指定了用戶,則NOAUDIT ALL或NOAUDIT ALL PRIVILEGE的時候,不會取消這些明確用戶的審計,必須在NOAUDIT的時候也明確的指出相應的用戶。

 

2、和審計相關的三個主要參數


(1). Audit_sys_operations

默認為false,當設置為true時,所有(注意是所有!)sys用戶(包括以sysdba,sysoper身份登錄的用戶)的操作都會被記錄

audit trail不會寫在aud$表中,這個很好理解,如果數據庫還未啟動aud$不可用,那麼像conn /as sysdba這樣的連接信息,只能記錄在其它地方。

如果是windows平台,audti trail會記錄在windows的事件管理中,如果是linux/unix平台則會記錄在audit_file_dest參數指定的文件中

(2). Audit_trail

有三個取值

  • None :默認值,不做審計
  • DB :將audit trail 記錄在數據庫的審計相關表中,如aud$
  • OS :將audit trail 記錄在操作系統文件中,文件名由audit_file_dest參數指定

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

(3). Audit_file_dest

存放審計日志的目錄

 

3、審計級別


當開啟審計功能後(audit_trail=DB/OS),可在三個級別對數據庫進行審計:Statement(語句)    、Privilege(權限)、object(對象)

(1). Statement

按語句來審計,

比如audit table 會審計數據庫中所有的create table,drop table,truncate table語句,alter session by cmy會審計cmy用戶所有的數據庫連接。

(2). Privilege

按權限來審計,當用戶使用了該權限則被審計,

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

(3). 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反之。 省略該子句的話,不管操作成功與否都會審計。

 

Syntax Auditing SQL:  

    AUDIT ALL|ALL PRIVILEGES|sql_statement|system_priv [options]  

    Options:    

        BY user    

        BY proxy [ON BEHALF OF ANY|user]    

        BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]

Syntax for Auditing Objects:  

   AUDIT action on schema.object BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]  

   AUDIT action on DEFAULT BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]  

   AUDIT action on DIRECTORY dir_name BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]    

      Where actions is any of     

         ALTER, AUDIT, COMMENT, DELETE, EXECUTE, GRANT, INDEX, INSERT, LOCK, RENAME, SELECT, UPDATE

 

5、和審計相關的視圖


(1). dba_audit_trail

保存所有的audit trail,實際上它只是一個基於aud$的視圖。其它的視圖dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail的一個子集。

(2). dba_stmt_audit_opts

可以用來查看statement審計級別的audit options,即數據庫設置過哪些statement級別的審計。dba_obj_audit_opts,dba_priv_audit_opts視圖功能與之類似

(3). all_def_audit_opts

用來查看數據庫用on default子句設置了哪些默認對象審計。

(4). 其他視圖表

DBA_OBJ_AUDIT_OPTS: 視圖,表以及其他數據庫對象的審計信息;

DBA_PRIV_AUDIT_OPTS:所有特權的審計信息

DBA_STMI_AUDIT_OPTS:所有語句的審計信息;

DBA_DEP_AUDIT_OPTS:缺省的審計列表;

 

SYS.AUD$              是唯一保留審計結果的表。其它的都是視圖。

 

STMT_AUDIT_OPTION_MAP 包含有關審計選項類型代碼的信息由SQL.BSQ 腳本在CREATEDATABASE 的時候創建

AUDIT_ACTIONS         包含對審計跟蹤動作類型代碼的說明

ALL_DEF_AUDIT_OPTS    包含默認對象審計選項。當創建對象時將應用這些選項

 

DBA_STMT_AUDIT_OPTS   描述由用戶設置的跨系統的當前系統審計選項

DBA_PRIV_AUDIT_OPTS   描述由用戶正在審計的跨系統的當前系統權限

DBA_OBJ_AUDIT_OPTS    描述在所有對象上的審計選項

USER_OBJ_AUDIT_OPTS   USER 視圖描述當前用戶擁有的所有對象上的審計選項

 

以下是審計記錄

DBA_AUDIT_TRAIL       列出所有審計跟蹤條目

USER_AUDIT_TRAIL      USER視圖顯示與當前用戶有關的審計跟蹤條目

 

DBA_AUDIT_OBJECT      包含系統中所有對象的審計跟蹤記錄

USER_AUDIT_ OBJECT    USER 視圖列出一些審計跟蹤記錄而這些記錄涉及當前用戶可以訪問的對象的語句

 

DBA_AUDIT_SESSION     列出涉及CONNECT 和DISCONNECT 的所有審計跟蹤記錄

USER_AUDIT_ SESSION   USER視圖列出涉及當前用戶的CONNECT 和DISCONNECT 的所有審計跟蹤記錄

 

DBA_AUDIT_STATEMENT     列出涉及數據庫全部的GRANT REVOKE AUDIT NOAUDIT 和ALTER SYSTEM 語句的審計跟蹤記錄

USER_ AUDIT_ STATEMENT  對於USER 視圖來說這些語句應是用戶發布的

 

DBA_AUDIT_EXISTS      列出BY AUDIT NOT EXISTS 產生的審計跟蹤條目

 

下面的視圖用於細粒度審計

DBA_AUDIT_POLICIES 顯示系統上的所有審計策略

DBA_FGA_AUDIT_TRAIL 列出基於值的審計的審計跟蹤記錄

 

6、取消審計


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

 

7. 啟動Audit


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表空間又足夠的空間存放審計信息。

安裝後要重啟數據庫

 

7. Audit策略實現


案例:創建測試表,通過Insert, Update, Delete加入Audit策略,監控表的增刪改情況

Step1. 創建測試表

CREATE TABLE bxj_test_audit
(
   invoice_id     NUMBER,
   invoice_num    VARCHAR (50),
   invoice_desc   VARCHAR (200)
)

 

Step2. 加入細粒度監控Audit Polocy

 
BEGIN
   DBMS_FGA.ADD_POLICY (object_schema     => 'APPS',
                        object_name       => 'BXJ_TEST_AUDIT',
                        policy_name       => 'TEST_AUD_INSERT',
                        audit_column      => 'invoice_id, invoice_num,invoice_desc',
                        enable            => FALSE,
                        statement_types   => 'INSERT');
END;

BEGIN
   DBMS_FGA.ADD_POLICY (object_schema     => 'APPS',
                        object_name       => 'BXJ_TEST_AUDIT',
                        policy_name       => 'TEST_AUD_UPDATE',
                        audit_column      => 'invoice_id, invoice_num,invoice_desc',
                        enable            => FALSE,
                        statement_types   => 'UPDATE');
END;

BEGIN
   DBMS_FGA.ADD_POLICY (object_schema     => 'APPS',
                        object_name       => 'BXJ_TEST_AUDIT',
                        policy_name       => 'TEST_AUD_DELETE',
                        audit_column      => 'invoice_id, invoice_num,invoice_desc',
                        enable            => FALSE,
                        statement_types   => 'DELETE');
END;

 

Step3. 啟用細粒度監控Audit Polocy 

BEGIN
   DBMS_FGA.ENABLE_POLICY (object_schema   => 'APPS',
                           object_name     => 'BXJ_TEST_AUDIT',
                           policy_name     => 'TEST_AUD_INSERT');
END;

BEGIN
   DBMS_FGA.ENABLE_POLICY (object_schema   => 'APPS',
                           object_name     => 'BXJ_TEST_AUDIT',
                           policy_name     => 'TEST_AUD_UPDATE');
END;

BEGIN
   DBMS_FGA.ENABLE_POLICY (object_schema   => 'APPS',
                           object_name     => 'BXJ_TEST_AUDIT',
                           policy_name     => 'TEST_AUD_DELETE');
END;

 

Step4. 對表進行增刪改

insert into bxj_test_audit values (2,'2014-08-22 001', 'PAY THE TAXI FOR 2014-0822');

update bxj_test_audit set invoice_id = 1 where invoice_id = 2;

delete from bxj_test_audit where invoice_id = 1;

 

Step5. 查看監控表

 

Step6. 關閉細粒度監控策略

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

SQL> EXEC DBMS_FGA.DROP_POLICY(object_schema=>'LPPMTEST'   ,object_name=>'TEST'   ,policy_name=>'TEST_AUD');

 

 ********************作者: 鮑新建********************

 


通過oracle第三方管理軟件toad,對數據庫表進行更改後,審計通過查詢dba_audit_trail表語句顯示OLDROWID

:Old_ROWID的變量的含義,“ROWID”=:Old_ROWID的含義是:“Old_ROWID”的值賦給這個領域的“ROWID”。
 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved