Azure WAF-Protokolle erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie Azure-WAF-Logs (Web Application Firewall) mithilfe eines Azure-Speicherkontos in Google Security Operations exportieren. Der Parser verarbeitet Protokolle im JSON-Format und wandelt sie in UDM um. Dabei werden Protokolle mit einem records-Array verarbeitet, indem jeder Datensatz durchgegangen und bestimmte Felder UDM-Properties zugeordnet werden. Wenn das Array records fehlt, verarbeitet der Parser das Protokoll als einzelnes Ereignis und extrahiert und ordnet die Felder entsprechend zu.

Hinweise

  • Sie benötigen eine Google SecOps-Instanz.
  • Sie benötigen einen aktiven Azure-Mandanten.
  • Sie benötigen Berechtigungen für den Zugriff auf Azure.

Azure-Speicherkonto konfigurieren

  1. Suchen Sie in der Azure-Konsole nach Speicherkonten.
  2. Klicken Sie auf Erstellen.
  3. Geben Sie Werte für die folgenden Eingabeparameter an:
    • Abo: Wählen Sie das Abo aus.
    • Ressourcengruppe: Wählen Sie die Ressourcengruppe aus.
    • Region: Wählen Sie die Region aus.
    • Leistung: Wählen Sie die Leistung aus. Wir empfehlen „Standard“.
    • Redundanz: Wählen Sie die Redundanz aus (GRS oder LRS empfohlen).
    • Speicherkontoname: Geben Sie einen Namen für das neue Speicherkonto ein.
  4. Klicken Sie auf Überprüfen + Erstellen.
  5. Sehen Sie sich die Kontoübersicht an und klicken Sie auf Erstellen.
  6. Wählen Sie auf der Seite Speicherkontoübersicht unter Sicherheit & Netzwerk das Untermenü Zugriffsschlüssel aus.
  7. Klicken Sie neben key1 oder key2 auf Anzeigen.
  8. Klicke auf In die Zwischenablage kopieren, um den Schlüssel zu kopieren.
  9. Speichern Sie den Schlüssel an einem sicheren Ort, um ihn später zu verwenden.
  10. Wählen Sie auf der Seite Speicherkontoübersicht unter Einstellungen das Untermenü Endpunkte aus.
  11. Klicken Sie auf In Zwischenablage kopieren, um die Endpunkt-URL des Blob-Dienstes zu kopieren, z. B. https://<storageaccountname>.blob.core.windows.net.
  12. Speichern Sie die Endpunkt-URL an einem sicheren Ort für die spätere Verwendung.

Logexport für Azure-WAF-Logs konfigurieren

  1. Melden Sie sich mit Ihrem Konto mit Berechtigungen im Azure-Portal an.
  2. Gehen Sie zu WAF-Regeln (Web Application Firewall) und wählen Sie eine WAF aus, die Sie überwachen möchten.
  3. Wählen Sie Monitoring > Diagnoseeinstellungen aus.
  4. Klicken Sie auf + Diagnoseeinstellung hinzufügen.
    • Geben Sie einen aussagekräftigen Namen für die Diagnoseeinstellung ein.
  5. Wählen Sie allLogs aus.
  6. Wählen Sie das Kästchen In einem Speicherkonto archivieren als Ziel aus.
    • Geben Sie das Abo und das Speicherkonto an.
  7. Klicken Sie auf Speichern.

Feed in Google SecOps für die Aufnahme der Azure-WAF-Logs konfigurieren

  1. Gehen Sie zu SIEM-Einstellungen > Feeds.
  2. Klicken Sie auf Neu hinzufügen.
  3. Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. Azure WAF-Protokolle.
  4. Wählen Sie Microsoft Azure Blob Storage als Quelltyp aus.
  5. Wählen Sie Azure WAF als Logtyp aus.
  6. Klicken Sie auf Weiter.
  7. Geben Sie Werte für die folgenden Eingabeparameter an:

    • Azure-URI: die Blob-Endpunkt-URL.
      • ENDPOINT_URL/BLOB_NAME
        • Dabei gilt:
          • ENDPOINT_URL: die Blob-Endpunkt-URL (https://<storageaccountname>.blob.core.windows.net)
          • BLOB_NAME: der Name des Blobs (z. B. <logname>-logs)
    • URI ist: Wählen Sie den URI-TYP gemäß der Logstream-Konfiguration aus (Einzeldatei | Verzeichnis | Verzeichnis mit Unterverzeichnissen).
    • Optionen zum Löschen der Quelle: Wählen Sie die gewünschte Löschoption aus.

    • Freigegebener Schlüssel: Der Zugriffsschlüssel für Azure Blob Storage.

    • Asset-Namespace: der Asset-Namespace.

    • Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll.

  8. Klicken Sie auf Weiter.

  9. Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
backendPoolName additional.fields[?key=='backendPoolName'].value.string_value Der Wert wird aus dem Feld backendPoolName im Rohprotokoll übernommen.
backendSettingName additional.fields[?key=='backendSettingName'].value.string_value Der Wert wird aus dem Feld backendSettingName im Rohprotokoll übernommen.
category metadata.product_event_type Der Wert wird aus dem Feld category im Rohprotokoll übernommen.
EventEnqueuedUtcTime additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value Der Wert wird aus dem Feld EventEnqueuedUtcTime im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
EventProcessedUtcTime additional.fields[?key=='EventProcessedUtcTime'].value.string_value Der Wert wird aus dem Feld EventProcessedUtcTime im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
operationName additional.fields[?key=='operationName'].value.string_value Der Wert wird aus dem Feld operationName im Rohprotokoll übernommen.
properties.action additional.fields[?key=='action'].value.string_value Der Wert wird aus dem Feld properties.action im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
properties.action security_result.action_details Wenn das Feld records nicht vorhanden ist, wird der Wert aus dem Feld properties.action im Rohprotokoll übernommen.
properties.clientIP, properties.clientIp principal.asset.ip, principal.ip Der Wert wird entweder aus dem Feld properties.clientIP oder properties.clientIp im Rohprotokoll übernommen. Dabei wird clientIP priorisiert.
properties.clientPort principal.port Der Wert wird aus dem Feld properties.clientPort im Rohprotokoll übernommen.
properties.clientResponseTime principal.resource.attribute.labels[?key=='Client Response Time'].value Wenn das Feld records nicht vorhanden ist, wird der Wert aus dem Feld properties.clientResponseTime im Rohprotokoll übernommen.
properties.details.data additional.fields[?key=='Properties data'].value.string_value Der Wert wird aus dem Feld properties.details.data im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
properties.details.file principal.process.file.full_path Wenn das Feld records nicht vorhanden ist, wird der Wert aus dem Feld properties.details.file im Rohprotokoll übernommen.
properties.details.matches[].matchVariableName, properties.details.matches[].matchVariableValue additional.fields[?key.startsWith('%{idx} ')].value.string_value Der Wert wird aus dem Array properties.details.matches im Rohprotokoll übernommen. Die key im UDM wird mit dem Index (idx) und matchVariableName erstellt. Der Wert für value wird aus matchVariableValue übernommen.
properties.details.message metadata.description Der Wert wird aus dem Feld properties.details.message im Rohprotokoll übernommen, nachdem Backslashes und Anführungszeichen entfernt wurden.
properties.details.msg metadata.description Der Wert wird aus dem Feld properties.details.msg im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
properties.httpMethod network.http.method Der Wert wird aus dem Feld properties.httpMethod im Rohprotokoll übernommen.
properties.httpStatus network.http.response_code Der Wert wird aus dem Feld properties.httpStatus im Rohprotokoll übernommen.
properties.httpVersion network.application_protocol Wenn das Feld properties.httpVersion den Wert HTTP enthält, wird der Wert HTTP zugewiesen.
properties.host, properties.hostname, properties.originalHost principal.asset.hostname, principal.hostname Der Wert wird aus einem der Werte properties.originalHost, properties.host oder properties.hostname übernommen. Die Werte haben dabei folgende Priorität:
properties.policyId security_result.detection_fields[?key=='policyId'].value Der Wert wird aus dem Feld properties.policyId im Rohprotokoll übernommen.
properties.policyMode security_result.detection_fields[?key=='policyMode'].value Der Wert wird aus dem Feld properties.policyMode im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
properties.policy additional.fields[?key=='Properties policy'].value.string_value Der Wert wird aus dem Feld properties.policy im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
properties.receivedBytes network.received_bytes Der Wert wird aus dem Feld properties.receivedBytes im Rohprotokoll übernommen.
properties.requestUri target.url Der Wert wird aus dem Feld properties.requestUri im Rohprotokoll übernommen.
properties.ruleId security_result.rule_id Der Wert wird aus dem Feld properties.ruleId im Rohprotokoll übernommen.
properties.ruleName security_result.rule_name Der Wert wird aus dem Feld properties.ruleName im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
properties.ruleName, ruleSetType security_result.rule_name Der Wert wird aus dem Feld properties.ruleName übernommen. Ist dieses Feld leer, wird der Wert aus dem Feld ruleSetType im Rohprotokoll übernommen, wenn das Feld records nicht vorhanden ist.
properties.ruleSetVersion security_result.detection_fields[?key=='ruleSetVersion'].value Der Wert wird aus dem Feld properties.ruleSetVersion im Rohprotokoll übernommen.
properties.sentBytes network.sent_bytes Der Wert wird aus dem Feld properties.sentBytes im Rohprotokoll übernommen.
properties.serverResponseLatency additional.fields[?key=='Server Response Latency'].value.string_value Wenn das Feld records nicht vorhanden ist, wird der Wert aus dem Feld properties.serverResponseLatency im Rohprotokoll übernommen.
properties.serverRouted target.asset.ip, target.ip, target.port IP und Port werden aus dem Feld properties.serverRouted extrahiert.
properties.sslCipher network.tls.cipher Der Wert wird aus dem Feld properties.sslCipher im Rohprotokoll übernommen.
properties.sslClientCertificateIssuerName network.tls.server.certificate.issuer Der Wert wird aus dem Feld properties.sslClientCertificateIssuerName im Rohprotokoll übernommen.
properties.sslProtocol network.tls.version Der Wert wird aus dem Feld properties.sslProtocol im Rohprotokoll übernommen.
properties.timeTaken additional.fields[?key=='Properties Timetaken'].value.string_value Wenn das Feld records nicht vorhanden ist, wird der Wert aus dem Feld properties.timeTaken im Rohprotokoll übernommen.
properties.trackingReference additional.fields[?key=='trackingReference'].value.string_value Der Wert wird aus dem Feld properties.trackingReference im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
properties.transactionId network.session_id Der Wert wird aus dem Feld properties.transactionId im Rohprotokoll übernommen.
properties.userAgent network.http.user_agent Der Wert wird aus dem Feld properties.userAgent im Rohprotokoll übernommen.
properties.WAFEvaluationTime additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value Wenn das Feld records nicht vorhanden ist, wird der Wert aus dem Feld properties.WAFEvaluationTime im Rohprotokoll übernommen.
properties.WAFMode additional.fields[?key=='Properties WAFMode'].value.string_value Wenn das Feld records nicht vorhanden ist, wird der Wert aus dem Feld properties.WAFMode im Rohprotokoll übernommen.
rec.category metadata.product_event_type Der Wert wird aus dem Feld rec.category im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
rec.operationName additional.fields[?key=='operationName'].value.string_value Der Wert wird aus dem Feld rec.operationName im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
rec.properties.clientIP, rec.properties.clientIp principal.asset.ip, principal.ip Der Wert wird entweder aus dem Feld rec.properties.clientIP oder rec.properties.clientIp im Rohprotokoll übernommen. Wenn das Feld records vorhanden ist, wird clientIP priorisiert.
rec.properties.clientPort principal.port Der Wert wird aus dem Feld rec.properties.clientPort im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
rec.properties.host principal.asset.hostname, principal.hostname Der Wert wird aus dem Feld rec.properties.host im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
rec.properties.policy additional.fields[?key=='Properties policy'].value.string_value Der Wert wird aus dem Feld rec.properties.policy im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
rec.properties.requestUri target.url Der Wert wird aus dem Feld rec.properties.requestUri im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
rec.properties.ruleName security_result.rule_name Der Wert wird aus dem Feld rec.properties.ruleName im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
rec.properties.trackingReference additional.fields[?key=='trackingReference'].value.string_value Der Wert wird aus dem Feld rec.properties.trackingReference im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
rec.resourceId target.resource.id Der Wert wird aus dem Feld rec.resourceId im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
rec.time metadata.event_timestamp Der Wert wird aus dem Feld rec.time im Rohprotokoll übernommen, wenn das Feld records vorhanden ist.
resourceId target.resource.id Wenn das Feld records nicht vorhanden ist, wird der Wert aus dem Feld resourceId im Rohprotokoll übernommen.
timeStamp metadata.event_timestamp Wenn das Feld records nicht vorhanden ist, wird der Wert aus dem Feld timeStamp im Rohprotokoll übernommen.
metadata.event_type Der Wert wird auf NETWORK_CONNECTION festgelegt, wenn sowohl der Haupt- (Hostname oder Client-IP) als auch die Ziel-IP vorhanden sind. Es wird auf STATUS_UPDATE gesetzt, wenn ein Hauptkonto vorhanden ist, aber die Ziel-IP-Adresse fehlt. Andernfalls wird standardmäßig GENERIC_EVENT oder der Wert des Felds event_type verwendet.
metadata.log_type Der Wert ist auf AZURE_WAF hartcodiert.
metadata.product_name Der Wert ist auf Azure WAF Logs hartcodiert.
metadata.vendor_name Der Wert ist auf Microsoft hartcodiert.
security_result.action Der Wert wird auf ALLOW gesetzt, wenn properties.action gleich Matched ist, und auf BLOCK, wenn properties.action gleich Block ist.

Änderungen

2024-04-07

Optimierung:

  • rec.properties.clientIp wurde principal.ip zugeordnet.
  • rec_properties_trackingReference, rec_properties_host, rec_properties_policyMode, rec_properties_ruleName, rec_properties_policy, rec_properties_details_msg, rec_properties_clientIP und rec_time in Statusdaten definiert.

2023-07-14

Optimierung:

  • Eine for-Schleife zum Verarbeiten von JSON-Logs wurde hinzugefügt.

2023-02-28

Optimierung:

  • properties.ruleName wurde security_result.rule_name zugeordnet.
  • properties.action wurde security_result.action zugeordnet.
  • Es wurde eine Prüfung für on_error für properties.clientPort, properties.httpStatus, properties.receivedBytes, properties.sentBytes, properties.clientResponseTime und properties.timeTaken hinzugefügt.

2022-10-22

  • Neu erstellter Parser

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