PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Auditing von PostgreSQL mit pgAudit

Audit in der Informationstechnologie (IT) ist ein Prozess zur Untersuchung der IT-Infrastruktur einer Organisation, um sicherzustellen, dass sie die Anforderungen anerkannter Standards oder etablierter Richtlinien erfüllt. Datenschutzvorschriften wie die neuen DSGVO-Vorschriften werden immer strenger, um Benutzerdaten zu schützen. Daher ist es wichtig, dass Ihre Datenbankprüfungen ordnungsgemäß eingerichtet sind, um sicherzustellen, dass sowohl Ihre Anwendung als auch Ihre Benutzerdaten vor Schwachstellen geschützt sind. In diesem Blog-Beitrag werden wir pgAudit besprechen – ein Tool, das die Audit-Protokolle generiert, die zur Erleichterung der Überwachung von PostgreSQL benötigt werden.

Was ist pgAudit?

Die PostgreSQL-Audit-Erweiterung, pgAudit, ist eine Open-Source-Erweiterung, die die Ereignisse in einer PostgreSQL-Datenbank in einem detaillierten Audit-Protokoll protokolliert. Es verwendet die native PostgreSQL-Protokollierungsfunktion, sodass die Audit-Protokolle Teil der PostgreSQL-Protokolle sind. Die Erweiterung basiert auf dem 2ndQuadrant pgAudit-Projekt, das von Simon Riggs, Abhijit Menon-Sen und Ian Barwick verfasst wurde, und enthält Verbesserungen von David Steele von Crunchy Data.

Warum pgAudit statt log_statement=all?

Wir können alle Anweisungen in PostgreSQL protokollieren, indem wir einfach log_statement=all setzen . Warum also überhaupt pgAudit verwenden? Die grundlegende Anweisungsprotokollierung (mithilfe von log_statement ) listet nur die Operationen auf, die für die Datenbank ausgeführt werden. Es bietet keine Möglichkeit, Vorgänge zu filtern, und die Protokolle haben nicht die richtige Formatierung, die für die Überwachung erforderlich ist. pgAudit bietet zusätzlich Granularität zum Protokollieren bestimmter Klassen von Anweisungen wie READ (SELECT und COPY ), WRITE (INSERT , UPDATE , DELETE usw.), DDL usw. Darüber hinaus bietet es Auditing auf Objektebene, bei dem nur Vorgänge für bestimmte Beziehungen protokolliert werden.

Ein weiterer Vorteil von pgAudit gegenüber der einfachen Anweisungsprotokollierung besteht darin, dass es die Details der durchgeführten Operation liefert, anstatt nur die angeforderte Operation zu protokollieren. Ziehen Sie beispielsweise in Erwägung, den anonymen Codeblock mit einer DO-Anweisung auszuführen.

DO $$
BEGIN
	EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;

Die Protokollierung der grundlegenden Anweisung führt zu:

2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG:  statement: DO $$
        BEGIN
            EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
        END $$;

pgAudit protokolliert dieselbe Operation wie:

2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG:  AUDIT: SESSION,4,1,FUNCTION,DO,,,"DO $$
        BEGIN
            EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
        END $$;",<not logged>
2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG:  AUDIT: SESSION,4,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT),<not logged>

Das Obige zeigt deutlich die pgAudit-Funktionalität, die die Operation und ihre Interna mit strukturierter Ausgabe protokolliert, die die Suche erleichtert.

So prüfen Sie PostgreSQL mit pgAuditClick To Tweet

Wie installiere ich pgAudit?

pgAudit ist eine Erweiterung, die aus dem PostgreSQL-Repository heruntergeladen oder aus dem Quellcode kompiliert und erstellt werden kann. Als erster Schritt muss das Paket heruntergeladen und auf dem Computer installiert werden, auf dem PostgreSQL ausgeführt wird (dieses Erweiterungspaket ist auf allen PostgreSQL-Bereitstellungen von ScaleGrid vorinstalliert).

Nach der Installation muss es in PostgreSQL geladen werden. Dies wird durch Hinzufügen von pgaudit erreicht zu den shared_preload_libraries Konfigurationsparameter. Damit diese Konfigurationsänderung wirksam wird, ist ein Neustart von PostgreSQL erforderlich. Der nächste Schritt besteht darin, die Erweiterung in der Datenbank zu aktivieren, indem Sie CREATE EXTENSION pgaudit ausführen .

Nun, da die Erweiterung bereit ist, müssen wir sicherstellen, dass die Konfigurationsparameter für die Erweiterung festgelegt werden, um mit der Protokollierung zu beginnen. Dies kann so einfach sein wie das Setzen des Parameters pgaudit.log um all zu bewerten und pgAudit beginnt mit der Anmeldung in session Modus.

Nun, da wir wissen, wie man pgAudit installiert und aktiviert, lassen Sie uns die beiden Audit-Protokollierungsmodi besprechen, die es bietet, Sitzung und Objekt.

Sitzungs-Audit-Protokollierung

Im Sitzungsmodus protokolliert pgAudit alle von einem Benutzer durchgeführten Vorgänge. Setzen der pgaudit.log -Parameter auf einen der definierten Werte, außer NONE , aktiviert die Protokollierung der Sitzungsüberwachung. Die pgaudit.log Der Parameter gibt die Klassen von Anweisungen an, die im Sitzungsmodus protokolliert werden. Die möglichen Werte sind:READ , WRITE , FUNCTION , ROLE , DDL , MISC , MISC_SET , ALL und NONE .

Setzen der pgaudit.log Parameter auf ALL wird alle Aussagen protokollieren. Der Parameter kann mehrere Klassen mit einer durch Kommas getrennten Liste akzeptieren und bestimmte Klassen können mit einem – Zeichen ausgeschlossen werden. Zum Beispiel, wenn Sie alle Anweisungen außer MISC protokollieren möchten Klasse, der Wert von pgaudit.log wird ALL, -MISC, -MISC_SET sein . Sie können pgAudit auch aktivieren, um einen separaten Protokolleintrag für jede Beziehungsreferenz in einer Anweisung zu erstellen, indem Sie pgaudit.log_relation festlegen ein.

Betrachten Sie ein Beispiel zum Erstellen einer Tabelle. Die SQL-Anweisung wäre:

CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));

Die entsprechenden Prüfprotokolleinträge sind:

2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,CREATE SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,CREATE TABLE,TABLE,public.persons,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,CREATE INDEX,INDEX,public.persons_pkey,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,ALTER SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>

Objekt-Audit-Protokollierung

In bestimmten Fällen kann es erforderlich sein, nur einen bestimmten Satz von Beziehungen zu prüfen. In solchen Fällen führt die Verwendung des Sitzungsmodus nur zu einer unnötig großen Anzahl von Audit-Protokollen, die nicht den erforderlichen Beziehungen entsprechen. Der Objektmodus ist für diesen Zweck besonders geeignet und kann nur einen bestimmten Satz von Beziehungen prüfen.

Objekt-Audit-Protokollierung wird mithilfe der PostgreSQL-Rollen erreicht. Eine Rolle kann erstellt und ihr die Berechtigungen zugewiesen werden, nur auf einen bestimmten Satz von Beziehungen zuzugreifen. Diese Rolle sollte im Konfigurationsparameter pgaudit.role angegeben werden . Der Objektmodus unterstützt nur SELECT , INSERT , UPDATE und DELETE Aussagen. Die Klassen von Anweisungen, die protokolliert werden, hängen von den Berechtigungen ab, die der Rolle erteilt wurden. Zum Beispiel, wenn die Rolle die Berechtigung hat, nur SELECT auszuführen , dann nur noch SELECT Anweisungen werden protokolliert.

Unten ist ein Beispiel für die Objekt-Audit-Protokollierung:

Erstellen Sie eine Rolle und gewähren Sie nur SELECT Berechtigungen. Legen Sie die pgaudit.role fest zu dieser Rolle und führen Sie SELECT aus SQL-Anweisung:

CREATE ROLE audit_person;
GRANT SELECT ON persons TO audit_person;
SET pgaudit.role = 'audit_person';
SELECT * FROM persons WHERE ID=404;

Die obige select-Anweisung wird protokolliert als:

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG:  AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>

Interessiert an einer vollständig verwalteten PostgreSQL-Lösung?

Um mehr darüber zu erfahren, wie ein DBaaS-Anbieter wie ScaleGrid Sie bei der Verwaltung Ihrer PostgreSQL-Datenbanken unterstützen kann, besuchen Sie unsere PostgreSQL-Seite. Erfahren Sie, wie Sie sich mit ScaleGrid mehr auf die Entwicklung Ihres Produkts und weniger auf die Verwaltung von Datenbanken konzentrieren können.

Wie interpretiert man den Audit-Log-Eintrag?

Bisher haben wir Details dazu bereitgestellt, wie der Audit-Log-Eintrag aussieht, jetzt werfen wir einen Blick auf das Format des Audit-Log-Eintrags. Jeder Eintrag beginnt mit dem für die PostgreSQL-Protokollierung erwähnten log_line_prefix, und der Rest der Ausgabe erfolgt im CSV-Format. Betrachten Sie den folgenden einfachen Überwachungsprotokolleintrag:

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG:  AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>

Im obigen Eintrag ist der Wert

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: 

hat das Format log_line_prefix %t:%r:%u@%d:[%p]: . Der Inhalt des Prüfeintrags beginnt mit LOG: AUDIT: Wert und folgt dem CSV-Format. Das Werteformat hat folgende Form:

AUDIT_TYPE,STATEMENT_ID,SUBSTATEMENT_ID,CLASS,COMMAND,OBJECT_TYPE,OBJECT_NAME,STATEMENT,PARAMETER

Sehen wir uns die einzelnen Felder einzeln an:

Feld Beschreibung Wert aus Beispiel-Audit-Eintrag
AUDIT_TYPE Gibt den Prüfmodus an:SESSION oder OBJECT OBJEKT
STATEMENT_ID Eindeutige Anweisungskennung für jede Sitzung 10
SUBSTATEMENT_ID Eine Kennung für jede Unteranweisung innerhalb der Hauptanweisung 1
KLASSE Gibt die Klasse von Anweisungen wie READ, WRITE usw. an, die definierte Werte für den Parameter pgaudit.log sind. LESEN
BEFEHL Der in der SQL-Anweisung verwendete Befehl SELECT
OBJECT_TYPE Kann TABELLE, INDEX, ANSICHT usw. sein TABLE
OBJECT_NAME Der vollständig qualifizierte Objektname öffentliche.Personen
ERKLÄRUNG Die tatsächlich ausgeführte Anweisung wähle * von Personen mit ID=404;
PARAMETER Wenn pgaudit.log_parameter auf „true“ gesetzt ist, wird die zitierte CSV-Datei der Parameter aufgelistet, falls vorhanden, oder „none“, wenn keine Parameter vorhanden sind. Wenn der Parameter pgaudit.log_parameter nicht gesetzt ist, lautet der Wert „

Schlussfolgerung

pgAudit vereinfacht mit all seinen Möglichkeiten den Audit-Prozess, indem es das Audit-Trail-Protokoll generiert. Obwohl es einige Vorbehalte gibt, wie das Protokollieren umbenannter Objekte unter demselben Namen, ist es immer noch ein robustes Tool, das die erforderliche Funktionalität bietet. Die in Protokolle geschriebenen Audit-Informationen sind jedoch möglicherweise nicht nur ideal für den Audit-Prozess – der Audit-Prozess ist sogar noch besser, wenn diese Protokolle in ein Datenbankschema konvertiert werden können und Audit-Daten in die Datenbank geladen werden können, sodass Sie sie einfach abfragen können Information. Hier hilft der PostgreSQL Audit Log Analyzer (pgAudit Analyze). Weitere Informationen finden Sie auf den GitHub-Seiten von pgAudit und pgAudit Analyze.