Export des journaux vers un SIEM¶
La borne journalise chaque événement dans un fichier de lignes JSON,
/var/log/pandora-box/pandora-box.log : clés insérées et retirées, analyses
et leurs verdicts, fichiers infectés, quarantaine et nettoyage, mises à jour
des signatures et de l'image, clés de maintenance, erreurs. Une borne en
ligne peut envoyer ces entrées à un SIEM (Wazuh, Elastic, Graylog, Splunk,
ou tout serveur syslog), au fur et à mesure.
Configuration¶
L'export est désactivé par défaut. Il nécessite le profil d'image online
(Construction de l'image), qui apporte le réseau
et le service pandora-box-siem, et la section [siem] de la configuration
(packaging/pandora-box.toml) :
[siem]
enabled = true
host = "siem.example.org"
# "tls" (par défaut), "tcp" ou "udp"
transport = "tls"
# 0 : 6514 pour tls, 514 pour tcp et udp
port = 0
# Autorités de certification du certificat du SIEM, pour tls ("" : celles du
# système)
ca = "/usr/share/pandora-box/siem-ca.pem"
# "syslog" (RFC 5424) ou "json"
format = "syslog"
facility = "local0"
pandora-box --check-config vérifie la section. Les autorités de
certification font partie de l'image : placez-les dans image/siem-ca.pem
(PEM), installé sous /usr/share/pandora-box/siem-ca.pem à la construction
de l'image.
Messages¶
Chaque entrée du journal est un message.
format = "syslog" : un message
RFC 5424 dont l'en-tête vient de
l'entrée, et dont le message est l'entrée JSON elle-même :
<132>1 2026-10-14T10:25:32.123456+00:00 kiosk-01 pandora-box - infected_files - {"timestamp": "2026-10-14T10:25:32.123456+00:00", "level": "WARNING", "kiosk": "kiosk-01", "event": "infected_files", "count": 2}
| Champ | Valeur |
|---|---|
| PRI | facility et le niveau de l'entrée : DEBUG 7, INFO 6, WARNING 4, ERROR 3 |
| TIMESTAMP | Heure de l'entrée (UTC) |
| HOSTNAME | kiosk.name (les caractères autres que l'ASCII imprimable remplacés par _) |
| APP-NAME | pandora-box |
| MSGID | Nom de l'événement (device_verdict, infected_files...) |
Sur TCP et TLS, les messages sont délimités par comptage d'octets (RFC 5425, RFC 6587), comme l'exige syslog sur TLS.
format = "json" : l'entrée JSON seule, une par ligne sur TCP et TLS,
une par datagramme sur UDP. Cela convient aux récepteurs de lignes JSON
(Logstash json_lines, Fluent Bit, Vector) et aux SIEM qui décodent le JSON
d'un message brut.
Chaque entrée contient timestamp, level, kiosk et event, puis les
champs de l'événement. Les horodatages viennent de l'horloge de la borne,
synchronisée par NTP dans le profil online (Heure).
Transport¶
transport |
Port par défaut | |
|---|---|---|
tls |
6514 | Recommandé : le certificat du SIEM est vérifié (autorités de certification de ca, nom d'hôte de host), TLS 1.2 au minimum |
tcp |
514 | En clair, sur un réseau de confiance uniquement |
udp |
514 | En clair ; un datagramme peut être perdu sans avertissement |
La borne ne s'authentifie pas avec un certificat client.
Acheminement¶
Le fichier de journal sert de file d'attente. Le service enregistre la
position de la dernière entrée envoyée (/var/lib/pandora-box-siem/state.json) :
quand le SIEM est injoignable, il réessaie (après 1 seconde, puis deux fois
plus longtemps à chaque fois, jusqu'à 1 minute) et envoie, dans l'ordre,
chaque entrée journalisée entre-temps. Il en va de même quand le service ou
la borne redémarre. logrotate déplace le fichier de journal chaque mois : le
service envoie la fin du fichier déplacé avant le nouveau, donc une
interruption de plus d'un mois perd les entrées du mois le plus ancien.
Syslog n'a pas d'accusé de réception : sur TCP et TLS, les entrées envoyées juste avant une coupure de connexion peuvent être perdues, ou envoyées deux fois si la coupure survient pendant leur envoi. Sur UDP, rien n'est garanti.
Le service¶
pandora-box-siem.service (src/pandora_box/siem.py) suit le fichier de
journal et envoie ses entrées. Il s'arrête aussitôt quand [siem] est
désactivé.
- La borne elle-même n'a pas de réseau (
IPAddressDeny=any, aucun socket IP) : elle ne fait qu'écrire le fichier de journal. Le service tourne sous l'utilisateurpandora-box-siem, sans privilèges et dans un bac à sable systemd, et le pare-feu laisse sortir cet utilisateur (TCP et UDP), en plus du service de mise à jour. - Il lit le fichier de journal grâce au groupe
pandora-box-log, le groupe de/var/log/pandora-boxet des fichiers de la borne : il ne peut lire ni les rapports d'analyse ni la quarantaine (/var/lib/pandora-box, mode 0700). - Ses messages, connexion perdue puis rétablie, sont dans son journal :
journalctl -u pandora-box-siem.
Récepteurs¶
Wazuh : le gestionnaire reçoit syslog sur TCP ou UDP, sans TLS, depuis
les adresses qu'il autorise (<remote> de ossec.conf, connection
syslog). Avec format = "json" et transport = "tcp", chaque entrée
arrive telle quelle au décodeur JSON de Wazuh ; vérifiez le décodage avec
wazuh-logtest.
rsyslog, sur TLS (paquets rsyslog et rsyslog-gnutls) :
global(
DefaultNetstreamDriverCAFile="/etc/rsyslog.d/ca.pem"
DefaultNetstreamDriverCertFile="/etc/rsyslog.d/siem.pem"
DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/siem.key"
)
module(load="imtcp" StreamDriver.Name="gtls" StreamDriver.Mode="1"
StreamDriver.AuthMode="anon")
input(type="imtcp" port="6514")
Développement¶
Le service fonctionne aussi en dehors de l'image, avec toute configuration
dont la section [siem] est activée, ici vers un récepteur local :
nc -lk 5514 &
pandora-box-siem --config pandora-box.toml --state /tmp/siem-state.json
avec host = "127.0.0.1", transport = "tcp" et port = 5514. Le test en
machine virtuelle envoie les journaux de la borne à un récepteur syslog du
test (Test avec QEMU).