Differenziertes Auditing mit Konfigurationsparametern und Fine Grained Auditing
von Heinz-Wilhelm Fabry, ORACLE Deutschland GmbH
Im Datenbankumfeld versteht man unter Auditieren das Aufzeichnen von Benutzeraktivitäten.
Die Oracle-Datenbank kann das seit etwa 20 Jahren. Seit Oracle Version 6 konnte protokolliert
werden, wer mit welchen Befehlen auf welche Objekte zugreift oder wer welche Systemprivilegien
nutzt. Diese Möglichkeiten haben aber viele Jahre lang eher ein Schattendasein unter den
Datenbankfeatures geführt. Das ist z.B. daran erkennbar, dass das Auditing standardmäßig
immer ausgeschaltet war und erst nach der Änderung des (statischen) Konfigurationsparameters
audit_trail und dem Neustart der Datenbank genutzt werden konnte. Inzwischen wird
dem Auditing aber immer stärkere Aufmerksamkeit entgegengebracht - kein Wunder, denn
Sicherheitsaspekte und Compliance-Anforderungen erzwingen ein immer umfangreicheres Monitoring
der Benutzeraktivitäten. Sichtbar wird diese veränderte Einstellung dem Auditing gegenüber
übrigens auch in der veränderten Standardeinstellung der neusten Datenbankversion, Oracle Database
11g: Hier ist das Auditing standardmäßig für alle Befehle aktiviert, die aus der
Oracle-Perspektive sicherheitsrelevant sein könnten - z.B. für den Befehl CREATE USER.
Obwohl man also schon lange die unterschiedlichsten Aktivitäten auditieren konnte, mangelte es
lange an Differenzierungsmöglichkeiten. Betrachtet man beispielsweise den Zugriff auf
Tabellendaten, konnte man nur feststellen, wer und wann lesend oder ändernd auf eine Tabelle
zugegriffen hat. Auch ob die Aktion erfolgreich war oder nicht, wurde notiert. Die genauen Statements konnte man jedoch mit Datenbankmitteln nicht
reproduzieren. Genauso wenig konnte das Auditieren an bestimmte Bedingungen geknüpft werden.
Beides ist inzwischen möglich.
Vorüberlegungen
Die tatsächliche Umsetzung des Auditing ist über viele Jahre bewährt und so sehr
von Routine geprägt, dass die Herausforderung eigentlich vor allem in einer angemessenen Planung besteht.
Die folgenden Abschnitte stellen die Rahmenbedingungen dar, die es dabei zu berücksichtigen gilt.
Aus zwei Gründen sollte man sich zunächst gut überlegen, was das Ziel des Auditing sein soll.
Zum ersten kostet Auditieren Ressourcen. Auf einer ohnehin stark ausgelasteten Datenbank könnte ein unkontrolliertes
Auditing zu einer nicht mehr akzeptablen Performance führen. Anzustreben ist, das selbstgesteckte Ziel
mit möglichst minimalem Einsatz zu erreichen. Minimaler Einsatz kann an dieser Stelle heißen,
dass z.B. nur die wichtigen Tabellen auditiert werden, dass nur ändernde Aktionen und keine
lesenden oder dass nur erfolgreiche Aktionen erfasst werden.
Aber selbst wenn die Systemperformance keinerlei Problem darstellt, ist zum zweiten zu bedenken, dass die
Auditing-Daten ausgewertet werden müssen. Je größer die Datenmenge, desto
schwieriger und zeitaufwändiger ist eine aussagekräftige Auswertung. Auch um den sprichwörtlichen
Wald vor lauter Bäumen nicht aus den Augen zu verlieren, sollte man sich also beim Auditing auf
das Nötigste beschränken. Egal was möglich ist, in der Regel macht es keinen Sinn jede
Aktion zu auditieren.
Hat man die Objekte und Aktionen identifiziert, die auditiert werden sollen, muss
man sich als nächstes klar darüber werden, wie weit das Auditing gefasst werden soll:
Müssen die exakten Statements erfasst werden, mit denen auf Daten zugegriffen wird? Sollen
auch alle Aktivitäten auditiert werden, die als SYSDBA durchgeführt werden? Soll das
Auditing nur dann erfolgen, wenn bestimmte
Werte geändert werden oder bestimmte Rahmenbedingungen vorliegen?
Initialisierungsparameter: Wo und wie speichern?
Über den Initialisierungsparameter audit_trail wird zunächst das Wo und Wie der Speicherung
der Audit-Daten festgelegt. Er ist - wie oben bereits erwähnt - in Datenbanken vor Oracle
Database 11g standardmäßig nicht gesetzt. In 11g ist die Voreinstellung
audit_trail=db. Das bedeutet, dass die Audit-Daten in der Datenbank gespeichert werden.
Die Speicherung in der Datenbank erfolgt in der Tabelle aud$. Die Tabelle ist Teil des Tablespace
SYSTEM. Eine Auslagerung der Tabelle in ein anderes Tablespace wird zwar gelegentlich von Kunden nachgefragt,
aber nur bedingt unterstützt: Nur Kunden, die das Produkt Audit Vault einsetzen, können
aud$ zur Zeit in ein anderes Tablespace auslagern. Ob diese Möglichkeit mit der nächsten
Datenbankversion (Oracle11g Release 2) wie geplant allen Kunden zur Verfügung gestellt wird, bleibt
abzuwarten.
Wenn der zur Verfügung stehende Speicherplatz erschöpft ist (Tablespace SYSTEM ist voll), lässt
die Datenbank keine weiteren Aktionen zu, die zu Auditing-Einträgen führen würden und natürlich
auch keinerlei Aktionen, die zum Wachsen des Tablespace SYSTEM führen würden. Deshalb müssen
die Daten in aud$ gelegentlich gelöscht werden. Je nach Anforderung müssen die Daten
natürlich zuvor in irgendeiner Form gesichert werden, z.B. durch einen Export mit Data Pump.
Als möglicher Nachteil der Speicherung der Audit-Daten in der Datenbank
muss in diesem Zusammenhang auf den hier erkennbaren fehlenden Schutz vor Manipulationen
durch einen kriminellen DBA hingewiesen werden.
Die Datenbank verhindert auch im Fall der Speicherung auf der Betriebssystemebene weitere
Aktionen, wenn dort kein Speicherplatz mehr verfügbar ist. Aber der Schutz vor dem kriminellen
DBA kann ein Grund dafür sein, Audit-Daten ausserhalb der Datenbank abzulegen. Setzt man
den Parameter audit_trail=os werden die Daten in ASCII-Dateien unter
betriebssystemspezifischen Standardverzeichnissen abgelegt oder - unter Windows - im
Applications Event Viewer. Unter UNIX / Linux kann mit dem Initialisierungsparameter
audit_file_dest auch ein alternatives Verzeichnis angegeben werden, in dem die
Daten abgelegt werden. Das Verzeichnis bzw. die darin angelegten Dateien können dann durch
die Vergabe entsprechender Schreib-Lese-Berechtigungen vor dem Zugriff durch den kriminellen
DBA geschützt werden. Natürlich setzt das voraus, dass Datenbank- und
Systemadministration nicht in einer Hand liegen.
Sieht man vom Einsatz des Produkts Oracle
Audit Vault einmal ab, bietet die Möglichkeit des Speicherns auf der Betriebssystemebene
unter UNIX / Linux mit dem zusätzlichen Parameter audit_syslog_level schließlich den
stärksten Schutz vor dem kriminellen DBA: Die Audit-Daten werden dann in das
syslog des Betriebssystems geschrieben. Das syslog kann sogar auf einem anderen Rechner liegen.
Die Ablage ausserhalb der Datenbank erhöht nicht nur den Schutz der Audit-Daten, sondern sie reduziert auch die
Systembelastung durch das Auditing. Ein für manche Kunden attraktiver Nebeneffekt der Entscheidung, die Daten
ausserhalb der Datenbank abzulegen, besteht in der dadurch gewonnenen Möglichkeit,
die Daten im XML-Format zu speichern. Dazu wird der Parameter audit_trail=xml gesetzt.
Auch in diesem Fall kann man mit dem bereits erwähnten Parameter audit_file_dest das
Verzeichnis festlegen, unter dem die Audit-Daten abgelegt werden.
Initialisierungsparameter: Umfang der Einzelinformationen festlegen
Die bisherigen Parametereinstellungen führen zwar dazu, dass auditiert wird, aber es liefert
nur recht vage Ergebnisse. Es kann z.B. festgestellt werden, dass eine Abfrage erfolgt ist, wer sie
abgesetzt hat, ob sie erfolgreich war usw., aber wie genau diese Abfrage aussah, ist nicht
festzustellen. Sinnvoll wäre in vielen Fällen sicherlich, das genaue Statement zu kennen. Dies wird
möglich, wenn die Parameter db und xml in modifizierter Form verwendet werden, und
zwar als db,extended oder xml, extended. Diese Varianten führen dazu, dass immer der
gesamte SQL-Text sowie die Bind-Variablen erfasst werden. Es ist lediglich zu beachten, dass es bezüglich der Anzeige der Bind-Variablen Einschränkungen hinsichtlich der Datentypen gibt.
Liegt das exakte Statement vor, kann man z.B. im Fall von SELECTs unter Umständen sogar noch
die genaue Ergebnismenge ermitteln, die dieses SELECT geliefert hat. Das wäre möglich, wenn in der
Flash Recovery-Area (oder in Flashback Data Archives; vgl. den entsprechenden Community-Tipp)
die Daten noch vorlägen und mit der AS-OF-TIMESTAMP-Klausel des SELECTs darauf zugegriffen
werden kann.
Initialisierungsparameter: SYSDBA und SYSOPER auditieren
Egal wie die bisher genannten Parameter konfiguriert sind: Alle Aktionen, die ein Benutzer als
SYSDBA oder SYSOPER ausführt, werden nicht erfasst. Dieses Problem lässt sich aber durch die
Verwendung eines einzigen Initialisierungsparameter lösen. Der Parameter heißt
audit_sys_operations und muss auf den Wert true gesetzt werden.
Dieses manchmal auch als SYS-Auditing bezeichnete Verfahren ist in Bezug auf den Parameter
audit_trail erläuterungsbedürftig. Zunächst einmal funktioniert das SYS-Auditing, selbst
wenn der Parameter audit_trail nicht gesetzt ist. Ausserdem werden die Ergebnisse des
SYS-Auditing immer ausserhalb der Datenbank gespeichert - entweder in einem vorgegebenen
Verzeichnis oder in dem Verzeichnis, das im Parameter audit_file_dest angegeben ist. Das
soll natürlich dazu dienen, dem SYSDBA den Zugriff auf die Audit-Daten zu entziehen (s.o.). Und
schließlich wird das SYS-Auditing im XML-Format geschrieben, sofern der Parameter
audit_trail entweder auf xml oder xml,extended steht.
Abschließend sei noch darauf hingewiesen, dass das SYS-Auditing nicht weiter zu steuern ist.
Es werden immer alle Statements protokolliert und zwar - komfortablerweise - mit vollständigem
Text.
Auditieren
Nachdem der Initialisierungsparameter audit_trail gesetzt und aktiviert ist, wird
mit dem Befehl AUDIT festgelegt, welche Aktionen konkret auditiert werden sollen. Was genau
möglich ist, ist umfangreich
im SQL-Handbuch
beschrieben, deshalb an dieser Stelle nur einige Beispiele für die Syntax:
Die Befehle können mit ihrem Pendant, dem Befehl NOAUDIT, wieder ausser Kraft gesetzt werden.
HINWEIS: Die Möglichkeit, bestimmte Aktionen BY SESSION zu
auditieren, wird zukünftig vermutlich nicht mehr unterstützt. Stattdessen soll
grundsätzlich BY ACCESS auditiert werden.
Informationsauswertung
Die Audit-Informationen, die durch das Setzen des Parameters audit_trail gesteuert
werden und natürlich auch alle aktiven Einstellungen, können über Data Dictionary Views abgefragt werden. Sofern es sich um Ergebnisdaten des Auditing handelt, bereiten alle diese
Views Daten
aus aud$ oder den Betriebssystemdateien auf. Eine komplette Liste der Views liefert
z.B. der
Security Guide, allerdings soll hier auf einige der wichtigsten dieser Views hingewiesen werden:
Der folgende Screenshot zeigt, dass mit dem Enterprise Manager natürlich auch eine graphische
Schnittstelle zum Zugriff auf diese Informationen zur Verfügung steht.
Differenzieren mit Fine Grained Auditing
Kunden, die die Enterprise Edition einsetzen, haben mit dem Fine Grained Auditing (FGA)
eine noch stärkere Differenzierungsmöglichkeit für das Auditing von DML-Befehlen (einschließlich
SELECT). Dieses Auditing wird nur
durchgeführt, wenn selbst zu bestimmende Bedingungen erfüllt sind, es ist
nicht an Initialisierungsparameter gekoppelt und schreibt die Informationen auch in eine
eigene Systemtabelle namens fga_log$ bzw. in eine selbst zu definierende Betriebssystemdatei
im XML-Format. Die Informationen dieses Auditings sind ebenfalls
über eigene Views zugänglich gemacht, z.B. über DBA_FGA_AUDIT_TRAIL oder über
DBA_COMMON_AUDIT_TRAIL,
die eine konsolidierte Sicht aus aud$ und fga_log$ bietet.
Detaillierte Informationen zum Aufsetzen des FGA finden sich im bereits erwähnten
Security Guide und im Handbuch
Packages and Types Reference.
Hier soll nur an einem rudimentären Beispiel skizziert werden, wie man mit dem FGA arbeiten kann.
Voraussetzung für die Verwendung des FGA ist der Zugriff auf das Package SYS.DBMS_FGA. Mit
diesem Package wird festgelegt, welches Objekt unter welchen Bedingungen auditiert wird. Die
Verbindung von Bedingung und Tabelle wird als eigenständiges Objekt betrachtet und als
Policy bezeichnet.
In diesem Beispiel wird nur nach einem SELECT, das einen Satz selektiert, der einen Wert > 100
in der Spalte SENSIBLESPALTE enthält, ein Eintrag in der Tabelle fga_log$ geschrieben.
Über weitere Parameter bietet die Prozedur ADD_POLICY z.B. die Möglichkeit,
zusätzlich eine
Funktion auszuführen, wenn die Bedingung zutrifft, oder nur dann einen Eintrag zu schreiben,
wenn zusätzlich zur bereits formulierten Bedingung auch noch bestimmte Spalten angesprochen
werden.
Welche FGA-Policies existieren und welche Parameter dafür definiert sind, kann der DBA der
View DBA_AUDIT_POLICIES entnehmen.
Zurück zur Community-Seite
|