=====Die Audit Logs der Datenbank unter Oracle 11g/12c mit DBMS_AUDIT_MGMT "aufräumen"===== **Aufgabe**: * In einer Oracle 12c R2 Datenbank sollen mit dem Oracle Board Mitteln die Audit Logs der DB nach einer gewissen Zeit auch gelöscht werden. Lösung: * Interne Löschroutinen über **DBMS_AUDIT_MGMT** aufsetzen. Ablauf (alles als SYS User): - Mit **DBMS_AUDIT_MGMT.INIT_CLEANUP** initialisieren - Zeitpunkt vor dem alles gelöscht werden soll setzen mit **DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP** - Für eine Window Funktion diesen Zeitraum täglich neu setzen, als Job mit **DBMS_SCHEDULER.CREATE_JOB** - Job zum löschen anlegen mit "DBMS_AUDIT_MGMT.CREATE_PURGE_JOB" Bzgl. RAC siehe auch " How to create a purge job using DBMS_AUDIT_MGMT for RAC instances. (Doc ID 2261246.1)". ---- ==== Aktuelle Datenmenge und Einstellungen ==== Wie vielen Einträge haben wir schon in der AUD$? select username , action_name , count(*) as entries , to_char(min(timestamp),'dd.mm.yyyy hh24:mi:ss') as first_log , to_char(max(timestamp),'dd.mm.yyyy hh24:mi:ss') as last_log from dba_audit_object group by username,action_name order by 1 / Alle Details siehe => https://github.com/gpipperr/OraPowerShell/blob/master/Ora_SQLPlus_SQLcL_sql_scripts/audit.sql ---- ==== Initialisieren ==== Einschalten mit: BEGIN DBMS_AUDIT_MGMT.init_cleanup( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL , default_cleanup_interval => 24 /* hours */ ); END; / Falls ein "ORA-46267" auftritt siehe Support Node => DBMS_AUDIT_MGMT.INIT_CLEANUP Fails With ORA-46267 (Doc ID 1508787.1) == Den Zeitpunkt setzen, vor dem die Daten gelöscht werden sollen == BEGIN -- Standard database audit records in the SYS.AUD$ table DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD , last_archive_time => SYSTIMESTAMP-180); -- Unified audit trail. In unified auditing, all audit records are written to the unified audit trail and are made -- available through the unified audit trail views, such as UNIFIED_AUDIT_TRAIL. DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED , last_archive_time => SYSTIMESTAMP-180); -- Operating system audit trail. This refers to the audit records stored in operating system files. DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_OS , last_archive_time => SYSTIMESTAMP-180); END; / Mit den Parameter AUDIT_TRAIL_ALL erhalten ich den Fehler "ORA-46250: Ungültiger Wert für Argument "AUDIT_TRAIL_TYPE" , daher für alle drei Optionen seperat gesetzt. Zeitpunkt abfragen über: COLUMN RAC_INSTANCE format 999 heading "RAC|Inst" COLUMN audit_trail FORMAT A20 heading "Audit|Trail" COLUMN last_archive_ts FORMAT A40 heading "Last Archive|TS" SELECT RAC_INSTANCE , AUDIT_TRAIL , LAST_ARCHIVE_TS FROM dba_audit_mgmt_last_arch_ts order by 1,2 / ---- ==== Jobs anlegen ==== == Regelmäßig den Zeitpunkt nach vorn schieben== Job anlegen: BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'AUDIT_ARCHIVE_BEFORE_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 => SYSTIMESTAMP-180); DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED , last_archive_time => SYSTIMESTAMP-180); DBMS_AUDIT_MGMT.set_last_archive_timestamp( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_OS , last_archive_time => SYSTIMESTAMP-180); end;', start_date => sysdate, repeat_interval => 'FREQ=HOURLY;INTERVAL=24', enabled => TRUE, comments => 'Set the point in time before delete all audit log entries' ); END; / -- testen mit: exec dbms_scheduler.run_job('AUDIT_ARCHIVE_BEFORE_TIMESTAMP'); == Purge Job anlegen== BEGIN DBMS_AUDIT_MGMT.create_purge_job( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL , audit_trail_purge_interval => 24 /* hours */ , audit_trail_purge_name => 'CLEANUP_AUDIT_TRAIL_ALL' , use_last_arch_timestamp => TRUE); END; / Job Info abfragen über DBA_AUDIT_MGMT_CLEANUP_JOBS: column JOB_NAME format a24 heading "JOB|NAME" column JOB_STATUS format a10 heading "JOB|STATUS" column AUDIT_TRAIL format a20 heading "AUDIT|TRAIL" column JOB_FREQUENCY format a30 heading "JOB|FREQUENCY" column USE_LAST_ARCHIVE_TIMESTAMP format a10 heading "LAST | TIMESTAMP" column JOB_CONTAINER format a20 heading "JOB|CONTAINER" select JOB_NAME , JOB_STATUS , AUDIT_TRAIL , JOB_FREQUENCY , USE_LAST_ARCHIVE_TIMESTAMP , JOB_CONTAINER from DBA_AUDIT_MGMT_CLEANUP_JOBS / Wann werden nun aber die Jobs gestartet: SELECT job_name , last_start_date , next_run_date , state , enabled FROM dba_scheduler_jobs WHERE job_name LIKE '%AUDIT%' / ---- ==== Bug ORA-46267 ==== Ist der Default Tabelspace für die AUD$ Tabelle NICHT SYSAUX, tritt der folgende Fehler auf beim Aufruf von **DBMS_AUDIT_MGMT.init_cleanup** auf: ORA-46267: Nicht ausreichender Platz in 'SYSAUX' Tablespace, Vorgang kann nicht abgeschlossen werden ORA-06512: in "SYS.DBMS_AUDIT_MGMT", Zeile 2544 ORA-06512: in "SYS.DBMS_AUDIT_MGMT", Zeile 181 ORA-06512: in "SYS.DBMS_AUDIT_MGMT", Zeile 2330 ORA-06512: in "SYS.DBMS_AUDIT_MGMT", Zeile 655 ORA-06512: in Zeile 2 Lösung: Tabelle SYS.dam_config_param$ wie unter Support Node "DBMS_AUDIT_MGMT.INIT_CLEANUP Fails With ORA-46267 (Doc ID 1508787.1)" beschreiben, manipulieren. ---- ==== Wieder ausschalten ==== -- Job löschen BEGIN DBMS_AUDIT_MGMT.DROP_PURGE_JOB( AUDIT_TRAIL_PURGE_NAME => 'CLEANUP_AUDIT_TRAIL_ALL'); END; / BEGIN DBMS_SCHEDULER.DROP_JOB( job_name => 'AUDIT_ARCHIVE_BEFORE_TIMESTAMP' , force => TRUE ); END; / BEGIN DBMS_AUDIT_MGMT.deinit_cleanup( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_ALL); END; / ---- ==== Quellen ==== Oracle: * https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_AUDIT_MGMT.html#GUID-C704D6B0-A6ED-4CFC-B364-CC008CFF76F1 Web: * https://www.oradba.ch/2011/05/database-audit-and-audit-trail-purging/ *