一、 審計分類:
Oracle中審計總體上可分為“標准審計”和“細粒度審計”後者也稱為“基於政策的審計”,在Oracle10G之後功能得到很大增強。其中標准審計可分為用戶級審計和系統級審計。用戶級審計是任何Oracle用戶可設置的審計,主要是用戶針對自己創建的數據庫表或視圖進行審計,記錄所有用戶對這些表或視圖的一切成功和(或)不成功的訪問要求以及各種類型的SQL操作。系統級審計只能由DBA設置,用以監測成功或失敗的登錄要求、監測GRANT和REVOKE操作以及其他數據庫級權限下的操作。
二、 標准審計:
2.1 分類:
在ORACLE中分別支持以下三種標准審計類型:
u 語句審計,對某種類型的SQL語句審計,不指定結構或對象。
u 特權審計,對執行相應動作的系統特權的使用審計。
u 對象審計,對一特殊模式對象上的指定語句的審計。
這三種標准審計類型分別對如下3方面進行審計:
u 審計語句的成功執行、不成功執行,或者其兩者。
u 對每一用戶會話審計語句執行一次或者對語句每次執行審計一次。
u 對全部用戶或指定用戶的活動的審計。
當數據庫的審計功能打開後,在語句執行階段產生審計記錄。審計記錄包含有審計的操作、用戶執行的操作、操作的日期和時間等信息。審計記錄可存在數據字典表(稱為審計記錄)或操作系統審計記錄中。數據庫審計記錄是在SYS模式的AUD$表中。
2.2設置ORACLE標准審計:
下列步驟可以設置ORACLE的標准審計功能:
1. 修改初始化參數文件(init<sid>.ora)
如果使用服務器參數文件使用alter system set <parameter>=<value> scope=spfile|both,詳情參照1.1節中關於參數文件的介紹),設置 AUDIT_TRAIL參數,並且重啟數據庫。AUDIT_TRAIL的取值如下:
l DB/TRUE:啟動審計功能,並且把審計結果存放在數據庫的 SYS.AUD$ 表中
l OS:啟動審計功能,並把審計結果存放在操作系統的審計信息中
l DB_EXTENDED:具有DB/TRUE的功能,另外填寫AUD$的SQLBIND和SQLTEXT字段
l NONE/FALSE:關閉審計功能
2.設置AUDIT_TRAIL參數:
如果設置 AUDIT_TRAIL = OS, 還需要修改參數AUDIT_FILE_DEST。
如果操作系統支持設置AUDIT_TRAIL=OS,文件會自動存放在AUDIT_FILE
_DEST所指定的目錄下,並且文件名包含進程的PID。
比如:
AUDIT_FILE_DEST = $ORACLE_HOME/rdbms/audit
$ ls -l $ORACLE_HOME/rdbms/audit
-rw-rw---- 1 ora92 dba 881 Mar 17 09:57 ora_13264.aud
$ ps -ef|grep 13264
ora92 13264 13235 0 09:56:43 ? 0:00 oracleV92 (DESCRIPTION=(LOCAL=Y)
SQL> select spid, program, username from v$process;
SPID PROGRAM USERNAME
------ -------------------------------------------- -------------
...
13264 oracle@frhp11 (TNS V1-V3) ora92
3. 確認審計相關的表是否已經安裝
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表空間又足夠的空間存放審計信息。
4. 關閉並重啟數據庫
5. 設置所需要的審計信息
下面是一個例子
SQL> connect system/manager
SQL> grant audit system to scott;
SQL> connect scott/tiger
SQL> audit session;
停止審計:
SQL> noaudit session;
通常設置了標准審計後都是通過Audit語句開啟審計,使用noaudit語句收回審計。如下所示:
對修改SC表結構或數據的操作進行審計可使用如下語句:
AUDIE ALTER,UPDATE ON SC;
取消對SC表的一切審計可使用如下語句:
NOAUDIT ALL ON SC;
2.3設置審計的實例(對試圖嘗試口令的訪問的審計):
以下是一個審計的實例,用於記錄嘗試通過野蠻嘗試法破譯ORACLE帳號口令的例子:
1. 修改審計相關參數(參照上面介紹的方法)
2. 重啟數據庫
3. 設置審計信息
SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL
4. 查詢AUD$
SQL> select returncode, action#, userid, userhost, terminal,timestamp
from aud$
RETURNCODE ACTION# USERID USERHOST TERMINAL
---------- ---------- -------- -------------------- --------------------
1017 100 SCOTT WPRATA-BR
1017 100 SCOTT WPRATA-BR
1017 100 SCOTT WPRATA-BR
ORA-1017的含義為錯誤的用戶名口令。通過查看AUD$表可以清楚地看到WPRATA-BR嘗試破譯SCOTT的口令。可以通過下面一個存儲過程來分析AUD$表,找出可疑的信息:
create or replace procedure AuditLogin(Since Varchar2,Times PLS_Integer)
is
USER_ID VARCHAR2(20);
cursor c1 is select userid,count(*) from sys.aud$ where returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd')
group by userid;
cursor C2 IS Select userhost, terminal,TO_CHAR(timestamp#,'YYYY-MM-DD:HH24:MI:SS')
from sys.aud$ WHERE returncode='1017' and timestamp#>=to_date(Since,'yyyy-mm-dd') AND USERID=USER_ID;
ct PLS_INTEGER;
V_USERHOST VARCHAR2(40);
V_TERMINAL VARCHAR(40);
V_DATE VARCHAR2(40);
BEGIN
OPEN C1;
dbms_output.enable(1024000);
LOOP
FETCH C1 INTO USER_ID,CT;
EXIT WHEN C1%NOTFOUND;
IF(CT>=TIMES) THEN
DBMS_OUTPUT.PUT_LINE('USER BROKEN ALARM:'||USER_ID);
OPEN C2;
LOOP
FETCH C2 INTO V_USERhOST,V_TERMINAL,V_DATE;
DBMS_OUTPUT.PUT_LINE(CHR(9)||'HOST:'||V_USERHOST||',TERM:'||V_TERMINAL||',TIME:'||V_DATE);
EXIT WHEN C2%NOTFOUND;
END LOOP;
close c2;
END IF;
END LOOP;
close c1;
END;
/
一下是執行結果:
SQL>set serveroutput on;
SQL> execute auditlogin('2004-01-01',2);
USER BROKEN ALARM:SYS
HOST:,TERM:XUJI,TIME:2004-09-22:11:08:00
HOST:,TERM:XUJI,TIME:2004-09-22:11:08:01
HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29
HOST:,TERM:XUJI,TIME:2004-09-22:11:09:29
PL/SQL 過程已成功完成。
2.4將審計相關的表移動到其他表空間:
由於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>;
三、 細粒度審計:
細粒度審計 (FGA)(通過 Oracle9i 引入)可以理解為“基於政策的審計”。與標准的審計功能相反,FGA 可用於指定生成審計記錄必需的條件:
FGA 政策通過使用“dbms_fga”程序包以編程方式綁定到對象(表、視圖)。類似於用於通過 VPD ("dbms_rls") 進行訪問控制的程序包,它允許您創建任何需要的條件,例如:僅當以下條件為真時審計事件:
· 在早上九點到下午六點之間或在星期六和星期日對某個表進行了訪問。
· 使用了公司網絡外部的某個 IP 地址。
· 選定或更新了特定列。
· 使用了該列的特定值。
這將創建更有意義的審計線索,因為無需記錄每一個人對表的每一次訪問。從 Oracle 數據庫 10g 開始,FGA 支持在一個策略中使用“選擇”、“插入”、“更新”和“刪除”語句的任意組合。事實上,綁定到表的 FGA 政策簡化了審計政策的管理,因為這將只需在數據庫中對其更改一次,不用在每個應用程序中一次次進行。此外。無論用戶通過何種方式連接至數據庫(通過應用程序、Web 接口或通過 SQL*Plus),其操作都會記錄下來。
3.1 使用細粒度審計:
1、創建測試表:
create table ACCOUNT
(AACT_NO number not null,
CUST_ID number not null,
BALANCE number(15,2)
);
2、添加審計策略:
begin
DBMS_FGA.DROP_POLICY(object_schema => 'TEST',
object_name => 'ACCOUNT',
policy_name => 'ACCOUNT_ACCESS');
end;
這段代碼必須由具有執行程序包 dbms_fga 權限的用戶來執行。建議應該建立一個專門的用戶來專門負責添加審計策略。該過程有許多參數,具體含義如下:
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
處理器模塊的過程名稱(如果存在)
3、在定義了策略以後,當用戶以通常的方式對表進行查詢時,如下所示:
select * from bank.accounts;
審計線索記錄此操作。可以使用以下語句查看線索:
select timestamp,
db_user,
os_user,
object_schema,
object_name,
sql_text
from dba_fga_audit_trail;
TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT
--------- ------- ------- ------- -------- ----------------------
26-MAR-10 TEST ananda TEST ACCOUNT select * from account
注意名為 DBA_FGA_AUDIT_TRAIL 的新視圖,它記錄細粒度的訪問信息。其中顯示了審計事件的時間標記、查詢者的數據庫用戶 ID、操作系統用戶 ID、查詢中所使用表的名稱和所有者,最後還有確切的查詢語句。
3.2 審計列和審計條件:
默認情況下會對被審計對象的所有列開啟審計,當任何一列被訪問時都會紀錄一條審計信息,這在現實情況下不太常見,因為這樣會使審計信息表增長過快造成存儲空間的壓力,因此通常都會設置審計條件,當條件觸發時再發起審計。例如我們可以對Account表的Balance列設置審計條件,當訪問該列並觸發審計條件時才進行審計。如下所示:
begin
dbms_fga.add_policy (
object_schema=>'TEST',
object_name=>'ACCOUNT',
policy_name=>'ACCOUNT_ACCESS',
audit_column => 'BALANCE',
audit_condition => 'BALANCE >= 11000'
);
end;
該策略將在訪問BALANCE列並且只有訪問列值大於等於11000時才發起審計。因此根據該條件戶有如下不同審計狀態:
SQL 語句
審計狀態
select balance from account;
進行審計。用戶選擇了在添加策略時所指定的審計列 BALANCE。
select * from account;
進行審計。即使用戶沒有明確指定列 BALANCE,* 也隱含地選擇了它。
select cust_id from account where balance < 10000;
進行審計。即使用戶沒有明確指定列 BALANCE,where 子句也隱含地選擇了它。
select cust_id from account;
不進行審計。用戶沒有選擇列 BALANCE。
select count(*) from account;
不進行審計。用戶沒有明確或隱含地選擇列 BALANCE。
3.3優化器模式:
FGA 需要基於成本的優化 (CBO),以便正確地工作。在基於規則的優化時,只要用戶從表中進行選擇,無論是否選擇了相關的列,都始終生成審計線索,增加了誤導項目出現的可能性。為使 FGA 正確地工作,除了在實例級啟用 CBO 之外,在 SQL 語句中應該沒有規則暗示(hint),並且必須至少使用評估選項對查詢中的所有表進行分析。
3.4管理 FGA 策略:
要刪除策略,您可以使用以下語句:
begin
dbms_fga.drop_policy (
object_schema => 'TEST',
object_name => 'ACCOUNT',
policy_name => 'ACCOUNT_ACCESS'
);
end;
對於更改策略而言,沒有隨取隨用的解決方案。要更改策略中的任何參數,必須刪除策略,再使用更改後的參數添加策略。但是可以暫時禁用已有策略,如下所示:
begin
dbms_fga.enable_policy (
object_schema => 'TEST',
object_name => 'ACCOUNT',
policy_name => 'ACCOUNT_ACCESS',
enable => FALSE
);
end;
若要重新啟用它,可使用同一函數,只需將參數 enable 設置為 TRUE。
3.5 FGA 數據字典視圖:
FGA 策略的定義位於數據字典視圖 DBA_AUDIT_POLICIES 中。該市途中各列含義如下:
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 語句使用的綁定變量(如果存在)
3.6視圖和 FGA:
假定在 ACCOUNTS 表上定義視圖 VW_ACCOUNT 如下:
create view vw_account as select * from account;
現在,如果用戶從視圖中而不是從表中進行選擇:
select * from vw_account;
您將看到以下審計線索:
select object_name, sql_text from dba_fga_audit_trail;
OBJECT_NAME SQL_TEXT
----------- -------------------------------------------------
ACCOUNT select * from vw_account
注意,是基表名稱而不是視圖名稱出現在 OBJECT_NAME 列中,因為視圖中的選擇是從基表中進行選擇。但是,SQL_TEXT 列記錄了用戶提交的實際語句。
如果只希望審計對視圖的查詢而不是對表的查詢,可以對視圖本身建立策略。通過將視圖名稱而不是表的名稱傳遞給打包的過程 dbms_fga.add_policy 中的參數 object_name,可以完成這項工作。隨後 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列將顯示視圖的名稱,並且不會出現有關表訪問的附加記錄。