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 für die spätere Verwendung.
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
- Content Hub> Content-Pakete
Feeds über die SIEM-Einstellungen > „Feeds“ einrichten
Informationen zum Konfigurieren mehrerer Feeds für verschiedene Logtypen in dieser Produktfamilie finden Sie unter Feeds nach Produkt konfigurieren.
So konfigurieren Sie einen einzelnen 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. Azure WAF Logs (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 is a (URI ist ein): Wählen Sie den URI-TYP entsprechend der Logstream-Konfiguration aus (Single file (Einzelne Datei) | Directory (Verzeichnis) | Directory which includes subdirectories (Verzeichnis mit Unterverzeichnissen)).
Optionen zum Löschen der Quelle: Wählen Sie die Löschoption entsprechend Ihren Aufnahmeeinstellungen 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.
Feeds über den Content Hub einrichten
Geben Sie Werte für die folgenden Felder 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 is a (URI ist ein): Wählen Sie den URI-TYP entsprechend der Logstream-Konfiguration aus (Single file (Einzelne Datei) | Directory (Verzeichnis) | Directory which includes subdirectories (Verzeichnis mit Unterverzeichnissen)).
- Optionen zum Löschen der Quelle: Wählen Sie die Löschoption entsprechend Ihren Aufnahmeeinstellungen aus.
- Freigegebener Schlüssel: Der Zugriffsschlüssel für Azure Blob Storage.
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: Namespace, der dem Feed zugeordnet ist.
- Aufnahmelabels: Labels, die auf alle Ereignisse aus diesem Feed angewendet werden.
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 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