Oracle審計功能

Oracle審計功能






 


 



一、什麼是審計node

審計(Audit)用於監視用戶所執行的數據庫操做,審計記錄可存在數據字典表(稱爲審計記錄:存儲在system表空間中的SYS.AUD$表中,可經過視圖dba_audit_trail查看)或操做系統審計記錄中(默認位置爲$ORACLE_BASE/admin/$ORACLE_SID/adump/).。默認狀況下審計是沒有開啓的。linux

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

審計記錄包含:數據庫

(1)有審計的操做、express

(2)用戶執行的操做、windows

(3)操做的日期和時間等信息。安全

無論你是否打開數據庫的審計功能,如下這些操做系統會強制記錄:用管理員權限鏈接Instance;啓動數據庫;關閉數據庫。session

ORACLE審計功能oracle

審計是對選定的用戶動做的監控和記錄,一般用於:app

審查可疑的活動。例如:數據被非受權用戶所刪除,此時安全管理員可決定對該數據庫的全部鏈接進行審計,以及對數據庫的全部表的成功地或不成功地刪除進行審計。

監視和收集關於指定數據庫活動的數據。例如: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 ;

二、和審計相關的兩個主要參數

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參數,須要從新啓動數據庫才能生效。

三、審計級別

當開啓審計功能後,可在三個級別對數據庫進行審計: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.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.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子句設置了哪些默認對象審計。

六、取消審計

將對應審計語句的audit改成noaudit便可,

如audit session whenever successful

對應的取消審計語句爲noaudit session whenever successful;

七、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)進行審計.

五、使用以下語句:

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

能夠對全部用戶(不包含sys用戶)下的表進行insert、update、delete、select 審計。

實例:


一、select * from dba_audit_trail;

其中有「returncode」列:0,表明語句執行正常;非0,表明語句執行異常;有待驗證

三、對於 drop table 語句的審覈只能是 audit table; 
若是僅僅是對 alter any table 系統權限進行審覈,當用戶使用 alter table 語句修改用戶所擁有的表時,是不會差生任何審覈記錄,由於沒有用到 alter any table 系統權限。

四、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 Cluster、Audit Cluster、Drop Cluster、Truncate Cluster

DATABASE LINK

Create Database Link、Drop Database Link

DIRECTORY

Create Directory、Drop Directory

INDEX

Create Index、Alter Index、Drop Index

PROCEDURE

Create Function、Create Library、Create Package、Create Package Body、Create Procedure、Drop Function、Drop Library、Drop Package

PROFILE

Create Profile、Alter Profile、Drop Profile

PUBLIC SYNONYM

Create Public Synonym、Drop Public Synonym

ROLE

Create Role、Alter Role、Drop Role、Set Role

ROLLBACK SEGMENT

Create Rollback Segment、Alter Rollback Segment、Drop Rollback Segment

SEQUENCE

Create Sequence、Drop Sequence

SESSION

Connect、Disconnect

SYNONYM

Create Synonym、Drop Synonym

SYSTEM AUDIT

Audit、Noaudit

SYSTEM GRANT

Grant、Revoke

TABLE

Create Table、Drop Table、Truncate Table

TABLESPACE

Create Tablespace、Alter Tablespace、Drop Tablespace

TRIGGER

Create Trigger、Alter Trigger

USERS

Create User、Alter User、Drop User

TYPE

Create Type、Create Type Body、Alter Type、Drop Type、Drop Type Body

VIEW

Create View、Drop View

ALTER SEQUENCE

Alter Sequence

ALTER TABLE

Alter Table

DELETE TABLE

Delete from tables、views

EXECUTE

Execute Function、Library、Package

GRANT SEQUENCE

Grant privilege On sequence、Revoke privilege On sequence

GRANT TABLE

Grant privilege on table、Revoke 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:

    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.

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

  • 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):

    The audit_trail parameter appears in the ALL_AUDIT_POLICIES view.

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

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

  • 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

    The default is DBMS_FGA.ANY_COLUMNS.

    The ALL_AUDIT_POLICIES view also shows audit_column_opts.

    • 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).

  • 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 啓用數據庫審計,輸出審計記錄的全部列,包括SqlText和SqlBind的值。

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審計記錄,供你們參考。  1、審計的相關配置  --環境  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  2、修改審計存儲表空間  新增一個表空間用於存儲審計日誌  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  3、清除審計記錄  經過這個過程設定清除間隔  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  4、小結  a、對於Oracle 11g,審計功能默認被開啓,所以若是在必須啓用的狀況下應考慮性能影響;   b、開啓審計的狀況下,建議將審計從system或sysaux表空間剝離,使用單獨的表空間;   c、對於歷史審計日誌的清除,應考慮清除期間所帶來的性能影響;   d、調用DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION這個過程已經開始了搬遷過程,若是審計日誌很龐大,應考慮IO影響;   e、審計日誌的清除須要先設定歸檔,已歸檔的審計日誌會被清理;   f、也能夠經過trunate table aud$ reuse storage以及deallocate很是規方式來處理。   

相關文章
相關標籤/搜索