Fastly WAF-Logs erfassen

Unterstützt in:

Übersicht

Dieser Parser extrahiert Felder aus Fastly WAF-JSON-Logs, transformiert und benennt sie um und ordnet sie dem UDM zu. Es verarbeitet verschiedene Datentypen, konvertiert Schweregrade und kategorisiert Ereignisse anhand der verfügbaren IP- und Hostnameninformationen. Außerdem werden potenzielle Parsing-Fehler behandelt und fehlerhafte Logeinträge verworfen.

Hinweise

Prüfen Sie, ob die folgenden Voraussetzungen erfüllt sind:

  • Google SecOps-Instanz.
  • Fastly-Konto mit Zugriff zum Konfigurieren von WAF-Einstellungen.

Feeds einrichten

Es gibt zwei verschiedene Einstiegspunkte zum Einrichten von Feeds in der Google SecOps-Plattform:

  • SIEM-Einstellungen > Feeds
  • Content Hub> Content-Pakete

Feeds über „SIEM-Einstellungen“ > „Feeds“ einrichten

So konfigurieren Sie einen Feed:

  1. Rufen Sie die SIEM-Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Feed hinzufügen.
  3. Klicken Sie auf der nächsten Seite auf Einen einzelnen Feed konfigurieren.
  4. Geben Sie im Feld Feed name (Feedname) einen Namen für den Feed ein, z. B. Fastly WAF Logs (Fastly-WAF-Logs).
  5. Wählen Sie Webhook als Quelltyp aus.
  6. Wählen Sie Fastly WAF als Logtyp aus.
  7. Klicken Sie auf Weiter.
  8. Optional: Geben Sie Werte für die folgenden Eingabeparameter an:
    • Trennzeichen für Aufteilung: Das Trennzeichen, das zum Trennen von Logzeilen verwendet wird, z. B. \n.
  9. Klicken Sie auf Weiter.
  10. Prüfen Sie die Feedkonfiguration auf dem Bildschirm Finalize (Abschließen) und klicken Sie dann auf Submit (Senden).
  11. Klicken Sie auf Geheimen Schlüssel generieren, um einen geheimen Schlüssel zur Authentifizierung dieses Feeds zu generieren.
  12. Kopieren Sie den geheimen Schlüssel und speichern Sie ihn. Sie können diesen geheimen Schlüssel nicht noch einmal aufrufen. Bei Bedarf können Sie einen neuen geheimen Schlüssel generieren. Dadurch wird der vorherige geheime Schlüssel jedoch ungültig.
  13. Kopieren Sie auf dem Tab Details die Feed-Endpunkt-URL aus dem Feld Endpunktinformationen. Sie müssen diese Endpunkt-URL in Ihrer Clientanwendung angeben.
  14. Klicken Sie auf Fertig.

Feeds über den Content Hub einrichten

Geben Sie Werte für die folgenden Felder an:

  • Trennzeichen für Aufteilung: Das Trennzeichen, das zum Trennen von Logzeilen verwendet wird, z. B. \n.

Erweiterte Optionen

  • Feedname: Ein vorausgefüllter Wert, der den Feed identifiziert.
  • Quelltyp: Methode, die zum Erfassen von Logs in Google SecOps verwendet wird.
  • Asset-Namespace: Der Namespace, der dem Feed zugeordnet ist.
  • Aufnahmelabels: Labels, die auf alle Ereignisse aus diesem Feed angewendet werden.

  • Klicken Sie auf Geheimen Schlüssel generieren, um einen geheimen Schlüssel zur Authentifizierung dieses Feeds zu generieren.

  • Kopieren Sie den geheimen Schlüssel und speichern Sie ihn. Sie können diesen geheimen Schlüssel nicht noch einmal aufrufen. Bei Bedarf können Sie einen neuen geheimen Schlüssel generieren. Dadurch wird der vorherige geheime Schlüssel jedoch ungültig.

  • Kopieren Sie auf dem Tab Details die Feed-Endpunkt-URL aus dem Feld Endpunktinformationen. Sie müssen diese Endpunkt-URL in Ihrer Clientanwendung angeben.

API-Schlüssel für den Webhook-Feed erstellen

  1. Rufen Sie die Google Cloud Console > Anmeldedaten auf.

    Zu den Anmeldedaten

  2. Klicken Sie auf Anmeldedaten erstellen und wählen Sie anschließend API-Schlüssel aus.

  3. Schränken Sie den API-Schlüsselzugriff auf die Google Security Operations API ein.

Endpunkt-URL angeben

  1. Geben Sie in Ihrer Clientanwendung die HTTPS-Endpunkt-URL an, die im Webhook-Feed bereitgestellt wird.
  2. Aktivieren Sie die Authentifizierung, indem Sie den API-Schlüssel und den geheimen Schlüssel als Teil des benutzerdefinierten Headers im folgenden Format angeben:

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    Empfehlung: Geben Sie den API-Schlüssel als Header an, anstatt ihn in der URL anzugeben.

  3. Wenn Ihr Webhook-Client keine benutzerdefinierten Headern unterstützt, können Sie den API-Schlüssel und den geheimen Schlüssel mit Suchparametern im folgenden Format angeben:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

    Ersetzen Sie Folgendes:

    • ENDPOINT_URL: Die URL des Feed-Endpunkts.
    • API_KEY: Der API-Schlüssel für die Authentifizierung bei Google Security Operations.
    • SECRET: Der geheime Schlüssel, den Sie zur Authentifizierung des Feeds generiert haben.

Webhook in Fastly konfigurieren

  1. Melden Sie sich in Fastly an.
  2. Optional: Wählen Sie im Menü Websites eine Website aus, wenn Sie mehrere Websites haben.
  3. Wählen Sie Verwalten > Websiteintegrationen aus.
  4. Klicken Sie auf Websiteintegration hinzufügen.
  5. Wählen Sie Generic Webhook (Allgemeiner Webhook) aus.
  6. Webhook-URL: Geben Sie die ENDPOINT_URL von Google SecOps ein, gefolgt von API_KEY und SECRET.
  7. Platzierung von Benachrichtigungen: Wählen Sie Alle Aktivitäten oder Bestimmte Aktivität aus.
  8. Optional: Wenn Sie Bestimmte Aktivität ausgewählt haben, rufen Sie das Aktivitätsmenü auf und wählen Sie die Aktivitätstypen aus, die vom Webhook gesendet werden sollen.
  9. Klicken Sie auf Websiteintegration erstellen.

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
anomaly_score security_result.detection_fields[].key: „anomaly“
security_result.detection_fields[].value: anomaly_score
Wenn waf.score.anomaly 0 oder leer ist und anomaly_score nicht leer oder 0 ist, wird der anomaly_score-Wert verwendet, um das security_result.detection_fields-Array mit dem Schlüssel „anomaly“ und dem Wert des anomaly_score-Felds zu füllen.
cache_status additional.fields[].key: "cache_status"
additional.fields[].value.string_value: cache_status
Der Wert cache_status wird verwendet, um das Array additional.fields mit dem Schlüssel „cache_status“ und dem Wert des Felds cache_status zu füllen.
client_ip principal.ip: client_ip Das Feld client_ip ist principal.ip zugeordnet.
connection.fastly_is_edge additional.fields[].key: "fastly_is_edge"
additional.fields[].value.bool_value: connection.fastly_is_edge
Der connection.fastly_is_edge-Wert wird verwendet, um das additional.fields-Array mit dem Schlüssel „fastly_is_edge“ und dem Wert des connection.fastly_is_edge-Felds zu füllen.
connection.fastly_is_shield additional.fields[].key: „fastly_is_shield“
additional.fields[].value.bool_value: connection.fastly_is_shield
Der Wert connection.fastly_is_shield wird verwendet, um das Array additional.fields mit dem Schlüssel „fastly_is_shield“ und dem Wert des Felds connection.fastly_is_shield zu füllen.
connection.request_tls_version network.tls.version: connection.request_tls_version Das Feld connection.request_tls_version ist network.tls.version zugeordnet.
fastly.server target.hostname: fastly.server Das Feld fastly.server ist target.hostname zugeordnet.
fastly.service_id additional.fields[].key: "service_id"
additional.fields[].value.string_value: fastly.service_id
Der Wert fastly.service_id wird verwendet, um das Array additional.fields mit dem Schlüssel „service_id“ und dem Wert des Felds fastly.service_id zu füllen.
geo.city principal.location.city: geo.city Das Feld geo.city ist principal.location.city zugeordnet.
geo.country principal.location.country_or_region: geo.country Das Feld geo.country ist principal.location.country_or_region zugeordnet.
geo.location principal.location.region_latitude: extrahiert aus geo.location
principal.location.region_longitude: extrahiert aus geo.location
Breiten- und Längengrad werden mithilfe eines regulären Ausdrucks aus dem Feld geo.location extrahiert und principal.location.region_latitude bzw. principal.location.region_longitude zugeordnet.
geo.region principal.location.state: geo.region Das Feld geo.region ist principal.location.state zugeordnet.
host principal.hostname: host Das Feld host ist principal.hostname zugeordnet.
request_headers.accept_charset additional.fields[].key: "accept_charset"
additional.fields[].value.string_value: request_headers.accept_charset
Der Wert request_headers.accept_charset wird verwendet, um das Array additional.fields mit dem Schlüssel „accept_charset“ und dem Wert des Felds request_headers.accept_charset zu füllen.
request_headers.accept_language additional.fields[].key: „accept_language“
additional.fields[].value.string_value: request_headers.accept_language
Der Wert request_headers.accept_language wird verwendet, um das Array additional.fields mit dem Schlüssel „accept_language“ und dem Wert des Felds request_headers.accept_language zu füllen.
request_headers.referer network.http.referral_url: request_headers.referer Das Feld request_headers.referer ist network.http.referral_url zugeordnet.
request_headers.user_agent network.http.user_agent: request_headers.user_agent Das Feld request_headers.user_agent ist network.http.user_agent zugeordnet.
request_id metadata.product_log_id: request_id Das Feld request_id ist metadata.product_log_id zugeordnet.
request_method network.http.method: request_method Das Feld request_method ist network.http.method zugeordnet.
response_headers.cache_control additional.fields[].key: "cache_control"
additional.fields[].value.string_value: response_headers.cache_control
Der Wert response_headers.cache_control wird verwendet, um das Array additional.fields mit dem Schlüssel „cache_control“ und dem Wert des Felds response_headers.cache_control zu füllen.
response_headers.content_type additional.fields[].key: "content_type"
additional.fields[].value.string_value: response_headers.content_type
Der Wert response_headers.content_type wird verwendet, um das additional.fields-Array mit dem Schlüssel „content_type“ und dem Wert des Felds response_headers.content_type zu füllen.
response_state additional.fields[].key: „response_state“
additional.fields[].value.string_value: response_state
Der Wert response_state wird verwendet, um das Array additional.fields mit dem Schlüssel „response_state“ und dem Wert des Felds response_state zu füllen.
response_status network.http.response_code: response_status Das Feld response_status wird network.http.response_code zugeordnet, wenn das Feld status leer ist.
rule_id security_result.rule_id: rule_id Wenn waf.rule_id leer ist, wird der Wert rule_id verwendet, um security_result.rule_id zu füllen.
severity waf.severity: severity Der Wert des Felds severity wird in waf.severity kopiert.
size_bytes.request_header network.sent_bytes: size_bytes.request_header Das Feld size_bytes.request_header ist network.sent_bytes zugeordnet.
size_bytes.response_header network.received_bytes: size_bytes.response_header Das Feld size_bytes.response_header ist network.received_bytes zugeordnet.
status network.http.response_code: status Das Feld status ist network.http.response_code zugeordnet.
timestamp metadata.event_timestamp: timestamp Das Feld timestamp wird geparst und metadata.event_timestamp zugeordnet.
url target.url: url Das Feld url ist target.url zugeordnet.
waf.blocked security_result.action: abgeleitet Wenn waf.blocked „false“ ist, wird security_result.action auf „ALLOW“ gesetzt. Wenn waf.blocked „true“ ist, wird security_result.action auf „BLOCK“ gesetzt.
waf.executed security_result.detection_fields[].key: „executed“
security_result.detection_fields[].value: waf.executed
Der Wert waf.executed wird verwendet, um das Array security_result.detection_fields mit dem Schlüssel „executed“ und dem Wert des Felds waf.executed zu füllen.
waf.failures security_result.detection_fields[].key: „failures“
security_result.detection_fields[].value: waf.failures
Der Wert waf.failures wird verwendet, um das Array security_result.detection_fields mit dem Schlüssel „failures“ und dem Wert des Felds waf.failures zu füllen.
waf.logged security_result.detection_fields[].key: „logged“
security_result.detection_fields[].value: waf.logged
Der Wert waf.logged wird verwendet, um das Array security_result.detection_fields mit dem Schlüssel „logged“ und dem Wert des Felds waf.logged zu füllen.
waf.message metadata.description: waf.message Wenn waf.message nicht leer ist, wird es metadata.description zugeordnet.
waf.rule_id security_result.rule_id: waf.rule_id Wenn waf.rule_id nicht leer ist, wird es security_result.rule_id zugeordnet.
waf.score.anomaly security_result.detection_fields[].key: „anomaly“
security_result.detection_fields[].value: waf.score.anomaly
Wenn waf.score.anomaly nicht 0 und nicht leer ist, wird der Wert verwendet, um das security_result.detection_fields-Array mit dem Schlüssel „anomaly“ und dem Wert des Felds waf.score.anomaly zu füllen.
waf.score.http_violation security_result.detection_fields[].key: „http_violation“
security_result.detection_fields[].value: waf.score.http_violation
Wenn waf.score.http_violation nicht 0 und nicht leer ist, wird der Wert verwendet, um das security_result.detection_fields-Array zu füllen.
waf.score.lfi security_result.detection_fields[].key: „lfi“
security_result.detection_fields[].value: waf.score.lfi
Ähnliche Logik wie waf.score.http_violation.
waf.score.php_injection security_result.detection_fields[].key: "php_injection"
security_result.detection_fields[].value: waf.score.php_injection
Ähnliche Logik wie waf.score.http_violation.
waf.score.rce security_result.detection_fields[].key: „rce“
security_result.detection_fields[].value: waf.score.rce
Ähnliche Logik wie waf.score.http_violation.
waf.score.rfi security_result.detection_fields[].key: „rfi“
security_result.detection_fields[].value: waf.score.rfi
Ähnliche Logik wie waf.score.http_violation.
waf.score.session_fixation security_result.detection_fields[].key: „session_fixation“
security_result.detection_fields[].value: waf.score.session_fixation
Ähnliche Logik wie waf.score.http_violation.
waf.score.sql_injection security_result.detection_fields[].key: "sql_injection"
security_result.detection_fields[].value: waf.score.sql_injection
Ähnliche Logik wie waf.score.http_violation.
waf.score.xss security_result.detection_fields[].key: „xss“
security_result.detection_fields[].value: waf.score.xss
Ähnliche Logik wie waf.score.http_violation.
waf.severity security_result.severity: abgeleitet
security_result.severity_details: waf.severity
Wenn waf.severity nicht leer ist, wird der Wert von security_result.severity anhand von Bereichen bestimmt (<=3: HIGH, >3 und <=6: MEDIUM, >6 und <=8: LOW, sonst: UNKNOWN_SEVERITY). Der ursprüngliche waf.severity-Wert wird ebenfalls security_result.severity_details zugeordnet.
waf_message metadata.description: waf_message Wenn waf.message leer und waf_message nicht leer ist, wird waf.message metadata.description zugeordnet. Wenn client_ip oder host und fastly.server nicht leer sind, wird metadata.event_type auf „NETWORK_HTTP“ gesetzt. Andernfalls, wenn client_ip oder host nicht leer sind, wird metadata.event_type auf „STATUS_UPDATE“ gesetzt. Andernfalls wird er auf „GENERIC_EVENT“ gesetzt. Hartcodierter Wert. Hartcodierter Wert. Hartcodierter Wert.

Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten