在Oracle11g之前,oracle數據庫自帶的審計功能是關閉的,考慮到性能和審計管理的復雜性,用戶一般不打開審計功能。如果有審計要求,DBA會采用trigger來實現對DDL審計的方法來折中。例如類似下面代碼實現:
create or replace trigger sys.ddl_trigger after DDL on database BEGIN insert into event_table values (ora_sysevent, ora_login_user, ora_instance_num, ora_database_name, ora_dict_obj_name, ora_dict_obj_type, ora_dict_obj_owner, sysdate); END; / |
這種trigger審計很輕便,但功能有限,只能對DDL做一些記錄跟蹤,並且記錄信息也不全面,如用戶執行的完整的語句就不能記錄下來,管理上也有諸多不便,如數據清理。在Oracle11g,Oracle不僅加強了審計的功能,同時也對自身的數據庫審計(區別於第三方的審計產品)有了很大信心,Oracle官方宣稱默認啟用的審計日志不會對絕大多數產品數據庫的性能帶來過大的負面影響,11g默認啟用數據庫審計選項,AUDIT_TRAIL參數的缺省值為DB,這意為着審計數據將記錄在數據庫中的AUD$審計字典基表上。
注意,因為在11g中CREATE SESSION將被作為受審計的權限來被記錄,因此當SYSTEM表空間因磁盤空間而無法擴展時將導致這部分審計記錄無法生成,這將最終導致普通用戶的新會話將無法正常創建,普通用戶將無法登陸數據庫。默認情況下表空間會以AUTOEXTEND ON自動擴展選項創建SYSTEM表空間,因此系統表空間在必要情況下還是會自動增長的,我們所需注意的是磁盤上的剩余空間是否能夠滿足其增長需求即可,但是數據文件擴展是有上限的,對於普通的8k smallfile表空間而言單個數據文件的最大尺寸是32G。
為了便於管理Oracle審計,袋鼠雲提供了集中審計管理功能,其產品設計思路如下:
1、審計的關閉和打開
2、審計數據遷移
3、自動化審計數據清理
4、審計統計分析
一、審計的關閉和打開
袋鼠雲前台界面提供了Oracle標准審計的所有功能,如登錄審計、語句審計、權限審計、特定對象審計等等。用戶可以靈活的選擇審計的打開和關閉,審計所針對的對象和權限等。
二、審計數據遷移
考慮到DB,EXTENDED審計數據默認使用SYSTEM表空間,DTOPS提供一鍵數據遷移功能,底層調用的代碼如下:比如將標准審計表遷入USERS表空間
BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, AUDIT_TRAIL_LOCATION_VALUE => 'USERS' ); END; / |
三、自動化審計數據清理
前文已經說過,數據庫的審計信息一般較重,尤其在打開登錄審計后,所有session的登錄和退出都會在審計表中留有記錄,由於表空間或者存儲的限制,如果不能寫入審計記錄,數據庫執行需要有審計的操作將被掛起,比如打開了CREATE SESSION審計,由於空間限制普通用戶將不能登錄數據庫。需要有關辦法來靈活的管理數據庫的審計記錄空間。
下面介紹自動清理數據的方法,針對已經分析過的老數據做自動清理,首先要初始化清理策略:
begin dbms_audit_mgmt.init_cleanup( audit_trail_type => dbms_audit_mgmt.audit_trail_db_std, default_cleanup_interval => 24 ); end; / |
這個INIT_CLEANUP過程設計到兩個參數:
audit_trail_type:指要設置的清理類型,這里是audit_trail_db_std,標准的數據庫審計跟蹤,即aud$表。
default_cleanup_interval:這個值表示每隔多少時間執行清理任務,24即24小時。
相關審計類型:
Parameter |
Description |
audit_trail_aud_std |
The standard AUD$ audit trail in the database |
audit_trail_fga_std |
The FGA_LOG$ table, for Fine Grained Auditing |
audit_trail_db_std |
Both standard and FGA audit trails |
audit_trail_os |
The OS audit trail |
audit_trail_xml |
The XML audit trail |
audit_trail_files |
Both OS and XML audit trails |
audit_trail_all |
All of the above |
設置完初始化清理參數后,實際上在調用清理任務時,會發現並沒有達到你的預期,可能數據一條都沒有清理掉,我們還需要設置另一個過程參數SET_LAST_ARCHIVE_TIMESTAMP,它的作用是告訴清理進程一個審計歸檔時間戳,這個過程接收三個參數:
audit_trail_type:要清理的審計類型,如audit_trail_aud_std
last_archive_time:最后一次歸檔時間,可以手工設置
rac_instance_number:RAC的話可以指定實例號
具體示例如下:
begin dbms_audit_mgmt.set_last_archive_timestamp( audit_trail_type => dbms_audit_mgmt.audit_trail_aud_std, last_archive_time => to_timestamp('2016-03-30 10:00:00','YYYY-MM-DD HH24:MI:SS'), rac_instance_number => null ); end; / |
執行上段程序后,你可以在DBA_AUDIT_MGMT_LAST_ARCH_TS視圖中查到相關信息。
有了歸檔時間后,就可以執行真正的清理程序了。
begin dbms_audit_mgmt.clean_audit_trail( audit_trail_type => dbms_audit_mgmt.audit_trail_aud_std, use_last_arch_timestamp => TRUE ); end; / |
同樣,audit_trail_type表示清理的審計類型,use_last_arch_timestamp => TRUE,表示用最后的歸檔時間,如果為false,將會清理掉audit_trail_aud_std類型的所有審計信息。上面是手工清理的方法,設置了清理時間點后運行清理過程。下一步看自動清理怎么做:
將采用數據庫的自動任務來實現,第一個任務,自動產生清理時間點:
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'DAILY_AUDIT_ARCHIVE_TIMESTAMP', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,LAST_ARCHIVE_TIME => sysdate-10); END;', start_date => sysdate, repeat_interval => 'FREQ=HOURLY;INTERVAL=24', enabled => TRUE, comments => 'Create an archive timestamp' ); END; / |
第二個任務,根據時間點自動清理:
BEGIN DBMS_AUDIT_MGMT.CREATE_PURGE_JOB( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, AUDIT_TRAIL_PURGE_INTERVAL => 24 /* hours */, AUDIT_TRAIL_PURGE_NAME => 'Daily_Audit_Purge_Job', USE_LAST_ARCH_TIMESTAMP => TRUE ); END; / |
完成以上兩步后,可以在DBA_AUDIT_MGMT_CLEANUP_JOBS數據字典視圖中查看到這兩個任務的相關信息。
到此數據庫審計自動清理就可以實現了,但是從數據庫的性能考慮,如果您的數據庫很大,幾個T或者幾十T,您的審計數據也很龐大,一天的數據量上G,我們就得考慮數據的審計清理的性能,因為以上的審計清理時delete操作,不是truncate操作,oracle11g也提供了一個很好的解決方法,設置清理批處理時commit行數。如下:
begin dbms_audit_mgmt.set_audit_trail_property( audit_trail_type => dbms_audit_mgmt.audit_trail_aud_std, audit_trail_property => dbms_audit_mgmt.db_delete_batch_size, audit_trail_property_value => 100000); end; / |
三個參數,一看就懂,audit_trail_type清理類型,audit_trail_property設置刪除批處理,audit_trail_property_value表示每次commit行數100000。
這篇文檔主要介紹了Oracle11g審計跟蹤管理相關的知識點,如審計表遷移,Oracle審計不同的類型,審計的定時自動清理等。這里僅僅介紹袋鼠雲相關審計功能實現原理,至於針對審計數據的集中收集,展現方法已不屬於審計跟蹤管理的范疇。袋鼠雲目前主要支持的數據庫有MySQL、Oracle,比如對基於阿里雲上或雲下Oracle數據庫提供一系列解決方案,如數據庫自動部署、備份管理、容災管理、恢復管理、容災切換管理、性能監控等等。