Azure WAF-Protokolle erfassen
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
- Suchen Sie in der Azure-Konsole nach 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. 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.
- Klicken Sie auf Überprüfen + Erstellen.
- Sehen Sie sich die Kontoübersicht an und klicken Sie auf Erstellen.
- Wählen Sie auf der Seite Speicherkontoübersicht unter Sicherheit & Netzwerk das Untermenü Zugriffsschlüssel aus.
- Klicken Sie neben key1 oder key2 auf Anzeigen.
- Klicke auf In die Zwischenablage kopieren, um den Schlüssel zu kopieren.
- Speichern Sie den Schlüssel an einem sicheren Ort, um ihn später zu verwenden.
- Wählen Sie auf der Seite Speicherkontoübersicht unter Einstellungen das Untermenü Endpunkte aus.
- Klicken Sie auf In 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 für die spätere Verwendung.
Logexport für Azure-WAF-Logs konfigurieren
- Melden Sie sich mit Ihrem Konto mit Berechtigungen im Azure-Portal an.
- Gehen Sie zu WAF-Regeln (Web Application Firewall) und wählen Sie eine WAF aus, die Sie überwachen möchten.
- 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.
Feed in Google SecOps für die Aufnahme der Azure-WAF-Logs konfigurieren
- Gehen Sie zu SIEM-Einstellungen > Feeds.
- Klicken Sie auf Neu hinzufügen.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. Azure WAF-Protokolle.
- Wählen Sie Microsoft Azure Blob Storage als Quelltyp aus.
- Wählen Sie Azure WAF als Logtyp aus.
- Klicken Sie auf Weiter.
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
)
- Dabei gilt:
- 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.
- Azure-URI: die Blob-Endpunkt-URL.
Klicken Sie auf Weiter.
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
wurdeprincipal.ip
zugeordnet.rec_properties_trackingReference
,rec_properties_host
,rec_properties_policyMode
,rec_properties_ruleName
,rec_properties_policy
,rec_properties_details_msg
,rec_properties_clientIP
undrec_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
wurdesecurity_result.rule_name
zugeordnet.properties.action
wurdesecurity_result.action
zugeordnet.- Es wurde eine Prüfung für on_error für
properties.clientPort
,properties.httpStatus
,properties.receivedBytes
,properties.sentBytes
,properties.clientResponseTime
undproperties.timeTaken
hinzugefügt.
2022-10-22
- Neu erstellter Parser
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten