Home > Oracle Datenbank > DB Audit Cleanup

DB Audit Cleanup

HOWTO - Audit Informationen ausräumen 11g und 12c

Da Oracle 11gR2 noch kein Unified Audit kennt, entfällt der entsprechende Teil. Der Rest ist ident mit Oracle 12c

Dieses HOWTO deckt auch Datenbanken mit der Multitenant Option sowie die Oracle Data Guard Option ab. Wenn man diese nicht nutzt, einfach die entsprechenden Teile weglassen.

Empfehlungen für die Konfiguration von Audit

Per Default sollte man die Audit Destination wie folgt einrichten

  • Primary DBs = DB,extended - das bedeutet, dass dies gesondert für CDB/PDBs abgelegt wird
  • Standby DBs = OS, da diese Datenbank READ_ONLY geöffnet ist, müssen die Audit Records am Betriebssystem abgelegt werden.

Mit Security folgendes abklären:

  • Wie soll das Audit eingerichtet werden (SYS_OPERATIONS,...)
  • Aufbehaltedauer der Audit Records im System (z.b. 30 Tage)
  • Archivierung der Audit Records vor dem löschen (wenn ja wie) oder reicht die Aufbehaltedauer aus?

OS-Audit: (Job pro "udit_file_dest")

Folgender Job müssen eingerichtet werden:

OS Audit aufräumen (auf allen Database Server für alle ORACLE_HOMEs durchführen):
Die ist auch für die Data Guard Instanzen nötig, wenn SYS_AUDIT_OPERATIONS aktiv ist und wenn Unified Auditing nicht aktiviert ist.
Mit folgenden Befehl werden alle Audit-Files gelöscht, die älter als 30 Tage sind (Archivierung muss vorher geplant werden, wenn nötig)

find $ORACLE_HOME/rdbms/audit -name "*.aud" -mtime +30 -exec rm {} \;

Database Vault Audit (Job pro CDB/PDB)

Die Audit Records von Database Vault müssen manuell weggeräumt werden - hier gibt es keine Routine.

Dies kann man entweder als Database Vault Owner machen oder man legt einen eingenen User an, dem man folgende Rolle granted: DV_AUDIT_CLEANUP

Hierfür muss pro CDB/PDB ein Job erstellt werden, der dies in regelmäßigen Abständen durchführt. Dieses Beispiel löscht alle Database Vault Audit Einträge die älter als 30 Tage sind. (Archivierung muss vorher geplant werden, wenn nötig)

conn c##dbv_owner/Welcome1
alter session set container=xxx;
DELETE FROM DVSYS.AUDIT_TRAIL$ where timestamp < sysdate -30;
commit;

Audit/Unified Audit (Job pro CDB/PDB)

Unter Oracle Database 12c, kann man beide Audit Variante löschen (STD und Unified Auditing), auch wenn nur eine verwendet wird - man kann jedoch auch nur den Teil davon nehmen der einen betrifft. Zum Löschen dieser Audit Einträge, wird das Package "dbms_audit_mgmt" verwendet, welches auch schon unter 11gR2 funktioniert. Da dieses Package normalerweise alle Eintrage löschen wird, muss zusätzlich ein Scheduler Job eingerichtet werden, welcher vorher "last_archive_time" setzt, damit z.b. nur alle einträge älter als 30 Tage gelöscht werden.

Dieses Beispiel löscht alle Audit Einträge (STD und Unified Auditing) die älter als 30 Tage sind. (Archivierung muss vorher geplant werden, wenn nötig)

Database:
Leider gibt es einen BUG im Zusammenhang mit Unified Auditing, wenn man LAST_ARCHIVE_TIME weiter zurück als 5 Tage stellt - hier erhält man folgenden Fehler:

ERROR at line 1:
ORA-08180: no snapshot found based on specified time
ORA-06512: at "SYS.DBMS_AUDIT_MGMT", line 5134
ORA-06512: at "SYS.DBMS_AUDIT_MGMT", line 1187
ORA-06512: at line 2

Solution:
Patch 18743542: 12C UNIFIED AUDIT TRAIL, CANNOT DELETE LAST_ARCHIVE_TIME

Manuell:
Initial muss mal folgendes gemacht werden:

BEGIN
dbms_audit_mgmt.init_cleanup(
audit_trail_type => dbms_audit_mgmt.AUDIT_TRAIL_AUD_STD,
default_cleanup_interval => 24);
END;
/

"Archive Timestamp" auf den gewünschten Tag stellen (alle älteren Einträge werden anschließend gelöscht)
(zur Sicherheit behandeln wir das normale Audit und Unified Auditing)

BEGIN
dbms_audit_mgmt.set_last_archive_timestamp(
audit_trail_type => dbms_audit_mgmt.AUDIT_TRAIL_AUD_STD,
last_archive_time => sysdate-31);
END;
/

BEGIN
dbms_audit_mgmt.set_last_archive_timestamp(
audit_trail_type => dbms_audit_mgmt.audit_trail_unified,
last_archive_time => sysdate-31);
END;
/

Löschen der Audit Einträge laut "Archive Timestamp"

BEGIN
dbms_audit_mgmt.clean_audit_trail(
audit_trail_type => dbms_audit_mgmt.AUDIT_TRAIL_AUD_STD,
use_last_arch_timestamp => TRUE);
END;
/

BEGIN dbms_audit_mgmt.clean_audit_trail(
audit_trail_type => dbms_audit_mgmt.audit_trail_unified,
use_last_arch_timestamp => TRUE);
END;
/

automatisiert: Hiermit wird der zuerst der init für das normale Audit gemacht (beim Unified Audit ist es nicht nötig) und anschließend die automatisierten Jobs fürs löschen erstellt.
Hinweis:
bei der Multitanent Option, muss dies sowohl in der CDB als auch in allen PDBs gemacht werden.

BEGIN
dbms_audit_mgmt.init_cleanup(
audit_trail_type => dbms_audit_mgmt.AUDIT_TRAIL_AUD_STD,
default_cleanup_interval => 24);
END;
/

BEGIN
dbms_scheduler.create_job (
job_name => '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-31);
dbms_audit_mgmt.set_last_archive_timestamp(
AUDIT_TRAIL_TYPE => dbms_audit_mgmt.audit_trail_unified,
LAST_ARCHIVE_TIME => sysdate-31);
END;',
start_date => sysdate,
repeat_interval=>'FREQ=DAILY;BYHOUR=23',
enabled => TRUE,
comments => 'Create Archive timestamp');

dbms_audit_mgmt.create_purge_job(
AUDIT_TRAIL_TYPE => dbms_audit_mgmt.audit_trail_aud_std,
AUDIT_TRAIL_PURGE_INTERVAL => 24 /* Stunden */,
AUDIT_TRAIL_PURGE_NAME => 'Audit_Purge_Job_STD_AUD',
USE_LAST_ARCH_TIMESTAMP => TRUE);

dbms_audit_mgmt.create_purge_job(
AUDIT_TRAIL_TYPE => dbms_audit_mgmt.audit_trail_unified,
AUDIT_TRAIL_PURGE_INTERVAL => 24 /* Stunden */,
AUDIT_TRAIL_PURGE_NAME => 'Audit_Purge_Job_UNI_AUD',
USE_LAST_ARCH_TIMESTAMP => TRUE);
END;
/

Ob die Jobs angelegt wurde, sieht man wie folgt:

col JOB_NAME format a30
col JOB_FREQUENCY format a40
SELECT job_name,job_status,audit_trail,job_frequency FROM dba_audit_mgmt_cleanup_jobs;
SELECT job_name, next_run_date, state, enabled FROM dba_scheduler_jobs WHERE job_name LIKE '%AUDIT%';

Löschen der vorher angelegten jobs geht wie folgt:

BEGIN
dbms_scheduler.drop_job(job_name => 'Audit_Archive_Timestamp');
END;
/
BEGIN
DBMS_AUDIT_MGMT.DROP_PURGE_JOB(
AUDIT_TRAIL_PURGE_NAME => 'Audit_Purge_Job_STD_AUD');
END;
/
BEGIN
DBMS_AUDIT_MGMT.DROP_PURGE_JOB(
AUDIT_TRAIL_PURGE_NAME => 'Audit_Purge_Job_UNI_AUD');
END;
/