1.Audit的概念
Audit是監視和記錄用戶對數據庫進行的操作,以供DBA進行問題分析。利用Audit功能,可以完成以下任務:
- 監視和收集特定數據庫活動的數據。例如管理員能夠審計哪些表被更新,在某個時間點上有多少個並行用戶統計數據;
- 保證用戶對自己的活動負責。這些活動包括在特定模式、特定表、特定行等對象上進行的操作;
- 審計數據庫中的可疑活動。如一個未經授權的用戶正從表中刪除數據,那么數據庫管理員必須審計所有數據庫連接,以及在數據庫中所有成功和失敗的刪除操作。
根據審計類型不同,審計記錄中的信息也有所不同。通常,一條審計記錄中包含用戶名、會話標識、終端標識、所操作的模式對象名稱、執行的操作、執行的完整語句代碼、日期和時間戳、所使用的系統權限。
2.Audit的分類
在oracle 11g中,一共有4種審計類型:
- 語句審計(Statement Auditing):對特定的SQL語句進行審計,不指定具體對象;
- 權限審計(Privilege Auditing):對特定的系統權限使用情況進行審計;
- 對象審計(Object Auditing):對特定的模式對象上執行的特定語句進行審計;
- 網絡審計(Network Auditing):對網絡協議錯誤與網絡層內部錯誤進行審計。
此外,根據用戶是否成功執行,可以分為對執行成功的語句進行審計、對不成功的語句進行審計、無論成功與否都進行審計。
根據對同一個語句審計次數不同,可以分為會話審計和存取審計。會話審計是指對某個用戶或所有用戶的同一語句只審計一次,形成一條審計記錄;存取審計是指對某個用戶或所有用戶的同一語句每執行一次審計一次,形成多條審計記錄。
3.審計環境設置
使用審計功能,需要對數據庫初始化參數AUDIT_TRAIL進行設置,其參數值可以為:
- none:不啟用審計功能;
- db:啟用審計功能,審計信息寫入sys.aud$數據字典中,審計的結果只有連接信息(sys用戶的記錄以及強制性要求的記錄都寫入操作系統文件中);
- db_extended:審計結果除了有連接信息,還有執行的具體語句。關於db與db_extended的區別,見例子1;
- os:啟用審計功能,審計信息寫入操作系統文件;
- xml:啟用審計功能,審計信息寫入xml格式的操作系統文件中;
查看是否啟用了審計功能:
SQL> show parameter audit_trail NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ audit_trail string DB
修改審計環境參數:
SQL> alter system set audit_trail = 'DB_EXTENDED' scope = spfile; System altered SQL> shutdown immediate;--
需要重啟數據庫 SQL> startup;
4.審計詳解
4.1 語句審計(Statement auditing)
(1)語句審計是對特定的SQL語句進行審計,與具體的對象沒有關系。創建語句審計的基本語法為:
sql_statement_shortcut | ALL |
ALL STATEMENTS[BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
解釋:
- sql_statement_shortcut:被審計的SQL語句的快捷方式;
- ALL:審計大部分SQL語句,這里不在列出;
- ALL STATEMENT:對最高級別的SQL語句進行審計,即對直接執行的SQL語句進行審計,而不對包含在PL/SQL程序中的SQL語句進行審計;
- BY user_lists:指定審計的用戶,如果不指定,則審計全部用戶;
- IN SESSION CURRENT:只對當前會話進行審計;
- BY SESSION:會話審計,同一個SQL語句只審計一次;
- BY ACCESS:存取審計,同一個SQL語句執行幾次就審計幾次;
- WHENEVER SUCCESSFUL:只審計執行成功的SQL語句;
- WHENEVER NOT SUCCESS:只審計執行不成功的SQL語句;
(2)如果要取消對某個語句的審計,只需將AUDIT命令改為NOAUDIT命令即可,其語法與創建AUDIT相同。
(3)通過數據字典DBA_STMT_AUDIT_OPTS可以了解當前數據庫哪些用戶進行了語句審計及審計設置信息。例如,查看與scott用戶相關的語句審計:
SQL> select * from dba_stmt_audit_opts where user_name='SCOTT'; USER_NAME PROXY_NAME AUDIT_OPTION SUCCESS FAILURE --------- ----------- --------------- ---------- ---------- SCOTT TABLE BY ACCESS BY ACCESS SCOTT INSERT TABLE BY ACCESS BY ACCESS
例子1.在scott模式下創建表test02,查看其審計信息。
查看audit_trace參數
SQL> show parameter audit_trail NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ audit_trail string DB
step1.對scott用戶創建語句審計
audit table by scott by access audit insert table by scott by access
step2.創建表test02,插入2行數據:
SQL> show user; User is "SCOTT" SQL> create table test02 ( id number, name varchar(40), local varchar(50) ); Table created SQL> commit; Commit complete SQL> insert into test02 values(1,'lihua','chengdu'); SQL> insert into test02 values(2,'ll','dd'); 1 row inserted SQL> commit; Commit complete
step3.查看sys.aud$和sys.audit_actions視圖
select a.userid, a.userhost, a.terminal, a.action#, aa.name, dbms_lob.substr(a.sqltext) as sqltext, dbms_lob.substr(a.sqlbind) as sqlbind, a.obj$creator, a.obj$name, a.ntimestamp# from sys.aud$ a, sys.audit_actions aa where a.obj$name = 'TEST02' and a.action# = aa.action and a.ntimestamp# > to_date('20170412','yyyymmdd');
結果為:
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24 ------- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------ SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST02 2017/4/15 13:58:54 SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 14:00:00 SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 15:27:26
結合sys.aud$和sys.audit.actions,我們可與看到對數據庫進行了create table和2次insert操作,但是我們還是不知道具體信息。接下來,我們將audit_trail參數改為:audit_trail = db_extended。
step4.修改audit_trail參數
SQL> alter system set audit_trail = 'DB_EXTENDED' scope = spfile; System altered SQL> shutdown immediate ; SQL>startup; SQL> show parameter audit_trail NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ audit_trail string DB_EXTENDED
此時,再向test02表插入1行數據
SQL> insert into test02 values(3,'cc','vv'); 1 row inserted SQL> commit; Commit complete
step5.再次查看sys.aud$和sys.audit_actions視圖
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24 ------- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------ SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST02 2017/4/15 13:58:54 SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 14:00:00 SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 15:27:26 SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT insert into test02 values(3,'cc','vv') SCOTT TEST02 2017/4/15 16:31:53
可以看到,在SQLTEXT欄位有了具體的執行SQL語句。
4.2 權限審計
(1)權限審計是對特定的系統權限進行審計,語法為:
system_privilege |
[ALL PRIVILEGES] [BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
(2)如果要了解當前數據庫中對哪些用戶使用了什么權限審計,可以通過數據字典DBA_PRIV_AUDIT_OPTS來查看。
例子2.對scott用戶的select any table權限進行審計
step1.查看scott的系統權限
SQL> select * from dba_sys_privs where grantee = 'SCOTT'; GRANTEE PRIVILEGE ADMIN_OPTION ------------------------------ ---------------------------------------- ------------ SCOTT CREATE ANY TABLE NO SCOTT UNLIMITED TABLESPACE NO SCOTT CREATE ANY VIEW NO
step2.使用scott用戶,在模式‘LIJIAMAN’下創建表test03,查詢其審計信息:
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24 ------ ------------------------- --------------- ---------- ------------ ---------------------------- -------- ------------ --------- ------------------ SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE create table lijiaman.test03 LIJIAMAN TEST03 2017/4/15 19:08:20 ( id number, name varchar(20) )
step3.使用scott用戶,在scott下創建表test05,查詢其審計信息:
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24 ------- -------------------------- ---------------- ---------- --------------- -------------------- --------- ------------ ---------- ------------------ SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST05 2017/4/15 19:38:24 create table test05 ( id number, name varchar(30) )
通過這個這個例子,我們可以看到,只要scott用戶使用select any table權限,我們就可以通過審計得到其操作信息。
4.3 對象審計
(1)對象審計是指對特定模式對象的操作進行審計,與用戶無關,語法為:
sql_operation |
ALL ON [schema.]object] [BY user_lists] | [IN SESSION CURRENT]
[BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
其中,sql_operation指定了特定對象上要審計的SQL語句。
(2)如果要查看當前數據庫哪些模式對象進行了對象審計,可以通過查詢DBA_OBJ_AUDIT_OPTS獲得。
例子3.對模式scott下的表dept進行對象審計
SQL> audit all on scott.dept by session; Audit succeeded
查看其審計信息:
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24 ---------------- -------------------------- ---------------- ---------- ----------- ---------------------------------- -------- ------------ ---------- ------------------ LIJIAMAN WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 103 SESSION REC select * from scott.dept SCOTT DEPT 2017/4/15 20:13:47 LIJIAMAN WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 103 SESSION REC audit all on scott.dept by session SCOTT DEPT 2017/4/15 20:13:19
4.4 網絡審計
網絡審計對協議錯誤與網絡層內部錯誤進行審計,網絡審計捕獲客戶端與服務器通信過程中發生的錯誤,這些錯誤由SQL*NET網絡服務拋出。網絡審計的語法為:
AUDIT NETWORK [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
================================================================
2019年1月2日補充:
(1)如何關閉默認的login、logoff審計
在11g默認審計中,Oracle會去審計用戶的登入登出操作。如果用戶登入登出操作很多,那么sys.aud$表會非常的大。我的1個生產數據庫由於沒有關閉對登入登出的審計,導致積累了16GB的審計數據。在一個平時不怎么使用的測試庫里面,登入登出的審計信息也非常的多。
select a.action#,b.name,count(*) as counter from sys.aud$ a, sys.audit_actions b where a.action# = b.action group by a.action#,b.name order by counter desc
如何關閉呢,可以使用sql語句來關閉
SQL> noaudit session;