在大型的資訊系統開發中,我們往往選擇功能強大的資料庫系統作為應用層的資料存儲,除了支撐業務系統的正常運作外,還要求資料庫系統有較高的可靠性、保密性、可控性和可跟蹤性,對資料庫系統的各種操作是在有監控的條件下進行的,同時,對重要資料的操作也要保留曆史痕迹,這樣,當出現了重大的涉密業務辦理失誤,需要進行責任追查認定時,資料庫級别的審計功能可以有效地配合應用系統層審計記錄,進一步提高審計的強度,進而為事後追蹤和責任認定提供有力的審計證據。同時,應用系統層的某些審計功能的實作也需要資料庫審計特性的輔助來實作。
Oracle 資料庫系統被應用于很多大型的資訊系統中,為應用系統提供了良好的資料庫存儲支援和廣泛的安全特性以保護使用者的資訊免受未經授權的通路及有意或無意的破壞。這種安全性是在使用者到使用者,權限到權限的基礎上通過授予或撤消權限來提供的,并且是附加于但又獨立于使用者的計算機系統本身已有的安全機制之上。在實作了權限配置設定的基礎上,應用中又面臨着實時跟蹤被使用的系統資源與資料庫資源,監測使用者對資料庫的行為的問題,這就是大型資料庫管理系統所必需的審計功能。
從Oracle 9i開始,引入了一個新的安全特性——Auditing(Oracle 9i審計特性)。Oracle 9i審計特性為我們提供了監視和記錄資料活動的功能,通常用于監視重要的資料庫活動和收集特定的資料庫活動資訊。利用該特性,我們可以實作對資料庫系統的操作進行記錄以及對特定重要業務資料表的控制,甚至可以實作應用系統的操作與資料庫動作的關聯。
<a>開啟審計特性</a>
預設情況下,為了提高資料庫系統的性能,審計特性是關閉的。如果需要開
啟審計功能,需要設定audit_trail參數的值為 ‘DB’,該操作可以通過管理控制台來實作,也可以通過修改初始化參數檔案init.ora實作,但是即使這樣,我們仍舊不能做到對審計特性的即時開關,因為audit_trail是一個靜态參數,需要在下一次資料庫系統重新啟動後才能生效。修改該參數并重新啟動資料庫後,可以在通過如下指令來查詢審計特性是否已開啟:
SQL> show parameter audit_trail;
NAME TYPE VALUE
------------------------------------ ----------- ------------
audit_trail string DB
audit_trail 參數的值可以設定為以下幾種:
1. NONE:不開啟審計功能
2. DB:開啟審計功能,并将審計記錄儲存在資料庫系統提供的審計視圖内,要求用于審計功能實作的視圖已經建立。
3. OS:審計記錄寫入一個作業系統檔案。
4. TRUE:與參數DB效果等同
5. FALSE:不開啟審計功能。
Oracle 9i提供了一個二進制伺服器參數檔案(spfile)來管理初始化參數,這是一個另人激動的新特性。通過spfile,我們就可以使用alter system或者alter session指令動态地改變所有的參數,盡管有些靜态參數不能夠馬上生效,但是可以修改到spfile中,将在資料庫下次重新啟動後生效。
可以通過如下方式建立SPFILE:
SQL> startup pfile=‘C:\Oracle\admin\orcl\pfile\init.ora';
SQL> create spfile from pfile;
這樣,SPFILE就建立成功了,但是不能以同樣的方式指定spfile來啟動資料庫,Oracle 9i提供了一種變通的方法,即可以建立一個包含spfile參數的pfile檔案,指向spfile,如下是一個pfile檔案的内容:
這樣,我們在啟動時指定pfile,實際上就實作了以SPFILE檔案啟動資料庫的操作,同時,在該pfile檔案中,還可以指定其他的參數,如果出現與SPFILE中重複的參數設定,那麼,後出現的參數設定将覆寫先前的設定。
采用如上方式啟動資料庫後,你就可以使用alter system指令來改變任何一個初始化參數。
SQL> alter system set audit_trail = ‘DB’ scope=spfile;
這裡,需要對重要的scope參數引起注意。
scope參數具有三個值:
1. spfile: 在spfile中改變一個參數而不影響目前的執行個體。
2. memory:僅将改變應用于目前執行個體。
3. both:立即執行改變,并永久地使用改變。
在使用spfile啟動資料庫後,我們就可以在系統應用層通過業務邏輯來實作
對audit_trail參數的修改,該修改将在下一次重新啟動資料庫後生效,進而,我們可以不手動修改init.ora檔案,并在應用系統層實作對審計開關的控制。如下所示将在資料庫重新啟動後關閉審計開關:
PreparedStatement ps = db.getConnnection().prepareStatement(
"alter system set audit_trail='NONE' scope=spfile");
ps.execute();
Oracle審計特性提供了三種級别的審計,分别是語句級、權限級和實體級,同時,我們還可以配合使用觸發器來實作特定的細粒度的審計功能實作,以到達互補的效果,提供更全面和強有力的審計證據支援。
l 語句級審計
語句級審計表示隻審計某種類型的SQL語句,可以審計某個使用者,也可以審計所有使用者的SQL語句,其文法如下:
SQL>Audit SQL語句或選項
[by 使用者名] --表示隻審計指定使用者的SQL語句,不審計其他使用者的SQL語句
[by session/access] --by session:每個會話相同語句隻審計一次,系統預設;
by access:每次都将審計
Whenever [NOT] Successful;--隻審計(不)成功的語句
SQL語句或選項參數不需要寫出全部的SQL語句,隻需要寫出語句的選項即可,這樣可以代表某一類的SQL語句。例如:
audit table by bjmiadmin by access
當使用者執行Create Table;Drop Table;Truncate Table等與table相關的操作時,系統會自動記錄這些過程,将其儲存在相應的資料字典中。我們可以通過查詢資料字典DBA_STMT_AUDIT_OPTS來檢視具體的語句級審計實施細節。
如果我們不需要再進行審計,可以通過Noaudit指令取消審計,如:
noaudit table by bjmiadmin by access
l 權限級審計
權限級審計表示隻審計某一系統權限的使用狀況,可以審計某個使用者,也可以審計所有使用者,其文法如下:
SQL>Audit 權限名稱
[by 使用者名] --表示隻審計指定使用者的SQL語句,不審計其他使用者的SQL語句
by access:每次都将審計
權限名稱包含了大部分的對資料庫對象的DDL操作,如alter,create,drop等等。例如:
audit delete any table
該指令将對任何使用者的删除表的操作進行記錄。如果想知道目前對哪些使用者進行了哪些權限級别的審計,可以通過查詢資料字典DBA_PRIV_AUDIT_OPTS來了解細節。
如果不需要再對使用者進行系統權限的審計,那麼可以使用noaudit指令取消對使用者所進行的權限審計,如:
noaudit delete any table
l 實體級審計
實體級審計用于監視所有使用者對某一指定使用者表的存取狀況,實體級審計是不分使用者的,其重點關注的是哪些使用者對某一指定使用者表的操作,其文法如下[16]:
SQL>Audit 實體選項 ON Schema 實體名稱
各選項範圍與語句級及權限級審計相同,例如:
audit update on bjmiadmin.deptinfo whenever successful
該指令将對bjmiadmin.deptinfo的更新操作進行記錄。如果想知道目前對哪些使用者的哪些實體進行了實體級審計及審計的選項,可以通過查詢資料字典DBA_OBJ_AUDIT_OPTS來了解實施細節。
如果不需要再對使用者進行系統權限的審計,那麼可以使用noaudit指令取消對實體審計,如:
noaudit update on bjmiadmin.deptinfo
l 觸發器
觸發器是一種特殊的過程,與普通的過程不同的是,觸發器不需要顯示調用,而是當某些事件發生時,由資料庫系統自動執行。觸發器的構成包括[17]:
觸發事件:引起觸發器被觸發的事件,如insert、update等DML語句或者create、alter、drop等DDL語句,資料庫系統事件或者使用者事件等等。
觸發條件:由WHEN子句指定的一個邏輯表達式,隻有當該表達式為TRUE時,遇到觸發器事件才會自動執行觸發器。
觸發對象:包括表、視圖、模式和資料庫。
觸發操作:觸發器定義的過程。
在BJMI電子政務安全審計系統中,我們綜合利用了多種觸發器類型,如DDL觸發器(對所有使用者的DDL操作進行審計)、DML觸發器(對重要的表和視圖的DML操作進行審計,儲存資料的曆史和更新)、系統事件觸發器(記錄系統啟動、退出或異常錯誤等)、使用者事件觸發器(使用者登入系統或退出系統的動作)等。如下是實作系統事件審計的觸發器
CREATE OR REPLACE TRIGGER BJMIADMIN.AUDIT_DB_STARTUP_TRIGGER
AFTER STARTUP ON DATABASE
BEGIN
INSERT INTO BJMIADMIN.AUDIT_DBLOG
VALUES(SYSDATE,'STARTUP');
END;
資料庫關閉觸發器:
CREATE OR REPLACE TRIGGER BJMIADMIN.AUDIT_DB_SHUTDOWN_TRIGGER
BEFORE SHUTDOWN ON DATABASE
VALUES(SYSDATE,'SHUTDOWN');
通過以上觸發器的配置,我們可以得到資料庫系統的啟動和關閉動作的日志,對資料庫系統的運轉情況可以實作曆史檢視。這些曆史記錄将在應用系統層提供給審計管理者進行檢視。
針對采取的審計政策不同,審計日志也應當分别采用不同的存儲政策進行存儲。采用Oracle 9i審計特性實作的審計功能,如語句級、權限級和實體級審計記錄将儲存在系統視圖裡;利用觸發器實作的審計功能擷取的日志可以儲存在自定義的資料庫表中。
将審計結果都将儲存在資料庫系統中,具有良好的格式,可以對審計日志進行分析和挖掘,非常容易維護,同時,我們可以利用資料庫系統的安全性對日志進行保護和管理。當然,考慮性能原因,我們可以進行自定義的審計實作,隻審計重要的業務表,而不是對所有的表都進行審計,這就要求對需求的透徹分析進而确定優良的資料庫審計方案。
Oracle 9i定義了格式良好的審計視圖來儲存開啟審計功能後産生的審計記錄。這些視圖包括:AUD$,DBA_AUDIT_OBJECT, DBA_AUDIT_TRAIL, DBA_AUDIT_SESSION等。系統定義的視圖為我們提供了詳細的審計資訊,如:SESSIONID,ENTRYID,STATEMENTID,USERID,USERHOST,TERMINAL等,包含了資料庫會話ID,用戶端詳細資訊,時間戳等等,我們可以從中選擇适應于審計需求的資訊。
自定義審計主要根據特定的需要而編寫觸發器來實作,如果我們需要對系統事件,如資料庫系統的啟動和關閉,可以編寫如下的觸發器來實作,當然,為了存儲審計日志,我們需要建立資料庫表來存儲日志。入下是建立用于存儲資料庫系統啟動/關閉日志的字定義審計表,該表的審計日志資料由上文的觸發器而得到:
CREATE TABLE BJMIADMIN.AUDIT_DBLOG(
TIME DATE,--登入時間
ACTION VARCHAR2(20)--動作
)
TABLESPACE "BJMIGYJ" ;--表空間
自定義審計表具有很大的靈活性,我們可以根據審計需求,有針對性地設計審計表,配合觸發器來得到審計日志。
如何實作應用層操作和資料庫動作的關聯
通過研究Oracle資料庫系統的<code>SYS_CONTEXT</code>來關聯應用層動作和資料庫的動作。USERENV是Oracle提供的一個命名空間,用來儲存目前的會話資訊。我們在進行審計日志的采集的同時,可以通過Oracle資料庫系統提供的<code>SYS_CONTEXT</code> ('USERENV', 'SESSION_ID')來得到資料庫的會話ID,然後将資料庫會話ID也作為審計日志的一個列屬性進行存儲,這樣,應用層的日志就存儲了資料庫會話ID。而我們的資料庫層審計,會話ID也是一個必不可少的審計資訊,這樣,通過會話ID的關聯,我們就可以把應用層的動作和資料庫系統的相應資料處理動作關聯起來,這也更加增強了審計的強度。
另外,我們還可以通過以下方式進行關聯——使用CLIENT_IDENTIFIER。
應用程式上下文是一組可用于資料庫會話的名字/值對。Oracle9i有預定義的應用程式上下文名字空間USERENV,它含有使用者會話資訊,包括預定義的屬性CLIENT_IDENTIFIER,我們可以稍加變更,将它用于保持Web使用者辨別符。
從servlet或Enterprise JavaBeans (EJB)會話bean,應用程式代碼将從Web請求檢索使用者名,然後調用内部PL/SQL過程設定CLIENT_IDENTIFIER:
String userName = request.getRemoteUser();
(set up the JDBC connection)
PreparedStatement ps = conn.prepareCall(
"begin dbms_session.set_identifier(?);
end;");
ps.setString(1, username);
我們可以通過SELECT sys_context('userenv', 'client_identifier') FROM dual;來得到我們設定的Web使用者辨別符。但是,這種方法不夠安全,因為任何人都能設定這個上下文值,是以必須借助額外的安全性措施,如細粒度的通路控制和安全的應用程式角色等,同時,應用程式還應在将資料庫連接配接傳回給連接配接池之前清除CLIENT_IDENTIFIER屬性。
結論
本篇文章主要通過課題案例研究了Oracle資料庫系統的審計特性,為資料庫管理人員提供了一些實施資料庫系統層審計的方案,同時,對應用系統的開發人員實作應用層的安全審計具有重要的借鑒意義。Oracle的審計特性可以幫助開發人員實作一個完善的安全審計子系統,進而保證整個系統的安全體系的完善,為其提供強大的抗抵賴服務。
本文轉自 august 51CTO部落格,原文連結:http://blog.51cto.com/august/57344,如需轉載請自行聯系原作者