Oracle審計

huangdazhu發表於2017-04-17
oracle審計


1、什麼是審計


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


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


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


Audit_sys_operations:


預設為false,當設定為true時,所有sys使用者(包括以sysdba, sysoper身份登入的使用者)的操作都會被記錄,audit trail不會寫在aud$表中,這個很好理解,如果資料庫還未啟動aud$不可用,那麼像conn /as sysdba這樣的連線資訊,只能記錄在其它地方。如果是windows平臺,audti trail會記錄在windows的事件管理中,如果是linux/unix平臺則會記錄在audit_file_dest引數指定的檔案中。


Audit_trail:


None:是預設值,不做審計;


DB:將audit trail 記錄在資料庫的審計相關表中,如aud$,審計的結果只有連線資訊;


DB,Extended:這樣審計結果裡面除了連線資訊還包含了當時執行的具體語句;


OS:將audit trail 記錄在作業系統檔案中,檔名由audit_file_dest引數指定;


XML:10g裡新增的。


注:這兩個引數是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 之前的版本,使用觸發器雖然對於以行級跟蹤使用者初始的更改是沒有吸引力的選擇,但它也是唯一可靠的方法。


8、例項講解


8.1、啟用審計


SQL> conn /as sysdba


SQL> show parameter audit


NAME TYPE VALUE


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


audit_file_dest string /u01/app/oracle/admin/ORCL/adump


audit_sys_operations boolean FALSE


audit_syslog_level string


audit_trail string NONE


SQL> alter system set audit_sys_operations=TRUE scope=spfile; --審計管理使用者(以sysdba/sysoper角色登陸)


SQL> alter system set audit_trail=db,extended scope=spfile;


SQL> startup force;


SQL> show parameter audit


NAME TYPE VALUE


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


audit_file_dest string /u01/app/oracle/admin/ORCL/adump


audit_sys_operations boolean TRUE


audit_syslog_level string


audit_trail string DB, EXTENDED


8.2、開始審計


SQL> conn /as sysdba


SQL> audit all on t_test;


SQL> conn u_test


SQL> select * from t_test;


SQL> insert into u_test.t_test (c2,c5) values ('test1','2');


SQL> commit;


SQL> delete from u_test.t_test;


SQL> commit;


SQL> conn /as sysdba


SQL> col DEST_NAME format a30


col OS_USERNAME format a15


col USERNAME format a15


col USERHOST format a15


col TERMINAL format a15


col OBJ_NAME format a30


col SQL_TEXT format a60


SQL> select OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;


sql> audit select table by u_test by access;


如果在命令後面新增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操作


8.3、撤銷審計


SQL> noaudit all on t_test;


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'); 

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

相關文章