Oracle审计功能
1、什么是審計
審計(Audit)用于監視用戶所執行的數據庫操作,審計記錄可存在數據字典表(稱為審計記錄:存儲在system表空間中的 SYS.AUD$表中,可通過視圖dba_audit_trail查看)或操作系統審計記錄中(默認位置為$ORACLE_BASE/admin/$ORACLE_SID/adump/)。。默認情況下審計是沒有開啟的。
當數據庫的審計是使能的,在語句執行階段產生審計記錄。審計記錄包含有審計的操作、用戶執行的操作、操作的日期和時間等信息。
不管你是否打開數據庫的審計功能,以下這些操作系統會強制記錄:用管理員權限連接Instance;啟動數據庫;關閉數據庫。
(1)Oracle審計功能
審計是對選定的用戶動作的監控和記錄,通常用于:
審查可疑的活動。例如:數據被非授權用戶所刪除,此時安全管理員可決定對該 數據庫的所有連接進行審計,以及對數據庫的所有表的成功地或不成功地刪除進行審計。
監視和收集關于指定數據庫活動的數據。例如:DBA可收集哪些被修改、執行了多少次邏輯的I/O等統計數據。
ORACLE所允許的審計選擇限于下列方面:
審計語句的成功執行、不成功執行,或者其兩者。
對每一用戶會話審計語句執行一次或者對語句每次執行審計一次。
對全部用戶或指定用戶的活動的審計。
(2)審計相關的表安裝
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表空間又足夠的空間存放審計信息。
安裝后要重啟數據庫
將審計相關的表移動到其他表空間
由于AUD$表等審計相關的表存放在SYSTEM表空間,因此為了不影響系統的性能,保護SYSTEM表空間,最好把AUD$移動到其他的表空間上??梢允褂孟旅娴恼Z句來進行移動:
sql>connect / as sysdba;
sql>alter table aud$ move tablespace <new tablespace>;
sql>alter index I_aud1 rebuild online tablespace <new tablespace>;
SQL> alter table audit$ move tablespace <new tablespace>;
SQL> alter index i_audit rebuild online tablespace <new tablespace>;
SQL> alter table audit_actions move tablespace <new tablespace>;
SQL> alter index i_audit_actions rebuild online tablespace <new tablespace>;
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$,審計的結果只有連接信息;
DB,Extended:這樣審計結果里面除了連接信息還包含了當時執行的具體語句;
OS:將audit trail 記錄在操作系統文件中,文件名由audit_file_dest參數指定;
XML:10g里新增的。
注:這兩個參數是static參數,需要重新啟動數據庫才能生效。
3、審計級別
當開啟審計功能后,可在三個級別對數據庫進行審計:Statement(語句)、Privilege(權限)、object(對象)。
(1)Statement:
語句審計,對某種類型的SQL語句審計,不指定結構或對象。比如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、審計的一些其他選項
(1)by access / by session:
by access ?每一個被審計的操作都會生成一條audit trail。
by session 一個會話里面同類型的操作只會生成一條audit trail,默認為by session。
(2)whenever [not] successful:
whenever successful 操作成功(dba_audit_trail中returncode字段為0) 才審計,
whenever not successful 反之。省略該子句的話,不管操作成功與否都會審計。
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子句設置了哪些默認對象審計。
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、審計的相關基本操作
(1)審計功能的參數控制
audit_trail 參數的值可以設置為以下幾種
1. NONE:不開啟
2. DB:開啟審計功能
3. OS:審計記錄寫入一個操作系統文件。
4. TRUE:與參數DB一樣
5. FALSE:不開啟審計功能。
這個參數是寫道spfile里面的,需要重啟數據庫
(2)查看是否審計功能是否啟動
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
(3)開啟審計
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> 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
(4)關閉審計
SQL> conn /as sysdba
SQL> show parameter audit
SQL> alter system set audit_trail=none;
關閉審計也需要重啟實例
9、審計實例
(1)激活審計
SQL> conn sys/admin as sysdba
已連接。
SQL> show parameter audit
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? ?VALUE
------------------------------------ ? ? ? ? ----------- ------------------------------
audit_file_dest ? ? ? ? ? ? ? ? ? ? ?string ? ? ?D:\ORACLE\ADMIN\DBA\ADUMP
audit_sys_operations ? ? ? ? ? ? ? ? boolean ? ? FALSE
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 ? ? ?D:\ORACLE\ADMIN\DBA\ADUMP
audit_sys_operations ? ? ? ? ? ? ? ? boolean ? ? TRUE
audit_trail ? ? ? ? ? ? ? ? ? ? ? ? ?string ? ? ?DB, EXTENDED
(2)開始審計
注意:無法對 SYS 用戶操作執行 audit 或 noaudit 命令
SQL> conn ?system/admin
SQL> audit all on test;
SQL> commit;
SQL> delete from test;
SQL> commit;
SQL> select OS_USERNAME,USERNAME,USERHOST,TERMINAL,TIMESTAMP,OWNER,
obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;
OS_USER USERNAME USERHOST ? TERMINAL ? ? ? ?TIMESTAMP ? ? ?OWNER
------- ? -------- --------------- --------------- -------------- ----------------
user ? ?SYSTEM ? WORKGROUP\HFCC- HFCC-KF-3068 ? ?22-10月-09 ? ? SYSTEM
SQL> audit select table by 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 SYSTEM; --審計SYSTEM用戶對表user.table的delete,update,insert操作
(3)撤銷審計
SQL> noaudit all on t_test;
oracle視頻教程請關注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
轉載于:https://blog.51cto.com/19880614/1289378
總結
以上是生活随笔為你收集整理的Oracle审计功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: awk批量修改文件名,awk用法
- 下一篇: mmap函数用法及示例程序