2014-08-15 BaoXinjian
1、什麼是審計
(1). 簡單來講,就是把對數據庫的操作記錄下來。不管你是否打開數據庫的審計功能,以下這些操作系統會強制記錄。
(2).記錄對數據對象的所有操作。什麼時候,什麼用戶對對象做出了什麼類型的操作。默認情況下審計是關閉的。
(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
有三個取值
注:這兩個參數是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');
********************作者: 鮑新建********************
:Old_ROWID的變量的含義,“ROWID”=:Old_ROWID的含義是:“Old_ROWID”的值賦給這個領域的“ROWID”。