Oracle 標準資料庫審計
Standard database auditing:標準資料庫審計
AUDIT_TRAIL(審計的存放方式)
None:是10g預設值,不做審計;11g預設值DB,將審計結果記錄到aud$表中;
要使用資料庫審計,必須先將靜態AUDIT_TRAIL引數設定為指向審計記錄的儲存位置。這樣做可啟用資料庫審計。
啟用資料庫審計並指定審計選項(登入事件、行使的系統和物件許可權或使用的SQL 語句)後,資料庫開始收集審計資訊。
AUDIT_TRAIL = { none | os | db [, extended] | xml [, extended] }
如果將AUDIT_TRAIL設定為OS,審計記錄儲存在作業系統的審計系統中。
在Windows 環境下,審計記錄儲存在事件日誌中。
在UNIX 或Linux 環境下,審計記錄儲存在使用AUDIT_FILE_DEST引數指定的檔案中。
如果將AUDIT_TRAIL引數設定為DB或DB,_EXTENDED,可以在DBA_AUDIT_TRAIL檢視(SYS方案的一部分)中檢視審計記錄。
如果AUDIT_TRAIL設定為XML或XML,EXTENDED,審計記錄會寫AUDIT_FILE_DEST引數指向的目錄中的XML 檔案。使用V$XML_AUDIT_TRAIL檢視可檢視此目錄中的所有XML 檔案。
初始化引數AUDIT_TRAIL用於控制資料庫審計,預設值為none。
[email protected]> show parameter audit_trail ---->審計的存放方式
NAME TYPE VALUE
-------------------------------- ----------- ----------------
audit_trail string NONE
enable or disable database audit
AUDIT_TRAIL = { none | os | db | db,extended | xml | xml,extended }
引數詳解:
AUDIT_TRAIL啟用或禁用資料庫審計。當設定該引數為NONE或FALSE時,將禁止資料庫審計;當設定該引數為OS時,將啟用資料庫審計,並將審計記錄寫入到OS審計跟蹤檔案中;當設定該引數為DB或TRUE時,將啟用資料庫審計,並將審計記錄寫入到資料字典SYS.AUD$中;當設定該引數為DB_EXTENDED時,不僅將審計記錄寫入到資料字典SYS.AUD$中,還會填充該資料字典的SQLBIND和SQLTEXT列。
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 sql_statement_clause by {session | access} whenever [not] successful;
by session,在一個會話中,同類型的操作只審計一條
by access,每個符合審計的操作全部審計
- 審計相關引數( audit_trail):
audit_trail = { none | os | db [, extended] | xml [, extended] }
none:10g 預設值,不做審計;
os:將audit trail 記錄在作業系統檔案中,檔名由audit_file_dest引數指定;
db:11g預設值,將審計結果記錄到aud$表中;
db,extended:將審計結果記錄到aud$表中,同時包括繫結變數及CLOB欄位;
xml:記錄OS檔案的是XML格式的審計記錄;
xml,extended:記錄OS檔案的是XML格式的審計記錄,同時包括繫結變數及 CLOB 欄位。
oracle10g:預設審計引數為 NONE,即未開啟
Oracle11g:預設審計引數為 DB
維護審計線索是一項重要的管理任務。審計線索可能會迅速地增長,具體取決於審計選項的審計重點。
如果維護不當,審計線索會建立過多的記錄,以至影響系統的效能。審計開銷與生成的記錄號直接相關。
配置審計線索
可使用AUDIT_TRAIL啟用資料庫審計。
可以在Enterprise Manager 中使用“Initialization Parameters(初始化引數)”頁或者在
SQL*Plus 中使用ALTER SYSTEM SET命令來設定AUDIT_TRAIL引數。
ALTER SYSTEM SET AUDIT_TRAIL='XML' SCOPE=SPFILE;
因為這是一個靜態引數,所以您必須重啟資料庫,更改才能生效。
如果資料庫是使用Database
Configuration Assistant (DBCA) 建立的,預設情況下,audit_trail引數設定為DB。
[email protected]> show parameter AUDIT_TRAIL
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_trail string DB
當AUDIT_TRAIL設定為DB時,預設的行為是將審計線索記錄到資料庫的AUD$表中。
對於大多數站點而言,這類審計不會對資料庫效能造成太大影響。Oracle 建議使用作業系統審計線索檔案。
如果資料庫是手動建立的(使用CREATE DATABASE命令),預設將AUDIT_TRAIL設定為NONE。
實驗開始:
——檢視審計是否安裝
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
——檢視審計是否開啟: (DB表示為11g預設引數)
[email protected]>show parameter audit_trail
NAME TYPE VALUE
------------------------------------ ----------- -----------------------------------------
audit_trail string DB
注:儲存審計資訊的表( aud$)的預設表空間為 system, system 表空間是不建議用的,所以最好為表aud$單獨建立一個表空間用於儲存審計資料。
——驗證:
[email protected]>select TABLE_NAME,TABLESPACE_NAME from user_tables where table_name='AUD$';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
AUD$ SYSTEM
1) 建立 ts_audit 表空間,用於儲存審計資訊
[email protected]>create tablespace ts_audit datafile '/u01/app/oracle/oradata/ORA11GR2/ts_audit_01.dbf' size 10m autoextend on next 10m;
Tablespace created.
2) 將儲存審計資訊的表 move 到 ts_audit 表空間
[email protected]>alter table aud$ move tablespace ts_audit;
Table altered.
——驗證:
[email protected]>select TABLE_NAME,TABLESPACE_NAME from user_tables where table_name='AUD$';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
AUD$ TS_AUDIT
SQL> desc aud$;
Name Null? Type
----------------------------------------- -------- ----------------------------
SQLBIND CLOB
SQLTEXT CLOB
【考慮將 aud$中 clob 欄位單獨儲存一個表空間,如下
alter table sys.aud$ move lob(sqlbind) store as( tablespace USERS);
alter table sys.aud$ move lob(SQLTEXT) store as( tablespace USERS);
oracle10g 中,還可以考慮將索引 move 一個新的表空間, oracle11g 中 aud$表已無索引
alter index sys.I_AUD1 rebuild tablespace users;】
3) 檢視審計引數並對其修改,改為儲存到資料庫並記錄繫結變數
--檢視當前資料庫中引數 audit_trail 的值
[email protected]>show parameter audit_trail
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_trail string DB
--修改為審計記錄儲存到資料庫中並且包含 clob 欄位
[email protected]>alter system set audit_trail=db,extended scope=spfile;
System altered.
[email protected]>startup force;
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.
Total System Global Area 830930944 bytes
Fixed Size 2257800 bytes
Variable Size 503319672 bytes
Database Buffers 322961408 bytes
Redo Buffers 2392064 bytes
Database mounted.
Database opened.
——驗證:
[email protected]>show parameter audit_trail
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_trail string DB, EXTENDED
4) 登入 scott 使用者,建立 t 表並開啟 update 審計,使用 by access 子句,每次 update 都審計
[email protected]>create table t(x int);
Table created.
[email protected]>insert into t values(9);
1 row created.
[email protected]>commit;
Commit complete.
——在scott使用者下對t表進行access級別的審計
[email protected]>audit update on t by access; 表示對t表的每次更新操作進行審計
(by access,每個符合審計的操作全部審計;by session,在一個會話中,同類型的操作只審計一條)
Audit succeeded.
5) 使用繫結變數的 sql 進行 update 測試
[email protected]>var v_num number;
[email protected]>exec :v_num:=1000; (:v_num繫結變數,:v_num:=給繫結變數授予一個值)
PL/SQL procedure successfully completed.
[email protected]>update t set x=:v_num;
1 row updated.
[email protected]>commit;
Commit complete.
6) 返回 sys 賬戶,驗證結果
[email protected]>select username,sql_text,sql_bind from dba_audit_trail where sql_text='update t set x=:v_num';
USERNAME SQL_TEXT SQL_BIND
---------- ------------------------- ---------------
SCOTT update t set x=:v_num #1(4):1000
7) 另: sql 語句中“&變數”非繫結變數,在審計表中也可以清晰的看出來
[email protected]>conn scott/tiger
Connected.
[email protected]>select * from t;
X
----------
1000
[email protected]>update t set x=&val;
Enter value for val: 9
old 1: update t set x=&val
new 1: update t set x=9
1 row updated.
[email protected]>commit;
Commit complete.
——檢視:
[email protected]>conn / as sysdba
[email protected]>select username,sql_text,sql_bind from dba_audit_trail where sql_text like 'update t set x=%';
USERNAME SQL_TEXT SQL_BIND
---------- ------------------------- ---------------
SCOTT update t set x=:v_num #1(4):1000
SCOTT update t set x=9
8) 取消審計(取消語句無需寫 by access 子句)
[email protected]>conn scott/tiger
Connected.
[email protected]>noaudit update on t;
Noaudit succeeded.
實驗結束