Raccogliere i log di F5 Distributed Cloud Services
Questo documento spiega come importare i log di F5 Distributed Cloud Services in Google Security Operations utilizzando Google Cloud Storage V2.
F5 Distributed Cloud Services è una piattaforma di gestione di sicurezza, networking e applicazioni basata su SaaS che fornisce infrastruttura cloud distribuita, distribuzione di applicazioni, sicurezza delle API e funzionalità di web application firewall in più cloud e località perimetrali.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Un progetto Google Cloud con l'API Cloud Storage abilitata
- Autorizzazioni per creare e gestire bucket GCS
- Autorizzazioni per gestire le policy IAM nei bucket GCS
- Accesso con privilegi alla console F5 Distributed Cloud
- Autorizzazioni per creare oggetti Global Log Receiver in F5 Distributed Cloud
Creare un bucket Google Cloud Storage
- Vai alla console Google Cloud.
- Seleziona il tuo progetto o creane uno nuovo.
- Nel menu di navigazione, vai a Cloud Storage > Bucket.
- Fai clic su Crea bucket.
Fornisci i seguenti dettagli di configurazione:
Impostazione Valore Assegna un nome al bucket Inserisci un nome univoco globale (ad esempio f5-dcs-logs).Tipo di località Scegli in base alle tue esigenze (regione singola, doppia regione, più regioni) Località Seleziona la posizione (ad esempio, us-central1).Classe di archiviazione Standard (consigliato per i log a cui si accede di frequente) Controllo dell'accesso Uniforme (consigliato) Strumenti di protezione (Facoltativo) Attiva il controllo delle versioni degli oggetti o la policy di conservazione Fai clic su Crea.
Configura F5 Distributed Cloud per l'esportazione in GCS
Aggiungere il bucket GCS alla lista consentita del firewall
F5 Distributed Cloud Global Log Receiver richiede l'aggiunta dei seguenti intervalli di indirizzi IP alla lista consentita del firewall:
193.16.236.64/29185.160.8.152/29
Se il tuo bucket GCS utilizza i controlli di servizio VPC o le regole firewall, aggiungi questi intervalli IP alla lista consentita.
Crea un account di servizio Google Cloud per F5 Distributed Cloud
- Nella console Google Cloud, vai a IAM e amministrazione > Service account.
- Fai clic su Crea account di servizio.
Fornisci i seguenti dettagli di configurazione:
- Nome service account: inserisci
f5-dcs-log-writer(o un nome descrittivo) - Descrizione service account: inserisci
Service account for F5 Distributed Cloud to write logs to GCS
- Nome service account: inserisci
Fai clic su Crea e continua.
Nella sezione Concedi a questo account di servizio l'accesso al progetto:
- Fai clic su Seleziona un ruolo.
- Cerca e seleziona Amministratore oggetti di archiviazione.
Fai clic su Continua.
Fai clic su Fine.
Crea una chiave dell'account di servizio
- Nell'elenco Service account, fai clic sul account di servizio che hai creato (ad esempio,
f5-dcs-log-writer). - Vai alla scheda Chiavi.
- Fai clic su Aggiungi chiave > Crea nuova chiave.
- Seleziona JSON come tipo di chiave.
- Fai clic su Crea.
- Il file della chiave JSON viene scaricato sul computer.
- Salva questo file in modo sicuro. Ti servirà nei passaggi successivi.
Concedi autorizzazioni IAM sul bucket GCS
- Vai a Cloud Storage > Bucket.
- Fai clic sul nome del bucket (ad esempio
f5-dcs-logs). - Vai alla scheda Autorizzazioni.
- Fai clic su Concedi l'accesso.
- Fornisci i seguenti dettagli di configurazione:
- Aggiungi entità: inserisci l'email del account di servizio (ad esempio,
f5-dcs-log-writer@PROJECT_ID.iam.gserviceaccount.com). - Assegna i ruoli: seleziona Storage Object Admin.
- Aggiungi entità: inserisci l'email del account di servizio (ad esempio,
- Fai clic su Salva.
Crea le credenziali Google Cloud nella console F5 Distributed Cloud
- Accedi alla console F5 Distributed Cloud all'indirizzo
https://<tenant>.console.ves.volterra.io. - Seleziona il servizio Multi-Cloud Network Connect dalla home page.
- Vai a Gestisci > Gestione siti > Credenziali cloud.
- Fai clic su Aggiungi credenziali cloud.
- Nella sezione Metadati:
- Nome: inserisci un nome descrittivo (ad esempio,
gcp-chronicle-logs). - (Facoltativo) Descrizione: inserisci
Cloud Storage credentials for Google SecOps log export
- Nome: inserisci un nome descrittivo (ad esempio,
- Nella sezione Tipo di credenziali cloud, seleziona Credenziali GCP.
- Fai clic su Configura nel campo Credenziali GCP.
- Nel menu a discesa Tipo di credenziali, seleziona File delle credenziali del service account.
- Fai clic su Carica file e seleziona il file di chiave JSON che hai scaricato nei passaggi precedenti.
- Fai clic su Applica.
- Fai clic su Salva ed esci.
Crea un ricevitore di log globale
- Nella console F5 Distributed Cloud, assicurati di trovarti nel servizio Multi-Cloud Network Connect.
- Vai a Gestisci > Gestione log > Ricevitore log globale.
- Fai clic su Aggiungi destinatario log globale.
Nella sezione Metadati:
- Nome: inserisci un nome descrittivo (ad esempio,
chronicle-gcs-receiver). - (Facoltativo) Descrizione: inserisci
Global log receiver for Google SecOps SIEM
- Nome: inserisci un nome descrittivo (ad esempio,
Nel menu a discesa Tipo di log, seleziona i tipi di log che vuoi esportare:
- Log delle richieste: log di richieste/risposte HTTP con utente, percorso, metodo e codici di risposta
- Eventi di sicurezza: eventi WAF, DDoS, protezione API, Bot Defense
- Audit log: modifiche alla configurazione tramite API pubbliche
- Log delle richieste DNS: log delle query DNS
Nel menu a discesa Selezione messaggio di log, seleziona una delle seguenti opzioni:
- Seleziona log dallo spazio dei nomi corrente: invia i log solo dallo spazio dei nomi corrente
- Seleziona i log di tutti gli spazi dei nomi: invia i log di tutti gli spazi dei nomi (opzione consigliata per una visibilità completa)
- Seleziona i log in spazi dei nomi specifici: invia i log dagli spazi dei nomi specificati (fai clic su Aggiungi elemento per aggiungere i nomi degli spazi dei nomi)
Nel menu a discesa Configurazione ricevitore, seleziona Ricevitore bucket GCP.
Nel campo Nome bucket GCP, inserisci il nome del bucket GCS (ad esempio
f5-dcs-logs).Nel menu a discesa Credenziali Google Cloud, seleziona le credenziali cloud che hai creato in precedenza (ad esempio,
gcp-chronicle-logs).(Facoltativo) Espandi Mostra campi avanzati per configurare le opzioni batch:
- Opzioni di timeout batch: seleziona Timeout in secondi e inserisci un valore (valore predefinito:
300secondi) - Batch Max Events: seleziona Max Events e inserisci un valore compreso tra 32 e 2000 (lascia il campo vuoto per nessun limite)
- Byte batch: seleziona Byte max e inserisci un valore compreso tra 4096 e 1048576 (valore predefinito:
10485760byte / 10 MB)
- Opzioni di timeout batch: seleziona Timeout in secondi e inserisci un valore (valore predefinito:
Fai clic su Salva ed esci.
Testa la connessione
- Nell'elenco Ricevitore di log globale, individua il ricevitore che hai creato (ad esempio,
chronicle-gcs-receiver). - Fai clic sui tre puntini (…) nella colonna Azioni.
- Seleziona Prova connessione.
- Attendi il completamento del test.
Dovrebbe essere visualizzato un messaggio che indica che la connessione è stata stabilita correttamente.
Verifica i log nel bucket GCS
- Vai a Cloud Storage > Bucket nella console GCP.
- Fai clic sul nome del bucket (ad esempio
f5-dcs-logs). - Verifica che i file di log vengano creati nel bucket.
F5 Distributed Cloud organizza i log nella seguente struttura di cartelle:
YYYY/MM/DD/HH/- Viene creata una cartella per ogni giorno (AAAA/MM/GG)
- All'interno di ogni cartella del giorno, viene creata una sottocartella per ogni ora (HH)
- Ogni 5 minuti, nella sottocartella oraria vengono scritti nuovi file gzip compressi
- I file sono in formato NDJSON (JSON delimitato da nuova riga)
Fai clic su un file gzip per scaricarlo e ispezionare il formato del log.
Recuperare il account di servizio Google SecOps
Google SecOps utilizza un account di servizio univoco per leggere i dati dal tuo bucket GCS. Devi concedere a questo account di servizio l'accesso al tuo bucket.
Recupera l'email del account di servizio
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
F5 DCS Logs). - Seleziona Google Cloud Storage V2 come Tipo di origine.
- Seleziona F5 Distributed Cloud Services come Tipo di log.
Fai clic su Ottieni service account. Verrà visualizzata un'email univoca del account di servizio, ad esempio:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopia questo indirizzo email per utilizzarlo nel passaggio successivo.
Fai clic su Avanti.
Specifica i valori per i seguenti parametri di input:
URL bucket di archiviazione: inserisci l'URI del bucket GCS:
gs://f5-dcs-logs/Sostituisci
f5-dcs-logscon il nome del tuo bucket GCS.Opzione di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze:
- Mai: non elimina mai i file dopo i trasferimenti (opzione consigliata per i test).
- Elimina file trasferiti: elimina i file dopo il trasferimento riuscito.
Elimina file trasferiti e directory vuote: elimina i file e le directory vuote dopo il trasferimento riuscito.
Età massima del file: includi 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
Fai clic su Avanti.
Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Concedi le autorizzazioni IAM al account di servizio Google SecOps
Il account di servizio Google SecOps deve avere il ruolo Visualizzatore oggetti Storage nel bucket GCS.
- Vai a Cloud Storage > Bucket.
- Fai clic sul nome del bucket (ad esempio
f5-dcs-logs). - Vai alla scheda Autorizzazioni.
- Fai clic su Concedi l'accesso.
Fornisci i seguenti dettagli di configurazione:
- Aggiungi entità: incolla l'email del account di servizio Google SecOps
- Assegna i ruoli: seleziona Visualizzatore oggetti Storage
Fai clic su Salva.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| _id | metadata.product_log_id | Valore copiato direttamente |
| src | principal.namespace | Valore copiato direttamente |
| kubernetes_labels_app | target.resource.attribute.labels | Unito da app_label (derivato da kubernetes_labels_app) |
| kubernetes_host | target.hostname | Valore copiato direttamente |
| kubernetes_container_name | target.resource.product_object_id | Valore copiato direttamente |
| bot_info.classification | security_result.detection_fields | Unito da bot_info_classification_label (derivato da bot_info.classification) |
| bot_info.name | security_result.detection_fields | Unito da bot_info_name_label (derivato da bot_info.name) |
| bot_info.type | security_result.detection_fields | Unito da bot_info_type_label (derivato da bot_info.type) |
| timestamp | @timestamp | Analizzato utilizzando il filtro per data con RFC3339, UNIX, ISO8601 |
| visitor_id | security_result.detection_fields | Unito da visitor_id_label (derivato da visitor_id) |
| tag | security_result.detection_fields | Unito da tag_label (derivato dal tag) |
| azione | security_result.action | Imposta su ALLOW se le corrispondenze lo consentono, BLOCK se le corrispondenze lo negano |
| gravità | security_result.severity | Imposta su HIGH se è presente un errore/avviso; CRITICAL se è critico; MEDIUM se è una notifica; LOW se è un'informazione/nota |
| gravità | security_result.severity_details | Valore copiato direttamente |
| api_endpoint | target.labels | Unito da api_endpoint_label (derivato da api_endpoint) |
| app_firewall_name | principal.process.command_line | Valore copiato direttamente |
| app_type | security_result.detection_fields | Unito da about_app_type (derivato da app_type) |
| as_org | security_result.detection_fields | Unito da about_as_org (derivato da as_org) |
| asn | security_result.detection_fields | Unito da about_asn (derivato da asn) |
| kubernetes.pod_id | security_result.detection_fields | Unito da about_pod_id (derivato da kubernetes.pod_id) |
| kubernetes.pod_name | security_result.detection_fields | Unito da about_pod_name (derivato da kubernetes.pod_name) |
| latitude | principal.location.region_latitude | Convertito in numero decimale |
| longitude | principal.location.region_longitude | Convertito in numero decimale |
| req_params | additional.fields | Unito da about_req_params (derivato da req_params) |
| as_number | additional.fields | Unito da about_as_number (convertito in stringa da as_number) |
| x_forwarded_for | intermediary.ip | Unito se l'IP è valido |
| x_forwarded_for | security_result.about.resource.attribute.labels | Unito da x_forwarded_for_label se non IP |
| policy_hit.malicious_user_mitigate_action | security_result.detection_fields | Unito da malicious_user_label (derivato da policy_hit.malicious_user_mitigate_action) |
| policy_hit.policy | security_result.about.resource.attribute.labels | Unito da policy_label (derivato da policy_hit.policy) |
| policy_hit.policy_namespace | additional.fields | Unito da policy_namespace_label (derivato da policy_hit.policy_namespace) |
| policy_hit.policy_rule | security_result.rule_name | Valore copiato direttamente |
| policy_hit.policy_rule_description | security_result.description | Valore copiato direttamente |
| policy_hit.policy_set | target.resource.name | Valore copiato direttamente |
| policy_hit.result | additional.fields | Unito da result_label (derivato da policy_hit.result) |
| vhost_id | security_result.detection_fields | Unito da vhostlabel (derivato da vhost_id) |
| messageid | security_result.detection_fields | Unito da messageid_label (derivato da messageid) |
| sec_event_name | security_result.detection_fields | Unito da sec_event_name_label (derivato da sec_event_name) |
| sec_event_type | security_result.detection_fields | Unito da sec_event_type_label (derivato da sec_event_type) |
| vh_name | security_result.detection_fields | Unito da vhost_name_label (derivato da vh_name) |
| tls_fingerprint | security_result.detection_fields | Unito da tls_fingerprint_label (derivato da tls_fingerprint) |
| tempo | additional.fields | Unito da time_label (derivato da time) |
| kubernetes.namespace_name | additional.fields | Unito da namespace_name_label (derivato da kubernetes.namespace_name) |
| src_instance | additional.fields | Unito da src_instance_label (derivato da src_instance) |
| violation_rating | additional.fields | Unito da violation_rating_label (derivato da violation_rating) |
| req_size | additional.fields | Unito da req_size_label (convertito in stringa da req_size) |
| rsp_code | additional.fields | Unito da rsp_code_label (convertito in stringa da rsp_code) |
| rsp_code_class | additional.fields | Unito da rsp_code_class_label (convertito in stringa da rsp_code_class) |
| rsp_size | additional.fields | Unito da rsp_size_label (convertito in stringa da rsp_size) |
| original_path | additional.fields | Unito da original_path_label (derivato da original_path) |
| req_path | target.url | Valore copiato direttamente |
| req_headers_size | additional.fields | Unito da req_headers_size_label (derivato da req_headers_size) |
| recommended_action | additional.fields | Unito da recommended_action_label (derivato da recommended_action) |
| enforcement_mode | additional.fields | Unito da enforcement_mode_label (derivato da enforcement_mode) |
| src_ip | principal.ip, principal.asset.ip | Unito se corrisponde all'espressione regolare IPv4 |
| host | principal.ip, principal.asset.ip | Unito se corrisponde all'espressione regolare IPv4 |
| nome host | principal.hostname, principal.asset.hostname | Valore copiato direttamente se non è vuoto o - |
| http_version | network.application_protocol_version | Valore copiato direttamente |
| http_version | network.application_protocol | Imposta su HTTP se contiene HTTP, HTTPS se contiene HTTPS |
| rete | principal.nat_ip | Unito se corrisponde all'espressione regolare IPv4 |
| dst_ip | target.ip, target.asset.ip | Unito se corrisponde all'espressione regolare IPv4 |
| dst_port | target.port | Convertito in numero intero |
| src_port | principal.port | Convertito in numero intero |
| src_site | additional.fields | Unito da src_site_field (derivato da src_site) |
| sito | additional.fields | Unito da site_field (derivato da site) |
| cluster_name | additional.fields | Unito da cluster_name_field (derivato da cluster_name) |
| dominio | principal.administrative_domain | Valore copiato direttamente |
| metodo | network.http.method | Valore copiato direttamente se non è vuoto o N/A |
| spazio dei nomi | target.namespace | Valore copiato direttamente |
| city | principal.location.city | Valore copiato direttamente |
| flusso | security_result.detection_fields | Unito da stream_label (derivato da stream) |
| regione | principal.location.country_or_region | Valore copiato direttamente |
| utente | principal.user.userid | Estratto dall'utente utilizzando il pattern grok per user_id |
| user_ip | target.ip, target.asset.ip | Unito da user_ip estratto |
| Cookie | additional.fields | Unito dal cookie (derivato dal cookie in req_headers) |
| X-F5-Request-Id | security_result.detection_fields | Unito da x_f5_request_id (derivato da X-F5-Request-Id in req_headers) |
| X-Request-Id | security_result.detection_fields | Unito da request_id (derivato da X-Request-Id in req_headers) |
| security_result | security_result | Unito direttamente |
| has_network, has_principal, has_target | metadata.event_type | Imposta NETWORK_CONNECTION se tutte le condizioni sono vere; STATUS_UPDATE se has_principal è true; altrimenti GENERIC_EVENT |
| metadata.vendor_name | Imposta su "F5_DCS" | |
| metadata.product_name | Imposta su "F5 DCS" | |
| intermediario | intermediario | Unito direttamente |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.