Collecter les journaux Fortinet FortiWeb

Compatible avec :

Ce document explique comment ingérer des journaux Fortinet FortiWeb dans Google Security Operations à l'aide de Bindplane.

L'analyseur extrait les champs des journaux au format KV Fortinet FortiWeb. Il utilise grok et/ou kv pour analyser le message du journal, puis mappe ces valeurs au modèle de données unifié (UDM). Il définit également les valeurs de métadonnées par défaut pour la source et le type d'événement.

Avant de commencer

Assurez-vous de remplir les conditions suivantes :

  • Une instance Google SecOps
  • Windows Server 2016 ou version ultérieure, ou hôte Linux avec systemd
  • Si vous exécutez l'agent derrière un proxy, assurez-vous que les ports de pare-feu sont ouverts conformément aux exigences de l'agent Bindplane.
  • Accès privilégié à l'interface Web Fortinet FortiWeb

Obtenir le fichier d'authentification d'ingestion Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agents de collecte.
  3. Téléchargez le fichier d'authentification d'ingestion. Enregistrez le fichier de manière sécurisée sur le système sur lequel Bindplane sera installé.

Obtenir l'ID client Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres SIEM> Profil.
  3. Copiez et enregistrez le numéro client de la section Informations sur l'organisation.

Installer l'agent Bindplane

Installez l'agent Bindplane sur votre système d'exploitation Windows ou Linux en suivant les instructions ci-dessous.

Installation de fenêtres

  1. Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
  2. Exécutez la commande suivante :

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Attendez la fin de l'installation.

  4. Vérifiez l'installation en exécutant la commande suivante :

    sc query observiq-otel-collector
    

Le service doit être indiqué comme RUNNING (EN COURS D'EXÉCUTION).

Installation de Linux

  1. Ouvrez un terminal avec les droits root ou sudo.
  2. Exécutez la commande suivante :

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Attendez la fin de l'installation.

  4. Vérifiez l'installation en exécutant la commande suivante :

    sudo systemctl status observiq-otel-collector
    

Le service doit être indiqué comme actif (en cours d'exécution).

Autres ressources d'installation

Pour obtenir d'autres options d'installation et de dépannage, consultez le guide d'installation de l'agent Bindplane.

Configurer l'agent Bindplane pour ingérer les journaux syslog et les envoyer à Google SecOps

Localiser le fichier de configuration

  • Linux :

    sudo nano /etc/bindplane-agent/config.yaml
    
  • Windows :

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

Modifiez le fichier de configuration

  • Remplacez l'intégralité du contenu de config.yaml par la configuration suivante :

    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
    

Paramètres de configuration

  • Remplacez les espaces réservés suivants :

    • Configuration du récepteur :

      • udplog : utilisez udplog pour syslog UDP ou tcplog pour syslog TCP.
      • 0.0.0.0 : adresse IP à écouter (0.0.0.0 pour écouter sur toutes les interfaces)
      • 514 : numéro de port à écouter (port syslog standard)
    • Configuration de l'exportateur :

      • creds_file_path : chemin d'accès complet au fichier d'authentification de l'ingestion :
        • Linux : /etc/bindplane-agent/ingestion-auth.json
        • Windows : C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
      • YOUR_CUSTOMER_ID : ID client de la section "Obtenir l'ID client"
      • endpoint : URL du point de terminaison régional :
        • États-Unis : malachiteingestion-pa.googleapis.com
        • Europe : europe-malachiteingestion-pa.googleapis.com
        • Asie : asia-southeast1-malachiteingestion-pa.googleapis.com
        • Pour obtenir la liste complète, consultez Points de terminaison régionaux.
      • log_type : type de journal tel qu'il apparaît dans Chronicle (FORTINET_FORTIWEB)

Enregistrez le fichier de configuration.

  • Après avoir modifié le fichier, enregistrez-le :
    • Linux : appuyez sur Ctrl+O, puis sur Enter, puis sur Ctrl+X.
    • Windows : cliquez sur Fichier > Enregistrer.

Redémarrez l'agent Bindplane pour appliquer les modifications.

  • Pour redémarrer l'agent Bindplane sous Linux, exécutez la commande suivante :

    sudo systemctl restart observiq-otel-collector
    
    1. Vérifiez que le service est en cours d'exécution :

        sudo systemctl status observiq-otel-collector
      
    2. Recherchez les erreurs dans les journaux :

        sudo journalctl -u observiq-otel-collector -f
      
  • Pour redémarrer l'agent Bindplane dans Windows, choisissez l'une des options suivantes :

    • Invite de commandes ou PowerShell en tant qu'administrateur :

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • Console Services :

      1. Appuyez sur Win+R, saisissez services.msc, puis appuyez sur Entrée.
      2. Localisez observIQ OpenTelemetry Collector.
      3. Effectuez un clic droit, puis sélectionnez Redémarrer.

      4. Vérifiez que le service est en cours d'exécution :

        sc query observiq-otel-collector
        
      5. Recherchez les erreurs dans les journaux :

        type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
        

Configurer le transfert syslog Fortinet FortiWeb

  1. Connectez-vous à l'interface Web FortiWeb.
  2. Accédez à Journal et rapport > Configuration du journal > Autres paramètres du journal.
  3. Sous Règle Syslog, cliquez sur Créer pour ajouter une règle Syslog.
  4. Fournissez les informations de configuration suivantes :
    • Nom de la règle : saisissez un nom descriptif (par exemple, Google-SecOps-Bindplane).
    • Adresse IP : saisissez l'adresse IP de l'hôte de l'agent Bindplane.
    • Port : saisissez 514.
    • Enable (Activer) : sélectionnez Enable (Activer).
    • Établissement : sélectionnez local0 (ou l'établissement de votre choix).
    • Niveau de journalisation : sélectionnez Informations (ou le niveau de votre choix).
  5. Dans la section Type de journal, activez les éléments suivants :
    • Journal des attaques
    • Journal des événements
    • Journal du trafic
  6. Cliquez sur OK pour enregistrer.
  7. Vérifiez que les messages syslog sont envoyés en consultant les journaux de l'agent Bindplane.

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 l'action est "Autoriser" ou "Accepter", security_result.action_details est défini sur "ALLOW". Si l'action est "Refusée", "refuser", "bloquer" ou "Bloquer", security_result.action_details est défini sur "BLOCK".
application network.application_protocol La valeur est directement mappée 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 "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ée à l'heure et analysée 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.
Message 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 mappée 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. Si aucune correspondance n'est trouvée, la valeur par défaut est UNKNOWN_SEVERITY.
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 mappée 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.
de gravité, security_result.severity Si la gravité est vide et que cs3Label est "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.
heure metadata.event_timestamp.seconds Combinée à la date et analysée 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 la valeur sur "USER_UNCATEGORIZED" si principal.ip et principal.user sont présents. Définissez 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.