oracle審計功能

yeahokay發表於2008-05-18

Oracle審計功能












1、什麼是審計

審計(Audit)用於監視使用者所執行的資料庫操作,審計記錄可存在資料字典表(稱為審計記錄:儲存在system表空間中的SYS.AUD$中,可通過檢視dba_audit_trail檢視)或作業系統審計記錄中(預設位置為$ORACLE_BASE/admin/$ORACLE_SID/adump/).。預設情況下審計是沒有開啟的。

當資料庫的審計是使能的,在語句執行階段產生審計記錄。

審計記錄包含:

(1)有審計的操作、

(2)使用者執行的操作、

(3)操作的日期和時間等資訊。

不管你是否開啟資料庫的審計功能,以下這些作業系統會強制記錄:用管理員許可權連線Instance;啟動資料庫;關閉資料庫。

ORACLE審計功能

審計是對選定的使用者動作的監控和記錄,通常用於:

審查可疑的活動。例如:資料被非授權使用者所刪除,此時安全管理員可決定對該資料庫的所有連線進行審計,以及對資料庫的所有表的成功地或不成功地刪除進行審計。

監視和收集關於指定資料庫活動的資料。例如:DBA可收集哪些被修改、執行了多少次邏輯的I/O等統計資料。

ORACLE所允許的審計選擇限於下列方面:

審計語句的成功執行、不成功執行,或者其兩者。

對每一使用者會話審計語句執行一次或者對語句每次執行審計一次。

對全部使用者或指定使用者的活動的審計。

[@more@]


審計相關的表安裝、轉移

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 ;

2、和審計相關的兩個主要引數

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_trail

None:是預設值,不做審計;

DB:將audit trail 記錄在資料庫的審計相關表中,如aud$,審計的結果只有連線資訊;

DB,Extended:這樣審計結果裡面除了連線資訊還包含了當時執行的具體語句;

OS:將audit trail 記錄在作業系統檔案中,檔名由audit_file_dest引數指定;

XML:10g裡新增的。

注:這兩個引數是static引數,需要重新啟動資料庫才能生效。

3、審計級別

當開啟審計功能後,可在三個級別對資料庫進行審計:Statement(語句)、Privilege(許可權)、object(物件)。

3.1 Statement:

語句審計,對某種型別的SQL語句審計,不指定結構或物件。比如audit table 會審計資料庫中所有的create table,drop table,truncate table語句,alter session by cmy會審計cmy使用者所有的資料庫連線。

3.2 Privilege:

許可權審計,當使用者使用了該許可權則被審計,如執行grant select any table to a,當執行了audit select any table語句後,當使用者a 訪問了使用者b的表時(如select * from b.t)會用到select any table許可權,故會被審計。注意使用者是自己表的所有者,所以使用者訪問自己的表不會被審計。 特權審計。

3.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、審計的一些其他選項

4.1 by access / by session:

by access 每一個被審計的操作都會生成一條audit trail。

by session 一個會話裡面同型別的操作只會生成一條audit trail,預設為by session。

4.2 whenever [not] successful:

whenever successful 操作成功(dba_audit_trail中returncode欄位為0) 才審計,

whenever not successful 反之。省略該子句的話,不管操作成功與否都會審計。

5、和審計相關的檢視

5.1 dba_audit_trail:儲存所有的audit trail,實際上它只是一個基於aud$的檢視。其它的檢視dba_audit_session,dba_audit_object, dba_audit_statement都只是dba_audit_trail的一個子集。

5.2 dba_stmt_audit_opts:可以用來檢視statement審計級別的audit options,即資料庫設定過哪些statement級別的審計。dba_obj_audit_opts,dba_priv_audit_opts檢視功能與之類似

5.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.審計的相關基本操作

8.1 審計功能的引數控制

audit_trail 引數的值可以設定為以下幾種

1. NONE:不開啟

2. DB:開啟審計功能

3. OS:審計記錄寫入一個作業系統檔案。

4. TRUE:與引數DB一樣

5. FALSE:不開啟審計功能。

這個引數是寫道spfile裡面的,需要重啟資料庫

8.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

8.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


8.4 關閉審計

SQL> conn /as sysdba

SQL> show parameter audit

SQL> alter system set audit_trail=none;

關閉審計也需要重啟例項

9. 審計例項

9.1 啟用審計

SQL> conn sys/admin as sysdba

已連線。

SQL> show parameter audit

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

audit_file_dest string D:ORACLEADMINDBAADUMP

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:ORACLEADMINDBAADUMP

audit_sys_operations boolean TRUE

audit_trail string DB, EXTENDED

9.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 WORKGROUPHFCC- 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操作

9.3 撤銷審計

SQL> noaudit all on t_test;


10.FGA策略(細粒度審計)

DBMS_FGA是SYS使用者的一個包

10.1 增加 FGA 策略

-- 審計表
GRANT RESOURCE,CONNECT TO BANK IDENTIFIED BY BANK;

CREATE TABLE BANK.ACCOUNTS
(
ACCT_NO NUMBER PRIMARY KEY,
CUST_ID NUMBER NOT NULL ,
BALANCE NUMBER(15,2) NULL
);
insert into bank.accounts values(1,1,10000);
insert into bank.accounts values(2,2,20000);
commit;

Begin
dbms_fga.drop_policy (
object_schema=>'BANK',
object_name=>'ACCOUNTS',
policy_name=>'ACCOUNTS_ACCESS');
dbms_fga.add_policy (
object_schema=>'BANK',
object_name=>'ACCOUNTS',
policy_name=>'ACCOUNTS_ACCESS');
end;
/

select * from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;

-- 審計列和審計條件, 在add_policy中加入
-- audit_column => 'BALANCE'
-- audit_condition => 'BALANCE >= 11000'

Begin
dbms_fga.drop_policy (
object_schema=>'BANK',
object_name=>'ACCOUNTS',
policy_name=>'ACCOUNTS_ACCESS');

dbms_fga.add_policy (
object_schema=>'BANK',
object_name=>'ACCOUNTS',
audit_column => 'BALANCE',
audit_condition => 'BALANCE >= 11000',
policy_name=>'ACCOUNTS_ACCESS');
end;
/

select BALANCE from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;

10.2 管理 FGA 策略
--要刪除策略,您可以使用以下語句:
begin
dbms_fga.drop_policy (
object_schema => 'BANK',
object_name => 'ACCOUNTS',
policy_name => 'ACCOUNTS_ACCESS'
);
end;
/

-- 對於更改策略而言,沒有隨取隨用的解決方案。要更改策略中的任何引數,必須刪除策略,再使用更改後的引數新增策略。

-- 需要臨時禁用審計收集 — 例如,如果您希望將線索表移動到不同的表空間或者要刪除線索表。您可以按如下方法禁用 FGA 策略:
begin
dbms_fga.enable_policy (
object_schema => 'BANK',
object_name => 'ACCOUNTS',
policy_name => 'ACCOUNTS_ACCESS',
enable => FALSE
);
end;
/
-- 重新啟用很簡單 enable =>; TRUE

--演示何時審計操作以及何時不審計操作的各種情況 SQL 語句 審計狀態

select balance from bank.accounts; 進行審計。使用者選擇了在新增策略時所指定的審計列 BALANCE。
select * from bank.accounts; 進行審計。即使使用者沒有明確指定列 BALANCE,* 也隱含地選擇了它。
select cust_id from bank.accounts where balance < 10000; 進行審計。即使使用者沒有明確指定列 BALANCE,where 子句也隱含地選擇了它。
select cust_id from bank.accounts; 不進行審計。使用者沒有選擇列 BALANCE。
select count(*) from bank.accounts; 不進行審計。使用者沒有明確或隱含地選擇列 BALANCE。

10.3 處理器模組
-- FGA 的功能不只是記錄審計線索中的事件;FGA 還可以任意執行過程。
-- 過程可以執行一項操作,比如當使用者從表中選擇特定行時向審計者傳送電子郵件警告,或者可以寫到不同的審計線索中。
-- 這種儲存程式碼段可以是獨立的過程或者是程式包中的過程,稱為策略的處理器模組。
-- 實際上由於安全性原因,它不必與基表本身處於同一模式中,您可能希望特意將它放置在不同的模式中。
-- 由於只要 SELECT 出現時過程就會執行,非常類似於 DML 語句啟動的觸發器,您還可以將其看作 SELECT 語句觸發器。

-- 以下引數指定將一個處理器模組指定給策略:
-- handler_schema 擁有資料過程的模式
-- handler_module 過程名稱
-- 處理器模組還可以採用程式包的名稱來代替過程名稱。在這種情況下,引數 handler_module 在 package.procedure 的格式中指定。

10.4 FGA 資料字典檢視
-- FGA 策略的定義位於資料字典檢視 DBA_AUDIT_POLICIES 中。

-- 審計線索收集在 SYS 擁有的表 FGA_LOG$ 中。對於 SYS 擁有的任何原始表,此表上的某些檢視以對使用者友好的方式顯示資訊。DBA_FGA_AUDIT_TRAIL 是該表上的一個檢視。
-- 一個重要的列是 SQL_BIND,它指定查詢中使用的繫結變數的值 — 這是顯著增強該工具功能的一項資訊。
-- 另一個重要的列是 SCN,當發生特定的查詢時,它記錄系統更改號。
-- 此資訊用於識別使用者在特定時間看到了什麼,而不是現在的值,它使用了閃回查詢,這種查詢能夠顯示在指定的 SCN 值時的資料。

10.5 檢視和 FGA
-- 到目前為止已經討論了在表上應用 FGA;現在讓我們來看如何在檢視上使用 FGA。假定在 ACCOUNTS 表上定義檢視 VW_ACCOUNTS 如下:

create view bank.vw_accounts as select * from bank.accounts;

select * from bank.vw_accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;

10.5.1 如果您只希望審計對檢視的查詢而不是對錶的查詢,可以對檢視本身建立策略。
-- 通過將檢視名稱而不是表的名稱傳遞給打包的過程 dbms_fga.add_policy 中的引數 object_name,可以完成這項工作。
-- 隨後 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列將顯示檢視的名稱,並且不會出現有關表訪問的附加記錄。

10.6 其它用途
除了記錄對錶的選擇訪問,FGA 還可用於某些其它情況:
-- 您可以對資料倉儲使用 FGA,以捕獲特定的表、檢視或物化檢視上發生的所有語句,這有助於計劃索引。您不需要到 V$SQL 檢視去獲取這些資訊。即使 SQL 語句已經超出了 V$SQL 的期限,在 FGA 審計線索中將會始終提供它。
-- 由於 FGA 捕獲繫結變數,它可以幫助您瞭解繫結變數值的模式,這有助於設計直方圖集合等。
-- 處理器模組可以向審計者或 DBA 傳送警告,這有助於跟蹤惡意應用程式。
-- 由於 FGA 可以作為 SELECT 語句的觸發器,您可以在需要這種功能的任何時候使用它。

結論
FGA 在 Oracle 資料庫中支援隱私和職能策略。因為審計發生在資料庫內部而不是應用程式中,所以無論使用者使用的訪問方法是什麼(通過諸如 SQL*Plus 等工具或者應用程式),都對操作進行審計,允許進行非常簡單的設定。

資料字典檢視 DBA_AUDIT_POLICIES 中重要的列
-----------------------------------------------------------------------
OBJECT_SCHEMA 對其定義了 FGA 策略的表或檢視的所有者
OBJECT_NAME 表或檢視的名稱
POLICY_NAME 策略的名稱 — 例如,ACCOUNTS_ACCESS
POLICY_TEXT 在新增策略時指定的審計條件 — 例如,BALANCE >;= 11000
POLICY_COLUMN 審計列 — 例如,BALANCE
ENABLED 如果啟用則為 YES,否則為 NO 
PF_SCHEMA 擁有策略處理器模組的模式(如果存在)
PF_PACKAGE 處理器模組的程式包名稱(如果存在)
PF_FUNCTION 處理器模組的過程名稱(如果存在)

資料字典檢視 DBA_FGA_AUDIT_TRAIL 中重要的列
-----------------------------------------------------------------------
SESSION_ID 審計會話識別符號;與 V$SESSION 檢視中的會話識別符號不同
TIMESTAMP 審計記錄生成時的時間標記
DB_USER 發出查詢的資料庫使用者
OS_USER 作業系統使用者
USERHOST 使用者連線的機器的主機名
CLIENT_ID 客戶識別符號(如果由對打包過程 dbms_session.set_identifier 的呼叫所設定)
EXT_NAME 外部認證的客戶名稱,如 LDAP 使用者
OBJECT_SCHEMA 對該表的訪問觸發了審計的表所有者
OBJECT_NAME 對該表的 SELECT 操作觸發了審計的表名稱
POLICY_NAME 觸發審計的策略名稱(如果對錶定義了多個策略,則每個策略將插入一條記錄。在此情況下,該列顯示哪些行是由哪個策略插入的。)
SCN 記錄了審計的 Oracle 系統更改號
SQL_TEXT 由使用者提交的 SQL 語句 
SQL_BIND 由 SQL 語句使用的繫結變數(如果存在)


結論

1. 對錶的審計:可以單獨對錶的create,alter進行審計,如果要對drop操作進行審計需要對錶加audit table(該命令包含有create table、drop table、truncate table);

audit alter table (該命令包含了 alter table ).
2. 對檢視的審計:可以單獨對檢視的create進行審計,如果要對drop操作進行審計需要對檢視加audit view(該命令包含有create view,drop view).
3. 對程式包的審計:可以對包(函式,儲存過程等)的create進行審計,如果需要對drop操作進行審計需要加audit procedure(該命令對CREATE FUNCTION, CREATE LIBRARY , CREATE PACKAGE, CREATE PACKAGE BODY, CREATE PROCEDURE, DROP FUNCTION, DROP LIBRARY, DROP PACKAGE, DROP PROCEDURE進行審計)
4. 對使用者的審計:可以通過audit user(該命令包含 create user,alter user,drop user)進行審計.

5、使用如下語句:

audit insert table; 
audit update table; 
audit delete table;
audit select table;

可以對所有使用者(不包含sys使用者)下的表進行insert、update、delete、select 審計。

例項:


1、select * from dba_audit_trail;

其中有“returncode”列:0,代表語句執行正常;非0,代表語句執行異常;有待驗證

3、對於 drop table 語句的稽核只能是 audit table; 
如果僅僅是對 alter any table 系統許可權進行稽核,當使用者使用 alter table 語句修改使用者所擁有的表時,是不會差生任何稽核記錄,因為沒有用到 alter any table 系統許可權。

4、AUDIT table BY ACCESS 對 drop table、alter table 和 create table 語句進行稽核。





基於值的審計value-based auditing








進行資料庫審計時會記錄審計物件中發生的插入、更新和刪除操作,但是不會捕獲更改的實際值。要擴充套件資料庫審計,可使用基於值的審計,利用資料庫觸發器(事件驅動的
PL/SQL 構造)來捕獲更改的值。

使用者在連線了相應觸發器的表中插入、更新或刪除資料時,觸發器在後臺將審計資訊複製到包含審計資訊的表中。因為審計觸發器程式碼在每次插入、更新或刪除操作發生時都必須執行,所以與標準資料庫審計相比,使用基於值的審計時,效能下降幅度比較大。效能下降幅度取決於觸發器程式碼的效率。只在標準資料庫審計捕獲的資訊不足的情況下,才使用基於值的審計。

基於值的審計由使用者或第三方程式碼實施。Oracle DB提供了可用來構建基於值的審計系統的 PL/SQL 構造。基於值的審計的關鍵部分是審計觸發器,這是一個單純為了捕獲審計資訊而構造的PL/SQL 觸發器。

以下是一個審計觸發器的典型示例:

CREATE OR REPLACE TRIGGER system.hrsalary_audit

AFTER UPDATE OF salary

ON hr.employees

REFERENCING NEW AS NEW OLD AS OLD

FOR EACH ROW  

BEGIN

IF :old.salary != :new.salary THEN

INSERT INTO system.audit_employees  

VALUES (sys_context('userenv','os_user'), sysdate, sys_context('userenv','ip_address'),

:new.employee_id ||' salary changed from '||:old.salary|| ' to '||:new.salary);

END IF;

END;

/

這個觸發器將審計的重點設定為捕獲hr.employees表薪水列的更改。更新某行後,觸發器就會檢查薪水列。如果新舊薪水不相等,則觸發器會在audit_employees表(通過在SYSTEM方案中單獨執行一項操作而建立)中插入一條審計記錄。審計記錄中包括了使用者名稱、執行更改的 IP 地址、標識所更改記錄的主鍵及更改的實際薪水值。

如果標準資料庫審計收集的資料不足,還可使用資料庫觸發器來捕獲關於使用者連線的資訊。通過使用登入觸發器,管理員可以捕獲用來標識連線到資料庫的使用者的資料。示例中包括下列各項:

登入人員的 IP 地址

用於連線到例項的程式名的前 48 個字元

? 用於連線到例項的終端名

在許多情況下,會使用細粒度審計(FGA)功能,而不會使用基於值的觸發器。





Oracle Database標準審計和細粒度審計功能 

      這篇文章主要簡單的討論一下Oracle的審計功能,包括粗粒度審計、細粒度審計(FGA),另外還將引用一篇文章討論Oracle預設的SYS使用者審計和Oracle 11g Database預設開啟的審計功能。

一.粗粒度審計功能。


1.審計級別:
語句級審計(stmt):表示只審計某種型別的SQL語句,不指定結構或物件。
許可權級審計(privs):表示只審計執行相應動作的系統許可權的使用情況。
實體級審計(obj):表示只對指定模式上的實體指定語句的審計。

    根據使用者語句的執行結果,審計語句分為成功語句的審計(Whenever Successful)、不成功語句的審計(Whenever NOT Successful)以及無論成功與否都進行審計(預設情況)。
    根據使用者語句的執行次數,審計又分為對某一使用者或全體使用者的會話(By Session)審計、對某一使用者或全體使用者存取方式(By Access)的審計。
    某一使用者或全體使用者的會話審計表示使用者語句每執行一次就審計一次;某一使用者或全體使用者存取方式審計表示相同語句執行多次時,每執行一次就審計一次。
    當資料庫的審計功能被啟動後,在使用者語句執行階段,系統會自動產生審計資訊。審計資訊中包括審計的操作、使用者執行的操作、操作日期、操作時間等資訊。

2.初始化引數:
audit_trail=none|false|db|true|os
none,false效果相同,db,true效果相同,os將結果存放到audit_dump_file引數對應的目錄下。
audit_sys_operations=false|true 是否啟動對sysdba,sysoper身份的使用者的審計。

3.語法:
audit stmt opts|privs opts|obj opts by users by session|access whenever [not] successful;

4.審計型別:

語句級審計

    語句級審計表示只審計某種型別的SQL語句。可以審計某個使用者,也可以審計所有使用者的SQL語句。語句級審計的語法如下:
AUDIT SQL語句選項 [by 使用者名稱] [by session|access] [whenever [NOT] successful;

語句選項

被審計的語句

CLUSTER

Create ClusterAudit ClusterDrop ClusterTruncate Cluster

DATABASE LINK

Create Database LinkDrop Database Link

DIRECTORY

Create DirectoryDrop Directory

INDEX

Create IndexAlter IndexDrop Index

PROCEDURE

Create FunctionCreate LibraryCreate PackageCreate Package BodyCreate ProcedureDrop FunctionDrop LibraryDrop Package

PROFILE

Create ProfileAlter ProfileDrop Profile

PUBLIC SYNONYM

Create Public SynonymDrop Public Synonym

ROLE

Create RoleAlter RoleDrop RoleSet Role

ROLLBACK SEGMENT

Create Rollback SegmentAlter Rollback SegmentDrop Rollback Segment

SEQUENCE

Create SequenceDrop Sequence

SESSION

ConnectDisconnect

SYNONYM

Create SynonymDrop Synonym

SYSTEM AUDIT

AuditNoaudit

SYSTEM GRANT

GrantRevoke

TABLE

Create TableDrop TableTruncate Table

TABLESPACE

Create TablespaceAlter TablespaceDrop Tablespace

TRIGGER

Create TriggerAlter Trigger

USERS

Create UserAlter UserDrop User

TYPE

Create TypeCreate Type BodyAlter TypeDrop TypeDrop Type Body

VIEW

Create ViewDrop View

ALTER SEQUENCE

Alter Sequence

ALTER TABLE

Alter Table

DELETE TABLE

Delete from tablesviews

EXECUTE

Execute FunctionLibraryPackage

GRANT SEQUENCE

Grant privilege On sequenceRevoke privilege On sequence

GRANT TABLE

Grant privilege on tableRevoke privilege on table

UPDATE TABLE

Lock Table


在使用時,不需要寫出全部的SQL語句,只要寫出語句的選項即可。

“by 使用者名稱”表示只審計指定使用者的SQL語句,不審計其他使用者。沒有指出使用者名稱時,則審計全體使用者。
audit table by scott; 表示scott使用者在執行Create Table、Drop Table、Truncate Table操作時將被審計。
audit table; 表示所有使用者執行該型別的語句都被審計。

“by session”表示按會話方式審計,在每個會話中,相同的語句只審計一次。這是系統預設的方式。
“by access”表示按存取方式審計,每一次語句都將審計。
“whenever successful”表示只審計成功語句。
“whenever not successful”表示只審計不成功語句。

audit table by scott by access;(審計scott使用者每一次對錶的CREATE、DROP、Truncate操作)。
audit table by scott by session;(審計scott使用者對錶的CREATE、DROP、Truncate操作,相同的操作只記錄一次)。
audit session by tax02 by session whenever not successful;(審計tax02使用者嘗試連線資料庫,但不成功的資訊,相同的操作只記錄一次)。
audit session by tax01,tax02;(審計tax01,tax02使用者嘗試連線資料庫,成功的資訊,相同的操作只記錄一次)。
audit session whenever not successful;(審計嘗試連線資料庫,但不成功的資訊)。

如果要了解對於哪些使用者都進行了語句級審計及審計的選項,可以查詢資料字典DBA_STMT_AUDIT_OPTS,該資料字典要以sys使用者連線資料庫查詢。

當不再對使用者進行審計時,可以使用noaudit命令,把使用者進行的審計取消。
noaudit SQL語句或選項 [by 使用者名稱] [by session|access] [Whenever [NOT] Successful];

許可權級審計

    許可權級審計表示只審計某一個系統許可權的使用情況。可以審計某個使用者所使用的系統許可權,也可以審計所有使用者使用的系統許可權。許可權級審計的語法如下:
Audit 許可權名稱 [by 使用者名稱] [by session|Access] [Whenever [NOT] Successful];

例如:
audit delete any table whenever not successful;(審計所有使用者不成功的DELETE ANY TABLE許可權使用情況)。
audit create table whenever not successful;(審計所有使用者不成功的CREATE TABLE許可權使用情況)。
audit alter any table,alter any procedure by scott by access whenever not successful;
audit create user by tax02 whenever not successful;

    如果要了解對哪些使用者進行了許可權級審計及審計選項,可以查詢資料字典DBA_PRIV_AUDIT_OPTS,該資料字典必須以sys使用者連線資料庫進行查詢。
當不再對使用者的系統許可權進行審計時,可以使用noaudit命令取消對使用者所進行的審計。取消使用者許可權審計的命令如下:
noaudit 許可權名稱 [by 使用者名稱] [by session|access] [whenever [NOT] Successful];

例如:
noaudit alter any table,alter any procedure by scott by access whenever not successful;
noaudit create user by tax02 whenever not successful;
noaudit create table whenever not successful;

審計停止後,使用者所進行的操作將不再記錄。

實體級審計

    實體審計用於監視所有使用者對某一指定使用者的表的存取狀況。實體級審計是不分審計物件的,資料庫管理員關心的重點是哪些使用者操作某一個指定使用者的表。實體級審計的語法如下:
audit 實體選項 on schema.實體名稱 [by session | access] [Whenever [NOT] Successful];

實體級審計中的實體選項及對實體操作的語句

 

TABLE

VIEW

SEQUENCE

PROCEDURE

SNAPSHOTS

ALTER

 

 

 

DELETE

 

 

 

EXECUTE

 

 

 

 

INDEX

 

 

 

 

INSERT

 

 

 

REFERENCES

 

 

 

 

SELECT

 

UPDATE

 

 

 



例如:
audit delete on scott.emp by access whenever successful;(審計所有使用者對scott.emp表所有成功的DELETE操作,每次操作都會記錄)
audit delete on scott.dept by access whenever not successful;(審計所有使用者對scott.emp表所有不成功的DELETE操作,每次操作都會記錄)
audit select on sys.tab;(審計所有使用者對sys.tab表的SELECT操作,相同的操作只會記錄一次)
audit update on scott.dept;
audit update,delete on hr.employees by access whenever successful;
audit update,delete on hr.employees by user;(對user使用者對hr.employees的update,delete進行審計)

    如果要了解對哪些使用者的實體進行了實體級審計及審計選項,可以查詢資料字典DBA_OBJ_AUDIT_OPTS,該資料字典必須以sys使用者連線資料庫進行查詢。例如對於使用者scott所進行的實體級審計資訊,可以使用以下命令:
select object_name,object_type,alt,aud,com,del,gra,ind,ins,loc,ren,sel,upd,ref,exe,cre,rea,wri from dba_obj_audit_opts where owner='SCOTT';

“-”表示沒有設定該選項的審計。
“S”表示使用by session選項進行審計。
“A”表示使用by access選項進行審計。
“/”表示使用過whenever successful、whenever not successful選項值。

使用noaudit命令取消對使用者實體所進行的審計。
例如:
noaudit delete on scott.emp by access whenever successful;
noaudit delete on scott.dept by access whenever not successful;

5.檢視審計結果:
dba_audit_trail;
    DBA_AUDIT_TRAIL displays all standard audit trail entries.

dba_audit_session;
   DBA_AUDIT_SESSION displays all audit trail records concerning CONNECT and DISCONNECT.

dba_audit_object;
   DBA_AUDIT_OBJECT displays audit trail records for all objects in the database.


6.檢視建立了哪些審計:
dba_obj_audit_opts;(實體級審計)
dba_priv_audit_opts;(許可權級審計)
dba_stmt_audit_opts;(語句級審計)

7.取消審計(將原有的audit語句的audit換成noaudit執行即可):
noaudit all;
noaudit all privileges;
noaudit update,delete on table_name [by username];

8.刪除審計記錄:
delete from sys.aud$ where timestamp#<sysdate-100;


二.細粒度審計(FGA)功能。

        細粒度的審計使用DBMS_FGA包完成配置和管理工作。細粒度審計除了審計功能外,還可用於繫結變數值的捕獲,下面簡單討論一下DBMS_FGA包的使用:
</sysdate-100;


SQL> desc dbms_fga

PROCEDURE ADD_POLICY

 Argument Name                  Type                    In/Out Default?

 ------------------------------ ----------------------- ------ --------

 OBJECT_SCHEMA                  VARCHAR2                IN     DEFAULT

 OBJECT_NAME                    VARCHAR2                IN

 POLICY_NAME                    VARCHAR2                IN

 AUDIT_CONDITION                VARCHAR2                IN     DEFAULT

 AUDIT_COLUMN                   VARCHAR2                IN     DEFAULT

 HANDLER_SCHEMA                 VARCHAR2                IN     DEFAULT

 HANDLER_MODULE                 VARCHAR2                IN     DEFAULT

 ENABLE                         BOOLEAN                 IN     DEFAULT

 STATEMENT_TYPES                VARCHAR2                IN     DEFAULT

 AUDIT_TRAIL                    BINARY_INTEGER          IN     DEFAULT

 AUDIT_COLUMN_OPTS              BINARY_INTEGER          IN     DEFAULT

PROCEDURE DISABLE_POLICY

 Argument Name                  Type                    In/Out Default?

 ------------------------------ ----------------------- ------ --------

 OBJECT_SCHEMA                  VARCHAR2                IN     DEFAULT

 OBJECT_NAME                    VARCHAR2                IN

 POLICY_NAME                    VARCHAR2                IN

PROCEDURE DROP_POLICY

 Argument Name                  Type                    In/Out Default?

 ------------------------------ ----------------------- ------ --------

 OBJECT_SCHEMA                  VARCHAR2                IN     DEFAULT

 OBJECT_NAME                    VARCHAR2                IN

 POLICY_NAME                    VARCHAR2                IN

PROCEDURE ENABLE_POLICY

 Argument Name                  Type                    In/Out Default?

 ------------------------------ ----------------------- ------ --------

 OBJECT_SCHEMA                  VARCHAR2                IN     DEFAULT

 OBJECT_NAME                    VARCHAR2                IN

 POLICY_NAME                    VARCHAR2                IN

 ENABLE                         BOOLEAN                 IN     DEFAULT


        從上面的結構很容易看出,DBMS_FGA包主要包括ADD_POLICY,ENABLE_POLICY,DISABLE_POLICY,和DROP_POLICY這4個儲存過程。其中ADD_POLICY是最常用也是最DBMS_FGA包中最複雜的過程,參考下面的內容順序ADD_POLICY儲存過程中引數的含義:

Table 40-2 ADD_POLICY Procedure Parameters

Parameter Description Default Value

object_schema

The schema of the object to be audited. (If NULL, the current log-on user schema is assumed.)

NULL

object_name

The name of the object to be audited.

-

policy_name

The unique name of the policy.

-

audit_condition

A condition in a row that indicates a monitoring condition. NULL is allowed and acts as TRUE.

NULL

audit_column

The columns to be checked for access. These can include hidden columns. The default, NULL, causes audit if any column is accessed or affected.

NULL

handler_schema

The schema that contains the event handler. The default, NULL, causes the current schema to be used.

NULL

handler_module

The function name of the event handler; includes the package name if necessary. This function is invoked only after the first row that matches the audit condition in the query is processed. If the procedure fails with an exception, the user SQL statement will fail as well.

NULL

enable

Enables the policy if TRUE, which is the default.

TRUE

statement_types

The SQL statement types to which this policy is applicable: INSERT, UPDATE, DELETE, or SELECT only.

SELECT

audit_trail

Destination (DB or XML) of fine grained audit records. Also specifies whether to populate LSQLTEXT and LSQLBIND in fga_log$.
<<<< 要想捕獲SQL語句和繫結變數值需要設定DBMS_FGA.EXTENDED,預設值即包含該設定,引數設定示例請參考下面的使用注意事項。

DB+EXTENDED

audit_column_opts

Establishes whether a statement is audited when the query references any column specified in the audit_column parameter or only when all such columns are referenced.    <<<< 值有DBMS_FGA.ALL_COLUMNS和DBMS_FGA.ANY_COLUMNS,表示audit_column設定中是滿足所有欄位捕獲還是滿足一個欄位捕獲。

ANY_COLUMNS


使用過程應該注意以下內容:

Usage Notes

  • If object_schema is not specified, the current log-on user schema is assumed.

  • An FGA policy should not be applied to out-of-line columns such as LOB columns.

  • Each audit policy is applied to the query individually. However, at most one audit record may be generated for each policy, no matter how many rows being returned satisfy that policy's audit_condition. In other words, whenever any number of rows being returned satisfy an audit condition defined on the table, a single audit record will be generated for each such policy.

  • If a table with an FGA policy defined on it receives a Fast Path insert or a vectored update, the hint is automatically disabled before any such operations. Disabling the hint allows auditing to occur according to the policy's terms. (One example of a Fast Path insert is the statement INSERT-WITH-APPEND-hint.)

  • The audit_condition must be a boolean expression that can be evaluated using the values in the row being inserted, updated, or deleted. This condition can be NULL (or omitted), which is interpreted as TRUE, but it cannot contain the following elements:

    • Subqueries or sequences

    • Any direct use of SYSDATE, UID, USER or USERENV functions. However, a user-defined function and other SQL functions can use these functions to return the desired information.

    • Any use of the pseudo columns LEVEL, PRIOR, or ROWNUM.

    Specifying an audit condition of "1=1" to force auditing of all specified statements ("statement_types") affecting the specified column ("audit_column") is no longer needed to achieve this purpose. NULL will cause audit even if no rows were processed, so that all actions on a table with this policy are audited.

  • The audit function (handler_module) is an alerting mechanism for the administrator. The required interface for such a function is as follows:

    PROCEDURE  ( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2 )  AS ...
    

    where fname is the name of the procedure, object_schema is the name of the schema of the table audited, object_name is the name of the table to be audited, and policy_name is the name of the policy being enforced. The audit function will be executed with the function owner's privilege.

  • The audit_trail parameter specifies both where the fine-grained audit trail will be written and whether it is to include the query's SQL Text and SQL Bind variable information (typically in columns named LSQLTEXT and LSQLBIND):

    • If audit_trail includes XML, then fine-grained audit records are written to XML-format operating system files stored in the directory specified by an AUDIT_FILE_DEST statement in SQL. (The default AUDIT_FILE_DEST is $ORACLE_BASE/admin/$DB_UNIQUE_NAME/adump on Unix-based systems, and $ORACLE_BASE\admin\$DB_UNIQUE_NAME\adump on Windows systems.)

    • If audit_trail includes DB instead, then the audit records are written to the SYS.FGA_LOG$ table in the database.

    • If audit_trail includes EXTENDED, then the query's SQL Text and SQL Bind variable information are included in the audit trail.

    • For example:

      • Setting audit_trail to DBMS_FGA.DB sends the audit trail to the SYS.FGA_LOG$ table in the database and omits SQL Text and SQL Bind.

      • Setting audit_trail to DBMS_FGA.DB + DBMS_FGA.EXTENDED sends the audit trail to the SYS.FGA_LOG$ table in the database and includes SQL Text and SQL Bind.

      • Setting audit_trail to DBMS_FGA.XML writes the audit trail in XML files sent to the operating system and omits SQL Text and SQL Bind.

      • Setting audit_trail to DBMS_FGA.XML + DBMS_FGA.EXTENDED writes the audit trail in XML files sent to the operating system and includes SQL Text and SQL Bind.

    The audit_trail parameter appears in the ALL_AUDIT_POLICIES view.

  • You can change the operating system destination using the following command:

    ALTER SYSTEM SET AUDIT_FILE_DEST = '' DEFERRED

  • On many platforms, XML audit files are named _.xml, for example, ora_2111.xml, or s002_11.xml. On Windows, the XML audit files are named _.xml (or _ProcessId>.xml if the process is not running as a thread).

  • The audit_column_opts parameter establishes whether a statement is audited

    • when the query references any column specified in the audit_column parameter (audit_column_opts = DBMS_FGA.ANY_COLUMNS), or

    • only when all such columns are referenced (audit_column_opts = DBMS_FGA.ALL_COLUMNS).

    The default is DBMS_FGA.ANY_COLUMNS.

    The ALL_AUDIT_POLICIES view also shows audit_column_opts.

  • When audit_column_opts is set to DBMS_FGA.ALL_COLUMNS, a SQL statement is audited only when all the columns mentioned in audit_column have been explicitly referenced in the statement. And these columns must be referenced in the same SQL-statement or in the sub-select.

    Also, all these columns must refer to a single table/view or alias.

    Thus, if a SQL statement selects the columns from different table aliases, the statement will not be audited.

下面介紹幾個最常用的初始化引數和檢視:

1).SYS.FGA_LOG$:如果audit_trail引數包含DB,那麼審計記錄會被記錄在FGA_LOG$表中。
2).AUDIT_FILE_DEST初始化引數:設定審計作業系統檔案的存放位置。
3).V$XML_AUDIT_TRAIL:如果audit_trail引數包含XML,那麼審計記錄會記錄在AUDIT_FILE_DEST初始化引數指定的目的地下的XML檔案中,Oracle會讀取這些XML檔案,生成V$XML_AUDIT_TRAIL動態效能檢視,方便DBA檢視審計詳細資訊。
4).DBA_AUDIT_POLICIES:詳細記錄了審計配置的策略資訊。
5).DBA_FGA_AUDIT_TRAIL:檢視到審計的SQL語句和繫結變數。
6).DBA_COMMON_AUDIT_TRAIL:包含V$XML_AUDIT_TRAIL動態效能檢視的內容,是標準和細粒度審計記錄。

注意:
        啟用細粒度的審計功能不需要設定資料庫的AUDIT_TRAIL初始化引數,只需要設定DBMS_FGA.ADD_POLICY儲存過程中的AUDIT_TRAIL引數或使用預設值即可。


        參考文章:《【實驗】【審計】【FGA】使用Oracle的審計功能監控資料庫中的可疑操作
》:http://space.itpub.net/519536/viewspace-613323


三.Oracle資料對SYS使用者的審計以及11g預設開啟的審計功能。

        參考文章:
        《Oracle 11gR2 Database和ASM預設的審計策略和相關操作》:http://space.itpub.net/23135684/viewspace-723442


Oracle 11g Database和ASM預設的審計策略和相關操作 
  這篇文章詳細討論一下Oracle 11gR2 Database中ASM例項和Database例項預設的審計策略和相關操作。

1.Oracle 11g DATABASE預設的審計策略。
    11gR2 Database的audit_trail被預設設定為DB,Oracle Database自動標準開啟審計功能。下面是11g預設開啟的標準審計功能:

    上圖展示的第一部分是預設開啟的許可權審計,可以通過DBA_PRIV_AUDIT_OPTS獲得開啟的許可權;第二部分是預設開啟的語句審計,可以通過DBA_OBJ_AUDIT_OPTS獲得開啟的許可權。

非SYSDBA、SYSOPER使用者的審計記錄將存放到SYSTEM表空間下的sys.aud$表中,隨著時間的推移,SYSTEM表空間可能因此急劇擴張。


下面是在11g資料庫例項下的操作:

SQL> show parameter audit

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /u01/app/oracle/admin/ractest/
                                                 adump
audit_sys_operations                 boolean     FALSE
audit_syslog_level                   string
audit_trail                          string      DB
SQL> select userid,count(1) from aud$ group by userid;

USERID                           COUNT(1)
------------------------------ ----------
PUBLIC                                 49
TEST                                    2
SYSTEM                                954
SCOTT                                   1
DBSNMP                               6189
SYSMAN                              43371
SOE                                   122
GGATE                                  70

8 rows selected.

SQL> select owner,segment_name,bytes/1024/1024 mb from dba_segments where segment_name='AUD$';

OWNER
------------------------------
SEGMENT_NAME
--------------------------------------------------------------------------------
        MB
----------
SYS
AUD$
        13
    5萬條審計記錄佔據了13M的空間。

    從上面的結果可以看出,11gR2的資料庫例項預設將audit_trail設定為DB,審計除了SYSDBA、SYSOPER許可權使用者以外的其他使用者特定操作。

2.對SYSDBA和SYSOPER進行審計。

對SYSDBA和SYSOPER的審計具有如下的特點:
1).審計線索必須儲存在資料庫外部。
2).始終會對以SYSDBA或SYSOPER身份執行的連線進行審計。
3).可使用AUDIT_SYS_OPERATIONS啟用對SYSDBA或SYSOPER操作的附加審計。
4).可使用AUDIT_FILE_DEST控制審計線索。

    無論是遠端或本地SYSDBA、SYSOPER許可權使用者登入都會在audit_file_dest指定的目的地生成相應審計檔案,記錄登入資訊。Windows平臺SYSDBA許可權使用者的審計記錄會被寫到事件檢視器中。

    下面討論一下AUDIT_SYS_OPERATIONS和AUDIT_TRIAL兩個初始化引數的含義:

AUDIT_SYS_OPERATIONS

Property Description
Parameter type Boolean
Default value false
Modifiable No
Range of values true | false
Basic No

AUDIT_SYS_OPERATIONS enables or disables the auditing of top-level operations, which are SQL statements directly issued by users when connecting with SYSDBAor SYSOPER privileges. (SQL statements run from within PL/SQL procedures or functions are not considered top-level.) The audit records are written to the operating system's audit trail. The audit records will be written in XML format if the AUDIT_TRAIL initialization parameter is set to xml or xml, extended.

On UNIX platforms, if the AUDIT_SYSLOG_LEVEL parameter has also been set, then it overrides the AUDIT_TRAIL parameter and SYS audit records are written to the system audit log using the SYSLOG utility.

    audit_sys_operations引數為false時,系統只以os檔案記錄sysdba身份的登入、開關資料庫的操作。
    audit_sys_operations引數為true時,系統以os檔案記錄sysdba身份的登入、開關資料庫的操作,以及其它輔助的操作。

下面是該引數的例子:
a).audit_sys_operations=false生成的審計記錄:
Audit file /u01/app/oracle/admin/ractest/adump/ractest2_ora_21523_1.aud
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1
System name:    Linux
Node name:      rhel2.localdomain
Release:        2.6.18-164.el5xen
Version:        #1 SMP Tue Aug 18 15:59:52 EDT 2009
Machine:        x86_64
VM name:        Xen Version: 3.1 (PVM)
Instance name: ractest2
Redo thread mounted by this instance: 2
Oracle process number: 69
Unix process pid: 21523, image: oracle@rhel2.localdomain (TNS V1-V3)

Tue May 21 12:44:08 2013 +08:00
LENGTH : '160'
ACTION :[7] 'CONNECT'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/0'
STATUS:[1] '0'
DBID:[10] '3282490722'

Tue May 21 12:44:44 2013 +08:00
LENGTH : '150'
ACTION :[8] 'SHUTDOWN'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/0'
STATUS:[1] '0'
DBID:[0] ''

    只對SHUTDOWN和STARTUP進行記錄。

b).audit_sys_operations=true生成的審計記錄:
Audit file /u01/app/oracle/admin/ractest/adump/ractest2_ora_23473_1.aud
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1
System name:    Linux
Node name:      rhel2.localdomain
Release:        2.6.18-164.el5xen
Version:        #1 SMP Tue Aug 18 15:59:52 EDT 2009
Machine:        x86_64
VM name:        Xen Version: 3.1 (PVM)
Instance name: ractest2
Redo thread mounted by this instance: 2
Oracle process number: 86
Unix process pid: 23473, image: oracle@rhel2.localdomain (TNS V1-V3)

Tue May 21 12:58:55 2013 +08:00
LENGTH : '160'
ACTION :[7] 'CONNECT'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/1'
STATUS:[1] '0'
DBID:[10] '3282490722'

Tue May 21 12:58:55 2013 +08:00
LENGTH : '159'
ACTION :[6] 'COMMIT'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/1'
STATUS:[1] '0'
DBID:[10] '3282490722'

Tue May 21 12:58:55 2013 +08:00
LENGTH : '159'
ACTION :[6] 'COMMIT'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/1'
STATUS:[1] '0'
DBID:[10] '3282490722'

Tue May 21 12:59:11 2013 +08:00
LENGTH : '184'
ACTION :[30] 'select count(1) from v$process'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/1'
STATUS:[1] '0'
DBID:[10] '3282490722'

    對簡單的SELECT操作也會記錄。

注意:
    1).資料庫例項的啟動過程會產生多個審計檔案,頻繁的啟停會產生大量的審計檔案。
 
    2).以上對SYS使用者的審計特性在10g的資料庫就已經存在。

AUDIT_TRAIL

Property Description
Parameter type String
Syntax AUDIT_TRAIL = { none | os | db [, extended] | xml [, extended] }
Default value none
Modifiable No
Basic No

AUDIT_TRAIL enables or disables database auditing.

Values:

  • none

    Disables standard auditing. This value is the default if the AUDIT_TRAIL parameter was not set in the initialization parameter file or if you created the database using a method other than Database Configuration Assistant. If you created the database using Database Configuration Assistant, then the default is db.

  • os

    Directs all audit records to an operating system file. Oracle recommends that you use the os setting, particularly if you are using an ultra-secure database configuration.

  • db

    Directs audit records to the database audit trail (the SYS.AUD$ table), except for records that are always written to the operating system audit trail. Use this setting for a general database for manageability.

    If the database was started in read-only mode with AUDIT_TRAIL set to db, then Oracle Database internally sets AUDIT_TRAIL to os. Check the alert log for details.

  • db, extended

    Performs all actions of AUDIT_TRAIL=db, and also populates the SQL bind and SQL text CLOB-type columns of the SYS.AUD$ table, when available. These two columns are populated only when this parameter is specified.

    If the database was started in read-only mode with AUDIT_TRAIL set to db, extended, then Oracle Database internally sets AUDIT_TRAIL to os. Check the alert log for details.

  • xml

    Writes to the operating system audit record file in XML format. Records all elements of the AuditRecord node except Sql_Text and Sql_Bind to the operating system XML audit file.

  • xml, extended

    Performs all actions of AUDIT_TRAIL=xml, and populates the SQL bind and SQL text CLOB-type columns of the SYS.AUD$ table, wherever possible. These columns are populated only when this parameter is specified.

You can use the SQL AUDIT statement to set auditing options regardless of the setting of this parameter.


注意:audit_syslog_level引數只在unix和Linux平臺存在。


3.ASM預設的審計策略。

下面是在ASM例項下的操作:
SQL> show parameter audit

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
audit_file_dest                      string
/u01/app/11.2.0/grid/rdbms/aud
it
audit_sys_operations                 boolean
FALSE
audit_syslog_level                   string

    可以注意到ASM例項引數中沒有包含audit_trail引數,ASM例項的所有審計記錄只能被寫到audit_file_dest引數指定的目的地。

    與Oracle資料庫例項相同,以sysasm、sysdba登入到ASM例項都會在audit_file_dest目錄下生成相應的審計檔案,過於頻繁的登入ASM例項將產生大量的審計檔案。


4.預設審計功能的管理。

1).關閉Database審計功能。
    將資料庫例項的audit_trail設定為none,重啟資料庫例項即可關閉資料庫例項對非SYSDBA、SYSOPER許可權使用者的審計功能;該設定並不能關閉對SYSDBA許可權使用者的審計,SYSDBA許可權使用者登入依然會在audit_file_dest指定目錄下生成相應的審計檔案。

2).關閉ASM審計功能。
    同樣沒法關閉對以SYSASM和SYSDBA、SYSOPER登入使用者的審計。

3).遷移AUD$表。
    AUD$表預設被存放到SYSTEM表空間下,頻繁的登入會導致SYSTEM表空間較快擴大,最終可能影響資料庫系統的正常執行。參考如下文章:http://yangtingkun.itpub.net/post/468/496990可完成對AUD$表的遷移。

4).AUD$表記錄的清除操作。
    AUD$表可以被直接TRUNCATE,也可以參考如下文章:http://yangtingkun.itpub.net/post/468/498990清除部分AUD$表資料。可以建立並排程JOB
對AUD$表進行自動化的清理

--end--


1.      初始化引數AUDIT_TRAIL用於控制資料庫審計,取值說明:

  • none 禁用資料庫審計
  • os 啟用資料庫審計,並將資料庫審計記錄定向到作業系統審計記錄
  • db 啟用資料庫審計,並將資料庫所有審計記錄定向到資料庫的SYS.AUD$
  • db,extended 啟用資料庫審計,並將資料庫所有審計記錄定向到資料庫的SYS.AUD$表。另外,填充SYS.AUD$表的SQLBIND 列和SQLTEXT CLOB 列。
  • xml 啟用資料庫審計,並將所有記錄寫到XML格式的作業系統檔案中。
  • xml,extended 啟用資料庫審計,輸出審計記錄的所有列,包括SqlTextSqlBind的值。

Oracle公司還推薦使用基於OS檔案的審計日誌記錄方式(OS audit trail files)。

2.      不同設定下audit  trail的位置如下:


 

3.      db 選項下的aud$表的遷移

在日常的資料庫維護中,經常出現因為資料庫登入審計的功能啟動,導致system表空間被用滿.從而出現異常,一般建議把aud$相關物件遷移到其他表空間,從而避免system被用完的風險.


10g及以前遷移方法

alter table AUDIT$ move tablespace users;

alter table AUDIT_ACTIONS move tablespace users;

alter table AUD$ move tablespace users;

alter table AUD$ move lob(SQLBIND) store as SYS_IL0000000384C00041$$ (tablespace users);

alter table AUD$ move lob(SQLTEXT) store as SYS_IL0000000384C00041$$ (tablespace users);

alter index I_AUDIT rebuild online tablespace users;

alter index I_AUDIT_ACTIONS rebuild online tablespace users;

11g以後

可以使用DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION進行遷移

conn / as sysdba


BEGIN

DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,

audit_trail_location_value => 'USERS');

END;

/


4.      審計日誌清理

10g及以前通過手工清理的方式或自定義作業來定期清理

DELETE FROM SYS.AUD$;

DELETE FROM SYS.AUD$

     WHERE obj$name='EMP';

OS和XML選項下進行手動刪除審計檔案



11g 新特性

通過DBMS_AUDIT_MGMT包下的子過程進行手動或定期清理,功能如下

Subprogram

Description

CLEAN_AUDIT_TRAIL Procedure

Deletes audit trail records/files that have been archived

CLEAR_LAST_ARCHIVE_TIMESTAMP Procedure

Clears the timestamp set by the SET_LAST_ARCHIVE_TIMESTAMP Procedure

CREATE_PURGE_JOB Procedure

Creates a purge job for periodically deleting the audit trail records/files

DEINIT_CLEANUP Procedure

Undoes the setup and initialization performed by the INIT_CLEANUP Procedure

DROP_PURGE_JOB Procedure

Drops the purge job created using the CREATE_PURGE_JOB Procedure

INIT_CLEANUP Procedure

Sets up the audit management infrastructure and sets a default cleanup interval for audit trail records/files

IS_CLEANUP_INITIALIZED Function

Checks to see if the INIT_CLEANUP Procedure has been run for an audit trail type

SET_LAST_ARCHIVE_TIMESTAMP Procedure

Sets a timestamp indicating when the audit records/files were last archived

SET_PURGE_JOB_INTERVAL Procedure

Sets the interval at which the CLEAN_AUDIT_TRAIL Procedure is called for the purge job that you specify

SET_PURGE_JOB_STATUS Procedure

Enables or disables the purge job that you specify










Oracle 資料庫審計功能非常強大,通常包括標準審計(包括使用者級審計和系統級審計)和細粒度審計。儘管如此,一不小心就容易造成效能問題。同時會把系統表空間給撐爆。下面的內容描述的是如何將審計從系統表空間剝離以及清理Oracle審計記錄,供大家參考。
一、審計的相關配置


--環境
SQL> select * from v$version where rownum=1;


BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production


SQL> show parameter audit


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /home/oraprod/app/product/11.2
                                                 .0/dbhome_1/rdbms/audit
audit_sys_operations                 boolean     FALSE
audit_syslog_level                   string
audit_trail                          string      DB  --此值為當前Oracle 11gR2預設配置


--從下面的查詢中可以看出,當前的審計位於system表空間
SQL> col segment_name FOR a10
SQL> SELECT owner,segment_name,tablespace_name FROM dba_segments WHERE segment_name ='AUD$';


OWNER                          SEGMENT_NA TABLESPACE_NAME
------------------------------ ---------- ------------------------------
SYS                            AUD$       SYSTEM




二、修改審計儲存表空間


新增一個表空間用於儲存審計日誌
SQL> CREATE tablespace audit_data datafile '/home/oracle/app/oradata/orcl/audit01.dbf'
  2  SIZE 100M autoextend ON NEXT 50M;


SQL> @tbs_free.sql


TABLESPACE_NAME                USED (MB FREE (MB TOTAL (M PER_FR
------------------------------ -------- -------- -------- ------
AUDIT_DATA                            1    1,199    1,200  100 %
SYSAUX                            1,133       77    1,210    6 %
SYSTEM                            1,875       15    1,890    1 %


-- 設定審計資料存放表空間  
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
  3      AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4      AUDIT_TRAIL_LOCATION_VALUE => 'AUDIT_DATA'
  5    );
  6  END;
  7  /
BEGIN
*
ERROR at line 1:
ORA-46267: Insufficient space in 'AUDIT_DATA' tablespace, cannot complete
operation
ORA-06512: at "SYS.DBMS_AUDIT_MGMT", line 1576
ORA-06512: at line 2
-- 錯誤提示,儘管我們使用了自動擴充套件表空間,依舊提示空間不夠


-- 檢視當前審計資料大小,如下為1152MB
SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$';


SEGMENT_NAME              BYTES/1024/1024
------------------------- ---------------
AUD$                                 1152


-- 下面調整資料檔案大小
SQL> alter database datafile '/home/oracle/app/oradata/orcl/audit01.dbf' resize 1200m;


Database altered.


-- 再次設定審計資料存放表空間OK 
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
  3      AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4      AUDIT_TRAIL_LOCATION_VALUE => 'AUDIT_DATA'
  5    );
  6  END;
  7  /


PL/SQL procedure successfully completed.


Elapsed: 00:02:23.10
--整個過程花費了2m23s,主要是期間進行了資料搬遷


SQL> SELECT owner,segment_name,tablespace_name FROM dba_segments WHERE segment_name ='AUD$';


OWNER                          SEGMENT_NAME                   TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
SYS                            AUD$                           AUDIT_DATA


SQL> @tbs_free.sql


TABLESPACE_NAME                USED (MB FREE (MB TOTAL (M PER_FR
------------------------------ -------- -------- -------- ------
AUDIT_DATA                        1,153       47    1,200    4 %
SYSAUX                            1,143       67    1,210    6 %
SYSTEM                              724    1,166    1,890   62 %


-- 從上面的這個查詢可以看出,原來位於system表空間的AUD$被遷移到了AUDIT_DATA
-- 相應地AUDIT_DATA表空間已使用增加,而SYSTEM表空間使用率下降


-- 檢視審計資料字典配置資訊
SQL> col PARAMETER_NAME FOR a30
SQL> col PARAMETER_VALUE FOR a15
SQL> col AUDIT_TRAIL FOR a20
SQL> SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL
  2  FROM DBA_AUDIT_MGMT_CONFIG_PARAMS
  3  WHERE audit_trail = 'STANDARD AUDIT TRAIL';


PARAMETER_NAME                 PARAMETER_VALUE AUDIT_TRAIL
------------------------------ --------------- --------------------
DB AUDIT TABLESPACE            AUDIT_DATA      STANDARD AUDIT TRAIL
DB AUDIT CLEAN BATCH SIZE      10000           STANDARD AUDIT TRAIL




三、清除審計記錄


通過這個過程設定清除間隔
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.init_cleanup(
  3      audit_trail_type         => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL,
  4      default_cleanup_interval => 120 /* hours */);
  5  END;
  6  /


PL/SQL procedure successfully completed.


-- 下面嚴驗證審計日誌清除是否已開啟
SQL> SET SERVEROUTPUT ON
SQL> BEGIN
  2    IF DBMS_AUDIT_MGMT.is_cleanup_initialized(DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD) THEN
  3      DBMS_OUTPUT.put_line('YES');
  4    ELSE
  5      DBMS_OUTPUT.put_line('NO');
  6    END IF;
  7  END;
  8  /
YES


PL/SQL procedure successfully completed.


SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$';


SEGMENT_NAME        BYTES/1024/1024
------------------- ---------------
AUD$                           1152


SQL> select 'Leshami' As author,'http://blog.csdn.net/leshami' as Blog from dual;


AUTHOR  BLOG
------- ----------------------------
Leshami http://blog.csdn.net/leshami


SQL> select count(*) from AUD$;


  COUNT(*)
----------
   5908086


SQL> select min(ntimestamp#) from aud$;


MIN(NTIMESTAMP#)
---------------------------------------------------------------------------
20-AUG-14 06.11.09.901253 AM


-- 設定歸檔間隔
SQL> BEGIN
  2  DBMS_AUDIT_MGMT.set_last_archive_timestamp(
  3  audit_trail_type  => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4  last_archive_time => SYSTIMESTAMP-10);
  5  END;
  6  /


PL/SQL procedure successfully completed


--檢視設定的歸檔間隔
SQL> SELECT * FROM dba_audit_mgmt_last_arch_ts;


AUDIT_TRAIL          RAC_INSTANCE LAST_ARCHIVE_TS
-------------------- ------------ ---------------------------------------------------------------------------
STANDARD AUDIT TRAIL            0 09-OCT-15 01.27.17.000000 PM +00:00


--通過呼叫DBMS_AUDIT_MGMT.clean_audit_trail進行手動清理審計日誌
BEGIN
  DBMS_AUDIT_MGMT.clean_audit_trail(
   audit_trail_type        => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
   use_last_arch_timestamp => TRUE);
END;
/


DBMS_AUDIT_MGMT.clean_audit_trail
This procedure deletes audit trail records. The CLEAN_AUDIT_TRAIL procedure is usually called after the 
SET_LAST_ARCHIVE_TIMESTAMP Procedure has been used to set the last archived timestamp for the audit records.


--也可以通過建立一個purge Job來進行清理已歸檔的歷史審計記錄
SQL> BEGIN
  2    DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
  3      AUDIT_TRAIL_TYPE           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4      AUDIT_TRAIL_PURGE_INTERVAL => 24 /* hours */,
  5      AUDIT_TRAIL_PURGE_NAME     => 'Daily_Audit_Purge_Job',
  6      USE_LAST_ARCH_TIMESTAMP    => TRUE
  7    );
  8  END;
  9  /


PL/SQL procedure successfully completed.


-- 本次測試使用了job進行清理,注,上面的purge job 並非使用DBMS_SCHEDULER.CREATE_JOB建立
-- 執行job用於清理歸檔,通過觀察,由於redo log size為50MB,切換較為頻繁,花費了19分鐘
-- 同時伴隨有Checkpoint not complete等待事件,可見redo size過小
SQL> exec DBMS_SCHEDULER.RUN_JOB(job_name => 'SYS.DAILY_AUDIT_PURGE_JOB');


PL/SQL procedure successfully completed.


Elapsed: 00:19:26.38


SQL> select count(*) from AUD$;


  COUNT(*)
----------
        12


--經檢視,清理後空間並沒有釋放        
SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$';


SEGMENT_NAME                   BYTES/1024/1024
------------------------------ ---------------
AUD$                                      1152


SQL> alter table sys.aud$ shrink space cascade;
alter table sys.aud$ shrink space cascade
*
ERROR at line 1:
ORA-10636: ROW MOVEMENT is not enabled


SQL> alter table sys.aud$ enable row movement;


Table altered.


SQL> alter table sys.aud$ shrink space cascade;


Table altered.


SQL> alter table sys.aud$ disable row movement;


Table altered.


-- 下面的查詢可以看到,空間已經被釋放
SQL> select segment_name,bytes/1024/1024 from dba_segments where segment_name='AUD$';


SEGMENT_NAME         BYTES/1024/1024
-------------------- ---------------
AUD$                           .0625




四、小結


a、對於Oracle 11g,審計功能預設被開啟,因此如果在必須啟用的情況下應考慮效能影響; 
b、開啟審計的情況下,建議將審計從system或sysaux表空間剝離,使用單獨的表空間; 
c、對於歷史審計日誌的清除,應考慮清除期間所帶來的效能影響; 
d、呼叫DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION這個過程已經開始了搬遷過程,如果審計日誌很龐大,應考慮IO影響; 
e、審計日誌的清除需要先設定歸檔,已歸檔的審計日誌會被清理; 
f、也可以通過trunate table aud$ reuse storage以及deallocate非常規方式來處理。









About Me

...............................................................................................................................

● 本文整理自網路

● 本文在itpub(http://blog.itpub.net/26736162)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 聯絡我請加QQ好友(646634621),註明新增緣由

● 於 2017-06-02 09:00 ~ 2017-06-30 22:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

...............................................................................................................................

拿起手機使用微信客戶端掃描下邊的左邊圖片來關注小麥苗的微信公眾號:xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學習最實用的資料庫技術。

oracle審計功能
DBA筆試面試講解
歡迎與我聯絡

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2140644/,如需轉載,請註明出處,否則將追究法律責任。

相關文章