Grunsätzliche Möglichkeiten für DML und Query Monitoring
Es gibt wie so oft mehrere Wege zum Ziel, die wir alle kurz vorstellen wollen.
Wir wollen in diesem Artikel nur den Weg mittels Unified Auditing zeigen. Der Grund dafür ist, dass es für alle Oracle Editions funktioniert und sowohl für DML als auch Query funktioniert. Das "alte" Standard Audit ist deutlich inflexibler und auch langsamer und sollte durch Unified Auditing abgelöst werden.
Unified Auditing konfigurieren
Um Unified Auditing zu nutzen, muss man es einschalten und "initialisieren". Mehr dazu finden Sie in unserem Artikel "Unified Auditing Konfigurieren".
Da Unified Auditing in einer Memory Struktur zwischenspeichert, muss man sicherheitshalber die Inhalte immer zuerst auf die Disk flushen.
EXEC SYS.DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL;
Abfragen der Informationen aus dem Unified Audit Trail:
select SESSIONID, ENTRY_ID, DBUSERNAME, CURRENT_USER, OBJECT_SCHEMA, OBJECT_NAME, UNIFIED_AUDIT_POLICIES,
ACTION_NAME, SYSTEM_PRIVILEGE_USED, EVENT_TIMESTAMP, STATEMENT_ID, SQL_TEXT, SQL_BINDS
from unified_audit_trail
where UNIFIED_AUDIT_POLICIES like '%DBM_AUDIT%' /* es koennte ja auch noch eine weitere Policy anschlagen */
order by sessionid, entry_id;
Alle Zugriffe auf ein bestimmtes Objekt - egal von wem!
Aufgabenstellung
Das ist der Klassiker: Wir wollen alle Zugriff auf ein bestimmtes Objekt auditieren.
Wir nehmen an, dass wir alle Zugriffe (DML und Query) auf die Tabelle DBM_TAB sehen wollen.
Umsetzung
noaudit policy DBM_AUDIT;
drop audit policy DBM_AUDIT;
create audit policy DBM_AUDIT
ACTIONS select on scott.DBM_tab,
insert on scott.DBM_tab,
update on scott.DBM_tab,
delete on scott.DBM_tab;
audit policy DBM_AUDIT;
Alles was ein DB User an DML und Query macht?
Aufgabenstellung
Wenn man herausfinden muss, welche DML und Query Statements ein bestimmter Datenbank Benutzer in der Datenbank absetzt, dann geht das natürlich auch.
In diesem Beispiel wollen wir wissen, welche Statements der Datenbankbenutzer SCOTT in der Datenbank absetzt.
Umsetzung
noaudit policy DBM_AUDIT;
drop audit policy DBM_AUDIT;
create audit policy DBM_AUDIT
ACTIONS SELECT, INSERT, UPDATE, DELETE
WHEN 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') = ''SCOTT'''
EVALUATE PER STATEMENT;
audit policy DBM_AUDIT;
Alle DML und Query Statements, die von einem bestimmten Client aus durchgeführt werden.
Grundsätzlich kann man sehr einfach auf alles einschränken, was man via SYS_CONTEXT angeben kann.
Aufgabenstellung
Wir wollen wissen, welche DML und Query Statements vom Client "myhostname" aus gemacht werden, egal unter welchem Datenbankbenutzer und in welchem Schema.
Umsetzung
noaudit policy DBM_AUDIT;
drop audit policy DBM_AUDIT;
create audit policy DBM_AUDIT
ACTIONS SELECT, INSERT, UPDATE, DELETE
WHEN 'SYS_CONTEXT(''USERENV'', ''HOST'') = ''myhostname'''
EVALUATE PER STATEMENT;
audit policy DBM_AUDIT;
Was eine PLSQL Procedure an SQL Statements ausführt
Das haben wir schon einmal in einem Artikel behandelt (SQL IN PLSQL TRACEN) und deswegen nur in Kurzversion.
Aufgabenstellung
Bei komplexen PLSQL Codes ist es oft nicht so einfach festzustellen, welche Zugriffe auf anderen Objekte (Tabellen, Views,...) bei einer Verarbeitung letztendlich erfolgen.
Zuerst muss man eine Policy anlegen, die die Zugriffe auf die Objekte (Tabellen, Views,...) sowie die Ausführung des PLSQL Codes auditiert.
Wir nehmen an, dass dies die Tabelle DBM_DUAL sowie die PLSQL Funktion DBM_TEST sind.
Umsetzung
noaudit policy DBM_AUDIT;
drop audit policy DBM_AUDIT;
create audit policy DBM_AUDIT
ACTIONS select on scott.DBM_dual,
insert on scott.DBM_dual,
update on scott.DBM_dual,
delete on scott.DBM_dual,
execute on scott.DBM_test;
audit policy DBM_AUDIT;
Hinweis
Wenn man Datenbank Auditing nutzt, muss man sich um das Management des/der Audit Trails kümmern. Weiterführende Informationen zu diesem Thema finden Sie in unseren Artikeln zu Unified Audit auf unserer Homepage.