Collecter les journaux FortiWeb WAF
Ce document explique comment collecter les journaux du pare-feu d'application Web (WAF, Web Application Firewall) FortiWeb à l'aide d'un transmetteur Google Security Operations.
Pour en savoir plus, consultez la présentation de l'ingestion de données dans Google Security Operations.
Une étiquette d'ingestion identifie l'analyseur qui normalise les données de journaux brutes au format UDM structuré. Les informations de ce document s'appliquent au parseur avec le libellé d'ingestion FORTINET_FORTIWEB
.
Configurer les journaux FortiWeb WAF
Pour configurer le WAF FortiWeb afin d'envoyer des journaux à un transmetteur Google Security Operations, procédez comme suit :
- Créez une règle syslog.
- Activez les types syslog et le niveau de journalisation.
- Créez un déclencheur.
Créer une règle syslog
- Connectez-vous à la console Fortinet FortiWeb.
- Dans la console Fortinet FortiWeb, sélectionnez Log & report > Log policy > Syslog policy.
- Cliquez sur Créer.
Dans la fenêtre Nouvelle règle syslog qui s'affiche, procédez comme suit :
- Dans le champ Nom de la règle, spécifiez le nom de la règle que vous souhaitez utiliser dans la configuration.
- Dans le champ Adresse IP, spécifiez l'adresse IP ou le nom d'hôte du serveur syslog distant.
- Dans le champ Port, spécifiez le port du serveur syslog.
- Décochez la case Activer le format CSV, si elle est cochée.
Cliquez sur OK.
Activez les types syslog et le niveau de journalisation.
- Dans la console Fortinet FortiWeb, sélectionnez Log & report > Log config > Global log settings.
Dans la fenêtre Paramètres de journalisation globaux qui s'affiche, cochez la case Syslog, puis procédez comme suit :
- Dans la liste Règle Syslog, sélectionnez la règle Syslog que vous avez créée précédemment.
- Dans la liste Niveau de journalisation, sélectionnez le niveau de gravité minimal des journaux à collecter.
- Dans la liste Établissement, sélectionnez l'établissement de journaux.
Cliquez sur Appliquer.
Créer un déclencheur
- Dans la console Fortinet FortiWeb, sélectionnez Log & report > Log policy > Trigger policy.
- Cliquez sur Créer.
Dans la fenêtre Nouvelle règle de déclencheur qui s'affiche, procédez comme suit :
- Dans le champ Nom de la règle, spécifiez le nom de la règle que vous souhaitez utiliser dans la configuration.
- Dans la liste Règle Syslog, sélectionnez la règle Syslog que vous avez créée précédemment.
Cliquez sur OK.
Mettez à jour votre règle syslog avec le déclencheur que vous venez de créer pour vous assurer que tous les événements requis sont consignés dans le redirecteur syslog Google Security Operations.
Configurer le redirecteur Google Security Operations pour ingérer les journaux FortiWeb WAF
- Accédez à Paramètres SIEM > Transférateurs.
- Cliquez sur Ajouter un nouveau transfert.
- Dans le champ Nom du transitaire, saisissez un nom unique pour le transitaire.
- Cliquez sur Envoyer. Le redirecteur est ajouté et la fenêtre Ajouter une configuration de collecteur s'affiche.
- Dans le champ Nom du collecteur, saisissez un nom.
- Sélectionnez Pare-feu d'application Web Fortinet comme type de journal.
- Sélectionnez Syslog comme type de collecteur.
- Configurez les paramètres d'entrée obligatoires suivants :
- Protocole : spécifiez le protocole de connexion utilisé par le collecteur pour écouter les données syslog.
- Adresse : spécifiez l'adresse IP ou le nom d'hôte cible où réside le collecteur et où il écoute les données syslog.
- Port : spécifiez le port cible sur lequel le collecteur réside et écoute les données syslog.
- Cliquez sur Envoyer.
Pour en savoir plus sur les répartiteurs Google Security Operations, consultez Gérer les configurations des répartiteurs dans l'interface utilisateur Google Security Operations.
Si vous rencontrez des problèmes lors de la création de redirecteurs, contactez l'assistance Google Security Operations.
Référence du mappage de champs
Ce parseur gère les journaux de FORTINET FORTIWEB au format clé/valeur (KV), en les transformant en UDM. Il traite les journaux au format CEF et non-CEF, en extrait les champs, normalise les valeurs et les mappe aux champs UDM appropriés en fonction du format du journal.
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
action |
additional.fields[].value.string_value |
La valeur est directement mappée. |
action |
security_result.action_details |
Si action est défini sur "Autoriser" ou "Accepter", security_result.action_details est défini sur "ALLOW". Si action est défini sur "Denied", "deny", "block" ou "Block", security_result.action_details est défini sur "BLOCK". |
app |
network.application_protocol |
La valeur est directement mise en correspondance après avoir été mise en majuscules. Uniquement si la valeur est HTTPS, HTTP, DNS, DHCP ou SMB. |
app_name |
additional.fields[].key |
La clé est définie sur "appName". |
app_name |
additional.fields[].value.string_value |
La valeur est directement mappée. |
backend_service |
additional.fields[].key |
La clé est définie sur "backend_service". |
backend_service |
additional.fields[].value.string_value |
La valeur est directement mappée. |
cat |
security_result.category_details |
La valeur est directement mappée. |
client_level |
security_result.category |
Si client_level est défini sur "Malicious", security_result.category est défini sur "NETWORK_MALICIOUS". |
cn1 |
additional.fields[].value.string_value |
Mappé au champ "threatWeight". |
cn1Label |
additional.fields[].key |
La clé est définie sur la valeur cn1Label. |
cn2 |
additional.fields[].value.string_value |
Mappé au champ de longueur. |
cn2Label |
additional.fields[].key |
La clé est définie sur la valeur cn2Label. |
cn3 |
additional.fields[].value.string_value |
Mappé au champ signatureID. |
cn3Label |
additional.fields[].key |
La clé est définie sur la valeur cn3Label. |
cs1 |
additional.fields[].value.string_value |
La valeur est directement mappée. |
cs1Label |
additional.fields[].key |
La clé est définie sur la valeur cs1Label. |
cs1 |
principal.user.product_object_id |
La valeur est directement mappée lorsque cs1Label correspond à "userID" (sans tenir compte de la casse). |
cs2 |
additional.fields[].value.string_value |
La valeur est directement mappée. |
cs2Label |
additional.fields[].key |
La clé est définie sur la valeur cs2Label. |
cs2 |
principal.user.userid |
La valeur est directement mappée lorsque cs2Label correspond à "userName" (sans tenir compte de la casse) et que suid est vide. |
cs3 |
additional.fields[].value.string_value |
La valeur est directement mappée. |
cs3Label |
additional.fields[].key |
La clé est définie sur la valeur cs3Label. |
cs3 |
metadata.severity |
La valeur est directement mappée lorsque cs3Label est défini sur "level" et que cs3 n'est pas vide. |
cs4 |
additional.fields[].value.string_value |
Mappé au champ "subType". |
cs4Label |
additional.fields[].key |
La clé est définie sur la valeur cs4Label. |
cs5 |
additional.fields[].value.string_value |
Mappé au champ "threatLevel". |
cs5Label |
additional.fields[].key |
La clé est définie sur la valeur cs5Label. |
cs6 |
additional.fields[].value.string_value |
Mappé au champ "owaspTop10". |
cs6Label |
additional.fields[].key |
La clé est définie sur la valeur cs6Label. |
date |
metadata.event_timestamp.seconds |
Combiné à time et analysé pour générer des secondes epoch. |
dev_id |
principal.resource.id |
La valeur est directement mappée. |
devname |
principal.resource.name |
La valeur est directement mappée. |
device_event_class_id |
metadata.product_event_type |
Utilisé dans l'analyse CEF. |
device_product |
metadata.product_name |
Utilisé dans l'analyse CEF. |
device_vendor |
metadata.vendor_name |
Utilisé dans l'analyse CEF. |
device_version |
metadata.product_version |
Utilisé dans l'analyse CEF. |
dhost |
target.hostname |
La valeur est directement mappée. |
dpt |
target.port |
La valeur est directement mappée et convertie en entier. |
dst |
target.ip |
La valeur est directement mappée. |
dst_port |
target.port |
La valeur est directement mappée et convertie en entier. |
dstepid |
target.process.pid |
La valeur est directement mappée. |
dsteuid |
target.user.userid |
La valeur est directement mappée. |
event_name |
metadata.product_event_type |
Utilisé dans l'analyse CEF. |
http_agent |
network.http.parsed_user_agent |
La valeur est analysée en tant que chaîne user-agent. |
http_method |
network.http.method |
La valeur est directement mappée. |
http_refer |
network.http.referral_url |
La valeur est directement mappée. |
http_session_id |
network.session_id |
La valeur est directement mappée. |
http_url |
target.url |
La valeur est directement mappée. |
http_version |
metadata.product_version |
La valeur est directement mappée. |
length |
additional.fields[].key |
La clé est définie sur "length". |
length |
additional.fields[].value.string_value |
La valeur est directement mappée. |
log_type |
metadata.log_type |
Codé en dur sur "FORTINET_FORTIWEB". |
main_type |
additional.fields[].key |
La clé est définie sur "mainType". |
main_type |
additional.fields[].value.string_value |
La valeur est directement mappée. |
message |
Différents champs | Analysé à l'aide des filtres grok et kv pour extraire différents champs. |
ml_allow_method |
additional.fields[].key |
La clé est définie sur "ml_allow_method". |
ml_allow_method |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_arg_dbid |
additional.fields[].key |
La clé est définie sur "ml_arg_dbid". |
ml_arg_dbid |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_domain_index |
additional.fields[].key |
La clé est définie sur "ml_domain_index". |
ml_domain_index |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_log_arglen |
additional.fields[].key |
La clé est définie sur "ml_log_arglen". |
ml_log_arglen |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_log_hmm_probability |
additional.fields[].key |
La clé est définie sur "ml_log_hmm_probability". |
ml_log_hmm_probability |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_log_sample_arglen_mean |
additional.fields[].key |
La clé est définie sur "ml_log_sample_arglen_mean". |
ml_log_sample_arglen_mean |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_log_sample_prob_mean |
additional.fields[].key |
La clé est définie sur "ml_log_sample_prob_mean". |
ml_log_sample_prob_mean |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_svm_accuracy |
additional.fields[].key |
La clé est définie sur "ml_svm_accuracy". |
ml_svm_accuracy |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_svm_log_main_types |
additional.fields[].key |
La clé est définie sur "ml_svm_log_main_types". |
ml_svm_log_main_types |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_svm_log_match_types |
additional.fields[].key |
La clé est définie sur "ml_svm_log_match_types". |
ml_svm_log_match_types |
additional.fields[].value.string_value |
La valeur est directement mappée. |
ml_url_dbid |
additional.fields[].key |
La clé est définie sur "ml_url_dbid". |
ml_url_dbid |
additional.fields[].value.string_value |
La valeur est directement mappée. |
monitor_status |
additional.fields[].key |
La clé est définie sur "monitor_status". |
monitor_status |
additional.fields[].value.string_value |
La valeur est directement mappée. |
msg |
metadata.description |
La valeur est directement mappée. |
owasp_top10 |
additional.fields[].key |
La clé est définie sur "owaspTop10". |
owasp_top10 |
additional.fields[].value.string_value |
La valeur est directement mappée. |
principal_app |
principal.application |
La valeur est directement mappée. |
principal_host |
principal.hostname |
La valeur est directement mappée. |
proto |
network.ip_protocol |
La valeur est directement mise en correspondance après avoir été mise en majuscules. |
request |
target.url |
La valeur est directement mappée. |
requestMethod |
network.http.method |
La valeur est directement mappée. |
rt |
metadata.event_timestamp.seconds |
Analysé en millisecondes depuis l'epoch et converti en secondes. |
security_result.severity |
security_result.severity |
Dérivé de severity_level . Mappé à différentes valeurs de gravité UDM en fonction de la valeur du journal brut. La valeur par défaut est UNKNOWN_SEVERITY si aucune correspondance n'est trouvée. |
server_pool_name |
additional.fields[].key |
La clé est définie sur "server_pool_name". |
server_pool_name |
additional.fields[].value.string_value |
La valeur est directement mappée. |
service |
network.application_protocol |
La valeur est directement mise en correspondance après avoir été mise en majuscules. |
service |
target.application |
La valeur est directement mappée après avoir été mise en majuscules si elle ne correspond pas à HTTPS, HTTP, DNS, DHCP ou SMB. |
severity |
security_result.severity |
Si severity est vide et que cs3Label est défini sur "level", la valeur de cs3 est utilisée. Elles sont ensuite mappées à une valeur de gravité UDM (FAIBLE, ÉLEVÉE, etc.). |
signature_id |
security_result.rule_id |
La valeur est directement mappée. |
signature_subclass |
security_result.detection_fields[].key |
La clé est définie sur "signature_subclass". |
signature_subclass |
security_result.detection_fields[].value |
La valeur est directement mappée. |
src |
principal.ip |
La valeur est directement mappée. |
src_country |
principal.location.country_or_region |
La valeur est directement mappée. |
src_ip |
principal.ip |
La valeur est directement mappée. |
src_port |
principal.port |
La valeur est directement mappée et convertie en entier. |
srccountry |
principal.location.country_or_region |
La valeur est directement mappée. |
sub_type |
additional.fields[].key |
La clé est définie sur "subType". |
sub_type |
additional.fields[].value.string_value |
La valeur est directement mappée. |
subtype |
target.resource.resource_subtype |
La valeur est directement mappée. |
suid |
principal.user.userid |
La valeur est directement mappée. |
threat_level |
additional.fields[].key |
La clé est définie sur "threatLevel". |
threat_level |
additional.fields[].value.string_value |
La valeur est directement mappée. |
threat_weight |
security_result.detection_fields[].key |
La clé est définie sur "threat_weight". |
threat_weight |
security_result.detection_fields[].value |
La valeur est directement mappée. |
time |
metadata.event_timestamp.seconds |
Combiné à date et analysé pour générer des secondes epoch. |
user_id |
principal.user.product_object_id |
La valeur est directement mappée. |
user_name |
additional.fields[].key |
La clé est définie sur "userName". |
user_name |
additional.fields[].value.string_value |
La valeur est directement mappée. |
user_name |
principal.user.userid |
La valeur est directement mappée. |
N/A | metadata.event_type |
Définissez sur "NETWORK_CONNECTION" si principal.ip et target.ip sont tous les deux présents. Définissez sur "USER_UNCATEGORIZED" si principal.ip et principal.user sont présents. Définissez-le sur "STATUS_UPDATE" si seul principal.ip est présent. Sinon, définissez-le sur "GENERIC_EVENT". |
N/A | metadata.log_type |
Codé en dur sur "FORTINET_FORTIWEB". |
N/A | metadata.product_name |
Codé en dur sur "FORTINET FORTIWEB" ou "FortiWEB Cloud" en fonction du format du journal. |
N/A | metadata.vendor_name |
Codé en dur sur "FORTINET" ou "Fortinet" en fonction du format du journal. |
N/A | principal.resource.resource_type |
Codé en dur sur "DEVICE" si dev_id est présent. |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.