Collecte et analyse des données Zeek avec Elastic Security
Dans ce blog, je vous guiderai tout au long du processus de configuration de Filebeat et de Zeek (anciennement connu sous le nom de Bro), ce qui vous permettra d'effectuer des analyses sur les données Zeek à l'aide d'Elastic Security. La configuration par défaut de Filebeat et de ses modules fonctionne pour de nombreux environnements ; cependant, vous pourriez avoir besoin de personnaliser les paramètres spécifiques à votre environnement. Les étapes détaillées dans ce blog devraient faciliter la compréhension des étapes nécessaires pour personnaliser votre configuration, avec pour objectif de pouvoir visualiser les données Zeek au sein d'Elastic Security.
Beats sont des agents de transfert légers parfaits pour collecter et transférer des données depuis ou à proximité de la périphérie de votre réseau vers un cluster Elasticsearch. Les agents Beats transfèrent des données conformes à l'Elastic Common Schema (ECS). Filebeat, membre de la famille Beat, est doté de modules internes qui simplifient la collecte, l'analyse et la visualisation des formats de logs courants. Ces modules y parviennent en combinant des chemins par défaut automatiques basés sur votre système d'exploitation. Nous utiliserons Filebeat pour analyser les données Zeek.
J'aborderai également les détails spécifiques au processus d'enrichissement GeoIP pour l'affichage des événements sur la carte Elastic Security. De plus, je détaillerai comment configurer Zeek pour la sortie des données au format JSON, ce qui est requis par Filebeat. Cet article de blog couvre uniquement la configuration. Je pars du principe que vous disposez déjà d'un cluster Elasticsearch configuré avec Filebeat et Zeek installés.
Détails de l'environnement
Mon cluster Elastic a été créé à l'aide d' Elasticsearch Service, qui est hébergé sur Elastic Cloud. Vous pouvez facilement déployer un cluster avec un essai gratuit de 14 jours, sans carte bancaire. Vous devriez essayer, car cela permet de prendre en main Elastic Stack rapidement et facilement.
J'utilise Zeek 3.0.0. Vous pouvez trouver Zeek à télécharger sur le site web de Zeek.
Aperçu de Filebeat
Filebeat transfère des dizaines d'intégrations prêtes à l'emploi, ce qui permet de passer des données au tableau de bord en quelques minutes. Vous pouvez facilement trouver ce dont vous avez besoin sur notre liste complète d'intégrations. Non seulement les modules savent comment analyser les données sources, mais ils configureront également un pipeline d'ingestion pour transformer les données au format ECS.
Elastic travaille à l'amélioration de l'expérience d'intégration et d'ingestion des données avec Elastic Agent et Ingest Manager. Toutefois, il s'agit actuellement d'une version expérimentale ; nous nous concentrerons donc sur l'utilisation des modules Filebeat prêts pour la production. De plus, bon nombre de ces modules fourniront un ou plusieurs tableaux de bord Kibana prêts à l'emploi.

Activer le module Zeek de Filebeat
La première chose à faire est d'activer le module Zeek dans Filebeat. Tous les modules fournis par Filebeat sont désactivés par défaut.
Étape 1 : activer le module Zeek dans Filebeat
L'activation du module Zeek dans Filebeat est aussi simple que l'exécution de la commande suivante :
sudo filebeat modules enable zeek
Cette commande activera Zeek via le fichier de configuration zeek.yml dans le répertoire modules.d de Filebeat. Filebeat doit être accessible depuis votre chemin d'accès. Si ce n'est pas le cas, l'emplacement par défaut de Filebeat est /usr/bin/filebeat si vous avez installé Filebeat en utilisant le référentiel GitHub d'Elastic.
Étape 2 : Ajouter le chemin des logs Zeek à zeek.yml
Les chemins des logs Zeek sont configurés dans le module Filebeat Zeek, et non dans Filebeat lui-même. Vous devez modifier le fichier de configuration du module Filebeat Zeek, zeek.yml. Pour mon installation de Filebeat, il se trouve dans /etc/filebeat/modules.d/zeek.yml. Vous devez ajouter des entrées pour chacun des logs Zeek qui vous intéressent. Le répertoire de base où mon installation de Zeek écrit les logs est /usr/local/zeek/logs/current
Voici la liste complète des chemins des logs Zeek. Vous devrez modifier ces chemins pour les adapter à votre environnement.
# Module: zeek
# Docs : /guide/en/Beats/Filebeat/7.6/module Filebeat-Zeek.html
- module : zeek
perte_de_capture :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/capture_loss.log"]
connexion :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/conn.log"]
dce_rpc :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dce_rpc.log"]
dhcp :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dhcp.log"]
dnp3 :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dnp3.log"]
DNS:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dns.log"]
dpd :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/dpd.log"]
fichiers :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/files.log"]
ftp :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ftp.log"]
http :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/http.log"]
Intelligence :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/intel.log"]
irc :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/irc.log"]
Kerberos :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/kerberos.log"]
modbus :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/modbus.log"]
MySQL :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/mysql.log"]
Avis :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/notice.log"]
ntlm :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ntlm.log"]
ocsp :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ocsp.log"]
pe :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/pe.log"]
rayon :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/radius.log"]
rdp :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/rdp.log"]
rfb :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/rfb.log"]
# signatures :
# enabled: true
# var.paths: ["/usr/local/zeek/logs/current/signatures.log"]
gorgée :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/sip.log"]
smb_cmd :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/smb_cmd.log"]
smb_files :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/smb_files.log"]
smb_mapping :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/smb_mapping.log"]
smtp:
enabled: true
var.paths: ["/usr/local/zeek/logs/current/smtp.log"]
snmp :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/snmp.log"]
socks :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/socks.log"]
ssh :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ssh.log"]
ssl :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/ssl.log"]
statistiques :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/stats.log"]
syslog :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/syslog.log"]
traceroute :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/traceroute.log"]
tunnel :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/tunnel.log"]
bizarre :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/weird.log"]
x509 :
enabled: true
var.paths: ["/usr/local/zeek/logs/current/x509.log"]
Remarque : le log de signature est commenté car le parser Filebeat n’inclut pas (à la date de publication) de support technique pour le log de signature au moment de la rédaction de ce blog.
Étape 3 : Redémarrer Filebeat
Une fois que vous avez terminé de modifier et d'enregistrer votre fichier de configuration zeek.yml, vous devez redémarrer Filebeat. Bien que votre version de Linux puisse nécessiter une légère variante, cela s'effectue généralement via :
sudo systemctl restart filebeat
À ce stade, vous vous attendez normalement à voir les données Zeek visibles dans Elastic Security et dans les index Filebeat. Ne soyez pas surpris si vous ne voyez pas vos données Zeek dans Discover ou sur un tableau de bord. Il reste quelques étapes à suivre.
Configurer Zeek pour une sortie JSON
Par défaut, Zeek n'a pas de sortie de logs au format JSON. C'est ce qui explique l'absence de données Zeek dans les index Filebeat. Le module Filebeat Zeek suppose que les logs Zeek sont au format JSON. Vous rencontrerez probablement des erreurs d'analyse de logs si vous tentez d'analyser les logs Zeek par défaut.
- Vous devez modifier le fichier de configuration
local.zeekpour configurer la sortie de logging JSON. L'emplacement de ce fichier de configuration dépendra de votre installation de Zeek. Mon installation de Zeek se trouve dans/usr/local/zeek. Mon fichier de configuration se trouve dans/usr/local/zeek/share/zeek/site/local.zeek. - Ajoutez la ligne suivante à la fin du fichier de configuration :
@load policy/tuning/json-logs.zeek
- Une fois la modification du fichier de configuration
local.zeekterminée, vous devrez redémarrer Zeek en utilisant :sudo zeekctl déployer
Cela redémarrera Zeek en utilisant les paramètres mis à jour du fichier de configuration. - Une fois cette modification effectuée, vous devez redémarrer Filebeat. À ce stade, vous devriez voir les données Zeek dans vos index Filebeat.
Voici une vue de Discover montrant les valeurs des champs géographiques remplis avec des données :

Enrichissement GeoIP
Une fois les données Zeek dans les index Filebeat, j'ai été surpris de ne voir aucune ligne « pew pew » dans l'onglet Network d'Elastic Security. J'ai créé le pipeline d'ingestion geoip-info comme indiqué dans la documentation de l'interface utilisateur de configuration de carte SIEM. J'ai également vérifié que je faisais bien référence à ce pipeline dans la section de sortie de la configuration de Filebeat, comme documenté.
Voici un exemple de définition du pipeline dans le fichier de configuration filebeat.yml :
sortie.elasticsearch: # Tableau d'hôtes auxquels se connecter. hosts: ["localhost:9200"] pipeline : geoip-info
Les Node sur lesquels j'exécute Zeek utilisent des adresses IP non routables, j'ai donc dû utiliser le processeur add_field de Filebeat pour mapper les informations géographiques en fonction de l'adresse IP. Bien que ces informations soient documentées dans le lien ci-dessus, il y avait un problème avec les noms des champs.
Le pipeline GeoIP suppose que les informations IP se trouvent dans source.ip et destination.ip. C’est le cas pour la plupart des sources. Cependant, avec Zeek, ces informations sont contenues dans source.address et destination.address. Pourquoi cela se produit-il ? Tout dépend en réalité du flux de données et du moment où le pipeline d’ingestion intervient.
Le module Zeek pour Filebeat crée un pipeline d’ingestion pour convertir les données au format ECS. Ce pipeline copie les valeurs de source.address vers source.ip et de destination.address vers destination.ip. Cependant, le processeur add_fields qui ajoute des champs dans Filebeat intervient avant que le pipeline d’ingestion ne traite les données. Par conséquent, les valeurs source.ip et destination.ip ne sont pas encore renseignées lorsque le processeur add_field est actif.
J'ai modifié ma configuration Filebeat pour utiliser le processeur add_field et utiliser address au lieu de ip. Voici à quoi cela ressemble :
processeurs :
- add_host_metadata:
- add_cloud_metadata:
- ajouter_des_champs :
when.network.source.address : 10.128.0.0/24
champ:
source.geo.location :
lat : 41,619549
lon : -93,598022
source.geo.continent_name : Amérique du Nord
source.geo.country_iso_code : États-Unis
source.geo.region_iso_code : US-IA
source.geo.region_name : Iowa
cible : ''
- ajouter_des_champs :
when.network.destination.address : 10.128.0.0/24
champ:
destination.geo.location :
lat : 41,619549
lon : -93,598022
destination.geo.continent_name : Amérique du Nord
destination.geo.country_iso_code : États-Unis
Veuillez noter que j'utilise le champ address dans la ligne when.network.source.address au lieu de when.network.source.ip comme indiqué dans la documentation. Cela s'applique également à la ligne destination. Cela résout le problème de synchronisation du flux de données que j'ai mentionné précédemment. À ce stade du flux de données, les informations dont j'ai besoin se trouvent dans le champ source.address.
Vérifier les données Zeek dans Elastic Security
Une fois que vous avez terminé toutes les modifications apportées à votre fichier de configuration filebeat.yml, vous devrez redémarrer Filebeat en utilisant :
sudo systemctl restart filebeat
Ouvrez maintenant Elastic Security et accédez à l'onglet Network (Réseau). La carte devrait afficher correctement les lignes « pew pew » que nous espérions voir.

En plus de la carte réseau, vous devriez également voir les données Zeek sur l'onglet d'aperçu d'Elastic Security. Dans cet exemple, vous pouvez constater que Filebeat a collecté plus de 500 000 événements Zeek au cours des dernières 24 heures.

Vous pouvez également voir les événements Zeek apparaître sous forme d'alertes externes dans Elastic Security.

Le nombre d'étapes nécessaires pour terminer cette configuration était relativement faible. Il ne devrait généralement falloir que quelques minutes pour terminer cette configuration, ce qui confirme à quel point il est facile de passer des données au tableau de bord en quelques minutes !
Quelle est la prochaine étape ?
Quelles sont donc les prochaines étapes ? Pensez aux autres flux de données que vous pourriez vouloir intégrer, tels que Suricata et les flux de données hôtes. Je vous encourage à consulter notre blog Getting started with adding a new sécurité données source in Elastic SIEM qui vous guide dans l’ajout de nouvelles sources de données de sécurité à utiliser dans Elastic Security.
Prêt pour une protection holistique des données avec Elastic Security? Essayez-le gratuitement dès aujourd'hui dans service Elasticsearch sur Elastic Cloud.
.