Audit-Logeinträge aufteilen

In diesem Dokument wird beschrieben, wie Cloud Logging übergroßes Audit-Log aufteilt: und enthält eine Anleitung zum aufgeteilte Audit-Logs.

Wenn ein einzelner Audit-Logeintrag die Größenbeschränkung überschreitet, Cloud Logging teilt diesen Eintrag auf und verteilt die in der Original-Audit-Logeintrag über mehrere Einträge hinweg. Nutzende möchten vielleicht aufgeteilte Audit-Logs, da die einzelnen Einträge nicht alle aus dem ursprünglichen Audit-Log.

Geteilte Audit-Logeinträge erkennen

Aufgeteilte Logeinträge enthalten Informationen zum ursprünglichen Eintrag, aus dem sie stammen geteilt wurden. Wenn ein Logeintrag eine split, dann Der Eintrag ist das Ergebnis der Aufteilung eines größeren ursprünglichen Logeintrags. Das split ist ein LogSplit Objekt, das die Informationen enthält, die zum Identifizieren des zugehörigen Aufteilungsprotokolls erforderlich sind Einträge.

Jeder geteilte Logeintrag enthält die folgenden Felder:

  • split.uid: Eine eindeutige Kennung für die Gruppe der aufgeteilten Logeinträge. aus einem gemeinsamen ursprünglichen Log-Eintrag. Der Wert dieses Felds ist für alle Einträge identisch, die aus dem ursprünglichen Logeintrag aufgeteilt wurden.

  • split.index: die Position dieses Eintrags in der Reihe der aufgeteilten Einträge. Die Der erste Eintrag des Splits hat den Index 0. split.index wird auch an das Feld LogEntry.insertId angehängt.

  • split.totalSplits: Die Anzahl der Logeinträge, in die der ursprüngliche Logeintrag aufgeteilt wurde. Der Wert dieses Felds ist für alle Einträge identisch, die aus dem ursprünglichen Logeintrag aufgeteilt wurden.

So wird ein Logeintrag aufgeteilt

Wenn ein übergroßer Audit-Logeintrag aufgeteilt wird, werden die Felder zwischen den sich folgende aufgeteilte Log-Einträge ergeben:

  • Alle Felder mit Ausnahme des Felds protoPayload werden in jedem Split dupliziert zu erstellen.

  • Die folgenden protoPayload-Unterfelder können auf mehrere Einträge aufgeteilt werden:

    • protoPayload.metadata
    • protoPayload.request
    • protoPayload.response
  • Alle anderen protoPayload-Unterfelder sind in allen aufgeteilten Einträgen enthalten.

  • Für protoPayload.metadata, protoPayload.request und protoPayload.response Unterfelder gehören, können die folgenden Feldtypen aufgeteilt werden für mehrere Einträge:

Wenn ein Feld zu einem teilbaren Feld gehört, aber nicht zu den teilbaren Feldtypen, ist es nur in einem der geteilten Logs vorhanden.

Ein boolesches Feld im Unterfeld protoPayload.request kann beispielsweise werden in einem aufgeteilten Logeintrag, aber in einem Stringfeld im protoPayload.request Der Inhalt eines untergeordneten Feldes kann auf mehrere geteilte Logeinträge aufgeteilt werden.

Ein Beispiel für die Aufteilung eines langen Eintrags finden Sie unter Beispiel für die Aufteilung eines Logeintrags

Wiederkehrende Felder mit vielen Werten

Wenn der Wert von protoPayload.metadata, protoPayload.request oder protoPayload.response eine Liste wiederholter Werte enthält, kann die Liste und auf mehrere geteilte Log-Einträge verteilt werden.

Die Liste der Werte [„foo“, „bar“, „baz“] könnte beispielsweise in 2 Werte aufgeteilt werden. listet: ["foo", "ba"] und ["", "r", "baz"]. Die erste Liste ist der Eintrag mit der split.index von 0, und die zweite Liste befindet sich im Eintrag mit split.index von 1 Die zweite Liste beginnt mit einer leeren Zeichenfolge, um die Positionen der der Elemente in der Liste und zeigen an, dass die Elemente an derselben Position müssen die verschiedenen Listen zusammengeführt werden. Im Beispiel ist ba der zweite Listenelement in Eintrag 0 und r das zweite Listenelement im Eintrag 1, sodass Sie werden beim Zusammenstellen der ursprünglichen Liste in der Reihenfolge bar neu kombiniert.

Große, nicht wiederkehrende Felder

Wenn große, nicht wiederholte Struct- und string-Felder aufgeteilt werden, werden diese Felder so behandelt:

  • Ein string-Feld wird auf Zeichenebene und nicht auf Byteebene aufgeteilt. Multibyte-Zeichen werden also nicht geändert.

  • LogEntry.split.index steuert die Reihenfolge der Inhalte der Aufteilung, nicht wiederholte Felder.

Geteilten Logeintrag wieder zusammensetzen

So können Sie mehrere geteilte Protokolle wieder zusammenführen:

  1. Die aufgeteilten Audit-Logs in aufsteigender Reihenfolge nach LogEntry.split.index sortieren Reihenfolge.

  2. Erstellen Sie eine Kopie des ersten geteilten Logs, wobei LogEntry.split.index == 0. Diese Kopie ist der Anfang des wieder zusammengesetzten Logs.

  3. Durchlaufen Sie für die verbleibenden Logeinträge alle teilbaren Felder von protoPayload und führen Sie für jedes Feld die folgenden Schritte aus:

    1. Wenn das Feld bereits im wieder zusammengesetzten Log vorhanden ist, hängen Sie den Inhalt von in das wieder zusammengestellte Log.

    2. Wenn das Feld im wieder zusammengesetzten Log nicht vorhanden ist, kopieren Sie es in das wieder zusammengestellte Protokoll

      Beim Aufteilen beibehalten wiederkehrende Felder den Index ihrer Elemente, sodass Sie diese Schritte auf Elementebene anwenden, wenn Sie ein wiederkehrendes Feld neu zusammenstellen.

  4. Löschen Sie nach dem Durchlaufen der teilbaren Felder LogEntry.split der zusammengestelltes Protokoll.

  5. Entfernen Sie das Suffix .0 aus LogEntry.insert_id des wieder zusammengesetzten Logs.

Beispielabfragen

Führen Sie den folgenden Befehl aus, um alle Logeinträge zu ermitteln, die aus demselben ursprünglichen Logeintrag aufgeteilt wurden. die folgende Abfrage im Log-Explorer, wobei die Klasse UID mit dem gewünschten Wert:

split.uid="UID"

Beispiel:

split.uid="abc123"

Führen Sie die folgende Abfrage aus, um alle Logeinträge zu ermitteln, die Teil einer Aufteilung sind:

split:*

Split-Audit-Logs herausfiltern

Mit dem folgenden Filter können Sie alle aufgeteilten Audit-Logs aus einer Abfrage ausschließen:

split.totalSplits = 0

Sie können auch nur den ersten Eintrag eines geteilten Audit-Logs einschließen und den Parameter mit folgendem Filter zurück:

split.index = 0

Beispiel für die Aufteilung eines Logeintrags

Das folgende Beispiel zeigt einen Audit-Logeintrag, bevor er in vier neue Logeinträge. Die neuen Einträge zeigen, wie verschiedene Felder in der auf mehrere Spalten aufgeteilt.

Übergroßer Audit-Logeintrag vor der Aufteilung

{
  "insertId": "567",
  "logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
  "resource": {
    "type": "audited_resource"
  },
  "protoPayload": {
    "serviceName": "example.googleapis.com",
    "methodName": "google.cloud.example.ExampleMethod",
    "resourceName": "projects/1234/resources/123",
    "status": {
      "code": 0
    },
    "authenticationInfo": {
      "principalEmail": "user@example_company.com"
    },
    "authorizationInfo": [
      {
        "resource": "example.googleapis.com/projects/1234/resources/123",
        "permission": "examples.get",
        "granted": "true"
      }
    ],
    "request" {
      "boolField": true,
      "numberField": 123,
      "stringField": "Very long string that needs 2 log entries.",
      "structField": {
        "nestedNumberField": 1337,
        "nestedStringField": "Another long string that needs 2 log entries.",
      },
      "listField" [
        {"value": "short 1"},
        {"value": "Yet another long string."},
        {"value": "short 2"},
        {"value": "short 3"},
      ]
    }
  }
}

Übergroßer Audit-Logeintrag nach der Aufteilung

Der ursprüngliche Logeintrag wird in die folgenden Einträge aufgeteilt. Beachten Sie, dass jeder Eintrag enthält das split-Objekt mit dem uid-Wert und dem totalSplits-Wert 4. Jedes Eintrag hat den split.index-Wert 0, 1, 2 oder 3. Dieser Wert gibt an, Reihenfolge der aufgeteilten Log-Einträge.

Logeintrag aufteilen, Index 0

Hier ist der erste aufgeteilte Logeintrag mit dem split.index-Wert 0.

{
  "insertId": "567.0",
  "logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
  "resource": {
    "type": "audited_resource"
  },
  "split": { 
    "uid": "789+2022-02-22T12:22:22.22+05:00",
    "index": 0,
    "totalSplits": 4,
  },
  "protoPayload": {
    // The following fields are included in all split entries
    "serviceName": "example.googleapis.com",
    "methodName": "google.cloud.example.ExampleMethod",
    "resourceName": "projects/1234/resources/123",
    "status": {
      "code": 0
    },
    "authenticationInfo": {  // small size; included in all split entries
      "principalEmail": "user@example_company.com"
    },
   // The following field is included in this split entry only.
   "authorizationInfo": [
      {
        "resource": "spanner.googleapis.com/projects/1234/datasets/123",
        "permission": "databases.read",
        "granted": "true"
      }
    ],
    // The following field is split across all the split entries
    "request" { 
      // boolField and numberField can only be in one split.
      "boolField": true,
      "numberField": 123,
      // Split with the next LogEntry.
      "stringField": "Very long string that ",
    }
  }
}

Logeintrag aufteilen, Index 1

Hier ist der nächste aufgeteilte Logeintrag mit dem split.index-Wert 1.

{
  "insertId": "567.1",
  "logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
  "resource": {
    "type": "audited_resource"
  },
  "split": { 
    "uid": "567+2022-02-22T12:22:22.22+05:00",
    "index": 1,
    "totalSplits": 4,
  },
  "protoPayload": { 
    "serviceName": "example.googleapis.com",
    "methodName": "google.cloud.example.ExampleMethod",
    "resourceName": "projects/1234/resources/123",
    "status": {
      "code": 0
    },
    "authenticationInfo": {
      "principalEmail": "user@example_company.com"
    },
    "request" { 
      // boolField and numberField aren't present
      // Continued from the previous entry.
      "stringField": "needs 2 log entries.",
      "structField": { 
        "nestedNumberField": 1337,
        // Split with the next LogEntry.
        "nestedStringField": "Another long string ",
      }
    }
  }
}

Logeintrag aufteilen, Index 2

Hier ist der nächste aufgeteilte Logeintrag mit dem split.index-Wert 2.

{
  "insertId": "567.2",
  "logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
  "resource": {
    "type": "audited_resource"
  },
  "split": { 
    "uid": "567+2022-02-22T12:22:22.22+05:00",
    "index": 2,
    "totalSplits": 4,
  },
  "protoPayload": { 
    "serviceName": "example.googleapis.com",
    "methodName": "google.cloud.example.ExampleMethod",
    "resourceName": "projects/1234/resources/123",
    "status": {
      "code": 0
    },
    "authenticationInfo": {
      "principalEmail": "user@example_company.com"
    },
    request { 
      "structField": { 
        // Continued from the previous entry.
        "nestedStringField": "that needs 2 log entries.",
      }
      "listField" [ 
         {"value": "short 1"},
         {"value": "Yet another "}, // Split with the next LogEntry.
        // Missing two values, split with the next LogEntry.
      ]
    }
  }
}

Logeintrag aufteilen, Index 3

Hier ist der letzte aufgeteilte Logeintrag mit dem split.index-Wert 3.

{
  "insertId": "567.3",
  "logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
  "resource": {
    "type": "audited_resource"
  },
  "split": { 
    "uid": "567+2022-02-22T12:22:22.22+05:00",
    "index": 3,
    "totalSplits": 4,
  },
  "protoPayload": { 
    "serviceName": "example.googleapis.com",
    "methodName": "google.cloud.example.ExampleMethod",
    "resourceName": "projects/1234/resources/123",
    "status": {
      "code": 0
    },
    "authenticationInfo": {
      "principalEmail": "user@example_company.com"
    },
    "request" { 
      "listField" [ 
        {}, // Padding to ensure correct positioning of elements in split repeated fields.
         {"value": "long string."}, // Continuation of the second repeated field.
         {"value": "short 2"},
         {"value": "short 3"},
      ]
    }
  }
}