Collecter les journaux Fortinet FortiClient
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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Agent de collecte.
- Cliquez sur Télécharger pour télécharger le fichier d'authentification de l'ingestion.
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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Profil.
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
- Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
Exécutez la commande suivante :
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietAttendez la fin de l'installation.
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
- Ouvrez un terminal avec les droits root ou sudo.
Exécutez la commande suivante :
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shAttendez la fin de l'installation.
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. Utilisez0.0.0.0:514pour é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
- Linux :
customer_id: ID client de la console Google SecOpsendpoint: 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.
- États-Unis :
log_type:FORTINET_FORTICLIENTingestion_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 surEnter, puis surCtrl+X. - Windows : cliquez sur Fichier > Enregistrer.
Redémarrez l'agent Bindplane pour appliquer les modifications.
Linux
sudo systemctl restart observiq-otel-collectorVérifiez que le service est en cours d'exécution :
sudo systemctl status observiq-otel-collectorRecherchez 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-collectorUtiliser la console Services :
- Appuyez sur
Win+R, saisissezservices.msc, puis appuyez sur Entrée. - Localisez observIQ OpenTelemetry Collector.
Effectuez un clic droit, puis sélectionnez Redémarrer.
Vérifiez que le service est en cours d'exécution :
sc query observiq-otel-collectorRecherchez les erreurs dans les journaux :
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Appuyez sur
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
- Connectez-vous à la console Web FortiClient EMS.
- Accédez à Profils de point de terminaison > Gérer les profils.
Modifier ou créer un profil de point de terminaison
- Sélectionnez un profil existant à modifier ou cliquez sur Ajouter pour en créer un.
- Dans le champ Nom du profil, saisissez un nom descriptif (par exemple,
Chronicle-Logging-Profile). - Cliquez sur Paramètres avancés.
- Cliquez sur l'onglet Configuration XML.
- 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 sur1pour activer la journalisation à distance.<log_protocol>: définissez sursyslogpour envoyer les journaux à un serveur syslog. Utilisezfazpour 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 sursyslog.<netlog_categories>: saisissez le masque de bits des catégories de journaux à importer :1= Journaux de trafic2= Journaux des failles4= Journaux des événements7= Toutes les catégories (1 + 2 + 4)
<log_upload_freq_minutes>: saisissez la fréquence d'importation des journaux en minutes (par exemple,5pour toutes les cinq minutes).<level>: niveau de journalisation FortiClient. Saisissez l'une des valeurs suivantes :0= Urgence1= Alerte2= Critique3= Erreur4= Avertissement5= Notification6= 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
- Cliquez sur Tester le fichier XML pour valider la configuration XML.
- Cliquez sur Enregistrer pour enregistrer le profil.
Appliquer le profil aux points de terminaison
- Accédez à Stratégies de point de terminaison > Gérer les stratégies.
- Sélectionnez une règle existante ou cliquez sur Ajouter pour en créer une.
- Dans le menu déroulant Profil, sélectionnez le profil que vous avez créé ou modifié.
- Dans la section Groupes de points de terminaison, sélectionnez les groupes de points de terminaison auxquels vous souhaitez appliquer la règle.
- 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
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 -fWindows :
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"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/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.