Oracle 審計功能(Oracle10g)
· 1、什麼是審計
審計(Audit)用於監視用戶所執行的數據庫操作,審計記錄可存在數據字典表(稱爲審計記錄:存儲在system表空間中的 SYS.AUD$表中,可通過視圖dba_audit_trail查看)或操作系統審計記錄中(默認位置爲$ORACLE_BASE/admin/$ORACLE_SID/adump/).。默認情況下審計是沒有開啓的。
當數據庫的審計是使能的,在語句執行階段產生審計記錄。
審計記錄包含:
(1)有審計的操作、
(2)用戶執行的操作、
(3)操作的日期和時間等信息。
不管你是否打開數據庫的審計功能,以下這些操作系統會強制記錄:用管理員權限連接Instance;啓動數據庫;關閉數據庫。
Oracle審計功能
審計是對選定的用戶動作的監控和記錄,通常用於:
監視和收集關於指定數據庫活動的數據。例如:DBA可收集哪些被修改、執行了多少次邏輯的I/O等統計數據。
ORACLE所允許的審計選擇限於下列方面:
審計相關的表安裝、轉移
安裝後要重啓數據庫
將審計相關的表移動到其他表空間
由於AUD$表等審計相關的表存放在SYSTEM表空間,因此爲了不影響系統的性能,保護SYSTEM表空間,最好把AUD$移動到其他的表空間上。可以使用下面的語句來進行移動:
sql>connect / as sysdba;
sql>alter table aud$ move tablespace <new tablespace>;
sql>alter index I_aud1 rebuild online tablespace <new tablespace>;
SQL> alter table audit$ move tablespace <new tablespace>;
SQL> alter index i_audit rebuild online tablespace <new tablespace>;
SQL> alter table audit_actions move tablespace <new tablespace>;
SQL> alter index i_audit_actions rebuild online tablespace <new 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
語句審計,對某種類型的SQL語句審計,不指定結構或對象。比如audit table 會審計數據庫中所有的create table,drop table,truncate table語句,alter session by cmy會審計cmy用戶所有的數據庫連接。
3.2
權限審計,當用戶使用了該權限則被審計,如執行grant select any table to a,當執行了audit select any table語句後,當用戶a 訪問了用戶b的表時(如select * from b.t)會用到select any table權限,故會被審計。注意用戶是自己表的所有者,所以用戶訪問自己的表不會被審計。 特權審計。
3.3
對象審計,對一特殊模式對象上的指定語句的審計. 如審計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
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
------------------------------------ ----------- ------------------------------
audit_file_dest
audit_sys_operations
audit_syslog_level
audit_trail
8.3 開啓審計
SQL> conn /as sysdba
SQL> show parameter audit
NAME
------------------------------------ ----------- ------------------------------
audit_file_dest
audit_sys_operations
audit_syslog_level
audit_trail
SQL> alter system set audit_sys_operations=TRUE scope=spfile;
SQL> alter system set audit_trail=db,extended scope=spfile;
開啓審計要重啓實例
SQL> show parameter audit
NAME
------------------------------------ ----------- ------------------------------
audit_file_dest
audit_sys_operations
audit_syslog_level
audit_trail
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
------------------------------------
audit_file_dest
audit_sys_operations
audit_trail
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
------------------------------------
audit_file_dest
audit_sys_operations
audit_trail
9.2 開始審計
注意:無法對 SYS 用戶操作執行 audit 或 noaudit 命令
SQL> conn
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
-------
user
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
(
);
insert into bank.accounts values(1,1,10000);
insert into bank.accounts values(2,2,20000);
commit;
Begin
dbms_fga.drop_policy (
dbms_fga.add_policy (
end;
/
select * from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text
-- 審計列和審計條件, 在add_policy中加入
--
--
Begin
dbms_fga.drop_policy (
dbms_fga.add_policy (
end;
/
select BALANCE from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text
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;
select * from
select cust_id from bank.accounts where balance < 10000; 進行審計。即使用戶沒有明確指定列 BALANCE,where 子句也隱含地選擇了它。
select cust_id from bank.accounts;
select count(*) from bank.accounts;
10.3
-- FGA 的功能不只是記錄審計線索中的事件;FGA 還可以任意執行過程。
-- 過程可以執行一項操作,比如當用戶從表中選擇特定行時向審計者發送電子郵件警告,或者可以寫到不同的審計線索中。
-- 這種存儲代碼段可以是獨立的過程或者是程序包中的過程,稱爲策略的處理器模塊。
-- 實際上由於安全性原因,它不必與基表本身處於同一模式中,您可能希望特意將它放置在不同的模式中。
-- 由於只要 SELECT 出現時過程就會執行,非常類似於 DML 語句啓動的觸發器,您還可以將其看作 SELECT 語句觸發器。
-- 以下參數指定將一個處理器模塊指定給策略:
--
--
-- 處理器模塊還可以採用程序包的名稱來代替過程名稱。在這種情況下,參數 handler_module 在 package.procedure 的格式中指定。
10.4
-- 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
10.5.1 如果您只希望審計對視圖的查詢而不是對錶的查詢,可以對視圖本身建立策略。
-- 通過將視圖名稱而不是表的名稱傳遞給打包的過程 dbms_fga.add_policy 中的參數 object_name,可以完成這項工作。
-- 隨後 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列將顯示視圖的名稱,並且不會出現有關表訪問的附加記錄。
10.6 其它用途
--
--
--
--
結論
數據字典視圖 DBA_AUDIT_POLICIES 中重要的列
-----------------------------------------------------------------------
OBJECT_SCHEMA
OBJECT_NAME
POLICY_NAME
POLICY_TEXT
POLICY_COLUMN
ENABLED
PF_SCHEMA
PF_PACKAGE
PF_FUNCTION
數據字典視圖 DBA_FGA_AUDIT_TRAIL 中重要的列
-----------------------------------------------------------------------
SESSION_ID
TIMESTAMP
DB_USER
OS_USER
USERHOST
CLIENT_ID
EXT_NAME
OBJECT_SCHEMA
OBJECT_NAME
POLICY_NAME
SCN
SQL_TEXT
SQL_BIND
結論:
1.
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
可以對所有用戶(不包含sys用戶)下的表進行insert、update、delete、select 審計。
實例:
3、對於 drop table 語句的審覈只能是 audit table;
如果僅僅是對 alter any table 系統權限進行審覈,當用戶使用 alter table 語句修改用戶所擁有的表時,是不會差生任何審覈記錄,因爲沒有用到 alter any table 系統權限。
4、AUDIT table BY ACCESS 對 drop table、alter table 和 create table 語句進行審覈。
5、若 aud$表中的數據無法刪除,則以sys用戶進行刪除;
例1:
1、查看數據庫審計狀態:
2、開啓數據庫審計功能、重啓數據庫、查看數據庫審計狀態:
3、查看審計記錄表、視圖:
select * from sys.aud$; -- 審計記錄表,可以刪除表裏面的數據;
select * from dba_audit_trail t ; -- 審計視圖,數據來源於sys.aud$ 表;
select * from dba_stmt_audit_opts;
4、數據庫審計相關的表默認在system表空間,把該表移動到其他自定義表空間:
sql>alter table aud$ move tablespace <new tablespace>;
sql>alter index I_aud1 rebuild online tablespace <new tablespace>;
SQL> alter table audit$ move tablespace <new tablespace>;
SQL> alter index i_audit rebuild online tablespace <new tablespace>;
SQL> alter table audit_actions move tablespace <new tablespace>;
SQL> alter index i_audit_actions rebuild online tablespace <new tablespace>;
5、 設置審計項目:
audit alter table (該命令包含了 alter table ).
(2)使用如下語句,
audit insert table;
audit update table;
audit delete table;
audit select table
可以對所有用戶(不包含sys用戶)下的表進行insert、update、delete、select 審計。
6、 取消審計項目:
把audit換成noaudit 即可,如:audit insert table;