Export SIEM (Enterprise)
Un daemon Enterprise peut refléter chaque événement d'audit dans un répertoire local en trois formats, JSON ligne par ligne, CEF et syslog RFC 5424, afin que le forwarder SIEM que vous exploitez déjà puisse les ingérer. Cette page est la référence de l'opérateur : les formats avec une ligne d'exemple chacun, les champs, le fichier de configuration et le comportement par mode.
Ce que c'est
Un miroir local, basé sur des fichiers, de la piste d'audit du daemon :
- Chaque action d'audit est reflétée :
allow,revert,quarantine,quarantine_reversible,detected_kept,meta_attacketfail_closed. - Trois formats, chacun un fichier rotatif activable indépendamment : lignes JSON, CEF (ArcSight Common Event Format) et syslog (RFC 5424).
- Local et compatible air gap : le daemon écrit des fichiers sur le disque ; le seul chemin réseau optionnel est une cible syslog que vous configurez sur votre propre réseau. Rien n'est envoyé au cloud PoisonZero.
- Best-effort et fail-open : toute erreur d'initialisation ou d'écriture est absorbée ; l'export ne peut jamais retarder ni bloquer l'application des décisions.
audit.log du coffre, lisible par le seul propriétaire (voir incidents et audit). Les fichiers SIEM sont un miroir destiné à l'ingestion, pas un remplacement.Activation
L'export se configure par un seul fichier local, siem.json, dans le répertoire de configuration du daemon. Il n'est délibérément pas géré par le cloud : aucune configuration distante ne peut l'activer ni le rediriger. Modifiez le fichier, puis redémarrez le daemon :
| Plateforme | Chemin |
|---|---|
| Linux | /etc/poisonzero/siem.json |
| macOS / Windows | <répertoire de config>/siem.json (répertoire modifiable via POISONZERO_CONFIG_DIR) |
{
"enabled": true,
"dir": "/var/log/poisonzero-siem",
"formats": ["json", "cef", "syslog"],
"syslog_target": "siem.example.com:514",
"syslog_network": "udp",
"group": "splunk"
}| Champ | Signification |
|---|---|
enabled | Interrupteur principal. false ou fichier absent : export désactivé. |
dir | Répertoire de sortie ; créé en mode 0755 s'il manque. |
formats | Tout sous-ensemble de json, cef, syslog. Chaque format activé écrit un fichier rotatif. |
syslog_target | host:port optionnel d'un récepteur syslog en direct. Omettez-le pour une sortie fichier uniquement. |
syslog_network | udp (défaut) ou tcp. |
group | Groupe de lecture optionnel pour les fichiers d'export (Linux/macOS) : le répertoire passe en 0750, les fichiers en 0640, les deux appartenant à ce groupe. Ignoré sous Windows. Voir les permissions ci-dessous. |
enabled: false, dir vide ou liste formats vide, JSON illisible : tous mènent au même résultat, export désactivé, daemon en marche. Un échec de connexion au syslog_target est également absorbé ; le miroir fichier continue d'écrire.Fichiers de sortie, rotation et permissions
| Fichier | Contenu |
|---|---|
audit.json | Un objet JSON par ligne |
audit.cef | Une ligne CEF par événement |
audit.syslog | Une ligne RFC 5424 par événement ; la même ligne part aussi vers le syslog_target s'il est défini |
- Rotation : chaque fichier bascule vers
*.1à 10 Mio ; le miroir reste borné sur le disque. - Permissions par défaut : le répertoire est créé en
0755, les fichiers sont écrits en0600. Les lignes portent des chemins de fichiers et des motifs ; par défaut seul l'utilisateur du daemon peut donc les lire. Au démarrage, le daemon remet aussi les droits de groupe hérités à ces valeurs par défaut. - Accès forwarder via
group(Linux/macOS) : un forwarder tournant sous son propre utilisateur non privilégié (splunk,nxlog,td-agent) obtient l'accès en lecture via le champ optionnelgroup: le répertoire passe en0750, les fichiers en0640, les deux appartenant à ce groupe - y compris chaque fichier frais créé par la rotation, ce à quoi une simple ACL de fichier ne survivrait pas. Ajoutez l'utilisateur du forwarder à ce groupe. - Fail-safe : si le groupe n'existe pas ou si la pose du groupe ou du mode échoue, l'export ne démarre pas (loggé une seule fois). Aucun fichier n'est laissé avec de mauvaises permissions.
- Révocation : retirez le champ et le prochain démarrage du daemon remet le répertoire et les fichiers en
0755/0600; les fichiers*.1déjà rotés ne sont corrigés qu'à leur prochaine rotation. - Windows : le champ est ignoré - les modes POSIX ne s'y appliquent pas. Accordez la lecture au compte du forwarder via l'ACL héritée du répertoire.
staff (macOS : chaque utilisateur local), users, wheel ou everyone : cela rend les lignes de détection au processus agent surveillé et à chaque utilisateur local - exactement ce que le défaut 0600 empêche. Créez un groupe dédié (par exemple pz-siem, ou le groupe propre du forwarder comme splunk) et n'y ajoutez que l'utilisateur du forwarder. Le daemon logge un avertissement au démarrage si un groupe système large est configuré.La ligne JSON
Chaque ligne est une entrée d'audit ; les champs optionnels vides sont omis :
| Clé | Type | Signification |
|---|---|---|
ts | string | RFC 3339 UTC. Horodaté au rendu si l'entrée n'en portait pas. |
action | string | Une des actions d'audit listées plus haut. detected_kept signifie : détecté mais délibérément laissé intact ; une détection, jamais comptée comme un blocage. |
path | string | Chemin absolu du fichier concerné. |
reason | string | Motif lisible ou message du classifieur. |
danger | number | De 0 à 1, présent uniquement pour les décisions IA. |
threat_level | string | low, medium ou high : le niveau de menace dérivé, première entrée des sévérités CEF et syslog. |
app_id | string | Identité du daemon ; estampillée depuis l'identité du daemon quand l'entrée n'en porte pas. |
agent | string | Nom de l'agent, quand il est connu. |
category | string | Catégorie d'attaque, quand le modèle l'a renseignée. |
grounded | boolean | Si la preuve figure mot pour mot dans le changement évalué ; présent seulement quand il y a une preuve. |
evidence_sha256, evidence_length | string, number | SHA-256 et longueur de la citation de preuve. La citation elle-même n'est jamais écrite ; voir ci-dessous. |
{"ts":"2026-06-10T12:00:00Z","action":"revert","path":"/home/dev/.claude/CLAUDE.md","reason":"prompt injection: exfiltration instruction","danger":0.93,"app_id":"app-7c1","agent":"claude-code","category":"exfil","threat_level":"high","evidence_sha256":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","evidence_length":72}La ligne CEF
En-tête : CEF:0|PoisonZero|PoisonZero|<version-daemon>|<action>|<action>|<sévérité>|<extensions>. Les caractères réservés sont échappés selon CEF dans l'en-tête et les valeurs d'extension. Les extensions :
| Clé CEF | Source | Notes |
|---|---|---|
rt | ts | Heure de l'événement (RFC 3339). |
act | action | Décision prise. |
fname | path | Fichier concerné. |
msg | reason | Motif ou message du classifieur. |
app | app_id | Identité du daemon. |
suser | agent | Nom de l'agent. |
cs1 | category | Avec cs1Label=Category. |
cs2 | threat_level | Avec cs2Label=ThreatLevel. |
cn1 | danger | Avec cn1Label=Danger. |
La sévérité (CEF 0 à 10) suit d'abord le niveau de menace : high vaut 9, medium 6, low 2. Seule une entrée sans niveau retombe sur son action : quarantine 10 ; revert, meta_attack, fail_closed 9 ; quarantine_reversible, detected_kept 6 ; allow 2 ; une action inconnue est classée selon danger. Dans les données réelles, le niveau décide : une quarantaine prouvée est high (9), un detected_kept est medium (6), les deux sont donc déjà séparés.
CEF:0|PoisonZero|PoisonZero|0.7.8|revert|revert|9|rt=2026-06-10T12:00:00Z act=revert fname=/home/dev/.claude/CLAUDE.md msg=prompt injection app=app-7c1 suser=claude-code cs2=high cs2Label=ThreatLevel cn1=0.93 cn1Label=Danger
La ligne syslog
RFC 5424, facilité local0 (16), donc PRI = 16 × 8 + sévérité. Le corps du message est la ligne CEF ci-dessus : CEF over syslog, la convention SIEM la plus courante. La sévérité reflète la logique CEF, niveau de menace d'abord :
| Entrée | Sévérité syslog |
|---|---|
Niveau de menace high | warning (4) |
Niveau de menace medium | notice (5) |
Niveau de menace low | informational (6) |
Sans niveau : quarantine, revert, meta_attack, fail_closed | warning (4) |
Sans niveau : quarantine_reversible, detected_kept | notice (5) |
Sans niveau : allow et tout le reste | informational (6) |
<132>1 2026-06-10T12:00:00Z build-host poisonzero - audit - CEF:0|PoisonZero|PoisonZero|0.7.8|revert|revert|9|rt=2026-06-10T12:00:00Z act=revert ...
detected_kept reste volontairement à notice : un opérateur qui filtre à partir de notice voit toujours la détection. Elle n'est pour autant jamais comptée comme un blocage.Modes et air gap
L'export se comporte de façon identique en mode Cloud et en mode Privé : c'est un puits purement local, un appareil privé ne perd donc rien (voir cloud ou privé). La fonctionnalité n'établit aucune connexion sortante propre ; le seul chemin réseau est le syslog_target que vous configurez explicitement, sur votre propre réseau. Dans un déploiement entièrement isolé, laissez syslog_target vide et faites lire les fichiers par votre collecteur sur site.
Export SIEM ou export OpenTelemetry ?
Les deux sont des fonctionnalités Enterprise et les deux restent dans votre réseau ; ils répondent à des questions différentes :
| Export SIEM | Export OpenTelemetry | |
|---|---|---|
| Transport | Fichiers locaux (plus transfert syslog optionnel) | Push OTLP/HTTP vers un collecteur |
| Portée | Chaque action d'audit, allow inclus | Événements de détection ; allow n'est jamais exporté |
| Formats | Lignes JSON, CEF, syslog RFC 5424 | OTLP avec attributs poisonzero.* fixes |
| Niveaux de détail | Aucun : la preuve est toujours hachage plus longueur | hashes, redacted, full (décision locale) |
| Configuration | Un fichier local, jamais géré par le cloud | Profil local ou API d'administration centrale pour les flottes |
À lire ensuite
Ce que la piste d'audit enregistre elle-même : incidents et audit. Combien de temps les données locales sont conservées : stockage, rétention et nettoyage. Le choix de mode derrière tout cela : cloud ou privé.
Votre piste d'audit, dans le SIEM que vous exploitez déjà.
JSON, CEF et syslog, écrits localement et ingérés par votre propre forwarder. Aucun cloud sur le chemin. Une fonctionnalité Enterprise.
Sign me up