SIEM-Export (Enterprise)
Ein Enterprise-Daemon kann jedes Audit-Ereignis in drei Formaten in ein lokales Verzeichnis spiegeln, als zeilenweises JSON, CEF und RFC-5424-syslog, damit der SIEM-Forwarder, den Sie ohnehin betreiben, sie einlesen kann. Diese Seite ist die Operator-Referenz: die Formate mit je einer Beispielzeile, die Felder, die Konfigurationsdatei und das Verhalten je Modus.
Was es ist
Ein lokaler, dateibasierter Spiegel des Audit-Protokolls des Daemons:
- Jede Audit-Aktion wird gespiegelt:
allow,revert,quarantine,quarantine_reversible,detected_kept,meta_attackundfail_closed. - Drei Formate, jedes eine unabhängig aktivierbare rotierende Datei: JSON-Zeilen, CEF (ArcSight Common Event Format) und syslog (RFC 5424).
- Lokal und Air-Gap-tauglich: Der Daemon schreibt Dateien auf die Platte; der einzige optionale Netzwerkpfad ist ein syslog-Ziel, das Sie in Ihrem eigenen Netz konfigurieren. An die PoisonZero-Cloud wird nichts gesendet.
- Best-effort und fail-open: Jeder Init- und Schreibfehler wird geschluckt; der Export kann die Durchsetzung nie verzögern oder blockieren.
audit.log im Tresor (siehe Vorfälle und Audit). Die SIEM-Dateien sind ein Spiegel zum Einlesen, kein Ersatz.Aktivieren
Der Export wird über genau eine lokale Datei konfiguriert, siem.json im Konfigurationsverzeichnis des Daemons. Sie ist bewusst nicht cloud-verwaltet: Keine Remote-Konfiguration kann ihn einschalten oder umleiten. Datei bearbeiten, dann den Daemon neu starten:
| Plattform | Pfad |
|---|---|
| Linux | /etc/poisonzero/siem.json |
| macOS / Windows | <Konfig-Verzeichnis>/siem.json (Verzeichnis überschreibbar mit 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"
}| Feld | Bedeutung |
|---|---|
enabled | Hauptschalter. false oder fehlende Datei bedeutet: Export aus. |
dir | Ausgabeverzeichnis; wird bei Bedarf mit Modus 0755 angelegt. |
formats | Beliebige Teilmenge aus json, cef, syslog. Jedes aktivierte Format schreibt eine rotierende Datei. |
syslog_target | Optionales host:port eines Live-syslog-Empfängers. Weglassen für reine Dateiausgabe. |
syslog_network | udp (Standard) oder tcp. |
group | Optionale Lesegruppe für die Exportdateien (Linux/macOS): Das Verzeichnis wird 0750, die Dateien werden 0640, beides gehört der Gruppe. Unter Windows ignoriert. Siehe Berechtigungen unten. |
enabled: false, leeres dir oder leere formats-Liste sowie unlesbares JSON führen alle zum selben Ergebnis: Export aus, Daemon läuft. Auch eine fehlgeschlagene Verbindung zum syslog_target wird geschluckt; der Dateispiegel schreibt weiter.Ausgabedateien, Rotation und Berechtigungen
| Datei | Inhalt |
|---|---|
audit.json | Ein JSON-Objekt pro Zeile |
audit.cef | Eine CEF-Zeile pro Ereignis |
audit.syslog | Eine RFC-5424-Zeile pro Ereignis; dieselbe Zeile geht zusätzlich an das syslog_target, falls gesetzt |
- Rotation: Jede Datei rotiert bei 10 MiB nach
*.1; der Spiegel bleibt auf der Platte größenbegrenzt. - Standard-Berechtigungen: Das Verzeichnis wird mit
0755angelegt, die Dateien werden mit0600geschrieben. Die Zeilen tragen Dateipfade und Begründungen, deshalb darf sie standardmäßig nur der Nutzer des Daemons lesen. Beim Start setzt der Daemon auch geerbte Gruppenrechte auf diese Standardwerte zurück. - Forwarder-Zugriff über
group(Linux/macOS): Ein Forwarder unter eigenem unprivilegiertem Nutzer (splunk,nxlog,td-agent) bekommt Lesezugriff über das optionale Feldgroup: Das Verzeichnis wird0750, die Dateien werden0640, beides gehört der Gruppe - einschließlich jeder frischen Datei aus der Rotation, was eine einfache Datei-ACL nicht überleben würde. Den Forwarder-Nutzer zur Gruppe hinzufügen. - Fail-safe: Existiert die Gruppe nicht oder schlägt das Setzen von Gruppe oder Modus fehl, startet der Export nicht (einmalig geloggt). Dateien bleiben nie mit falschen Berechtigungen liegen.
- Widerruf: Feld entfernen, und der nächste Daemon-Start setzt Verzeichnis und Dateien auf
0755/0600zurück; bereits rotierte*.1-Dateien werden erst bei ihrer nächsten Rotation korrigiert. - Windows: Das Feld wird ignoriert - POSIX-Modi gelten dort nicht. Lesezugriff für das Forwarder-Konto über die geerbte Verzeichnis-ACL erteilen.
staff (macOS: jeder lokale Nutzer), users, wheel oder everyone: Das gibt die Detektionszeilen an den überwachten Agenten-Prozess und jeden lokalen Nutzer - genau das, was der 0600-Standard verhindert. Eine dedizierte Gruppe anlegen (etwa pz-siem oder die eigene Gruppe des Forwarders wie splunk) und nur den Forwarder-Nutzer aufnehmen. Bei einer breiten Systemgruppe loggt der Daemon beim Start eine Warnung.Die JSON-Zeile
Jede Zeile ist ein Audit-Eintrag; leere optionale Felder entfallen:
| Schlüssel | Typ | Bedeutung |
|---|---|---|
ts | string | RFC 3339 UTC. Wird beim Rendern gestempelt, falls der Eintrag keinen Zeitstempel trug. |
action | string | Eine der oben gelisteten Audit-Aktionen. detected_kept heißt: erkannt, aber bewusst unangetastet gelassen; eine Erkennung, nie als Block gezählt. |
path | string | Absoluter Pfad der betroffenen Datei. |
reason | string | Menschenlesbare Begründung bzw. Klassifikator-Meldung. |
danger | number | 0 bis 1, nur bei KI-Entscheidungen vorhanden. |
threat_level | string | low, medium oder high: die abgeleitete Bedrohungsstufe und erste Eingabe für CEF- und syslog-Severity. |
app_id | string | Daemon-Identität; wird aus der Identität des Daemons gestempelt, wenn der Eintrag keine trägt. |
agent | string | Agenten-Name, sofern bekannt. |
category | string | Angriffskategorie, sofern vom Modell befüllt. |
grounded | boolean | Ob der Beleg wörtlich in der bewerteten Änderung steht; nur vorhanden, wenn es einen Beleg gibt. |
evidence_sha256, evidence_length | string, number | SHA-256 und Länge des Beleg-Zitats. Das Zitat selbst wird nie geschrieben; siehe unten. |
{"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}Die CEF-Zeile
Header: CEF:0|PoisonZero|PoisonZero|<Daemon-Version>|<action>|<action>|<Severity>|<Extensions>. Reservierte Zeichen werden in Header und Extension-Werten CEF-escaped. Die Extensions:
| CEF-Schlüssel | Quelle | Hinweise |
|---|---|---|
rt | ts | Ereigniszeit (RFC 3339). |
act | action | Getroffene Entscheidung. |
fname | path | Betroffene Datei. |
msg | reason | Begründung bzw. Klassifikator-Meldung. |
app | app_id | Daemon-Identität. |
suser | agent | Agenten-Name. |
cs1 | category | Mit cs1Label=Category. |
cs2 | threat_level | Mit cs2Label=ThreatLevel. |
cn1 | danger | Mit cn1Label=Danger. |
Die Severity (CEF 0 bis 10) richtet sich zuerst nach dem Threat-Level: high ist 9, medium ist 6, low ist 2. Nur ein Eintrag ohne Threat-Level fällt auf seine Aktion zurück: quarantine 10; revert, meta_attack, fail_closed 9; quarantine_reversible, detected_kept 6; allow 2; eine unbekannte Aktion wird nach danger eingestuft. In Live-Daten entscheidet die Stufe: Eine bewiesene Quarantäne ist high (9), ein detected_kept ist medium (6), die beiden sind also bereits getrennt.
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
Die syslog-Zeile
RFC 5424, Facility local0 (16), also PRI = 16 × 8 + Severity. Der Nachrichtenkörper ist die CEF-Zeile von oben: CEF over syslog, die gängige SIEM-Konvention. Die Severity spiegelt die CEF-Logik, Threat-Level zuerst:
| Eingabe | syslog-Severity |
|---|---|
Threat-Level high | warning (4) |
Threat-Level medium | notice (5) |
Threat-Level low | informational (6) |
Ohne Stufe: quarantine, revert, meta_attack, fail_closed | warning (4) |
Ohne Stufe: quarantine_reversible, detected_kept | notice (5) |
Ohne Stufe: allow und alles Übrige | 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 bleibt absichtlich auf notice: Ein Operator, der ab notice filtert, sieht die Erkennung weiterhin. Als Block gezählt wird sie trotzdem nie.Modi und Air Gap
Der Export verhält sich im Cloud-Modus und im Private-Modus identisch: Er ist eine rein lokale Senke, ein privates Gerät verliert also nichts (siehe Cloud oder Privat). Das Feature baut keine eigenen ausgehenden Verbindungen auf; der einzige Netzwerkpfad ist das von Ihnen ausdrücklich konfigurierte syslog_target in Ihrem eigenen Netz. In vollständig abgeschotteten Umgebungen lassen Sie syslog_target weg und lassen Ihren On-Premises-Collector die Dateien einlesen.
SIEM-Export oder OpenTelemetry-Export?
Beides sind Enterprise-Features und beide bleiben in Ihrem Netz; sie beantworten verschiedene Fragen:
| SIEM-Export | OpenTelemetry-Export | |
|---|---|---|
| Transport | Lokale Dateien (plus optionales syslog-Forwarding) | OTLP/HTTP-Push zu einem Collector |
| Umfang | Jede Audit-Aktion, allow eingeschlossen | Erkennungs-Events; allow wird nie exportiert |
| Formate | JSON-Zeilen, CEF, RFC-5424-syslog | OTLP mit festen poisonzero.*-Attributen |
| Detailstufen | Keine: Beleg immer als Hash plus Länge | hashes, redacted, full (lokale Entscheidung) |
| Konfiguration | Eine lokale Datei, nie cloud-verwaltet | Lokales Profil oder zentrale Admin-API für Flotten |
Weiterlesen
Was das Audit-Protokoll selbst festhält: Vorfälle und Audit. Wie lange lokale Daten bleiben: Speicher, Aufbewahrung und Bereinigung. Die Modus-Wahl dahinter: Cloud oder Privat.
Ihr Audit-Protokoll, im SIEM, das Sie ohnehin betreiben.
JSON, CEF und syslog, lokal geschrieben und von Ihrem eigenen Forwarder eingelesen. Keine Cloud im Pfad. Ein Enterprise-Feature.
Sign me up