Audit für PostgreSQL mit pgAudit

Auf dieser Seite wird die Datenbankprüfung mit der pgAudit-Erweiterung beschrieben. Damit können Sie viele Logs konfigurieren, die häufig für die Einhaltung von behördlichen, finanziellen und ISO-Zertifizierungen erforderlich sind.

Allgemeine Informationen zu PostgreSQL-Erweiterungen in Cloud SQL finden Sie unter PostgreSQL-Erweiterungen.

Übersicht

Die Datenbankprüfung in Cloud SQL for PostgreSQL ist über die Open-Source-pgAudit-Erweiterung möglich.

Mit dieser Erweiterung können Sie SQL-Vorgänge, die für eine bestimmte Datenbankinstanz ausgeführt wurden, selektiv aufzeichnen und verfolgen. Die Erweiterung bietet Ihnen Prüfungsfunktionen, mit denen Sie einen Teil der Vorgänge überwachen und aufzeichnen können.

Die pgAudit-Erweiterung gilt für ausgeführte SQL-Befehle und -Abfragen. Im Gegensatz dazu sollten Cloud-Audit-Logs verwendet werden, um Verwaltungs- und Wartungsvorgänge für eine Cloud SQL-Instanz zu prüfen.

Weitere Informationen zum Audit-Logging in Cloud SQL finden Sie auf der Seite Audit-Logs.

Datenbankprüfung in Cloud SQL einrichten

Für das Audit-Logging mithilfe der pgAudit-Erweiterung sind folgende Schritte erforderlich:

  1. Flag cloudsql.enable_pgaudit in Cloud SQL aktivieren
  2. Befehl ausführen, um pgAudit-Erweiterung zu erstellen
  3. Werte für das Flag pgaudit.log festlegen

Nach dem Einrichten der Datenbank-Auditing können Sie sich die Logs ansehen und das Logging gegebenenfalls deaktivieren.

Prüfung einrichten

In diesem Abschnitt werden die Grundlagen der Einrichtung von Datenbankprüfungsvorgängen beschrieben.

Erstes Flag zum Aktivieren des Auditing

In Cloud SQL verwenden Sie Datenbank-Flags für viele Vorgänge, einschließlich des Anpassens von PostgreSQL-Parametern und des Konfigurierens einer Instanz. Das Flag cloudsql.enable_pgaudit aktiviert das Auditing für eine bestimmte Datenbankinstanz. Sie können den Wert des Flags cloudsql.enable_pgaudit über die Google Cloud Console oder mit dem gcloud-Befehl ändern.

Verwenden Sie die Standardanleitung für Flags, um das Flag cloudsql.enable_pgaudit zu aktivieren und den Wert auf on zu setzen. Geben Sie beispielsweise zur Verwendung des gcloud-Befehls Folgendes an und ersetzen Sie [INSTANCE_NAME] durch Ihren Instanznamen:

gcloud sql instances patch [INSTANCE_NAME] --database-flags cloudsql.enable_pgaudit=on

Das Flag cloudsql.enable_pgaudit wird mit den anderen unterstützten Flags aufgeführt und gilt speziell für Cloud SQL.

Befehl ausführen, um pgAudit-Erweiterung zu erstellen

Führen Sie nach dem Aktivieren des Datenbank-Flags den Befehl CREATE EXTENSION mit einem kompatiblen psql-Client aus. Mit dem folgenden Befehl wird die pgAudit-Erweiterung für alle Datenbanken in einer Cloud SQL-Instanz erstellt:

CREATE EXTENSION pgaudit;

Legen Sie Werte für das Flag pgaudit.log fest.

Verwenden Sie die Standardanleitung für Flags, um Werte für das Flag pgaudit.log festzulegen.

Mit dem folgenden gcloud-Befehl können Sie beispielsweise die Prüfung für alle Datenbankvorgänge für eine Instanz aktivieren:

  gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

Andere Einstellungen für die Datenbank konfigurieren

Um die Prüfungseinstellungen für die Datenbank zu konfigurieren, folgen Sie den Schritten im Abschnitt Audit-Logging für Datenbanken in Cloud SQL anpassen.

Datenbank-Audit-Logs ansehen

Aktivieren Sie Audit-Logs zum Datenzugriff für Ihr Projekt, um sich Audit-Logs ansehen zu können. Die generierten pgAudit-Logs für die jeweilige Instanz werden als Audit-Logs zum Datenzugriff an Cloud Logging gesendet. Nutzer können sich die generierten pgAudit-Logs über den Log-Explorer ansehen.

Wenn Sie die pgAudit-Logs in der Log-Explorer-Anwendung aufrufen möchten, wählen Sie den Logfilter cloudaudit.googleapis.com/data_access aus.

Alternativ können Sie die folgende Abfrage verwenden, um alle pgAudit-Logs für ein bestimmtes Cloud SQL-Projekt aufzurufen:

resource.type="cloudsql_database"
logName="projects/<your-project-name>/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"

Logformat für pgAudit

Jeder pgAudit-Logeintrag in den Audit-Logs zum Datenzugriff enthält Felder, die die für eine Abfrage erfassten Informationen enthalten.

Hier ein Beispiel:

{
  protoPayload: {
    @type: "type.googleapis.com/google.cloud.audit.AuditLog"
    methodName: "cloudsql.instances.query"
    request: {
      @type: "type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"
      auditClass: "READ"
      auditType: "SESSION"
      chunkCount: "1"
      chunkIndex: "1"
      command: "SELECT"
      database: "finance"
      databaseSessionId: 2209692
      parameter: "[not logged]"
      statement: "SELECT * FROM revenue"
      statementId: 2
      substatementId: 1
      user: "alice"
    }
  }
}

Im Folgenden werden die Felder in den Audit-Logs zum Datenzugriff beschrieben:

  • auditClass: Der Typ der protokollierten Anweisung. Mögliche Werte sind READ, WRITE, FUNCTION, ROLE, DDL, MISC und MISC_SET.
  • auditType: SESSION oder OBJECT.
  • chunkCount: Die Blockaufteilung kann mit den Daten in den Feldern parameter und statement erfolgen. Das Feld chunkCount gibt die Gesamtzahl der Blöcke an. Sehen Sie sich auch die Beschreibung des Felds chunkIndex an.
  • chunkIndex: Gibt die Indexnummer der Datenblöcke in den Feldern parameter und statement im aktuellen request-Container an. Die erste Zahl ist 1. Sehen Sie sich auch die Beschreibung des Felds chunkCount an.
  • command: Beispiel: ALTER TABLE oder SELECT
  • parameter: Das Feld chunkIndex kann den Inhalt dieses Felds bestimmen. Siehe die Beschreibung des Felds chunkIndex. Wenn der Wert für pgaudit.log_parameter festgelegt ist, kann das Feld parameter die Anweisungsparameter als CSV-Daten in Anführungszeichen enthalten. Wenn keine Parameter vorhanden sind, enthält dieses Feld [none]. Andernfalls enthält dieses Feld [not logged].
  • statement: Anweisung, die auf dem Back-End ausgeführt wurde. Das Feld chunkIndex kann den Inhalt des Felds statement bestimmen. Siehe die Beschreibung des Felds chunkIndex.
  • statementId: Eindeutige Anweisungs-ID für diese Sitzung. Jede Anweisungs-ID stellt einen Back-End-Aufruf dar. Anweisungs-IDs sind sequenziell, selbst wenn einige Anweisungen nicht protokolliert werden.
  • substatementId: Sequenzielle ID für jede Unteranweisung in der Hauptanweisung.

Einige dieser Felder sind auch in der pgAudit-Dokumentation beschrieben.

Prüfung deaktivieren

Wenn Sie die Datenbankprüfung deaktivieren möchten, setzen Sie das Flag cloudsql.enable_pgaudit auf off. Der Wert lässt sich über die Cloud Console oder mit dem gcloud-Befehl ändern. Folgen Sie der Standardanleitung für Flags, um das Flag cloudsql.enable_pgaudit zu deaktivieren.

Führen Sie außerdem den Befehl DROP EXTENSION mit einem kompatiblen psql-Client aus, um den Erweiterungsstatus zu entfernen:

DROP EXTENSION pgaudit;

Audit-Logging für Datenbanken in Cloud SQL anpassen

In diesem Abschnitt wird beschrieben, wie Sie das Prüfverhalten einer Datenbankinstanz anpassen können.

Informationen zu weiteren Funktionen der Erweiterung finden Sie in der pgAudit-Dokumentation.

Anforderungen für Superuser-Berechtigungen

In Cloud SQL können Erweiterungen nur von Nutzern mit der Rolle cloudsqlsuperuser erstellt werden. Wenn Sie eine neue PostgreSQL-Instanz erstellen, wird der PostgreSQL-Standardnutzer für Sie erstellt. Sie müssen jedoch das Passwort des Nutzers festlegen. Der PostgreSQL-Standardnutzer hat die Rolle cloudsqlsuperuser. Weitere Informationen finden Sie unter PostgreSQL-Nutzer.

Prüfung für alle Datenbankvorgänge für die Instanz konfigurieren

Zum Konfigurieren der Prüfung für alle Datenbanken in einer Instanz müssen die pgAudit-Einstellungen auf Systemebene angewendet werden. Die Prüfparameter auf Systemebene können nur als Datenbank-Flags über die Google Cloud Console oder den gcloud-Befehl festgelegt werden. Mit dem folgenden gcloud-Befehl können Sie beispielsweise die Prüfung für alle Datenbankvorgänge für eine Instanz aktivieren:

  gcloud sql instances patch [INSTANCE_NAME] --database-flags \
  cloudsql.enable_pgaudit=on,pgaudit.log=all

Bestimmte Vorgänge für alle Instanzdatenbanken konfigurieren

Für die Prüfung aller Instanzdatenbanken können Sie die Google Cloud Console oder den Befehl gcloud verwenden. Wenn Sie beispielsweise die Prüfung nur für Lese- und Schreibvorgänge auf der Instanz aktivieren möchten, können Sie den folgenden gcloud-Befehl verwenden. In diesem Beispiel wird eine listenbasierte Syntax zum Angeben mehrerer Werte verwendet:

  gcloud sql instances patch [INSTANCE_NAME] \
  --database-flags ^:^cloudsql.enable_pgaudit=on:pgaudit.log=read,write

Der Befehl überschreibt die vorhandenen Datenbank-Flags.

Prüfung für eine bestimmte Datenbank konfigurieren

Um die Prüfung für eine bestimmte Datenbank zu konfigurieren, legen Sie die pgAudit-Parameter auf Datenbankebene fest. Mit dem folgenden SQL-Befehl kann beispielsweise die Lese-/Schreibprüfung für eine Datenbank namens finance aktiviert werden:

finance=> ALTER DATABASE finance SET pgaudit.log = 'read,write';

Prüfung für eine Beziehung konfigurieren

Die Prüfung für eine Beziehung ist weniger umfassend als die Prüfung für eine bestimmte Datenbank.

Beim Prüfen einer Beziehung wird dem Parameter pgaudit.role eine spezielle Prüferrolle zugewiesen. Alle Objekte oder Beziehungen, die dieser Rolle zugewiesen werden, werden in Logs erfasst.

Wenn Sie beispielsweise die Prüfung für alle SELECT-Abfragen in der salary-Beziehung in der employee-Datenbank konfigurieren möchten, können Sie die folgenden Befehle verwenden:

employee=> CREATE ROLE auditor WITH NOLOGIN;
employee=> ALTER DATABASE employee SET pgaudit.role = 'auditor';
employee=> GRANT SELECT ON salary TO auditor;

Sie können auch nur einen Teil der Spalten für eine bestimmte Beziehung prüfen.

Mit dem folgenden Befehl wird beispielsweise das Audit-Logging so konfiguriert, dass es nur erfolgt, wenn auf die Spalten income und tax_status über die salary-Beziehung zugegriffen wird:

employee=> GRANT SELECT(income, tax_status) ON salary TO auditor;

Prüfung für einen Datenbanknutzer konfigurieren

Sie können die Prüfung für einen bestimmten Nutzer aktivieren, indem Sie den Parameter pgaudit.log auf ROLE-Ebene festlegen.

Mit dem folgenden SQL-Befehl wird beispielsweise die Prüfung für alle Datenbankvorgänge festgelegt, die die Nutzerin Alice ausführt:

finance=> ALTER ROLE alice SET pgaudit.log = 'all';

Tipps zur Prüfungsverwaltung in Cloud SQL

Beachten Sie beim Anpassen des Prüfverhaltens Folgendes:

  • Wenn das Datenbank-Flag cloudsql.enable_pgaudit deaktiviert ist, wird das Audit-Logging sofort beendet. Die angewendeten pgAudit-Einstellungen (z. B. die Einstellungen des Parameters pgaudit.log) werden gespeichert, können aber explizit entfernt werden.
  • Die Datenbankinstanz wird neu gestartet, wenn der Wert des Datenbank-Flags für cloudsql.enable_pgaudit geändert wird.
  • Datenbanknutzer, die mit expliziten CREATE ROLE-Befehlen erstellt wurden, können keine Prüfungseinstellungen ändern. Das können nur Datenbanknutzer, die über die Google Cloud Console und den gcloud-Befehl erstellt wurden.
  • Wenn Sie sowohl das Sitzungs-Audit-Logging als auch das Objekt-Audit-Logging aktivieren, werden den Logs Anweisungen hinzugefügt, die sich auf beide beziehen. Sitzungs- und Objekt-Logging heben sich nicht gegenseitig auf oder verändern sich.

Einschränkungen der Erweiterung "pgAudit" in Cloud SQL for PostgreSQL

Audit-Logs werden vorübergehend auf das Laufwerk ihrer Instanz geschrieben und belegen Speicherplatz, bevor die Logs an Cloud Logging gesendet werden. Sehen Sie sich daher alle folgenden Informationen an, bevor Sie dieses Feature verwenden:

  • Die Logaufnahmerate beträgt 4 MB pro Sekunde. Wenn die Last aus der Loggenerierung die Aufnahmerate überschreitet, kann Folgendes auftreten:
    • Es kann zu einem Anstieg der Laufwerknutzung kommen.
    • Der Speicherplatz kann aufgebraucht werden.
  • Wenn Sie dieses Feature aktiviert haben und viele Abfragen ausführen, die Ihre Prüfungskriterien erfüllen, kann die Laufwerknutzung zu schnell anwachsen.
  • Bevor Sie dieses Feature verwenden, sollten Sie Folgendes tun:
    • Automatische Speichererhöhungen aktivieren
    • Gesamte Laufwerknutzung überwachen. Die Last aus der Loggenerierung kann nicht separat überwacht werden. Verwenden Sie den Messwert cloudsql.googleapis.com/database/disk/utilization im Metrics Explorer.
    • Verringern Sie die Laufwerknutzung gegebenenfalls, indem Sie weniger Abfragen ausführen oder die Prüfung reduzieren.
  • Wenn der verfügbare Speicherplatz aufgebraucht ist, gehen Audit-Logs für einige Abfragen möglicherweise verloren.