
pgaudit v19beta3
PostgreSQL-Audit-Erweiterung
pgAudit
Open-Source-Auditprotokollierung für PostgreSQL
Einführung
Die PostgreSQL-Audit-Erweiterung (pgAudit) bietet detaillierte Session- und/oder Objekt-Auditprotokollierung über die standardmäßige PostgreSQL-Protokollierungseinrichtung.
Das Ziel von pgAudit ist es, PostgreSQL-Benutzern die Möglichkeit zu geben, Audit-Logs zu erzeugen, die häufig erforderlich sind, um staatliche, finanzielle oder ISO-Zertifizierungen zu erfüllen.
Ein Audit ist eine offizielle Prüfung der Konten einer Person oder Organisation, in der Regel durch eine unabhängige Stelle. Die von pgAudit gesammelten Informationen werden korrekt als Audit-Trail oder Audit-Log bezeichnet. In dieser Dokumentation wird der Begriff Audit-Log verwendet.
Warum pgAudit?
Eine grundlegende Anweisungsprotokollierung kann mit der standardmäßigen Protokollierungseinrichtung über log_statement = all bereitgestellt werden. Dies ist für Überwachung und andere Zwecke akzeptabel, bietet jedoch nicht den Detailgrad, der für ein Audit allgemein erforderlich ist. Es reicht nicht aus, eine Liste aller an der Datenbank durchgeführten Operationen zu haben. Es muss auch möglich sein, bestimmte Anweisungen zu finden, die für einen Prüfer von Interesse sind. Die standardmäßige Protokollierungseinrichtung zeigt, was der Benutzer angefordert hat, während sich pgAudit auf die Details dessen konzentriert, was passiert ist, während die Datenbank die Anforderung ausgeführt hat.
Beispielsweise möchte ein Prüfer möglicherweise überprüfen, ob eine bestimmte Tabelle innerhalb eines dokumentierten Wartungsfensters erstellt wurde. Das scheint eine einfache Aufgabe für grep zu sein, aber was, wenn Ihnen ein Beispiel wie dieses (absichtlich verschleiert) präsentiert wird:
DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;
Die Standardprotokollierung liefert Ihnen Folgendes:
LOG: statement: DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;
Es scheint, dass das Auffinden der betreffenden Tabelle in Fällen, in denen Tabellen dynamisch erstellt werden, einige Kenntnisse des Codes erfordert. Das ist nicht ideal, da es vorzuziehen wäre, einfach nach dem Tabellennamen zu suchen. Hier kommt pgAudit ins Spiel. Für dieselbe Eingabe erzeugt es diese Ausgabe im Log:
AUDIT: SESSION,33,1,FUNCTION,DO,,,"DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;"
AUDIT: SESSION,33,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT)
Nicht nur der DO-Block wird protokolliert, sondern Teilanweisung 2 enthält den vollständigen Text der CREATE TABLE mit Anweisungstyp, Objekttyp und voll qualifiziertem Namen, um die Suche zu erleichtern.
Beim Protokollieren von SELECT- und DML-Anweisungen kann pgAudit so konfiguriert werden, dass für jede in einer Anweisung referenzierte Relation ein separater Eintrag protokolliert wird. Es ist kein Parsing erforderlich, um alle Anweisungen zu finden, die eine bestimmte Tabelle betreffen. Tatsächlich ist das Ziel, dass der Anweisungstext in erster Linie für die Tiefenforensik bereitgestellt wird und für ein Audit nicht erforderlich sein sollte.
Nutzungshinweise
Abhängig von den Einstellungen kann pgAudit ein enormes Protokollvolumen erzeugen. Achten Sie darauf, genau zu bestimmen, was in Ihrer Umgebung audit-protokolliert werden muss, um eine übermäßige Protokollierung zu vermeiden.
Beispielsweise wäre es in einer OLAP-Umgebung wahrscheinlich nicht ratsam, Einfügungen in eine große Faktentabelle zu audit-protokollieren. Die Größe der Logdatei wird wahrscheinlich ein Vielfaches der tatsächlichen Datengröße der Einfügungen betragen, da die Logdatei als Text ausgegeben wird. Da Logs in der Regel zusammen mit dem Betriebssystem gespeichert werden, kann dies dazu führen, dass der Speicherplatz sehr schnell erschöpft ist. In Fällen, in denen die Auditprotokollierung nicht auf bestimmte Tabellen beschränkt werden kann, sollten Sie die Leistungsauswirkungen während des Testens bewerten und auf dem Log-Volume reichlich Platz einplanen. Dies kann auch für OLTP-Umgebungen gelten. Selbst wenn das Einfügevolumen nicht so hoch ist, kann die Leistungsbeeinträchtigung durch die Auditprotokollierung die Latenz dennoch spürbar beeinflussen.
Um die Anzahl der Relationen zu begrenzen, die für SELECT- und DML-Anweisungen audit-protokolliert werden, sollten Sie die Objekt-Auditprotokollierung in Betracht ziehen (siehe Objekt-Auditprotokollierung). Die Objekt-Auditprotokollierung ermöglicht die Auswahl der zu protokollierenden Relationen und damit eine Reduzierung des gesamten Logvolumens. Wenn jedoch neue Relationen hinzugefügt werden, müssen sie explizit in die Objekt-Auditprotokollierung aufgenommen werden. Eine programmatische Lösung, bei der bestimmte Tabellen von der Protokollierung ausgeschlossen und alle anderen einbezogen werden, kann in diesem Fall eine gute Option sein.
PostgreSQL-Versionskompatibilität
pgAudit unterstützt PostgreSQL 14 oder höher.
Um neue Funktionen zu unterstützen, die in jeder PostgreSQL-Version eingeführt werden, pflegt pgAudit einen separaten Branch für jede PostgreSQL-Hauptversion (derzeit PostgreSQL 14 - 19), der in ähnlicher Weise wie das PostgreSQL-Projekt gepflegt wird.
Abgesehen von Fehlerkorrekturen ist für stabile Branches keine weitere Entwicklung erlaubt. Neue Entwicklungen, sofern vorhanden, sind ausschließlich für die nächste unveröffentlichte Hauptversion von PostgreSQL vorgesehen.
Die pgAudit-Versionen verhalten sich zu den PostgreSQL-Hauptversionen wie folgt:
-
pgAudit v19.X ist für die Unterstützung von PostgreSQL 19 vorgesehen.
-
pgAudit v18.X ist für die Unterstützung von PostgreSQL 18 vorgesehen.
-
pgAudit v17.X ist für die Unterstützung von PostgreSQL 17 vorgesehen.
-
pgAudit v16.X ist für die Unterstützung von PostgreSQL 16 vorgesehen.
-
pgAudit v1.7.X ist für die Unterstützung von PostgreSQL 15 vorgesehen.
-
pgAudit v1.6.X ist für die Unterstützung von PostgreSQL 14 vorgesehen.
Kompilieren und Installieren
pgAudit kann mit den Entwicklungspaketen mithilfe von PGXS gegen eine installierte Kopie von PostgreSQL kompiliert werden. Die folgenden Anweisungen sollten auf den meisten Unix-ähnlichen Betriebssystemen funktionieren.
Klonen Sie die pgAudit-Erweiterung:
git clone https://github.com/pgaudit/pgaudit.git
Wechseln Sie in das pgAudit-Verzeichnis:
cd pgaudit
Checken Sie den Branch REL_19_STABLE aus (beachten Sie, dass der stabile Branch für unveröffentlichte Versionen von PostgreSQL möglicherweise nicht existiert):
git checkout REL_19_STABLE
Kompilieren und installieren Sie pgAudit:
make install USE_PGXS=1 PG_CONFIG=/usr/pgsql-19/bin/pg_config
Anweisungen für Tests und Entwicklung finden Sie in test.
Einstellungen
Einstellungen dürfen nur von einem Superuser geändert werden. Wenn normale Benutzer ihre Einstellungen ändern könnten, würde das den Zweck eines Audit-Logs zunichtemachen.
Einstellungen können global (in postgresql.conf oder mit ALTER SYSTEM ... SET), auf Datenbankebene (mit ALTER DATABASE ... SET) oder auf Rollenebene (mit ALTER ROLE ... SET) angegeben werden. Beachten Sie, dass Einstellungen nicht über die normale Rollenvererbung vererbt werden und SET ROLE die pgAudit-Einstellungen eines Benutzers nicht ändert. Dies ist eine Einschränkung des Rollensystems und nicht auf pgAudit selbst zurückzuführen.
Die pgAudit-Erweiterung muss in shared_preload_libraries geladen werden. Andernfalls wird beim Laden ein Fehler ausgelöst und es findet keine Auditprotokollierung statt.