柳 俊
(武漢船舶職業技術學院電氣與電子工程學院,湖北武漢 430050)
作為一個優秀的大型數據庫管理系統,oracle在國民經濟建設與管理中已具有廣泛應用,銀行、郵電、稅務、保險等部門大多采用該數據庫來進行業務數據管理。然而數據安全問題也是各個大型系統的重中之重。近年來,我國一些大型系統數據安全得不到保證而造成的損失也是屢見不鮮。大型數據庫系統除了能支撐業務系統的正常運行外,還要求數據庫系統有較高的可靠性、保密性、可控性和可跟蹤性,對數據庫系統的各種操作是在有監控的條件下進行的,同時,對重要數據的操作也要保留歷史痕跡。這樣,當出現了重大的涉密業務辦理失誤,需要進行責任追查認定時,數據庫級別的審計功能可以有效地配合應用系統層審計記錄,進一步提高審計的強度,從而為事后追蹤和責任認定提供有力的審計證據。
從Oracle 9i開始,引入了一個新的安全特性——Auditing(Oracle 9i審計特性)。Oracle 9i審計特性為我們提供了監視和記錄數據活動的功能,通常用于監視重要的數據庫活動和收集特定的數據庫活動信息。利用該特性,我們可以實現對數據庫系統的操作進行記錄以及對特定重要業務數據表的控制,甚至可以實現應用系統的操作與數據庫動作的關聯。通常審計記錄可存儲在數據字典表(稱為審計記錄;存儲在system 表空間中的SYS.AUD$表中,可以通過視圖dba_audit_trail查看)。
審計意味著捕獲并存儲關于系統上所發生情況的信息,這會增加系統必須執行的工作量。審計必須有重點,所以只捕獲有意義的事件。如果審計重點設置適當,則會最大程度地減少對系統性能的影響,否則會對系統性能產生明顯的影響。默認情況下,為了提高數據庫系統的性能,審計特性是關閉的,如果需要開啟審計功能,需要設置audit_trail參數的值,該操作可以通過管理控制臺來實現,也可以通過修改初始化參數文件init.ora實現。
強制性審計是指不管其它審計選項參數如何設置,所有oracle數據庫都會審計特定的操作。由于數據庫需要記錄諸如系統啟動和關閉等數據庫活動,所以存在強制性審計日志。當數據庫啟動的時候,強制產生了一條審計記錄,列出了啟動數據庫實例的系統用戶名,系統終端的ID、時間,同樣在數據庫關閉的時候也會強制產生這樣一條類似的記錄。例如:ACTION:’CONNECT DATABASE USER:’/’ PRIVILEGE:SYSDBA CLIENT USER:LJ\liu CLIENT TERMINAL:LJ DATA:2010-11-01TIME:14:28:15
標準數據庫審計是一種功能強大而又靈活的數據庫審計技術,可以通過使用AUDIT_TRAIL初始化參數在系統級別設置的。啟用審計后,可選擇審計的對象和權限。標準數據庫審計流程如圖1所示。

圖1 標準數據庫審計流程
在制定審計選項時,Oracle 11g數據庫提供了4個標準的審計選項。
審計SQL 語句是對數據庫對象操作的sql語句進行審計。例如:AUDIT table;該語句可審計影響表的任何數據定義語言(DDL)語句,包括CREATE TABLE、DROP TABLE 和TRUNCATE TABLE等。除此之外還可以按照用戶名或者按成功或失敗來設置重點審計的SQL語句:
SQL>AUDIT TABLE BY liu WHENEVER NOT SUCCESSFUL;
審計系統權限可用來審計行駛的任何系統權限。例如:AUDIT drop any table,create any trigger;該語句將會對系統行駛了刪除表或者創建了trigger的權限時會創建一個審計記錄。
審計對象權限可用來審計關于表、視圖、過程、序列、目錄和用戶定義數據類型的操作。例如:AUDIT UPDATA,DELETE on liu.employees;該語句用來審計用戶liu的employees表的更新和刪除操作。
網絡審計可用來審計指定的相關網絡協議和網絡層的意外錯誤。
進行數據庫審計時會記錄審計對象中發生的插入、更新和刪除操作,但是不會捕獲實際更改實際值。基于值審計擴展了數據庫審計的功能,它能夠捕獲更改的實際值。基于值審計時利用了數據庫觸發器。用戶在連接了相應觸發器的表中插入、更新或刪除數據時,觸發器通過后臺工作將審計信息復制到用于包含審計信息的表中。因為審計觸發器代碼在每次插入、更新或刪除操作時都必須執行,所以與標準數據庫審計相比,使用基于值審計時,性能下降幅度比較大,性能下降幅度取決于觸發器代碼的效率。只在標準數據庫審計捕獲的信息不足的情況下,才會使用基于值審計。
基于值審計的關鍵在于審計觸發器。典型的審計觸發器如下:
CREATE OR REPLACE TRIGGER system.department_audit
AFTER UPDATE OF department
ON hr.department
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF:old.department!=new.department THEN
INSERT INTO system.audit_employees
VALUES(sys_context(‘userenv’,’os_user’),sysdate,sys_context(‘userenv’,’ip_address’),:new.employee_id||’department changed from’||:old.department||’to‘||:new.department);
END IF
END;
這個觸發器將審計的重點設置為捕獲的hr.employees表所在部門列的更改。更改某行后,觸發器就會檢查部門列。如果新舊部門不同時,那么觸發器會在audit_employees表中插入一條審計記錄。審計記錄中包括了用戶名、執行更改的IP地址、標識被更改記錄的主鍵及更改的實際部門的值。
標準數據庫審計和基于值審計允許在宏觀級別上跟蹤用戶在對象上的操作,但是簡單的select語句是不操縱數據的,它們既不啟動觸發器,我們也難以在海量的日志文件中找到相關的數據。現階段oracle11g數據庫中提供了細粒度審計解決了這些問題。與標準數據庫審計和基于值數據庫審計相比,FGA 對審計功能進行了擴展,它可以將重點審計的范圍設置得更窄。
FGA 可以按表或視圖中的單個列設置重點,也可以設置相應的條件,以便在符合特定的條件下捕獲審計記錄。同時,FGA 還支持多個相關列。
dbms_fga.add_policy(
object_schema=>‘hr’,
object_name=>‘employees’,
policy_name=>‘audit_emps_salary’,//創建FGA 策略命名
audit_condition=>‘department_id=10’,//設置FGA 審計的條件
audit_column=>‘salary’,//設置FGA 審計的列
handler_schema=>‘secure’,
handler_moudle=>‘log_emps_salary’,//
statement_types=>‘select’//設置FGA審計的DML語句
);
通過以上對數據庫的細粒度設置,當系統發生了以下兩個sql語句后,
(1)select name,job_id from employees;
(2)select name ,salary from employees where department_id=10;
語句(1)并不能創建任何的審計記錄,而語句(2)將創建審計記錄,并通過secure.log_emps_salary過程將審計日志信息寫到log里面。
具有SYSOPER 或SYSDBA 權限的用戶,不論以操作系統認證還是以數據庫認證的方式連接到數據庫時,都強制產生一條審計記錄,提供用戶的賬戶信息。當這些用戶關閉數據庫時這些用戶可能做了更改,所以這些權限審計線索必須存儲在數據庫外部。強制審計只是對sys用戶連接數據庫的過程進行審計,如果要對sys用戶的操作進行審計,可以使用初始化參數AUDIT_SYS_OPERATIONS啟用管理員的操作審計。默認情況下AUDIT_SYS_OPERATIONS為false,不對管理員的操作進行審計。若要啟用管理員操作的審計,執行下列命令后重起數據庫,即可打開管理員操作的審計。Alter system set audit_sys_opemtions=true scope=spfile Sys用戶的審計記錄寫入到操作系統文件,而不寫人數據庫的SYS.AUD$表中。
對oracle數據庫的每個操作首先記錄在日志文件中,日志中記錄的信息包括:數據庫的更改歷史、更改類型(INSERT、UPDATE 、DEELTE 、DDL等)、更改對應的SCN 號、以及執行這些操作的用戶信息等,通過分析各個時間段的日志文件內容,可以查看數據庫的各種操作。因此可以使用logmnr對數據庫的dml、ddl操作進行審計,缺點是不能對select操作審計。要查看日志文件的內容,用logmnr工具格式化日志文件,Logmnr生成的信息存儲在V$LOGMNR_CONTENTS視圖中,其中的信息非常豐富。
Oracle數據庫審計是數據庫安全管理的重要環節,安全管理人員應根據數據庫的安全需要,設計合理的審計方案,過多的審計選項不但產生很多無用信息,還會影響數據的性能;過少的審計選項不能滿足數據庫安全需要。另外,對于審計記錄的保護,防止審計信息的丟失和篡改,確保審計記錄的安全也是重要的工作;如何從大量的審計記錄中挖掘出有用信息,也是一個值得考慮的問題。
1 趙仲盂,陳劍.網絡內容安全分析與對策[J].計算機工程,2002,28(5):41-43
2 周洪,吳張剡,柏文陽.安全審計系統的設計與實現[J].計算機應用研究,2004(7)
3 竹勇,葉水生.oracle9i數據庫的安全管理機制[J].計算機技術與發展,2006,16(6)
4 曹暉,王青青.一種新型的數據庫安全審計系統[J].計算機工程與應用,2007.5