Fastly WAF-Logs erfassen
Ü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:
- Rufen Sie die SIEM-Einstellungen > Feeds auf.
- Klicken Sie auf Neuen Feed hinzufügen.
- Klicken Sie auf der nächsten Seite auf Einen einzelnen Feed konfigurieren.
- Geben Sie im Feld Feed name (Feedname) einen Namen für den Feed ein, z. B. Fastly WAF Logs (Fastly-WAF-Logs).
- Wählen Sie Webhook als Quelltyp aus.
- Wählen Sie Fastly WAF als Logtyp aus.
- Klicken Sie auf Weiter.
- 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
.
- Trennzeichen für Aufteilung: Das Trennzeichen, das zum Trennen von Logzeilen verwendet wird, z. B.
- Klicken Sie auf Weiter.
- Prüfen Sie die Feedkonfiguration auf dem Bildschirm Finalize (Abschließen) und klicken Sie dann auf Submit (Senden).
- 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.
- 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
Rufen Sie die Google Cloud Console > Anmeldedaten auf.
Klicken Sie auf Anmeldedaten erstellen und wählen Sie anschließend API-Schlüssel aus.
Schränken Sie den API-Schlüsselzugriff auf die Google Security Operations API ein.
Endpunkt-URL angeben
- Geben Sie in Ihrer Clientanwendung die HTTPS-Endpunkt-URL an, die im Webhook-Feed bereitgestellt wird.
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.
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
- Melden Sie sich in Fastly an.
- Optional: Wählen Sie im Menü Websites eine Website aus, wenn Sie mehrere Websites haben.
- Wählen Sie Verwalten > Websiteintegrationen aus.
- Klicken Sie auf Websiteintegration hinzufügen.
- Wählen Sie Generic Webhook (Allgemeiner Webhook) aus.
- Webhook-URL: Geben Sie die ENDPOINT_URL von Google SecOps ein, gefolgt von API_KEY und SECRET.
- Platzierung von Benachrichtigungen: Wählen Sie Alle Aktivitäten oder Bestimmte Aktivität aus.
- 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.
- 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 : abgeleitetsecurity_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