共計 11595 個字符,預計需要花費 29 分鐘才能閱讀完成。
如何理解 orcle 審計策略,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Oracle 審計功能
一、 審計分類:
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 列將顯示視圖的名稱,并且不會出現有關表訪問的附加記錄。
3.7 其它用途:
除了記錄對表的選擇訪問,FGA 還可用于某些其它情況:
可以對數據倉庫使用 FGA,以捕獲特定的表、視圖或物化視圖上發生的所有語句,這有助于計劃索引。不需要到 V$SQL 視圖去獲取這些信息。即使 SQL 語句已經超出了 V$SQL 的期限,在 FGA 審計線索中將會始終提供它。
由于 FGA 捕獲綁定變量,它可以幫助了解綁定變量值的模式,這有助于設計直方圖集合等。
可以向審計者或 DBA 發送警告,這有助于跟蹤惡意應用程序。
由于 FGA 可以作為 SELECT 語句的觸發器,可以在需要這種功能的任何時候使用它。
3.8 FGA 在 10G 中的增強:
3.8.1 對所有 DML 的審計:
在 9i 中 FGA 只能對 Select 語句進行審計,而不能對其他 DML 語句(Update、Delete、Insert)進行審計,如果想對其他 DML 語句進行審計那么只能采取數據庫處發起的形式來實現。在 10G 中實現了對所有 DML 語句的審計,如下所示:
begin
dbms_fga.add_policy (
object_schema = TEST ,
object_name = ACCOUNT ,
policy_name = ACCOUNT_ACCESS ,
audit_column = BALANCE ,
audit_condition = BALANCE = 3000,
statement_types = INSERT, UPDATE, DELETE, SELECT
);
end;
通過 statement_types = INSERT, UPDATE, DELETE, SELECT 參數制定了新的策略,該策略可以對 Select 之外的所有 DML 操作進行審計。因此根據新的審計條件和審計策略會有如下不同情況:
第 1 種情況
之前:BALANCE = 1000
用戶發出:
update account set balance = 1200 where ACCOUNT_NO = ….
舊的和新的 balance 都小于 3,000,審計條件不滿足;因此這條語句將不會被審計。
第 2 種情況
之前:BALANCE = 1000
用戶發出:
update account set balance = 3200 where ACCOUNT_NO = ….
新的 balance 大于 3,000,審計條件滿足;因此這條語句將 會被審計。
第 3 種情況
之前:BALANCE = 3200
用戶發出:
update account set balance = 1200 where ACCOUNT_NO = ….
新的 balance 小于 3,000,但舊的 balance 大于 3,000。因此審計條件滿足,這條語句將被審計。
第 4 種情況
用戶插入一行,其中有 BALANCE 3000。
insert into account values (9999,1200, X
因為 balance 1,200 不滿足審計條件,所以這條語句不被審計。如果 balance 列大于或等于 3,000,它將被審計。
第 5 種情況
用戶插入一行,其中 balance 的值為空。
insert into account (account_no, status) values (9997, X
因為 balance 為空,該列沒有任何默認值,所以審計條件不滿足(比較 NULL = 3000 結果為 FALSE),這條語句不會被審計。重要注意事項:假設該列有一個大于 3,000 的默認值時,這條語句仍然不會被審計,即使插入行的 balance 列值大于 3000。注意對于 DML 語句的審計是由一個自動事務插入的;即使回滾 DML 語句的操作,審計記錄也將存在不會跟著回滾。
3.8.2 制定
在表 ACCOUNT 上定義的一個策略,如下:
begin
dbms_fga.add_policy (
object_schema = TEST ,
object_name = ACCOUNT ,
policy_name = ACCOUNT_SEL ,
audit_column = ACCOUNT_NO, BALANCE ,
audit_condition = BALANCE = 3000 ,
statement_types = SELECT
);
end;
在某些情況下,列的組合可能很重要,而不是某個特定的列。以上策略是在 ACCOUNT_NO 和 BALANCE 上定義的。那么如果用戶發出以下語句:
select balance from accounts where account_no = 9995;
這條語句將被審計,因為 balance 列被選中,且余額為 3,200,大于 3,000,滿足審計條件。
如果一個用戶想查出在銀行的總余額,他發出:
select sum(balance) from account;
這條查詢幾乎沒什么害處;它不明確指出帳戶所有者和帳戶余額。因此安全策略可能不會要求審計這條查詢。不過,這條查詢
select balance from account where account_no = 9995
必須被審計;因為它明確地指定了一個帳戶。默認地,所有語句都被審計(無論使用了什么樣的列組合)。這將創建大量不需要的審計線索項目,并可能帶來一些空間限制問題。為了限制它們,您可以指定僅當在查詢中使用了希望的列組合時才開始審計。當定義策略時,您可以使用一個新的參數:
audit_column_opts = DBMS_FGA.ALL_COLUMNS
這個參數將使策略僅當列 ACCOUNT_NO 和 BALANCE 在查詢中都被訪問時才創建審計線索項目。例如,以下查詢將產生一個審計線索項目。
select account_no, balance from account;
但這條查詢不會產生審計線索項目。
select account_no from account;
使用這個參數將把審計的數量限制在一個更易管理的大小。如果希望采用默認的行為 — 即任意列被選中時都進行審計,那么您可以對同一參數的使用不同值。
audit_column_opts = DBMS_FGA.ANY_COLUMNS
3.8.3 與標準審計的結合:
通過制定如下審計策略實現標準審計與細粒度審計的結合
begin
dbms_fga.add_policy (
object_schema = TEST ,
object_name = ACCOUNT ,
policy_name = ACCOUNT_SEL ,
audit_column = ACCOUNT_NO, BALANCE ,
audit_condition = BALANCE = 3000 ,
statement_types = SELECT ,
audit_column_opts = DBMS_FGA.ALL_COLUMNS,
audit_trail = DB
);
end;
通過指定 audit_trail = DB 參數實現在細粒度審計時開啟標準審計。在 Oracle Database 10g 中,標準審計也得到了巨大的改進。通過 AUDIT 命令執行標準審計,它現在能夠捕獲大量其它有用的信息。在內容和功能方面,標準審計類似于細粒度審計。然而,作為一個數據庫管理員,有興趣知道所有的審計項目,而不只是一個審計項目。一個新的視圖,DBA_COMMON_AUDIT_TRAIL,結合了標準審計線索和 FGA 審計線索。用以下查詢來檢查它們二者如:
select * from dba_common_audit_trail; 通過這條查詢可以同時查看兩種審計收集的信息。
四、FGA 審計和標準審計的差異:
標準審計必須用參數 AUDIT_TRAIL 在數據庫級啟用。這個參數不是動態的;您必須重啟數據庫來使其生效。相比而言,FGA 不需要任何參數修改。
一旦被設置在一個對象上,標準審計將保持在那里。要解除它,必須用 NOAUDIT 命令刪除審計選項。這可能很不方便,因為在一個表上丟棄審計選項也將丟棄元數據信息。然而,FGA 可以臨時禁用和啟用,不丟失任何元數據信息。
FGA 只能夠處理四種類型的語句:SELECT、INSERT、UPDATE 和 DELETE。相比而言,常規審計可以處理其它許多語句和權限,甚至會話連接和斷開。
標準審計每次會話只創建一條記錄(按會話)或每次訪問對象創建一條記錄(按訪問)這種占用資源很少的方式對于控制審計線索表中的空間非常重要。FGA 并不是同樣節省資源;它每次訪問運行一次 — 使得線索更大。
通過記錄線索,標準審計可以用來檢測任何中斷企圖,如果企圖沒有成功,則將產生錯誤代碼。而 FGA 不能。
標準審計可以寫數據庫表或 OS 文件。后者在審計員(不是數據庫管理員)能夠訪問線索時非常有用。在 Windows 下,非數據庫審計線索記錄在事件日志中,并且可以用不同的方式對其進行訪問。這個選項保護了審計線索的完整性。然而,FGA 日志僅寫到數據庫表 FGA_LOG$ 中。可以在 FGA 中創建用戶自定義的審計處理程序來寫 OS 文件,但它們的完整性不能保證。
標準審計可以設置用于默認對象。當表是在運行期創建時,這個功能變得極為有用:默認的審計選項允許沒有數據庫管理員干預的審計。這在 FGA 中是不可能的,用戶必須在一個現有的表上創建策略,上述的情況只能在表已創建之后才可能發生。
在 FGA 中,審計更加靈活 — 僅當訪問某些列,當某個特定的條件為真時等等。這種多功能性在您需要控制線索的增長時非常方便。
在 FGA 中,SQL 賦值變量默認被捕獲。在標準審計中,必須把初始化參數 audit_trail 設為 db_extended,以啟用這一功能。
權限差異:標準審計需要審計系統或語句權限;FGA 只需要 dbms_fga 程序包上的運行權限。
關于如何理解 orcle 審計策略問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。