none
Disables database auditing.
os
Enables database auditing and directs all audit records to the operating system's audit trail.
db
Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table).
db,extended
Enables database auditing and directs all audit records to the database audit trail (the SYS.AUD$ table). In addition, populates the SQLBIND and SQLTEXT CLOB columns of the SYS.AUD$ table.
xml
Enables database auditing and writes all audit records to XML format OS files.
xml,extended
Enables database auditing and prints all columns of the audit trail, including SqlText and SqlBind values.
注:參數AUDIT_TRAIL不是動態的,為了使AUDIT_TRAIL參數中的改動生效,必須關閉數據庫並重新啟動。在對SYS.AUD$表進行審計時,應該注意監控該表的大小,以避免影響SYS表空間中其他對象的空間需求。推薦周期性歸檔SYS.AUD$中的行,並且截取該表。Oracle提供了角色 DELETE_CATALOG_ROLE,和批處理作業中的特殊賬戶一起使用,用於歸檔和截取審計表。
audit_file_dest:Audit_trail=OS時 文件位置
1.語句審計
所有類型的審計都使用audit命令來打開審計,使用noaudit命令來關閉審計。對於語句審計,audit命令的格式看起來如下所示:
AUDIT sql_statement_clause BY {SESSION | ACCESS} WHENEVER [NOT] SUCCESSFUL;
sql_statement_clause包含很多條不同的信息,例如希望審計的SQL語句類型以及審計什 麼人。
此外,希望在每次動作發生時都對其進行審計(by access)或者只審計一次(by session)。默認是by session。
有時希望審計成功的動作:沒有生成錯誤消息的語句。對於這些語句,添加whenever successful。而有時只關心使用審計語句的命令是否失敗,失敗原因是權限違犯、用完表空間中的空間還是語法錯誤。對於這些情況,使用 whenever not successful。
對於大多數類別的審計方法,如果確實希望審計所有類型的表訪問或某個用戶的任何權限,則可以指定all而不是單個的語句類型或對象。
表1列出了可以審計的語句類型,並且在每個類別中包含了相關語句的簡要描述。如果指定all,則審計該列表中的任何語句。然而,表2中的語句類型在啟用審計時不屬於all類別;必須在audit命令中顯式地指定它們。
表1 包括在ALL類別中的可審計語句
語 句 選 項
SQL操作
ALTER SYSTEM
所有ALTER SYSTEM選項,例如,動態改變實例參數,切換到下一個日志文件組,以及終止用戶會話
CLUSTER
CREATE、ALTER、DROP或TRUNCATE集群
CONTEXT
CREATE CONTEXT或DROP CONTEXT
DATABASE LINK
CREATE或DROP數據庫鏈接
DIMENSION
CREATE、ALTER或DROP維數
DIRECTORY
CREATE或DROP目錄
INDEX
CREATE、ALTER或DROP索引
MATERIALIZED VIEW
CREATE、ALTER或DROP物化視圖
NOT EXISTS
由於不存在的引用對象而造成的SQL語句的失敗
PROCEDURE
CREATE或DROP FUNCTION、LIBRARY、PACKAGE、PACKAGE BODY或PROCEDURE
PROFILE
CREATE、ALTER或DROP配置文件
PUBLIC DATABASE LINK
CREATE或DROP公有數據庫鏈接
PUBLIC SYNONYM
CREATE或DROP公有同義詞
ROLE
CREATE、ALTER、DROP或SET角色
ROLLBACK SEGMENT
CREATE、ALTER或DROP回滾段
SEQUENCE
CREATE或DROP序列
SESSION
登錄和退出
SYNONYM
CREATE或DROP同義詞
SYSTEM AUDIT
系統權限的AUDIT或NOAUDIT
SYSTEM GRANT
GRANT或REVOKE系統權限和角色
TABLE
CREATE、DROP或TRUNCATE表
TABLESPACE
CREATE、ALTER或DROP表空間
TRIGGER
CREATE、ALTER(啟用/禁用)、DROP觸發器;具有ENABLE ALL TRIGGERS或DISABLE ALL TRIGGERS的ALTER TABLE
TYPE
CREATE、ALTER和DROP類型以及類型主體
USER
CREATE、ALTER或DROP用戶
VIEW
CREATE或DROP視圖
表2 顯式指定的語句類型
語 句 選 項
SQL 操 作
ALTER SEQUENCE
任何ALTER SEQUENCE命令
ALTER TABLE
任何ALTER TABLE命令
COMMENT TABLE
添加注釋到表、視圖、物化視圖或它們中的任何列
DELETE TABLE
刪除表或視圖中的行
EXECUTE PROCEDURE
執行程序包中的過程、函數或任何變量或游標
GRANT DIRECTORY
GRANT或REVOKE DIRECTORY對象上的權限
GRANT PROCEDURE
GRANT或REVOKE過程、函數或程序包上的權限
GRANT SEQUENCE
GRANT或REVOKE序列上的權限
GRANT TABLE
GRANT或REVOKE表、視圖或物化視圖上的權限
GRANT TYPE
GRANT或REVOKE TYPE上的權限
INSERT TABLE
INSERT INTO表或視圖
LOCK TABLE
表或視圖上的LOCK TABLE命令
SELECT SEQUENCE
引用序列的CURRVAL或NEXTVAL的任何命令
SELECT TABLE
SELECT FROM表、視圖或物化視圖
UPDATE TABLE
在表或視圖上執行UPDATE
一些示例可以幫助讀者更清楚地了解所有這些選項。在示例數據庫中,用戶KSHELTON具有HR模式和其他模式中所有表上的權限。允許 KSHELTON創建其中一些表上的索引,但如果有一些與執行計劃改動相關的性能問題,則需要知道何時創建這些索引。可以使用如下命令審計 KSHELTON創建的索引:
SQL> audit index by kshelton; Audit succeeded.
後面的某一天,KSHELTON在HR.JOBS表上創建了一個索引:
SQL> create index job_title_idx on hr.jobs(job_title); Index created.
檢查數據字典視圖DBA_AUDIT_TRAIL中的審計跟蹤,可以看到KSHELTON實際上在8月12日的5:15 P.M.創建了索引:
SQL> select username, to_char(timestamp,'MM/DD/YY HH24:MI') Timestamp, 2 obj_name, action_name, sql_text from dba_audit_trail 3 where username = 'KSHELTON';
USERNAME TIMESTAMP OBJ_NAME ACTION_NAME SQL_TEXT --------- -------------- -------------- -------------- ---------------- KSHELTON 08/12/07 17:15 JOB_TITLE_IDX CREATE INDEX create index hr. job_title_idx on hr.jobs(job_title)
1 row selected.
注意:
從Oracle Database 11g開始,只有在初始參數AUDIT_TRAIL被設置為DB_EXTENDED時,才填充DBA_AUDIT_TRAIL中的列SQL_TEXT和SQL_BIND。默認情況下,AUDIT_TRAIL的值是DB。
為了關閉HR.JOBS表上KSHELTON的審計,可以使用noaudit命令,如下所示:
SQL> noaudit index by kshelton; Noaudit succeeded.
也可能希望按常規方式審計成功的和不成功的登錄,這需要兩個audit命令:
SQL> audit session whenever successful; Audit succeeded. SQL> audit session whenever not successful; Audit succeeded.
2.權限審計
審計系統權限具有與語句審計相同的基本語法,但審計系統權限是在sql_statement_clause中,而不是在語句中,指定系統權限。
例如,可能希望將ALTER TABLESPACE權限授予所有的DBA,但希望在發生這種情況時生成審計記錄。啟用對這種權限的審計的命令看起來類似於語句審計:
SQL> audit alter tablespace by access whenever successful; Audit succeeded.
每次成功使用ALTER TABLESPACE權限時,都會將一行內容添加到SYS.AUD$。
使用SYSDBA和SYSOPER權限或者以SYS用戶連接到數據庫的系統管理員可以利用特殊的審計。為了啟用這種額外的審計級別,可以設置初始參數AUDIT_SYS_OPERATIONS為TRUE。這種審計記錄發送到與操作系統審計記錄相同的位置。因此,這個位置是和操作系統相關的。當使用其中一種權限時執行的所有SQL語句,以及作為用戶SYS執行的任何SQL語句,都會發送到操作系統審計位置。
模式對象審計
審計對各種模式對象的訪問看起來類似於語句審計和權限審計:
AUDIT schema_object_clause BY {SESSION | ACCESS} WHENEVER [NOT] SUCCESSFUL;
schema_object_clause指定對象訪問的類型以及訪問的對象。可以審計特定對象上14種不同的操作類型,下表中列出了這些操作。
對 象 選 項
說 明
ALTER
改變表、序列或物化視圖
AUDIT
審計任何對象上的命令
COMMENT
添加注釋到表、視圖或物化視圖
DELETE
從表、視圖或物化視圖中刪除行
EXECUTE
執行過程、函數或程序包
FLASHBACK
執行表或視圖上的閃回操作
GRANT
授予任何類型對象上的權限
INDEX
創建表或物化視圖上的索引
INSERT
將行插入表、視圖或物化視圖中
LOCK
鎖定表、視圖或物化視圖
READ
對DIRECTORY對象的內容執行讀操作
RENAME
重命名表、視圖或過程
SELECT
從表、視圖、序列或物化視圖中選擇行
UPDATE
更新表、視圖或物化視圖
如果希望審計HR.JOBS表上的所有insert和update命令,而不管誰正在進行更新,則每次該動作發生時,都可以使用如下所示的audit命令:
SQL> audit insert, update on hr.jobs by access whenever successful; Audit successful.
用戶KSHELTON決定向HR.JOBS表添加兩個新行:
SQL> insert into hr.jobs (job_id, job_title, min_salary, max_salary) 2 values ('IN_CFO','Internet Chief Fun Officer', 7500, 50000); 1 row created.
SQL> insert into hr.jobs (job_id, job_title, min_salary, max_salary) 2 values ('OE_VLD','Order Entry CC Validation', 5500, 20000); 1 row created.
查看DBA_AUDIT_TRAIL視圖,可以看到KSHELTON會話中的兩個insert命令:
USERNAME TIMESTAMP OWNER OBJ_NAME ACTION_NAME SQL_TEXT ---------- -------------- -------- ---------- --------------- --------------------------------------------------------------- KSHELTON 08/12/07 22:54 HR JOBS INSERT insert into hr.jobs (job_id, job_title, min_salary, max_salary) values ('IN_CFO','Internet Chief Fun Officer', 7500, 50000); KSHELTON 08/12/07 22:53 HR JOBS INSERT insert into hr.jobs (job_id, job_title, min_salary, max_salary) values ('OE_VLD','Order Entry CC Validation', 5500, 20000); KSHELTON 08/12/07 22:51 LOGON
3 rows selected.
4.細粒度的審計
從Oracle9i開始,通過引入細粒度的對象審計,或稱為FGA,審計變得更為關注某個方面,並且更為精確。由稱為DBMS_FGA的PL/SQL程序包實現FGA。
使用標准的審計,可以輕松發現訪問了哪些對象以及由誰訪問,但無法知道訪問了哪些行或列。細粒度的審計可解決這個問題,它不僅為需要訪問的行指定謂詞(或where子句),還指定了表中訪問的列。通過只在訪問某些行和列時審計對表的訪問,可以極大地減少審計表條目的數量。
程序包DBMS_FGA具有4個過程:
ADD_POLICY
添加使用謂詞和審計列的審計策略
DROP_POLICY
刪除審計策略
DISABLE_POLICY
禁用審計策略,但保留與表或視圖關聯的策略
ENABLE_POLICY
啟用策略
用戶TAMARA通常每天訪問HR.EMPLOYEES表,查找雇員的電子郵件地址。系統管理員懷疑TAMARA正在查看經理們的薪水信息,因此他們建立一個FGA策略,用於審計任何經理對SALARY列的任何訪問:
begin dbms_fga.add_policy( object_schema => 'HR', object_name => 'EMPLOYEES', policy_name => 'SAL_SELECT_AUDIT', audit_condition => 'instr(job_id,''_MAN'') > 0', audit_column => 'SALARY' ); end;
可以使用數據字典視圖DBA_FGA_AUDIT_TRAIL訪問細粒度審計的審計記錄。如果一般需要查看標准的審計行和細粒度的審計行,則數據字典視圖DBA_COMMON_AUDIT_TRAIL結合了這兩種審計類型中的行。
繼續看示例,用戶TAMARA運行了如下兩個SQL查詢:
SQL> select employee_id, first_name, last_name, email from hr.employees 2 where employee_id = 114;
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL ----------- ------------------ --------------------- -------------- 114 Den Raphaely DRAPHEAL
1 row selected.
SQL> select employee_id, first_name, last_name, salary from hr.employees 2 where employee_id = 114;
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY ----------- ------------------ ----------------------- ---------- 114 Den Raphaely 11000
1 row selected.
第一個查詢訪問經理信息,但沒有訪問SALARY列。第二個查詢與第一個查詢相同,但是訪問了SALARY列,因此觸發了FGA策略,從而在審計跟蹤中生成了一行:
SQL> select to_char(timestamp,'mm/dd/yy hh24:mi') timestamp, 2 object_schema, object_name, policy_name, statement_type 3 from dba_fga_audit_trail 4 where db_user = 'TAMARA';
TIMESTAMP OBJECT_SCHEMA OBJECT_NAME POLICY_NAME STATEMENT_TYPE -------------- ------------- ------------- ---------------- -------------- 08/12/07 18:07 HR EMPLOYEES SAL_SELECT_AUDIT SELECT
1 row selected.
因為在本章前面的VPD示例中建立了細粒度的訪問控制來阻止對SALARY列的未授權訪問,因此需要加倍檢查策略函數,確保仍然正確限制了SALARY信息。細粒度的審計以及標准審計是確保首先正確建立授權策略的好方法。
5.與審計相關的數據字典視圖
下表包含了與審計相關的數據字典視圖。
數據字典視圖
說 明
AUDIT_ACTIONS
包含審計跟蹤動作類型代碼的描述,例如INSERT、DROP VIEW、DELETE、LOGON和LOCK
DBA_AUDIT_OBJECT
與數據庫中對象相關的審計跟蹤記錄
DBA_AUDIT_POLICIES
數據庫中的細粒度審計策略
DBA_AUDIT_SESSION
與CONNECT和DISCONNECT相關的所有審計跟蹤記錄
DBA_AUDIT_STATEMENT
與GRANT、REVOKE、AUDIT、NOAUDIT和ALTER SYSTEM命令相關的審計跟蹤條目
DBA_AUDIT_TRAIL
包含標准審計跟蹤條目。USER_AUDIT_TRAILUSER_TRAIL_AUDIT只包含已連接用戶的審計行
DBA_FGA_AUDIT_TRAIL
細粒度審計策略的審計跟蹤條目
(續表)
數據字典視圖
說 明
DBA_COMMON_AUDIT_TRAIL
將標准的審計行和細粒度的審計行結合在一個視圖中
DBA_OBJ_AUDIT_OPTS
對數據庫對象生效的審計選項
DBA_PRIV_AUDIT_OPTS
對系統權限生效的審計選項
DBA_STMT_AUDIT_OPTS
對語句生效的審計選項
6.保護審計跟蹤
審計跟蹤自身需要受到保護,特別是在非系統用戶必須訪問表SYS.AUD$時。內置的角色DELETE_ANY_CATALOG是非SYS用戶可以訪問審計跟蹤的一種方法(例如,歸檔和截取審計跟蹤,以確保它不會影響到SYS表空間中其他對象的空間需求)。
為了建立對審計跟蹤自身的審計,以SYSDBA身份連接到數據庫,並運行下面的命令:
SQL> audit all on sys.aud$ by access; Audit succeeded.
現在,所有針對表SYS.AUD$的動作,包括select、insert、update和delete,都記錄在SYS.AUD$自身中。但是,您可能會問,如果某個人刪除了標識對表SYS.AUD$訪問的審計記錄,這時會發生什麼?此時將刪除表中的行,但接著插入另一行,記錄行的刪除。因此,總是存在一些針對SYS.AUD$表的(有意的或偶然的)活動的證據。此外,如果將AUDIT_SYS _OPERATIONS設置為True,使用as sysdba、as sysoper或以SYS自身連接的任何會話將記錄到操作系統審計位置中,甚至Oracle DBA可能都無法訪問該位置。因此,有許多合適的安全措施,用於確保記錄數據庫中所有權限的活動,以及隱藏該活動的任何嘗試。
7.啟用增強的審計
從Oracle Database 11g開始,數據庫配置助手(Database Configuration Assistant,DBCA)很容易啟用默認的(增強的)審計。雖然記錄審計信息有一些系統開銷,但兼容性需求(例如,Sarbanes-Oxley法案中規定的兼容性需求)要求嚴格監控所有業務操作,包括數據庫中與安全相關的操作。
可以在創建數據庫時或在數據庫已經創建之後使用DBCA配置默認審計。如果已經改變了很多審計設置,並想要將審計選項重置為基線值,則在數據庫已創建之後使用DBCA配置默認審計就非常有用。
除將初始參數AUDIT_TRAIL的值設置為DB外,默認審計設置還審計audit role命令本身。另外,在Audited Privileges選項卡的Oracle Enterprise Manager Audit Settings頁面中,可以查看默認的審計權限。
補充說明:
8、實例講解
8.1、激活審計
審計相關的表安裝
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$移動到其他的表空間上。可以使用下面的語句來進行移動:
sql>connect / as sysdba;
sql>alter table aud$ move tablespace
sql>alter index I_aud1 rebuild online tablespace
SQL> alter table audit$ move tablespace
SQL> alter index i_audit rebuild online tablespace
SQL> alter table audit_actions move tablespace
SQL> alter index i_audit_actions rebuild online tablespace