Collecter les journaux Fortinet FortiClient

Compatible avec :

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

FortiClient est une solution de sécurité des points de terminaison qui fournit des fonctionnalités d'antivirus, de filtrage Web, de VPN, d'analyse des failles et de pare-feu d'application pour les points de terminaison Windows, macOS, Linux et Chromebook. FortiClient est géré de manière centralisée via FortiClient EMS (Endpoint Management Server), qui transmet les règles de sécurité et les profils de configuration aux points de terminaison.

Avant de commencer

Assurez-vous de remplir les conditions préalables suivantes :

  • Une instance Google SecOps
  • Windows Server 2016 ou version ultérieure, ou hôte Linux avec systemd
  • Connectivité réseau entre l'agent Bindplane et les points de terminaison FortiClient
  • 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é à la console de gestion FortiClient EMS
  • FortiClient EMS version 7.0 ou ultérieure avec des points de terminaison FortiClient sous licence

Obtenir le fichier d'authentification d'ingestion Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agent de collecte.
  3. Cliquez sur Télécharger pour télécharger le fichier d'authentification de l'ingestion.
  4. Enregistrez le fichier de manière sécurisée sur le système sur lequel l'agent 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/forticlient:
    compression: gzip
    creds_file_path: '/etc/bindplane-agent/ingestion-auth.json'
    customer_id: 'your-customer-id-here'
    endpoint: malachiteingestion-pa.googleapis.com
    log_type: FORTINET_FORTICLIENT
    raw_log_field: body
    ingestion_labels:
        env: production
        source: forticlient

service:
    pipelines:
    logs/forticlient_to_chronicle:
        receivers:
        - udplog
        exporters:
        - chronicle/forticlient

Paramètres de configuration

Remplacez les espaces réservés suivants :

Configuration du récepteur :

  • listen_address : adresse IP et port à écouter. Utilisez 0.0.0.0:514 pour écouter sur toutes les interfaces sur le port 514.

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
  • customer_id : ID client de la console Google SecOps
  • 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 : FORTINET_FORTICLIENT
  • ingestion_labels : libellés facultatifs au format YAML

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.

  • Linux

    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
      
  • Windows

    Choisissez l'une des options suivantes :

    • À l'aide de l'invite de commandes ou de PowerShell en tant qu'administrateur :

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • Utiliser la 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 la journalisation des points de terminaison FortiClient pour envoyer les journaux à l'agent Bindplane

La journalisation des points de terminaison FortiClient est configurée de manière centralisée via FortiClient EMS en modifiant les profils de point de terminaison avec la configuration XML. EMS envoie la configuration de journalisation aux points de terminaison FortiClient, qui envoient ensuite les journaux directement au récepteur syslog de l'agent Bindplane.

Se connecter à FortiClient EMS

  1. Connectez-vous à la console Web FortiClient EMS.
  2. Accédez à Profils de point de terminaison > Gérer les profils.

Modifier ou créer un profil de point de terminaison

  1. Sélectionnez un profil existant à modifier ou cliquez sur Ajouter pour en créer un.
  2. Dans le champ Nom du profil, saisissez un nom descriptif (par exemple, Chronicle-Logging-Profile).
  3. Cliquez sur Paramètres avancés.
  4. Cliquez sur l'onglet Configuration XML.
  5. Cliquez sur Modifier.

Configurer la journalisation à distance dans XML

L'EMS affiche deux volets. Utilisez le volet de droite pour modifier la configuration XML.

Recherchez la section <log_settings> dans <system>. Si ce n'est pas le cas, ajoutez-le. Dans <log_settings>, recherchez ou ajoutez la section <remote_logging>, puis configurez-la comme suit :

<forticlient_configuration>
    <system>
    <log_settings>
        <onnet_local_logging>1</onnet_local_logging>
        <level>6</level>
        <log_events>ipsecvpn,sslvpn,scheduler,update,firewall,av,proxy,shield,webfilter,endpoint,fssoma,configd,vuln,sandboxing,antiexploit</log_events>
        <remote_logging>
        <log_upload_enabled>1</log_upload_enabled>
        <log_protocol>syslog</log_protocol>
        <netlog_server>192.168.1.100</netlog_server>
        <netlog_categories>7</netlog_categories>
        <log_upload_freq_minutes>5</log_upload_freq_minutes>
        </remote_logging>
    </log_settings>
    </system>
</forticlient_configuration>

Paramètres de configuration :

  • <log_upload_enabled> : définissez la valeur sur 1 pour activer la journalisation à distance.
  • <log_protocol> : définissez sur syslog pour envoyer les journaux à un serveur syslog. Utilisez faz pour envoyer les journaux à FortiAnalyzer.
  • <netlog_server> : saisissez l'adresse IP de l'hôte de l'agent Bindplane (par exemple, 192.168.1.100). Ce paramètre n'est utilisé que lorsque <log_protocol> est défini sur syslog.
  • <netlog_categories> : saisissez le masque de bits des catégories de journaux à importer :
    • 1 = Journaux de trafic
    • 2 = Journaux des failles
    • 4 = Journaux des événements
    • 7 = Toutes les catégories (1 + 2 + 4)
  • <log_upload_freq_minutes> : saisissez la fréquence d'importation des journaux en minutes (par exemple, 5 pour toutes les cinq minutes).
  • <level> : niveau de journalisation FortiClient. Saisissez l'une des valeurs suivantes :
    • 0 = Urgence
    • 1 = Alerte
    • 2 = Critique
    • 3 = Erreur
    • 4 = Avertissement
    • 5 = Notification
    • 6 = Information (recommandé)
    • 7 = Débogage
  • <log_events> : liste d'événements ou de processus FortiClient à enregistrer, séparés par une virgule. Incluez les événements que vous souhaitez capturer (par exemple, ipsecvpn,sslvpn,firewall,av,webfilter,endpoint).

Enregistrer le profil

  1. Cliquez sur Tester le fichier XML pour valider la configuration XML.
  2. Cliquez sur Enregistrer pour enregistrer le profil.

Appliquer le profil aux points de terminaison

  1. Accédez à Stratégies de point de terminaison > Gérer les stratégies.
  2. Sélectionnez une règle existante ou cliquez sur Ajouter pour en créer une.
  3. Dans le menu déroulant Profil, sélectionnez le profil que vous avez créé ou modifié.
  4. Dans la section Groupes de points de terminaison, sélectionnez les groupes de points de terminaison auxquels vous souhaitez appliquer la règle.
  5. Cliquez sur Enregistrer.

EMS transmet la configuration du profil aux points de terminaison lors de la prochaine communication de télémétrie. Les points de terminaison FortiClient commenceront à envoyer des journaux au récepteur syslog de l'agent Bindplane.

Vérifier le transfert de journaux

  1. Sur l'hôte de l'agent Bindplane, vérifiez les journaux de l'agent pour vous assurer que les journaux sont bien reçus :

    Linux :

    sudo journalctl -u observiq-otel-collector -f
    

    Windows :

    type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
    
  2. Sur un point de terminaison FortiClient, vérifiez que la journalisation à distance est activée en consultant les journaux FortiClient :

    Windows :

    C:\Program Files\Fortinet\FortiClient\logs\
    

    macOS :

    /Library/Application Support/Fortinet/FortiClient/logs/
    

    Linux :

    /var/log/forticlient/
    
  3. Dans la console Google SecOps, vérifiez que les journaux FortiClient sont ingérés :

    • Accédez à Recherche.
    • Saisissez une requête de recherche pour les journaux FortiClient (par exemple, metadata.log_type = "FORTINET_FORTICLIENT").
    • Vérifiez que les journaux apparaissent dans les résultats de recherche.

Table de mappage UDM

Champ du journal Mappage UDM Logique
emsserial, devid, usingpolicy, itime, fctsn, logver, site, fctver, browsetime, event_id, SubjectUserName, SubjectLogonId, ThreadID additional.fields Libellés créés avec une clé et une valeur pour chaque champ, fusionnés dans additional.fields
timestamp metadata.collected_timestamp Analysé en tant que code temporel UNIX
ts metadata.event_timestamp Analysé avec le filtre de date à l'aide des formats "MMM d HH:mm:ss", "MMM d HH:mm:ss", "yyyy-MM-dd HH:mm:ss"
deviceip, client_ip, devicemac, hostname, user, uid metadata.event_type Défini sur USER_RESOURCE_ACCESS si l'utilisateur/l'UID et l'ID de la machine sont présents ; sur USER_UNCATEGORIZED si l'ID de la machine est présent ; sur GENERIC_EVENT dans le cas contraire
eventtype metadata.product_event_type Valeur copiée directement
id metadata.product_log_id Converti en chaîne, valeur copiée
service network.application_protocol En majuscules, puis défini sur le protocole prédéfini s'il correspond à la liste (par exemple, "SSH" pour "22", "SSH", "SSHD" ; "HTTP" pour "80", "8080", "HTTP"), sinon au service s'il figure dans la liste étendue, sinon vide
direction network.direction Définissez sur INBOUND si la valeur correspond à (?i)inbound ou sur OUTBOUND si elle correspond à (?i)outbound.
proto network.ip_protocol Définissez sur "TCP" si proto == "6"
rcvdbyte network.received_bytes Converti en uinteger, valeur copiée si elle n'est pas vide/0
sentbyte network.sent_bytes Converti en uinteger, valeur copiée si elle n'est pas vide/0
sessionid network.session_id Valeur copiée directement
pcdomain principal.administrative_domain Valeur copiée directement
srcproduct principal.application Valeur copiée directement
nom d'hôte principal.hostname Valeur copiée directement
deviceip, client_ip principal.ip Valeur issue de deviceip si elle n'est pas vide, sinon issue de client_ip si l'adresse IP est valide
devicemac principal.mac Valeur convertie au format MAC et copiée si elle est valide
os, source principal.platform Définissez sur WINDOWS si l'OS/la source correspond à (?i)windows, sur MAC si elle correspond à (?i)mac|ios et sur LINUX si elle correspond à (?i)linux.
source_ver principal.platform_version Valeur copiée directement
srcport principal.port Valeur convertie en nombre entier et copiée
ProcessId principal.process.pid Valeur copiée directement
srcname, source_type, type principal.resource.attribute.labels Libellés créés avec une clé et une valeur pour chaque champ, fusionnés dans attribute.labels
devname principal.resource.name Valeur copiée directement
ProviderGuid principal.resource.product_object_id Valeur copiée directement
subtype principal.resource.resource_subtype Valeur copiée directement
url principal.url Valeur copiée directement
uid, fctuid principal.user.product_object_id Valeur de l'UID si elle n'est pas vide, sinon fctuid
utilisateur principal.user.user_display_name Valeur copiée directement
utilisateur principal.user.userid Valeur copiée directement
SubjectUserSid principal.user.windows_sid Valeur copiée si elle correspond à l'expression régulière du SID
utmaction security_result.action Définissez sur ALLOW si la valeur est dans [accept,allow,passthrough,pass,permit,detected], sur BLOCK si elle est dans [deny,dropped,blocked,block] et sur UNKNOWN_ACTION dans les autres cas.
utmevent security_result.category_details Valeur copiée directement
utmaction security_result.description Définir sur "utmaction:"
userinitiated security_result.detection_fields Libellé créé avec la clé "userinitiated" et la valeur "userinitiated", fusionné
level security_result.severity Défini sur INFORMATIONAL si le niveau est "info"
menace security_result.threat_name Valeur copiée directement
emshostname, remotename target.hostname Valeur de emshostname si elle n'est pas vide, sinon remotename
dstip target.ip Adresse IP valide extraite de dstip
dstport target.port Convertie en entier, valeur copiée si elle n'est pas égale à 0
metadata.product_name Défini sur "FORTINET_FORTICLIENT"
metadata.vendor_name Défini sur "FORTINET_FORTICLIENT"

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.