Raccogliere i log WAF di Azure
Questo documento spiega come esportare i log di Azure Web Application Firewall (WAF) in Google Security Operations utilizzando un account di archiviazione Azure. Il parser gestisce i log in formato JSON, trasformandoli in UDM. Elabora i log contenenti un array di record iterando ogni record e mappando campi specifici alle proprietร UDM. Se l'array records รจ assente, il parser gestisce il log come un singolo evento, estraendo e mappando i campi di conseguenza.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Istanza Google SecOps
- Un tenant Azure attivo
- Accesso con privilegi ad Azure
Configura l'account di archiviazione di Azure
- Nella console Azure, cerca Storage accounts.
- Fai clic su Crea.
- Specifica i valori per i seguenti parametri di input:
- Abbonamento: seleziona l'abbonamento.
- Gruppo di risorse: seleziona il gruppo di risorse.
- Regione: seleziona la regione.
- Rendimento: seleziona il rendimento (consigliato Standard).
- Ridondanza: seleziona la ridondanza (consigliata GRS o LRS).
- Nome account di archiviazione: inserisci un nome per il nuovo account di archiviazione.
- Fai clic su Review + create (Rivedi e crea).
- Controlla la panoramica dell'account e fai clic su Crea.
- Nella pagina Panoramica account di archiviazione, seleziona il sottomenu Chiavi di accesso in Sicurezza e networking.
- Fai clic su Mostra accanto a key1 o key2.
- Fai clic su Copia negli appunti per copiare la chiave.
- Salva la chiave in un luogo sicuro per utilizzarla in un secondo momento.
- Nella pagina Panoramica account di archiviazione, seleziona il sottomenu Endpoint in Impostazioni.
- Fai clic su Copia negli appunti per copiare l'URL dell'endpoint Blob service, ad esempio
https://<storageaccountname>.blob.core.windows.net
. - Salva l'URL dell'endpoint in una posizione sicura per utilizzarlo in un secondo momento.
Come configurare l'esportazione dei log per i log WAF di Azure
- Accedi al portale di Azure utilizzando il tuo account con privilegi.
- Vai a Regole del web application firewall (WAF) e seleziona un WAF da monitorare.
- Seleziona Monitoraggio > Impostazioni di diagnostica.
- Fai clic su + Aggiungi impostazione di diagnostica.
- Inserisci un nome descrittivo per l'impostazione di diagnostica.
- Seleziona allLogs.
- Seleziona la casella di controllo Archivia in un account di archiviazione come destinazione.
- Specifica l'Abbonamento e l'Account di archiviazione.
- Fai clic su Salva.
Configurare i feed
Esistono due diversi punti di accesso per configurare i feed nella piattaforma Google SecOps:
- Impostazioni SIEM > Feed > Aggiungi nuovo
- Hub dei contenuti > Pacchetti di contenuti > Inizia
Come configurare il feed WAF di Azure
- Fai clic sul pacchetto Azure Platform.
- Individua il tipo di log Azure WAF e fai clic su Aggiungi nuovo feed.
Specifica i valori per i seguenti campi:
- Tipo di origine: Microsoft Azure Blob Storage V2.
- URI di Azure: l'URL dell'endpoint blob.
ENDPOINT_URL/BLOB_NAME
- Sostituisci quanto segue:
ENDPOINT_URL
: l'URL dell'endpoint blob (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: il nome del blob (ad esempio,<logname>-logs
)
- Sostituisci quanto segue:
- Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze di importazione.
Nota: se selezioni l'opzione
Delete transferred files
oDelete transferred files and empty directories
, assicurati di aver concesso le autorizzazioni appropriate al account di servizio. - Etร massima dei file: include i file modificati nell'ultimo numero di giorni. Il valore predefinito รจ 180 giorni.
Chiave condivisa: la chiave di accesso ad Azure Blob Storage. Opzioni avanzate
Nome feed: un valore precompilato che identifica il feed.
Spazio dei nomi dell'asset: spazio dei nomi associato al feed.
Etichette di importazione: etichette applicate a tutti gli eventi di questo feed.
Fai clic su Crea feed.
Per ulteriori informazioni sulla configurazione di piรน feed per diversi tipi di log all'interno di questa famiglia di prodotti, consulta Configurare i feed per prodotto.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
backendPoolName |
additional.fields[?key=='backendPoolName'].value.string_value |
Il valore viene estratto dal campo backendPoolName nel log non elaborato. |
backendSettingName |
additional.fields[?key=='backendSettingName'].value.string_value |
Il valore viene estratto dal campo backendSettingName nel log non elaborato. |
category |
metadata.product_event_type |
Il valore viene estratto dal campo category nel log non elaborato. |
EventEnqueuedUtcTime |
additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value |
Il valore viene estratto dal campo EventEnqueuedUtcTime nel log non elaborato quando esiste il campo records . |
EventProcessedUtcTime |
additional.fields[?key=='EventProcessedUtcTime'].value.string_value |
Il valore viene estratto dal campo EventProcessedUtcTime nel log non elaborato quando esiste il campo records . |
operationName |
additional.fields[?key=='operationName'].value.string_value |
Il valore viene estratto dal campo operationName nel log non elaborato. |
properties.action |
additional.fields[?key=='action'].value.string_value |
Il valore viene estratto dal campo properties.action nel log non elaborato quando esiste il campo records . |
properties.action |
security_result.action_details |
Il valore viene estratto dal campo properties.action nel log non elaborato quando il campo records non esiste. |
properties.clientIP , properties.clientIp |
principal.asset.ip , principal.ip |
Il valore viene estratto dal campo properties.clientIP o properties.clientIp nel log non elaborato, dando la prioritร a clientIP . |
properties.clientPort |
principal.port |
Il valore viene estratto dal campo properties.clientPort nel log non elaborato. |
properties.clientResponseTime |
principal.resource.attribute.labels[?key=='Client Response Time'].value |
Il valore viene estratto dal campo properties.clientResponseTime nel log non elaborato quando il campo records non esiste. |
properties.details.data |
additional.fields[?key=='Properties data'].value.string_value |
Il valore viene estratto dal campo properties.details.data nel log non elaborato quando esiste il campo records . |
properties.details.file |
principal.process.file.full_path |
Il valore viene estratto dal campo properties.details.file nel log non elaborato quando il campo records non esiste. |
properties.details.matches[].matchVariableName , properties.details.matches[].matchVariableValue |
additional.fields[?key.startsWith('%{idx} ')].value.string_value |
Il valore viene estratto dall'array properties.details.matches nel log non elaborato. key nell'UDM viene creato utilizzando l'indice (idx ) e matchVariableName . L'importo value viene prelevato da matchVariableValue . |
properties.details.message |
metadata.description |
Il valore viene estratto dal campo properties.details.message nel log non elaborato dopo aver rimosso le barre rovesciate e le virgolette. |
properties.details.msg |
metadata.description |
Il valore viene estratto dal campo properties.details.msg nel log non elaborato quando esiste il campo records . |
properties.httpMethod |
network.http.method |
Il valore viene estratto dal campo properties.httpMethod nel log non elaborato. |
properties.httpStatus |
network.http.response_code |
Il valore viene estratto dal campo properties.httpStatus nel log non elaborato. |
properties.httpVersion |
network.application_protocol |
Se il campo properties.httpVersion contiene HTTP , viene assegnato il valore HTTP . |
properties.host , properties.hostname , properties.originalHost |
principal.asset.hostname , principal.hostname |
Il valore viene estratto da properties.originalHost , properties.host o properties.hostname , in ordine di prioritร . |
properties.policyId |
security_result.detection_fields[?key=='policyId'].value |
Il valore viene estratto dal campo properties.policyId nel log non elaborato. |
properties.policyMode |
security_result.detection_fields[?key=='policyMode'].value |
Il valore viene estratto dal campo properties.policyMode nel log non elaborato quando esiste il campo records . |
properties.policy |
additional.fields[?key=='Properties policy'].value.string_value |
Il valore viene estratto dal campo properties.policy nel log non elaborato quando esiste il campo records . |
properties.receivedBytes |
network.received_bytes |
Il valore viene estratto dal campo properties.receivedBytes nel log non elaborato. |
properties.requestUri |
target.url |
Il valore viene estratto dal campo properties.requestUri nel log non elaborato. |
properties.ruleId |
security_result.rule_id |
Il valore viene estratto dal campo properties.ruleId nel log non elaborato. |
properties.ruleName |
security_result.rule_name |
Il valore viene estratto dal campo properties.ruleName nel log non elaborato quando esiste il campo records . |
properties.ruleName , ruleSetType |
security_result.rule_name |
Il valore viene estratto dal campo properties.ruleName o, se vuoto, dal campo ruleSetType nel log non elaborato quando il campo records non esiste. |
properties.ruleSetVersion |
security_result.detection_fields[?key=='ruleSetVersion'].value |
Il valore viene estratto dal campo properties.ruleSetVersion nel log non elaborato. |
properties.sentBytes |
network.sent_bytes |
Il valore viene estratto dal campo properties.sentBytes nel log non elaborato. |
properties.serverResponseLatency |
additional.fields[?key=='Server Response Latency'].value.string_value |
Il valore viene estratto dal campo properties.serverResponseLatency nel log non elaborato quando il campo records non esiste. |
properties.serverRouted |
target.asset.ip , target.ip , target.port |
L'IP e la porta vengono estratti dal campo properties.serverRouted . |
properties.sslCipher |
network.tls.cipher |
Il valore viene estratto dal campo properties.sslCipher nel log non elaborato. |
properties.sslClientCertificateIssuerName |
network.tls.server.certificate.issuer |
Il valore viene estratto dal campo properties.sslClientCertificateIssuerName nel log non elaborato. |
properties.sslProtocol |
network.tls.version |
Il valore viene estratto dal campo properties.sslProtocol nel log non elaborato. |
properties.timeTaken |
additional.fields[?key=='Properties Timetaken'].value.string_value |
Il valore viene estratto dal campo properties.timeTaken nel log non elaborato quando il campo records non esiste. |
properties.trackingReference |
additional.fields[?key=='trackingReference'].value.string_value |
Il valore viene estratto dal campo properties.trackingReference nel log non elaborato quando esiste il campo records . |
properties.transactionId |
network.session_id |
Il valore viene estratto dal campo properties.transactionId nel log non elaborato. |
properties.userAgent |
network.http.user_agent |
Il valore viene estratto dal campo properties.userAgent nel log non elaborato. |
properties.WAFEvaluationTime |
additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value |
Il valore viene estratto dal campo properties.WAFEvaluationTime nel log non elaborato quando il campo records non esiste. |
properties.WAFMode |
additional.fields[?key=='Properties WAFMode'].value.string_value |
Il valore viene estratto dal campo properties.WAFMode nel log non elaborato quando il campo records non esiste. |
rec.category |
metadata.product_event_type |
Il valore viene estratto dal campo rec.category nel log non elaborato quando esiste il campo records . |
rec.operationName |
additional.fields[?key=='operationName'].value.string_value |
Il valore viene estratto dal campo rec.operationName nel log non elaborato quando esiste il campo records . |
rec.properties.clientIP , rec.properties.clientIp |
principal.asset.ip , principal.ip |
Il valore viene estratto dal campo rec.properties.clientIP o rec.properties.clientIp nel log non elaborato, dando la prioritร a clientIP quando esiste il campo records . |
rec.properties.clientPort |
principal.port |
Il valore viene estratto dal campo rec.properties.clientPort nel log non elaborato quando esiste il campo records . |
rec.properties.host |
principal.asset.hostname , principal.hostname |
Il valore viene estratto dal campo rec.properties.host nel log non elaborato quando esiste il campo records . |
rec.properties.policy |
additional.fields[?key=='Properties policy'].value.string_value |
Il valore viene estratto dal campo rec.properties.policy nel log non elaborato quando esiste il campo records . |
rec.properties.requestUri |
target.url |
Il valore viene estratto dal campo rec.properties.requestUri nel log non elaborato quando esiste il campo records . |
rec.properties.ruleName |
security_result.rule_name |
Il valore viene estratto dal campo rec.properties.ruleName nel log non elaborato quando esiste il campo records . |
rec.properties.trackingReference |
additional.fields[?key=='trackingReference'].value.string_value |
Il valore viene estratto dal campo rec.properties.trackingReference nel log non elaborato quando esiste il campo records . |
rec.resourceId |
target.resource.id |
Il valore viene estratto dal campo rec.resourceId nel log non elaborato quando esiste il campo records . |
rec.time |
metadata.event_timestamp |
Il valore viene estratto dal campo rec.time nel log non elaborato quando esiste il campo records . |
resourceId |
target.resource.id |
Il valore viene estratto dal campo resourceId nel log non elaborato quando il campo records non esiste. |
timeStamp |
metadata.event_timestamp |
Il valore viene estratto dal campo timeStamp nel log non elaborato quando il campo records non esiste. |
N/D | metadata.event_type |
Il valore รจ impostato su NETWORK_CONNECTION se sono presenti sia l'entitร (nome host o IP client) sia l'IP di destinazione. ร impostato su STATUS_UPDATE se รจ presente un'entitร , ma manca l'IP di destinazione. In caso contrario, il valore predefinito รจ GENERIC_EVENT o il valore del campo event_type . |
N/D | metadata.log_type |
Il valore รจ codificato in modo permanente su AZURE_WAF . |
N/D | metadata.product_name |
Il valore รจ codificato in modo permanente su Azure WAF Logs . |
N/D | metadata.vendor_name |
Il valore รจ codificato in modo permanente su Microsoft . |
N/D | security_result.action |
Il valore รจ impostato su ALLOW se properties.action รจ Matched , BLOCK se properties.action รจ Block . |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.