Raccogliere i log di Fortinet FortiWeb
Questo documento spiega come importare i log di Fortinet FortiWeb in Google Security Operations utilizzando Bindplane.
Il parser estrae i campi dai log formattati KV di Fortinet FortiWeb. Utilizza grok e/o kv per analizzare il messaggio di log e quindi mappa questi valori al modello UDM (Unified Data Model). Imposta anche i valori predefiniti dei metadati per l'origine e il tipo di evento.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Windows Server 2016 o versioni successive oppure host Linux con
systemd - Se l'agente viene eseguito dietro un proxy, assicurati che le porte del firewall siano aperte in base ai requisiti dell'agente Bindplane
- Accesso privilegiato all'interfaccia web di Fortinet FortiWeb
Recuperare il file di autenticazione importazione di Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
- Scarica il file di autenticazione importazione. Salva il file in modo sicuro sul sistema in cui verrà installato Bindplane.
Recuperare l'ID cliente Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Profilo.
- Copia e salva l'ID cliente dalla sezione Dettagli dell'organizzazione.
Installa l'agente Bindplane
Installa l'agente Bindplane sul sistema operativo Windows o Linux seguendo le istruzioni riportate di seguito.
Installazione di Windows
- Apri Prompt dei comandi o PowerShell come amministratore.
Esegui questo comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietAttendi il completamento dell'installazione.
Verifica l'installazione eseguendo il comando:
sc query observiq-otel-collector
Il servizio dovrebbe essere visualizzato come IN ESECUZIONE.
Installazione di Linux
- Apri un terminale con privilegi di root o sudo.
Esegui questo comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shAttendi il completamento dell'installazione.
Verifica l'installazione eseguendo il comando:
sudo systemctl status observiq-otel-collector
Il servizio dovrebbe essere visualizzato come attivo (in esecuzione).
Risorse aggiuntive per l'installazione
Per ulteriori opzioni di installazione e risoluzione dei problemi, consulta la Guida all'installazione dell'agente Bindplane.
Configura l'agente Bindplane per importare syslog e inviarli a Google SecOps
Individua il file di configurazione
Linux:
sudo nano /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Modifica il file di configurazione
Sostituisci l'intero contenuto di
config.yamlcon la seguente configurazione:receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip creds_file_path: '/path/to/ingestion-authentication-file.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: 'FORTINET_FORTIWEB' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Parametri di configurazione
Sostituisci i seguenti segnaposto:
Configurazione del ricevitore:
udplog: utilizzaudplogper syslog UDP otcplogper syslog TCP0.0.0.0: indirizzo IP su cui ascoltare (0.0.0.0per ascoltare su tutte le interfacce)514: Numero di porta su cui ascoltare (porta syslog standard)
Configurazione dell'esportatore:
creds_file_path: percorso completo del file di autenticazione importazione:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
YOUR_CUSTOMER_ID: l'ID cliente della sezione Recupera ID clienteendpoint: URL endpoint regionale:- Stati Uniti:
malachiteingestion-pa.googleapis.com - Europa:
europe-malachiteingestion-pa.googleapis.com - Asia:
asia-southeast1-malachiteingestion-pa.googleapis.com - Per l'elenco completo, vedi Endpoint regionali.
- Stati Uniti:
log_type: Tipo di log esattamente come appare in Chronicle (FORTINET_FORTIWEB)
Salvare il file di configurazione
- Dopo la modifica, salva il file:
- Linux: premi
Ctrl+O, poiEntere infineCtrl+X. - Windows: fai clic su File > Salva.
- Linux: premi
Riavvia l'agente Bindplane per applicare le modifiche
Per riavviare l'agente Bindplane in Linux, esegui questo comando:
sudo systemctl restart observiq-otel-collectorVerifica che il servizio sia in esecuzione:
sudo systemctl status observiq-otel-collectorControlla i log per individuare eventuali errori:
sudo journalctl -u observiq-otel-collector -f
Per riavviare l'agente Bindplane in Windows, scegli una delle seguenti opzioni:
Prompt dei comandi o PowerShell come amministratore:
net stop observiq-otel-collector && net start observiq-otel-collectorConsole dei servizi:
- Premi
Win+R, digitaservices.msce premi Invio. - Individua observIQ OpenTelemetry Collector.
Fai clic con il tasto destro del mouse e seleziona Riavvia.
Verifica che il servizio sia in esecuzione:
sc query observiq-otel-collectorControlla i log per individuare eventuali errori:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Premi
Configurare l'inoltro di syslog di Fortinet FortiWeb
- Accedi all'interfaccia web di FortiWeb.
- Vai a Log e report > Configurazione log > Altre impostazioni log.
- In Syslog Policy, fai clic su Create New (Crea nuovo) per aggiungere una nuova norma syslog.
- Fornisci i seguenti dettagli di configurazione:
- Nome della policy: inserisci un nome descrittivo (ad esempio
Google-SecOps-Bindplane). - Indirizzo IP: inserisci l'indirizzo IP dell'host dell'agente Bindplane.
- Porta: inserisci
514. - Attiva: seleziona Attiva.
- Struttura: seleziona local0 (o la struttura che preferisci).
- Livello log: seleziona Informazioni (o il livello che preferisci).
- Nome della policy: inserisci un nome descrittivo (ad esempio
- Nella sezione Tipo di log, attiva le seguenti opzioni:
- Log degli attacchi
- Log eventi
- Log del traffico
- Fai clic su Ok per salvare.
- Verifica che i messaggi syslog vengano inviati controllando i log dell'agente Bindplane.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| azione | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| azione | security_result.action_details | Se l'azione è "Consenti" o "Accetta", security_result.action_details è impostato su "ALLOW". Se l'azione è "Denied", "deny", "block" o "Block", security_result.action_details è impostato su "BLOCK". |
| app | network.application_protocol | Il valore viene mappato direttamente dopo essere stato convertito in maiuscolo. Solo se il valore è HTTPS, HTTP, DNS, DHCP o SMB. |
| nome_app | additional.fields[].key | La chiave è impostata su "appName". |
| nome_app | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| backend_service | additional.fields[].key | La chiave è impostata su "backend_service". |
| backend_service | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| gatto | security_result.category_details | Il valore è mappato direttamente. |
| client_level | security_result.category | Se client_level è "Malicious", security_result.category è impostato su "NETWORK_MALICIOUS". |
| cn1 | additional.fields[].value.string_value | Mappato al campo threatWeight. |
| cn1Label | additional.fields[].key | La chiave è impostata sul valore cn1Label. |
| cn2 | additional.fields[].value.string_value | Mappato al campo Lunghezza. |
| cn2Label | additional.fields[].key | La chiave è impostata sul valore cn2Label. |
| cn3 | additional.fields[].value.string_value | Mappato al campo signatureID. |
| cn3Label | additional.fields[].key | La chiave è impostata sul valore cn3Label. |
| cs1 | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| cs1Label | additional.fields[].key | La chiave è impostata sul valore cs1Label. |
| cs1 | principal.user.product_object_id | Il valore viene mappato direttamente quando cs1Label corrisponde a "userID" (senza distinzione tra maiuscole e minuscole). |
| cs2 | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| cs2Label | additional.fields[].key | La chiave è impostata sul valore cs2Label. |
| cs2 | principal.user.userid | Il valore viene mappato direttamente quando cs2Label corrisponde a "userName" (senza distinzione tra maiuscole e minuscole) e suid è vuoto. |
| cs3 | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| cs3Label | additional.fields[].key | La chiave è impostata sul valore cs3Label. |
| cs3 | metadata.severity | Il valore viene mappato direttamente quando cs3Label è "level" e cs3 non è vuoto. |
| cs4 | additional.fields[].value.string_value | Mappato al campo subType. |
| cs4Label | additional.fields[].key | La chiave è impostata sul valore cs4Label. |
| cs5 | additional.fields[].value.string_value | Mappato al campo threatLevel. |
| cs5Label | additional.fields[].key | La chiave è impostata sul valore cs5Label. |
| cs6 | additional.fields[].value.string_value | Mappato al campo owaspTop10. |
| cs6Label | additional.fields[].key | La chiave è impostata sul valore cs6Label. |
| data | metadata.event_timestamp.seconds | Combinato con l'ora e analizzato per generare i secondi trascorsi dall'epoca. |
| dev_id | principal.resource.id | Il valore è mappato direttamente. |
| devname | principal.resource.name | Il valore è mappato direttamente. |
| device_event_class_id | metadata.product_event_type | Utilizzato nell'analisi CEF. |
| device_product | metadata.product_name | Utilizzato nell'analisi CEF. |
| device_vendor | metadata.vendor_name | Utilizzato nell'analisi CEF. |
| device_version | metadata.product_version | Utilizzato nell'analisi CEF. |
| dhost | target.hostname | Il valore è mappato direttamente. |
| dpt | target.port | Il valore viene mappato e convertito direttamente in un numero intero. |
| dst | target.ip | Il valore è mappato direttamente. |
| dst_port | target.port | Il valore viene mappato e convertito direttamente in un numero intero. |
| dstepid | target.process.pid | Il valore è mappato direttamente. |
| dsteuid | target.user.userid | Il valore è mappato direttamente. |
| event_name | metadata.product_event_type | Utilizzato nell'analisi CEF. |
| http_agent | network.http.parsed_user_agent | Il valore viene analizzato come una stringa user agent. |
| http_method | network.http.method | Il valore è mappato direttamente. |
| http_refer | network.http.referral_url | Il valore è mappato direttamente. |
| http_session_id | network.session_id | Il valore è mappato direttamente. |
| http_url | target.url | Il valore è mappato direttamente. |
| http_version | metadata.product_version | Il valore è mappato direttamente. |
| lunghezza | additional.fields[].key | La chiave è impostata su "length". |
| lunghezza | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| log_type | metadata.log_type | Codificato come "FORTINET_FORTIWEB". |
| main_type | additional.fields[].key | La chiave è impostata su "mainType". |
| main_type | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| messaggio | Vari campi | Analizzato utilizzando i filtri grok e kv per estrarre campi diversi. |
| ml_allow_method | additional.fields[].key | La chiave è impostata su "ml_allow_method". |
| ml_allow_method | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_arg_dbid | additional.fields[].key | La chiave è impostata su "ml_arg_dbid". |
| ml_arg_dbid | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_domain_index | additional.fields[].key | La chiave è impostata su "ml_domain_index". |
| ml_domain_index | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_log_arglen | additional.fields[].key | La chiave è impostata su "ml_log_arglen". |
| ml_log_arglen | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_log_hmm_probability | additional.fields[].key | La chiave è impostata su "ml_log_hmm_probability". |
| ml_log_hmm_probability | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_log_sample_arglen_mean | additional.fields[].key | La chiave è impostata su "ml_log_sample_arglen_mean". |
| ml_log_sample_arglen_mean | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_log_sample_prob_mean | additional.fields[].key | La chiave è impostata su "ml_log_sample_prob_mean". |
| ml_log_sample_prob_mean | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_svm_accuracy | additional.fields[].key | La chiave è impostata su "ml_svm_accuracy". |
| ml_svm_accuracy | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_svm_log_main_types | additional.fields[].key | La chiave è impostata su "ml_svm_log_main_types". |
| ml_svm_log_main_types | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_svm_log_match_types | additional.fields[].key | La chiave è impostata su "ml_svm_log_match_types". |
| ml_svm_log_match_types | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| ml_url_dbid | additional.fields[].key | La chiave è impostata su "ml_url_dbid". |
| ml_url_dbid | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| monitor_status | additional.fields[].key | La chiave è impostata su "monitor_status". |
| monitor_status | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| msg | metadata.description | Il valore è mappato direttamente. |
| owasp_top10 | additional.fields[].key | La chiave è impostata su "owaspTop10". |
| owasp_top10 | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| principal_app | principal.application | Il valore è mappato direttamente. |
| principal_host | principal.hostname | Il valore è mappato direttamente. |
| proto | network.ip_protocol | Il valore viene mappato direttamente dopo essere stato convertito in maiuscolo. |
| richiesta | target.url | Il valore è mappato direttamente. |
| requestMethod | network.http.method | Il valore è mappato direttamente. |
| rt | metadata.event_timestamp.seconds | Analizzato come millisecondi trascorsi da epoca e convertito in secondi. |
| security_result.severity | security_result.severity | Derivato da severity_level. Mappato su valori di gravità UDM diversi in base al valore del log non elaborato. Se non viene trovata alcuna corrispondenza, il valore predefinito è UNKNOWN_SEVERITY. |
| server_pool_name | additional.fields[].key | La chiave è impostata su "server_pool_name". |
| server_pool_name | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| servizio | network.application_protocol | Il valore viene mappato direttamente dopo essere stato convertito in maiuscolo. |
| servizio | target.application | Il valore viene mappato direttamente dopo essere stato convertito in maiuscolo se non è HTTPS, HTTP, DNS, DHCP o SMB. |
| gravità | security_result.severity | Se la gravità è vuota e cs3Label è "level", viene utilizzato il valore di cs3. Poi mappato a un valore di gravità UDM (LOW, HIGH e così via). |
| signature_id | security_result.rule_id | Il valore è mappato direttamente. |
| signature_subclass | security_result.detection_fields[].key | La chiave è impostata su "signature_subclass". |
| signature_subclass | security_result.detection_fields[].value | Il valore è mappato direttamente. |
| src | principal.ip | Il valore è mappato direttamente. |
| src_country | principal.location.country_or_region | Il valore è mappato direttamente. |
| src_ip | principal.ip | Il valore è mappato direttamente. |
| src_port | principal.port | Il valore viene mappato e convertito direttamente in un numero intero. |
| srccountry | principal.location.country_or_region | Il valore è mappato direttamente. |
| sub_type | additional.fields[].key | La chiave è impostata su "subType". |
| sub_type | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| sottotipo | target.resource.resource_subtype | Il valore è mappato direttamente. |
| suid | principal.user.userid | Il valore è mappato direttamente. |
| threat_level | additional.fields[].key | La chiave è impostata su "threatLevel". |
| threat_level | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| threat_weight | security_result.detection_fields[].key | La chiave è impostata su "threat_weight". |
| threat_weight | security_result.detection_fields[].value | Il valore è mappato direttamente. |
| tempo | metadata.event_timestamp.seconds | Combinato con la data e analizzato per generare i secondi trascorsi da epoca. |
| user_id | principal.user.product_object_id | Il valore è mappato direttamente. |
| user_name | additional.fields[].key | La chiave è impostata su "userName". |
| user_name | additional.fields[].value.string_value | Il valore è mappato direttamente. |
| user_name | principal.user.userid | Il valore è mappato direttamente. |
| N/D | metadata.event_type | Imposta su "NETWORK_CONNECTION" se sono presenti sia principal.ip sia target.ip. Imposta "USER_UNCATEGORIZED" se sono presenti principal.ip e principal.user. Impostato su "STATUS_UPDATE" se è presente solo principal.ip. In caso contrario, imposta "GENERIC_EVENT". |
| N/D | metadata.log_type | Codificato come "FORTINET_FORTIWEB". |
| N/D | metadata.product_name | Codificato in modo permanente su "FORTINET FORTIWEB" o "FortiWEB Cloud" in base al formato del log. |
| N/D | metadata.vendor_name | Codificato in modo permanente su "FORTINET" o "Fortinet" in base al formato del log. |
| N/D | principal.resource.resource_type | Codificato come "DEVICE" se è presente dev_id. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.