Raccogliere i log di Cloudflare
Questo documento spiega come importare i log di Cloudflare in Google Security Operations utilizzando Webhook (destinazione HTTP) o Google Cloud Storage. Cloudflare produce dati operativi sotto forma di log per DNS, HTTP, audit, Zero Trust e CASB. Questa integrazione ti consente di inviare questi log a Google SecOps per l'analisi e il monitoraggio. Il parser inizializza innanzitutto un insieme di campi vuoti e poi analizza i log Cloudflare in formato JSON, eliminando tutti i messaggi che non sono JSON validi. Il codice utilizza quindi la logica condizionale in base alla presenza e ai valori di campi specifici per determinare il prodotto e il tipo di evento Cloudflare, compilando i campi Unified Data Model (UDM) di conseguenza.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Istanza Google SecOps.
- Account Cloudflare Enterprise con LogPush attivato.
- Per il metodo Webhook: accesso privilegiato alla console Google Cloud .
- Per il metodo Google Cloud Storage: accesso con privilegi a Google Cloud Storage.
Metodo 1: configura l'esportazione dei log di Cloudflare utilizzando il webhook (destinazione HTTP)
Questo metodo ti consente di trasmettere i log di Cloudflare direttamente a Google SecOps senza spazio di archiviazione intermedio.
Configurare un feed webhook in Google SecOps
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
Cloudflare Webhook
). - Seleziona Webhook come Tipo di origine.
- Seleziona Cloudflare come Tipo di log.
- Fai clic su Avanti.
- Specifica i valori per i seguenti parametri di input:
- Delimitatore di divisione:
\n
. - Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
- Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
- Delimitatore di divisione:
- Fai clic su Avanti.
- Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
- Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.
- Copia e salva la chiave segreta, perché non potrai più visualizzarla.
- Vai alla scheda Dettagli.
- Copia l'URL dell'endpoint del feed dal campo Endpoint Information (Informazioni sull'endpoint).
- Fai clic su Fine.
Crea una chiave API per il feed Webhook
- Vai alla consoleGoogle Cloud > API e servizi > Credenziali.
- Fai clic su Crea credenziali e poi seleziona Chiave API.
- Fai clic su Modifica chiave API.
- In Restrizioni delle API, seleziona Limita chiave.
- Seleziona API Google SecOps dall'elenco.
- Fai clic su Salva.
- Copia il valore della chiave API.
Configura la destinazione HTTP Cloudflare LogPush
- Accedi alla dashboard di Cloudflare.
- Seleziona l'account aziendale o il dominio che vuoi utilizzare con LogPush.
- Vai ad Analytics e log > Logpush.
- Fai clic su Crea un job Logpush.
- In Seleziona una destinazione, scegli Destinazione HTTP.
Inserisci l'URL dell'endpoint HTTP con i parametri di autenticazione:
<ENDPOINT_URL>?header_X-goog-api-key=<API_KEY>&header_X-Webhook-Access-Key=<SECRET_KEY>
Sostituisci quanto segue:
<ENDPOINT_URL>
: l'URL dell'endpoint del feed di Google SecOps.<API_KEY>
: la chiave API della console Google Cloud (con codifica URL se contiene caratteri speciali).<SECRET_KEY>
: la chiave segreta del feed webhook (con codifica URL se contiene caratteri speciali).
Fai clic su Continua.
Seleziona il set di dati da inviare (ad esempio Richieste HTTP, DNS, Audit, Zero Trust, CASB).
Configura il job di logpush:
- Inserisci il Nome del job.
- (Facoltativo) In Se i log corrispondono, configura i filtri.
- In Invia i seguenti campi, seleziona i campi da includere.
- Scegli il formato del timestamp (consigliato RFC3 339).
- Configura la frequenza di campionamento, se necessario.
Fai clic su Invia per creare il job di push dei log.
Verificare l'integrazione webhook
Dopo la configurazione, i log dovrebbero essere visualizzati in Google SecOps entro pochi minuti. Per verificare:
- Vai a Indagine > Ricerca SIEM.
- Cerca i log con l'etichetta di importazione configurata.
- Verifica che i log di Cloudflare vengano analizzati correttamente.
Metodo 2: configura l'esportazione dei log di Cloudflare utilizzando Google Cloud Storage
Configura Cloudflare per il push dei log, il che comporta la concessione delle autorizzazioni necessarie.
Crea un bucket Google Cloud
- Accedi alla consoleGoogle Cloud .
- Vai alla pagina Bucket Cloud Storage.
- Fai clic su Crea.
- Nella pagina Crea un bucket, inserisci le informazioni del bucket:
- Nome: inserisci un nome univoco che soddisfi i requisiti del nome del bucket (ad esempio
cloudflare-data
). - Tipo di località: seleziona un tipo di località e una regione.
- Per attivare lo spazio dei nomi gerarchico, fai clic sulla freccia di espansione per espandere Ottimizza per workload orientati ai file e con uso intensivo dei dati, poi seleziona Abilita uno spazio dei nomi gerarchico in questo bucket.
- Nome: inserisci un nome univoco che soddisfi i requisiti del nome del bucket (ad esempio
- Fai clic su Crea.
Concedi le autorizzazioni al bucket
- Nella console Cloud Storage, seleziona il bucket creato in precedenza.
- Fai clic sulla scheda Autorizzazioni.
- Fai clic su Concedi accesso.
- Aggiungi l'account
logpush@cloudflare-data.iam.gserviceaccount.com
con l'autorizzazione Amministratore oggetti Storage. - Fai clic su Salva.
Configurare Cloudflare LogPush in Google Cloud Storage
- Accedi alla dashboard di Cloudflare.
- Seleziona l'account aziendale o il dominio che vuoi utilizzare con LogPush.
- Vai ad Analytics e log > Logpush.
- Fai clic su Crea un job Logpush.
- In Seleziona una destinazione, scegli Google Cloud Storage.
- Inserisci il percorso del bucket Google Cloud Storage (ad esempio,
gs://cloudflare-data/logs/
). Fai clic su Continua.
Inserisci il token di proprietà e fai clic su Continua.
Seleziona il set di dati da inviare allo spazio di archiviazione.
Configura il job di logpush:
- Inserisci il Nome del job.
- In Se i log corrispondono, puoi selezionare gli eventi da includere o rimuovere dai log.
- In Invia i seguenti campi, scegli i log da inviare.
- Scegli il formato del timestamp (consigliato RFC 339).
- Configura la frequenza di campionamento, se necessario.
Fai clic su Invia.
Configura un feed in Google SecOps per importare i log Cloudflare da Google Cloud Storage
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
Cloudflare GCS Logs
). - Seleziona Google Cloud Storage V2 come Tipo di origine.
- Seleziona Cloudflare come Tipo di log.
- Fai clic su Ottieni account di servizio.
- Fai clic su Avanti.
Specifica i valori per i seguenti parametri di input:
- URI bucket di archiviazione:URL del bucket in formato
gs://my-bucket/<value>/
. Google Cloud Questo URL deve terminare con una barra (/). - Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
- Età massima dei file: include i file modificati nell'ultimo numero di giorni. Il valore predefinito è 180 giorni.
- Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
- Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
- URI bucket di archiviazione:URL del bucket in formato
Fai clic su Avanti.
Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
ClientIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip |
Il valore viene estratto dal campo ClientIP. |
ClientRequestHost | read_only_udm.target.asset.hostname read_only_udm.target.hostname |
Il valore viene estratto dal campo ClientRequestHost. |
ClientRequestMethod | read_only_udm.network.http.method | Il valore viene estratto dal campo ClientRequestMethod. |
ClientRequestURI | read_only_udm.target.url | Il valore viene estratto dal campo ClientRequestURI. Se il campo ClientRequestHost non è vuoto, il valore viene concatenato al campo ClientRequestHost. |
ClientSrcPort | read_only_udm.principal.port | Il valore viene estratto dal campo ClientSrcPort. |
ClientRequestUserAgent | read_only_udm.network.http.user_agent | Il valore viene estratto dal campo ClientRequestUserAgent. |
ClientSSLCipher | read_only_udm.network.tls.cipher | Il valore viene estratto dal campo ClientSSLCipher. |
ClientSSLProtocol | read_only_udm.network.tls.version | Il valore viene estratto dal campo ClientSSLProtocol. |
Paese | read_only_udm.target.location.country_or_region | Il valore viene estratto dal campo Paese. |
CreatedAt | read_only_udm.metadata.event_timestamp | Il valore viene estratto dal campo CreatedAt. |
Data/ora | read_only_udm.metadata.event_timestamp | Il valore viene estratto dal campo Data/ora. |
DestinationIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
Il valore viene estratto dal campo DestinationIP. |
DestinationPort | read_only_udm.target.port | Il valore viene estratto dal campo DestinationPort. |
DeviceID | read_only_udm.principal.asset_id | Il valore viene estratto dal campo DeviceID e ha il prefisso "Cloudflare:". |
DeviceName | read_only_udm.principal.asset.hostname read_only_udm.principal.hostname |
Il valore viene estratto dal campo DeviceName. |
DstIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
Il valore viene tratto dal campo DstIP. |
DstPort | read_only_udm.target.port | Il valore viene estratto dal campo DstPort. |
EdgeResponseBytes | read_only_udm.network.received_bytes | Il valore viene estratto dal campo EdgeResponseBytes. |
EdgeResponseStatus | read_only_udm.network.http.response_code | Il valore viene tratto dal campo EdgeResponseStatus. |
EdgeServerIP | read_only_udm.target.asset.ip read_only_udm.target.ip |
Il valore viene estratto dal campo EdgeServerIP. |
read_only_udm.principal.user.email_addresses read_only_udm.target.user.email_addresses |
Il valore viene estratto dal campo Email. | |
FirewallMatchesActions | read_only_udm.security_result.action | Il valore è impostato su "ALLOW" se il campo FirewallMatchesAction è "allow", "Allow", "ALLOW", "skip", "SKIP" o "Skip", "ALLOW_WITH_MODIFICATION" se il campo FirewallMatchesAction è "challengeSolved" o "jschallengeSolved", "BLOCK" se il campo FirewallMatchesAction è "drop" o "block", "UNKNOWN_ACTION" se il campo FirewallMatchesAction non è vuoto. |
FirewallMatchesRuleIDs | read_only_udm.security_result.rule_id | Il valore viene estratto dal campo FirewallMatchesRuleIDs. |
FirewallMatchesSources | read_only_udm.security_result.rule_name | Il valore viene estratto dal campo FirewallMatchesSources. |
HTTPMethod | read_only_udm.network.http.method | Il valore viene preso dal campo HTTPMethod. |
HTTPHost | read_only_udm.target.hostname | Il valore viene preso dal campo HTTPHost. |
HTTPVersion | read_only_udm.network.application_protocol | Il valore viene estratto dal campo HTTPVersion. Se il valore contiene "HTTP", viene sostituito con "HTTP". |
IPAddress | read_only_udm.target.asset.ip read_only_udm.target.ip |
Il valore viene estratto dal campo IPAddress. |
IsIsolated | read_only_udm.about.labels read_only_udm.security_result.about.resource.attribute.labels |
Il valore viene estratto dal campo IsIsolated e convertito in una stringa. |
Località | read_only_udm.principal.location.name | Il valore viene preso dal campo Località. |
OriginIP | read_only_udm.intermediary.ip read_only_udm.target.asset.ip read_only_udm.target.ip |
Il valore viene estratto dal campo OriginIP. |
OriginPort | read_only_udm.target.port | Il valore viene estratto dal campo OriginPort. |
OwnerID | read_only_udm.target.user.product_object_id | Il valore viene estratto dal campo OwnerID. |
Norme | read_only_udm.security_result.rule_name | Il valore viene estratto dal campo Policy. |
PolicyID | read_only_udm.security_result.rule_id | Il valore viene estratto dal campo PolicyID. |
PolicyName | read_only_udm.security_result.rule_name | Il valore viene estratto dal campo PolicyName. |
Protocollo | read_only_udm.network.ip_protocol | Il valore viene estratto dal campo Protocollo e convertito in maiuscolo. |
QueryCategoryIDs | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
Il valore viene estratto dal campo QueryCategoryIDs. |
QueryName | read_only_udm.network.dns.questions.name | Il valore viene estratto dal campo QueryName. |
QueryNameReversed | read_only_udm.network.dns.questions.name | Il valore viene estratto dal campo QueryNameReversed. |
QuerySize | read_only_udm.network.sent_bytes | Il valore viene estratto dal campo QuerySize. |
QueryType | read_only_udm.network.dns.questions.type | Il valore viene estratto dal campo QueryType. Se il valore è uno dei tipi di record DNS noti, viene mappato al valore numerico corrispondente. In caso contrario, il valore viene convertito in una stringa. |
RData | read_only_udm.network.dns.answers | Il valore viene estratto dal campo RData. Il campo del tipo viene convertito in un numero intero senza segno. |
RayID | read_only_udm.metadata.product_log_id | Il valore viene estratto dal campo RayID. |
Referer | read_only_udm.network.http.referral_url | Il valore viene estratto dal campo Referer. |
RequestID | read_only_udm.metadata.product_log_id | Il valore viene estratto dal campo RequestID. |
ResolverDecision | read_only_udm.security_result.summary | Il valore viene estratto dal campo ResolverDecision. |
ResourceID | read_only_udm.target.resource.id read_only_udm.target.resource.product_object_id |
Il valore viene estratto dal campo ResourceID. |
ResourceType | read_only_udm.target.resource.resource_subtype | Il valore viene estratto dal campo ResourceType. |
SNI | read_only_udm.network.tls.client.server_name | Il valore viene estratto dal campo SNI. |
SecurityAction | read_only_udm.security_result.action | Il valore è impostato su "ALLOW" se il campo SecurityAction è vuoto o se il campo sec_action è vuoto, su "ALLOW_WITH_MODIFICATION" se il campo SecurityAction è "challengeSolved" o "jschallengeSolved", su "BLOCK" se il campo SecurityAction è "drop" o "block". |
SecurityLevel | read_only_udm.security_result.severity | Il valore viene estratto dal campo SecurityLevel e mappato al valore di gravità UDM corrispondente. |
SessionID | read_only_udm.network.session_id | Il valore viene estratto dal campo SessionID. |
SessionStartTime | read_only_udm.metadata.event_timestamp | Il valore viene estratto dal campo SessionStartTime. |
SourceIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip read_only_udm.src.asset.ip read_only_udm.src.ip |
Il valore viene estratto dal campo SourceIP. |
SourcePort | read_only_udm.principal.port read_only_udm.src.port |
Il valore viene estratto dal campo SourcePort. |
SrcIP | read_only_udm.principal.asset.ip read_only_udm.principal.ip |
Il valore viene estratto dal campo SrcIP. |
SrcPort | read_only_udm.principal.port | Il valore viene preso dal campo SrcPort. |
TemporaryAccessDuration | read_only_udm.network.session_duration.seconds | Il valore viene estratto dal campo TemporaryAccessDuration. |
Timestamp | read_only_udm.metadata.event_timestamp | Il valore viene estratto dal campo Timestamp. |
Trasporto | read_only_udm.network.ip_protocol | Il valore viene estratto dal campo Trasporto e convertito in maiuscolo. |
URL | read_only_udm.target.url | Il valore viene estratto dal campo URL. |
UserAgent | read_only_udm.network.http.user_agent | Il valore viene estratto dal campo UserAgent. |
UserID | read_only_udm.principal.user.product_object_id | Il valore viene estratto dal campo UserID. |
UserUID | read_only_udm.target.user.product_object_id | Il valore viene estratto dal campo UserUID. |
VirtualNetworkID | read_only_udm.principal.resource.product_object_id | Il valore viene estratto dal campo VirtualNetworkID. |
WAFAction | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
Il valore viene estratto dal campo WAFAction. |
WAFAttackScore | read_only_udm.security_result.about.resource.attribute.labels | Il valore viene estratto dal campo WAFAttackScore. |
WAFFlags | read_only_udm.security_result.about.resource.attribute.labels | Il valore viene preso dal campo WAFFlags. |
WAFProfile | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels |
Il valore viene preso dal campo WAFProfile. |
WAFRCEAttackScore | read_only_udm.security_result.about.resource.attribute.labels | Il valore viene estratto dal campo WAFRCEAttackScore. |
WAFRuleID | read_only_udm.security_result.about.labels read_only_udm.security_result.about.resource.attribute.labels read_only_udm.security_result.threat_id |
Il valore viene estratto dal campo WAFRuleID. |
WAFRuleMessage | read_only_udm.security_result.rule_name read_only_udm.security_result.threat_name |
Il valore viene estratto dal campo WAFRuleMessage. |
WAFSQLiAttackScore | read_only_udm.security_result.about.resource.attribute.labels | Il valore viene estratto dal campo WAFSQLiAttackScore. |
WAFXSSAttackScore | read_only_udm.security_result.about.resource.attribute.labels | Il valore viene estratto dal campo WAFXSSAttackScore. |
ZoneID | read_only_udm.additional.fields | Il valore viene estratto dal campo ZoneID. |
read_only_udm.metadata.log_type | Il valore è impostato su "CLOUDFLARE". | |
read_only_udm.metadata.product_name | Il valore è impostato su "Cloudflare Gateway DNS" se il log è un log DNS, "Cloudflare Gateway HTTP" se il log è un log HTTP di Gateway, "Cloudflare Audit" se il log è un log di controllo o "Web Application Firewall" in caso contrario. | |
read_only_udm.metadata.vendor_name | Il valore è impostato su "Cloudflare". | |
read_only_udm.network.application_protocol | Il valore è impostato su "DNS" se il log è un log DNS, su "HTTP" se il campo HTTPVersion contiene "HTTP" o sul valore del campo Protocollo convertito in maiuscolo se il campo Protocollo non è vuoto e non è "tls" o "TLS". | |
read_only_udm.network.direction | Il valore è impostato su "OUTBOUND" se il campo EgressIP non è vuoto. | |
read_only_udm.network.http.parsed_user_agent | Il valore viene estratto dal campo UserAgent o ClientRequestUserAgent e analizzato utilizzando il filtro parseduseragent. | |
read_only_udm.extensions.auth.type | Il valore è impostato su "MACHINE" se il campo Azione è "login" o "logout". | |
read_only_udm.metadata.event_type | Il valore è impostato su "NETWORK_DNS" se il log è un log DNS, "NETWORK_CONNECTION" se il log è un log HTTP del gateway, "USER_RESOURCE_ACCESS" se il log è un audit log e i campi ActorIP e ActorEmail sono vuoti, "USER_RESOURCE_UPDATE_CONTENT" se il log è un audit log e i campi ResourceType e newvalue non sono vuoti, "USER_LOGIN" se il campo Action è "login", "USER_LOGOUT" se il campo Action è "logout", "USER_RESOURCE_ACCESS" se il campo Email non è vuoto e corrisponde al formato dell'indirizzo email o "NETWORK_CONNECTION" se i campi EgressIP e SourceIP non sono vuoti o se i campi OriginIP e SourceIP non sono vuoti. | |
read_only_udm.target.file.mime_type | Il valore viene preso dal campo EdgeResponseContentType. | |
read_only_udm.target.location.country_or_region | Il valore viene estratto dal campo Paese. | |
read_only_udm.target.resource.id | Il valore viene estratto dal campo AccountID o dal campo ResourceID. | |
read_only_udm.target.resource.product_object_id | Il valore viene estratto dal campo AccountID, AppUUID o ResourceID. | |
read_only_udm.target.user.product_object_id | Il valore viene estratto dal campo OwnerID o UserUID. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.