Raccogliere i log di FortiWeb WAF
Questo documento descrive come raccogliere i log del web application firewall (WAF) FortiWeb utilizzando un forwarder di Google Security Operations.
Per ulteriori informazioni, consulta la Panoramica dell'importazione dei dati in Google Security Operations.
Un'etichetta di importazione identifica l'analizzatore sintattico che normalizza i dati dei log non elaborati in formato UDM strutturato. Le informazioni contenute in questo documento si applicano all'analizzatore con l'etichetta di importazione FORTINET_FORTIWEB
.
Configura i log WAF di FortiWeb
Per configurare il WAF FortiWeb in modo che invii i log a un forwarder di Google Security Operations:
Crea un criterio syslog
- Accedi alla console Fortinet FortiWeb.
- Nella console Fortinet FortiWeb, seleziona Log e report > Criterio di log > Criterio syslog.
- Fai clic su Crea nuova.
Nella finestra Nuovo criterio syslog visualizzata, procedi nel seguente modo:
- Nel campo Nome criterio, specifica un nome per il criterio che vuoi utilizzare nella configurazione.
- Nel campo Indirizzo IP, specifica l'indirizzo IP o il nome host del server syslog remoto.
- Nel campo Porta, specifica la porta per il server syslog.
- Deseleziona la casella di controllo Abilita formato CSV, se è selezionata.
Fai clic su OK.
Attiva i tipi di syslog e il livello di log
- Nella console Fortinet FortiWeb, seleziona Log e report > Configurazione log > Impostazioni log globali.
Nella finestra Impostazioni dei log globali visualizzata, seleziona la casella di controllo Syslog e svolgi i seguenti passaggi:
- Nell'elenco Norma syslog, seleziona la norma syslog creata in precedenza.
- Nell'elenco Livello log, scegli il livello di gravità minimo per i log da raccogliere.
- Nell'elenco Strumento, seleziona lo strumento di log.
Fai clic su Applica.
Crea un trigger
- Nella console Fortinet FortiWeb, seleziona Log e report > Criterio di log > Criterio di attivazione.
- Fai clic su Crea nuova.
Nella finestra Nuovo criterio di attivazione visualizzata, procedi nel seguente modo:
- Nel campo Nome criterio, specifica un nome per il criterio che vuoi utilizzare nella configurazione.
- Nell'elenco Norma syslog, seleziona la norma syslog creata in precedenza.
Fai clic su OK.
Aggiorna il criterio syslog con l'attivatore appena creato per assicurarti che tutti gli eventi richiesti vengano registrati nel forwarder syslog di Google Security Operations.
Configura il forwarder di Google Security Operations per importare i log WAF di FortiWeb
- Vai a Impostazioni SIEM > Inoltratori.
- Fai clic su Aggiungi nuovo mittente.
- Nel campo Nome del forwarder, inserisci un nome univoco per il forwarder.
- Fai clic su Invia. Il forwarder viene aggiunto e viene visualizzata la finestra Aggiungi configurazione del raccoglitore.
- Digita un nome nel campo Nome del raccoglitore.
- Seleziona Fortinet Web Application Firewall come Tipo di log.
- Seleziona Syslog come Tipo di collettore.
- Configura i seguenti parametri di input obbligatori:
- Protocollo: specifica il protocollo di connessione utilizzato dal collector per ascoltare i dati syslog.
- Indirizzo: specifica l'indirizzo IP o il nome host di destinazione in cui risiede il collector e ascolta i dati syslog.
- Porta: specifica la porta di destinazione in cui risiede il raccoglitore e ascolta i dati syslog.
- Fai clic su Invia.
Per ulteriori informazioni sui forwarder di Google Security Operations, consulta Gestire le configurazioni dei forwarder tramite l'interfaccia utente di Google Security Operations.
Se riscontri problemi durante la creazione dei reindirizzamenti, contatta l'assistenza di Google Security Operations.
Riferimento alla mappatura dei campi
Questo parser gestisce i log di FORTINET FORTIWEB in formato chiave-valore (KV), trasformandoli in UDM. Elabora i log formattati sia CEF che non CEF, estraendo i campi, normalizzando i valori e mappandoli ai campi UDM appropriati in base al formato del log.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
action |
additional.fields[].value.string_value |
Il valore è mappato direttamente. |
action |
security_result.action_details |
Se action è "Consenti" o "Accetta", security_result.action_details è impostato su "ALLOW". Se action è "Denied", "deny", "block" o "Block", security_result.action_details è impostato su "BLOCK". |
app |
network.application_protocol |
Il valore viene mappato direttamente dopo essere stato scritto in maiuscolo. Solo se il valore è uno dei seguenti: HTTPS, HTTP, DNS, DHCP, SMB. |
app_name |
additional.fields[].key |
La chiave è impostata su "appName". |
app_name |
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. |
cat |
security_result.category_details |
Il valore è mappato direttamente. |
client_level |
security_result.category |
Se client_level è "Malvagio", 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 |
Mappatura 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 "nomeUtente" (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 è "livello" e cs3 non è vuoto. |
cs4 |
additional.fields[].value.string_value |
Mappato al campo sottotipo. |
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. |
date |
metadata.event_timestamp.seconds |
Combinato con time e analizzato per generare secondi epoch. |
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 direttamente e convertito in numero intero. |
dst |
target.ip |
Il valore è mappato direttamente. |
dst_port |
target.port |
Il valore viene mappato direttamente e convertito in 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 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. |
length |
additional.fields[].key |
La chiave è impostata su "lunghezza". |
length |
additional.fields[].value.string_value |
Il valore è mappato direttamente. |
log_type |
metadata.log_type |
Hardcoded su "FORTINET_FORTIWEB". |
main_type |
additional.fields[].key |
La chiave è impostata su "mainType". |
main_type |
additional.fields[].value.string_value |
Il valore è mappato direttamente. |
message |
Vari campi | Analizzati utilizzando i filtri grok e kv per estrarre diversi campi. |
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 scritto in maiuscolo. |
request |
target.url |
Il valore è mappato direttamente. |
requestMethod |
network.http.method |
Il valore è mappato direttamente. |
rt |
metadata.event_timestamp.seconds |
Analizzati come millisecondi dall'epoca e convertiti in secondi. |
security_result.severity |
security_result.severity |
Derivata da severity_level . Mappato a diversi valori di gravità UDM 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. |
service |
network.application_protocol |
Il valore viene mappato direttamente dopo essere stato scritto in maiuscolo. |
service |
target.application |
Il valore viene mappato direttamente dopo essere stato scritto in maiuscolo se non è HTTPS, HTTP, DNS, DHCP o SMB. |
severity |
security_result.severity |
Se severity è vuoto e cs3Label è "livello", viene utilizzato il valore di cs3 . Poi viene 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 direttamente e convertito in 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. |
subtype |
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. |
time |
metadata.event_timestamp.seconds |
Combinato con date e analizzato per generare secondi epoch. |
user_id |
principal.user.product_object_id |
Il valore è mappato direttamente. |
user_name |
additional.fields[].key |
La chiave è impostata su "nomeUtente". |
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 che target.ip . Imposta su "USER_UNCATEGORIZED" se sono presenti principal.ip e principal.user . Impostato su "STATUS_UPDATE" se è presente solo principal.ip . In caso contrario, impostalo su "GENERIC_EVENT". |
N/D | metadata.log_type |
Hardcoded su "FORTINET_FORTIWEB". |
N/D | metadata.product_name |
Hardcoded su "FORTINET FORTIWEB" o "FortiWEB Cloud" in base al formato del log. |
N/D | metadata.vendor_name |
Hardcoded su "FORTINET" o "Fortinet" in base al formato del log. |
N/D | principal.resource.resource_type |
Hardcoded su "DEVICE" se è presente dev_id . |
Modifiche
2024-01-09
- È stato aggiunto il supporto per i log nel formato CEF.
- È stato aggiunto un pattern Grok per adattarsi al nuovo formato dei log CEF.
- "principal_hostnamne" è stato mappato a "principal.hostname".
- "principal.app" è stato mappato a "principal.application".
2023-05-18
- Parser appena creato.