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 spfile;
System altered
SQLshutdown immediate;
--需要重啟數據庫
SQL> startup;
4.審計詳解
4.1 語句審計(Statement auditing)
(1)語句審計是對特定的SQL語句進行審計,與具體的對象沒有關係。創建語句審計的基本語法為:
AUDIT sql_statement_
shortcut | 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;
PROXY_NAME AUDIT_OPTION SUCCESS FAILURE
------- ----------- --------------- ---------- ----------
SCOTT ACCESS
SCOTT BY ACCESS
例子1.在scott模式下創建表test02,查看其審計信息。
查看audit_trace參數
SQL show parameter audit_trail
NAME TYPE VALUE
---------------------------------- ----------- ------------------------------
audit_trail string DB
step1.對scott用戶創建語句審計
audit table
scott
access
audit table
scott
by access
step2.創建表test02,插入2行數據:
SQL;
SQL test02
(
id ,
name ),
local )
);
created
SQL;
complete
SQL test02
);
SQL);
row inserted
SQL;
Commit complete
step3.查看sys.aud$和sys.audit_actions視圖
a.userid,
a.userhost,
a.terminal,
a.action#,
aa.name,
dbms_lob.substr(a.sqltext) sqltext,
dbms_lob.substr(a.sqlbind) sqlbind,
a.obj$creator,
a.obj$name,
a.ntimestamp#
sys.aud$ a,
sys.audit_actions aa
a.obj$name '
a.action# aa.action
a.ntimestamp# ');
結果為:
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#24
----- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------
SCOTT WORKGROUP\DESKTOP
SCOTT WORKGROUP\DESKTOP
SCOTT WORKGROUP\DESKTOP26
結合sys.aud$和sys.audit.actions,我們可與看到對數據庫進行了create table和2次insert操作,但是我們還是不知道具體信息。接下來,我們將audit_trail參數改為:audit_trail = db_extended。
step4.修改audit_trail參數
SQL spfile;
System altered
SQL immediate ;
SQLstartup;
SQL show parameter audit_trail
NAME TYPE VALUE
---------------------------------- ----------- ------------------------------
audit_trail string DB_EXTENDED
此時,再向test02表插入1行數據
SQL);
row inserted
SQL;
Commit complete
step5.再次查看sys.aud$和sys.audit_actions視圖
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#24
----- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------
SCOTT WORKGROUP\DESKTOP
SCOTT WORKGROUP\DESKTOP
SCOTT WORKGROUP\DESKTOP
SCOTT WORKGROUP\DESKTOP53
可以看到,在SQLTEXT欄位有了具體的執行SQL語句。
4.2 權限審計
(1)權限審計是對特定的 系統權限進行審計,語法為:
AUDIT 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;
GRANTEE PRIVILEGE ADMIN_OPTION
---------------------------- ---------------------------------------- ------------
SCOTT NO
SCOTT UNLIMITED TABLESPACE NO
SCOTT VIEW NO
step2.使用scott用戶,在模式‘LIJIAMAN’下創建表test03,查詢其審計信息:
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#24
---- ------------------------- --------------- ---------- ------------ ---------------------------- -------- ------------ --------- ------------------
SCOTT WORKGROUP\DESKTOP
(
id ,
name )
)
step3.使用scott用戶,在scott下創建表test05,查詢其審計信息:
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#24
----- -------------------------- ---------------- ---------- --------------- -------------------- --------- ------------ ---------- ------------------
SCOTT WORKGROUP\DESKTOP24
test05
(
id ,
name )
)
通過這個這個例子,我們可以看到,只要scott用戶使用select any table權限,我們就可以通過審計得到其操作信息。
4.3 對像審計
(1)對像審計是指對特定模式對象的操作進行審計,與用戶無關,語法為:
AUDIT 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 session;
Audit succeeded
查看其審計信息:
USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#24
-------------- -------------------------- ---------------- ---------- ----------- ---------------------------------- -------- ------------ ---------- ------------------
LIJIAMAN WORKGROUP\DESKTOP
LIJIAMAN WORKGROUP\DESKTOP19
4.4 網絡審計
網絡審計對協議錯誤與網絡層內部錯誤進行審計,網絡審計捕獲客戶端與服務器通信過程中發生的錯誤,這些錯誤由SQL*NET網絡服務拋出。網絡審計的語法為:
AUDIT NETWORK
]
] SUCCESSFUL]
下一篇介紹如何去清理Audit數據。
================================================================
2019年1月2日補充:
(1)如何關閉默認的login、logoff審計
在11g默認審計中,Oracle會去審計用戶的登入登出操作。如果用戶登入登出操作很多,那麼sys.aud$表會非常的大。我的1個生產數據庫由於沒有關閉對登入登出的審計,導致積累了16GB的審計數據。在一個平時不怎麼使用的測試庫裡面,登入登出的審計信息也非常的多。
counter
sys.aud$ a,
sys.audit_actions b
b.action
a.action#,b.name
desc

如何關閉呢,可以使用sql語句來關閉