Azure WAF-Protokolle erfassen
In diesem Dokument wird beschrieben, wie Sie Azure Web Application Firewall-Logs (WAF) mit einem Azure-Speicherkonto in Google Security Operations exportieren. Der Parser verarbeitet Logs im JSON-Format und wandelt sie in das UDM um. Es werden Logs mit einem records-Array verarbeitet, indem jeder Datensatz durchlaufen und bestimmte Felder UDM-Attributen zugeordnet werden. Wenn das Array records fehlt, verarbeitet der Parser das Log als einzelnes Ereignis und extrahiert und ordnet die Felder entsprechend zu.
Hinweise
Prüfen Sie, ob die folgenden Voraussetzungen erfüllt sind:
- Google SecOps-Instanz
- Ein aktiver Azure-Mandant
- Privilegierter Zugriff auf Azure
Azure Storage-Konto konfigurieren
- Suchen Sie in der Azure-Konsole nach Storage accounts (Speicherkonten).
- Klicken Sie auf Erstellen.
- 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 (Standard wird empfohlen).
- Redundanz: Wählen Sie die Redundanz aus (GRS oder LRS empfohlen).
- Storage-Kontoname: Geben Sie einen Namen für das neue Speicherkonto ein.
- Klicken Sie auf Überprüfen + Erstellen.
- Sehen Sie sich die Übersicht des Kontos an und klicken Sie auf Erstellen.
- Wählen Sie auf der Seite Storage Account Overview (Speicherkonto – Übersicht) unter Security + networking (Sicherheit + Netzwerk) das Untermenü Access keys (Zugriffsschlüssel) aus.
- Klicken Sie neben key1 oder key2 auf Anzeigen.
- Klicken Sie auf In die Zwischenablage kopieren, um den Schlüssel zu kopieren.
- Bewahren Sie den Schlüssel an einem sicheren Ort auf, um ihn später zu verwenden.
- Wählen Sie auf der Seite Storage Account Overview (Speicherkontoübersicht) unter Settings (Einstellungen) das Untermenü Endpoints (Endpunkte) aus.
- Klicken Sie auf In die Zwischenablage kopieren, um die Endpunkt-URL des Blob-Dienstes zu kopieren, z. B.
https://<storageaccountname>.blob.core.windows.net
. - Speichern Sie die Endpunkt-URL an einem sicheren Ort, um sie später zu verwenden.
Logexport für Azure WAF-Logs konfigurieren
- Melden Sie sich mit Ihrem privilegierten Konto im Azure-Portal an.
- Rufen Sie WAF-Regeln (Web Application Firewall) auf und wählen Sie eine WAF aus, die überwacht werden soll.
- Wählen Sie Monitoring > Diagnoseeinstellungen aus.
- Klicken Sie auf + Diagnoseeinstellung hinzufügen.
- Geben Sie einen aussagekräftigen Namen für die Diagnoseeinstellung ein.
- Wählen Sie allLogs aus.
- Wählen Sie das Kästchen In einem Speicherkonto archivieren als Ziel aus.
- Geben Sie das Abo und das Speicherkonto an.
- Klicken Sie auf Speichern.
Feeds einrichten
Es gibt zwei verschiedene Einstiegspunkte zum Einrichten von Feeds in der Google SecOps-Plattform:
- SIEM-Einstellungen > Feeds > Neu hinzufügen
- Content Hub > Content-Packs > Erste Schritte
Azure WAF-Feed einrichten
- Klicken Sie auf das Paket Azure-Plattform.
- Suchen Sie den Protokolltyp Azure WAF und klicken Sie auf Neuen Feed hinzufügen.
Geben Sie Werte für die folgenden Felder an:
- Quelltyp: Microsoft Azure Blob Storage V2.
- 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
)
- Dabei gilt:
- Optionen zum Löschen der Quelle: Wählen Sie die Löschoption entsprechend Ihren Aufnahmeeinstellungen aus.
Hinweis: Wenn Sie die Option
Delete transferred files
oderDelete transferred files and empty directories
auswählen, müssen Sie dem Dienstkonto die entsprechenden Berechtigungen erteilen. - Maximales Dateialter: Enthält Dateien, die in den letzten Tagen geändert wurden. Der Standardwert ist 180 Tage.
Freigegebener Schlüssel: Der Zugriffsschlüssel für Azure Blob Storage. Erweiterte Optionen
Feedname: Ein vorausgefüllter Wert, der den Feed identifiziert.
Asset-Namespace: Namespace, der dem Feed zugeordnet ist.
Aufnahmelabels: Labels, die auf alle Ereignisse aus diesem Feed angewendet werden.
Klicken Sie auf Feed erstellen.
Weitere Informationen zum Konfigurieren mehrerer Feeds für verschiedene Logtypen in dieser Produktfamilie finden Sie unter Feeds nach Produkt konfigurieren.
UDM-Zuordnungstabelle
Logfeld | UDM-Zuordnung | Logik |
---|---|---|
backendPoolName |
additional.fields[?key=='backendPoolName'].value.string_value |
Der Wert wird aus dem Feld backendPoolName im Rohlog übernommen. |
backendSettingName |
additional.fields[?key=='backendSettingName'].value.string_value |
Der Wert wird aus dem Feld backendSettingName im Rohlog übernommen. |
category |
metadata.product_event_type |
Der Wert wird aus dem Feld category im Rohlog übernommen. |
EventEnqueuedUtcTime |
additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value |
Der Wert wird aus dem Feld EventEnqueuedUtcTime im Rohlog übernommen, wenn das Feld records vorhanden ist. |
EventProcessedUtcTime |
additional.fields[?key=='EventProcessedUtcTime'].value.string_value |
Der Wert wird aus dem Feld EventProcessedUtcTime im Rohlog übernommen, wenn das Feld records vorhanden ist. |
operationName |
additional.fields[?key=='operationName'].value.string_value |
Der Wert wird aus dem Feld operationName im Rohlog übernommen. |
properties.action |
additional.fields[?key=='action'].value.string_value |
Der Wert wird aus dem Feld properties.action im Rohlog übernommen, wenn das Feld records vorhanden ist. |
properties.action |
security_result.action_details |
Der Wert wird aus dem Feld properties.action im Rohlog übernommen, wenn das Feld records nicht vorhanden ist. |
properties.clientIP , properties.clientIp |
principal.asset.ip , principal.ip |
Der Wert wird entweder aus dem Feld properties.clientIP oder properties.clientIp im Rohlog übernommen, wobei clientIP Priorität hat. |
properties.clientPort |
principal.port |
Der Wert wird aus dem Feld properties.clientPort im Rohlog übernommen. |
properties.clientResponseTime |
principal.resource.attribute.labels[?key=='Client Response Time'].value |
Der Wert wird aus dem Feld properties.clientResponseTime im Rohlog übernommen, wenn das Feld records nicht vorhanden ist. |
properties.details.data |
additional.fields[?key=='Properties data'].value.string_value |
Der Wert wird aus dem Feld properties.details.data im Rohlog übernommen, wenn das Feld records vorhanden ist. |
properties.details.file |
principal.process.file.full_path |
Der Wert wird aus dem Feld properties.details.file im Rohlog übernommen, wenn das Feld records nicht vorhanden ist. |
properties.details.matches[].matchVariableName , properties.details.matches[].matchVariableValue |
additional.fields[?key.startsWith('%{idx} ')].value.string_value |
Der Wert wird aus dem properties.details.matches -Array im Rohlog übernommen. key im UDM wird mit dem Index (idx ) und matchVariableName erstellt. Der value wird aus matchVariableValue übernommen. |
properties.details.message |
metadata.description |
Der Wert wird aus dem Feld properties.details.message im Rohlog übernommen, nachdem Backslashes und Anführungszeichen entfernt wurden. |
properties.details.msg |
metadata.description |
Der Wert wird aus dem Feld properties.details.msg im Rohlog übernommen, wenn das Feld records vorhanden ist. |
properties.httpMethod |
network.http.method |
Der Wert wird aus dem Feld properties.httpMethod im Rohlog übernommen. |
properties.httpStatus |
network.http.response_code |
Der Wert wird aus dem Feld properties.httpStatus im Rohlog ü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 properties.originalHost , properties.host oder properties.hostname übernommen, wobei die Priorität in dieser Reihenfolge festgelegt wird. |
properties.policyId |
security_result.detection_fields[?key=='policyId'].value |
Der Wert wird aus dem Feld properties.policyId im Rohlog übernommen. |
properties.policyMode |
security_result.detection_fields[?key=='policyMode'].value |
Der Wert wird aus dem Feld properties.policyMode im Rohlog ü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 Rohlog übernommen, wenn das Feld records vorhanden ist. |
properties.receivedBytes |
network.received_bytes |
Der Wert wird aus dem Feld properties.receivedBytes im Rohlog übernommen. |
properties.requestUri |
target.url |
Der Wert wird aus dem Feld properties.requestUri im Rohlog übernommen. |
properties.ruleId |
security_result.rule_id |
Der Wert wird aus dem Feld properties.ruleId im Rohlog übernommen. |
properties.ruleName |
security_result.rule_name |
Der Wert wird aus dem Feld properties.ruleName im Rohlog übernommen, wenn das Feld records vorhanden ist. |
properties.ruleName , ruleSetType |
security_result.rule_name |
Der Wert wird aus dem Feld properties.ruleName übernommen. Wenn es leer ist, wird der Wert aus dem Feld ruleSetType im Rohlog übernommen, sofern das Feld records nicht vorhanden ist. |
properties.ruleSetVersion |
security_result.detection_fields[?key=='ruleSetVersion'].value |
Der Wert wird aus dem Feld properties.ruleSetVersion im Rohlog übernommen. |
properties.sentBytes |
network.sent_bytes |
Der Wert wird aus dem Feld properties.sentBytes im Rohlog übernommen. |
properties.serverResponseLatency |
additional.fields[?key=='Server Response Latency'].value.string_value |
Der Wert wird aus dem Feld properties.serverResponseLatency im Rohlog übernommen, wenn das Feld records nicht vorhanden ist. |
properties.serverRouted |
target.asset.ip , target.ip , target.port |
Die IP-Adresse und der Port werden aus dem Feld properties.serverRouted extrahiert. |
properties.sslCipher |
network.tls.cipher |
Der Wert wird aus dem Feld properties.sslCipher im Rohlog übernommen. |
properties.sslClientCertificateIssuerName |
network.tls.server.certificate.issuer |
Der Wert wird aus dem Feld properties.sslClientCertificateIssuerName im Rohlog übernommen. |
properties.sslProtocol |
network.tls.version |
Der Wert wird aus dem Feld properties.sslProtocol im Rohlog übernommen. |
properties.timeTaken |
additional.fields[?key=='Properties Timetaken'].value.string_value |
Der Wert wird aus dem Feld properties.timeTaken im Rohlog übernommen, wenn das Feld records nicht vorhanden ist. |
properties.trackingReference |
additional.fields[?key=='trackingReference'].value.string_value |
Der Wert wird aus dem Feld properties.trackingReference im Rohlog übernommen, wenn das Feld records vorhanden ist. |
properties.transactionId |
network.session_id |
Der Wert wird aus dem Feld properties.transactionId im Rohlog übernommen. |
properties.userAgent |
network.http.user_agent |
Der Wert wird aus dem Feld properties.userAgent im Rohlog übernommen. |
properties.WAFEvaluationTime |
additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value |
Der Wert wird aus dem Feld properties.WAFEvaluationTime im Rohlog übernommen, wenn das Feld records nicht vorhanden ist. |
properties.WAFMode |
additional.fields[?key=='Properties WAFMode'].value.string_value |
Der Wert wird aus dem Feld properties.WAFMode im Rohlog übernommen, wenn das Feld records nicht vorhanden ist. |
rec.category |
metadata.product_event_type |
Der Wert wird aus dem Feld rec.category im Rohlog ü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 Rohlog ü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 Rohlog übernommen, wobei clientIP Vorrang hat, wenn das Feld records vorhanden ist. |
rec.properties.clientPort |
principal.port |
Der Wert wird aus dem Feld rec.properties.clientPort im Rohlog ü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 Rohlog ü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 Rohlog übernommen, wenn das Feld records vorhanden ist. |
rec.properties.requestUri |
target.url |
Der Wert wird aus dem Feld rec.properties.requestUri im Rohlog übernommen, wenn das Feld records vorhanden ist. |
rec.properties.ruleName |
security_result.rule_name |
Der Wert wird aus dem Feld rec.properties.ruleName im Rohlog ü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 Rohlog übernommen, wenn das Feld records vorhanden ist. |
rec.resourceId |
target.resource.id |
Der Wert wird aus dem Feld rec.resourceId im Rohlog übernommen, wenn das Feld records vorhanden ist. |
rec.time |
metadata.event_timestamp |
Der Wert wird aus dem Feld rec.time im Rohlog übernommen, wenn das Feld records vorhanden ist. |
resourceId |
target.resource.id |
Der Wert wird aus dem Feld resourceId im Rohlog übernommen, wenn das Feld records nicht vorhanden ist. |
timeStamp |
metadata.event_timestamp |
Der Wert wird aus dem Feld timeStamp im Rohlog übernommen, wenn das Feld records nicht vorhanden ist. |
– | metadata.event_type |
Der Wert wird auf NETWORK_CONNECTION festgelegt, wenn sowohl der Prinzipal (Hostname oder Client-IP) als auch die Ziel-IP vorhanden sind. Der Wert ist auf STATUS_UPDATE festgelegt, wenn ein Prinzipal 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. |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten