Exportación SIEM (Enterprise)
Un daemon Enterprise puede reflejar cada evento de auditoría en un directorio local en tres formatos, JSON línea a línea, CEF y syslog RFC 5424, para que el forwarder SIEM que ya operas pueda ingerirlos. Esta página es la referencia del operador: los formatos con una línea de ejemplo cada uno, los campos, el archivo de configuración y el comportamiento por modo.
Qué es
Un espejo local, basado en archivos, del registro de auditoría del daemon:
- Cada acción de auditoría se refleja:
allow,revert,quarantine,quarantine_reversible,detected_kept,meta_attackyfail_closed. - Tres formatos, cada uno un archivo rotatorio activable de forma independiente: líneas JSON, CEF (ArcSight Common Event Format) y syslog (RFC 5424).
- Local y apto para air gap: el daemon escribe archivos en disco; la única ruta de red opcional es un destino syslog que configuras en tu propia red. Nada se envía a la nube de PoisonZero.
- Best-effort y fail-open: cualquier error de inicialización o escritura se absorbe; la exportación nunca puede retrasar ni bloquear la protección.
audit.log de la bóveda, legible solo por el propietario (ver incidentes y auditoría). Los archivos SIEM son un espejo para la ingesta, no un reemplazo.Cómo activarlo
La exportación se configura con un único archivo local, siem.json, en el directorio de configuración del daemon. Deliberadamente no se gestiona desde la nube: ninguna configuración remota puede activarla ni redirigirla. Edita el archivo y reinicia el daemon:
| Plataforma | Ruta |
|---|---|
| Linux | /etc/poisonzero/siem.json |
| macOS / Windows | <directorio de config>/siem.json (directorio modificable con 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"
}| Campo | Significado |
|---|---|
enabled | Interruptor principal. false o archivo ausente: exportación desactivada. |
dir | Directorio de salida; se crea con modo 0755 si falta. |
formats | Cualquier subconjunto de json, cef, syslog. Cada formato activado escribe un archivo rotatorio. |
syslog_target | host:port opcional de un receptor syslog en vivo. Omítelo para salida solo a archivo. |
syslog_network | udp (predeterminado) o tcp. |
group | Grupo de lectura opcional para los archivos de exportación (Linux/macOS): el directorio pasa a 0750, los archivos a 0640, ambos propiedad de ese grupo. Ignorado en Windows. Ver permisos más abajo. |
enabled: false, dir vacío o lista formats vacía, JSON ilegible: todo lleva al mismo resultado, exportación desactivada y daemon en marcha. Un fallo de conexión al syslog_target también se absorbe; el espejo en archivo sigue escribiendo.Archivos de salida, rotación y permisos
| Archivo | Contenido |
|---|---|
audit.json | Un objeto JSON por línea |
audit.cef | Una línea CEF por evento |
audit.syslog | Una línea RFC 5424 por evento; la misma línea va además al syslog_target si está definido |
- Rotación: cada archivo rota a
*.1al llegar a 10 MiB; el espejo queda acotado en disco. - Permisos por defecto: el directorio se crea con
0755y los archivos se escriben con0600. Las líneas llevan rutas de archivos y motivos; por defecto solo el usuario del daemon puede leerlas. Al arrancar, el daemon también restablece los permisos de grupo heredados a estos valores por defecto. - Acceso del forwarder vía
group(Linux/macOS): un forwarder que corre con su propio usuario sin privilegios (splunk,nxlog,td-agent) obtiene acceso de lectura con el campo opcionalgroup: el directorio pasa a0750, los archivos a0640, ambos propiedad de ese grupo - incluido cada archivo nuevo creado por la rotación, algo que una simple ACL de archivo no sobreviviría. Añade el usuario del forwarder a ese grupo. - Fail-safe: si el grupo no existe o falla la asignación de grupo o modo, la exportación no arranca (se registra una sola vez). Nunca quedan archivos con permisos incorrectos.
- Revocación: quita el campo y el siguiente arranque del daemon restablece directorio y archivos a
0755/0600; los archivos*.1ya rotados se corrigen en su siguiente rotación. - Windows: el campo se ignora - los modos POSIX no aplican allí. Concede lectura a la cuenta del forwarder mediante la ACL heredada del directorio.
staff (macOS: todos los usuarios locales), users, wheel o everyone: eso entrega las líneas de detección al proceso agente vigilado y a todos los usuarios locales - exactamente lo que el 0600 por defecto impide. Crea un grupo dedicado (por ejemplo pz-siem, o el grupo propio del forwarder como splunk) y añade solo al usuario del forwarder. El daemon registra una advertencia al arrancar si se configura un grupo amplio del sistema.La línea JSON
Cada línea es una entrada de auditoría; los campos opcionales vacíos se omiten:
| Clave | Tipo | Significado |
|---|---|---|
ts | string | RFC 3339 UTC. Se estampa al renderizar si la entrada no traía marca de tiempo. |
action | string | Una de las acciones de auditoría listadas arriba. detected_kept significa: detectado pero deliberadamente dejado intacto; una detección, nunca contada como bloqueo. |
path | string | Ruta absoluta del archivo afectado. |
reason | string | Motivo legible o mensaje del clasificador. |
danger | number | De 0 a 1, presente solo en decisiones de IA. |
threat_level | string | low, medium o high: el nivel de amenaza derivado y la primera entrada de la severidad CEF y syslog. |
app_id | string | Identidad del daemon; se estampa desde la identidad del daemon cuando la entrada no la trae. |
agent | string | Nombre del agente, cuando se conoce. |
category | string | Categoría de ataque, cuando el modelo la rellena. |
grounded | boolean | Si la evidencia aparece literalmente en el cambio evaluado; presente solo cuando hay evidencia. |
evidence_sha256, evidence_length | string, number | SHA-256 y longitud de la cita de evidencia. La cita en sí nunca se escribe; ver abajo. |
{"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 línea CEF
Cabecera: CEF:0|PoisonZero|PoisonZero|<versión-daemon>|<action>|<action>|<severidad>|<extensiones>. Los caracteres reservados se escapan según CEF tanto en la cabecera como en los valores de extensión. Las extensiones:
| Clave CEF | Origen | Notas |
|---|---|---|
rt | ts | Hora del evento (RFC 3339). |
act | action | Decisión tomada. |
fname | path | Archivo afectado. |
msg | reason | Motivo o mensaje del clasificador. |
app | app_id | Identidad del daemon. |
suser | agent | Nombre del agente. |
cs1 | category | Con cs1Label=Category. |
cs2 | threat_level | Con cs2Label=ThreatLevel. |
cn1 | danger | Con cn1Label=Danger. |
La severidad (CEF 0 a 10) sigue primero el nivel de amenaza: high es 9, medium es 6, low es 2. Solo una entrada sin nivel recurre a su acción: quarantine 10; revert, meta_attack, fail_closed 9; quarantine_reversible, detected_kept 6; allow 2; una acción desconocida se clasifica por danger. Con datos reales decide el nivel: una cuarentena probada es high (9) y un detected_kept es medium (6), así que ambos ya quedan separados.
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 línea syslog
RFC 5424, facility local0 (16), así que PRI = 16 × 8 + severidad. El cuerpo del mensaje es la línea CEF de arriba: CEF over syslog, la convención SIEM más habitual. La severidad refleja la lógica CEF, nivel de amenaza primero:
| Entrada | Severidad syslog |
|---|---|
Nivel de amenaza high | warning (4) |
Nivel de amenaza medium | notice (5) |
Nivel de amenaza low | informational (6) |
Sin nivel: quarantine, revert, meta_attack, fail_closed | warning (4) |
Sin nivel: quarantine_reversible, detected_kept | notice (5) |
Sin nivel: allow y todo lo demás | 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 se queda a propósito en notice: un operador que filtra desde notice sigue viendo la detección. Aun así, nunca se cuenta como bloqueo.Modos y air gap
La exportación se comporta igual en modo Nube y en modo Privado: es un destino puramente local, así que un dispositivo privado no pierde nada (ver nube o privado). La función no abre conexiones salientes propias; la única ruta de red es el syslog_target que configuras explícitamente, en tu propia red. En un despliegue totalmente aislado, deja syslog_target sin definir y haz que tu colector local lea los archivos.
¿Exportación SIEM o exportación OpenTelemetry?
Ambas son funciones Enterprise y ambas se quedan dentro de tu red; responden a preguntas distintas:
| Exportación SIEM | Exportación OpenTelemetry | |
|---|---|---|
| Transporte | Archivos locales (más reenvío syslog opcional) | Push OTLP/HTTP a un colector |
| Alcance | Cada acción de auditoría, allow incluida | Eventos de detección; allow nunca se exporta |
| Formatos | Líneas JSON, CEF, syslog RFC 5424 | OTLP con atributos poisonzero.* fijos |
| Niveles de detalle | Ninguno: la evidencia siempre es hash más longitud | hashes, redacted, full (decisión local) |
| Configuración | Un archivo local, nunca gestionado desde la nube | Perfil local o API de administración central para flotas |
Sigue leyendo
Lo que registra el propio historial de auditoría: incidentes y auditoría. Cuánto tiempo se conservan los datos locales: almacenamiento, retención y limpieza. La elección de modo detrás de todo: nube o privado.
Tu historial de auditoría, en el SIEM que ya operas.
JSON, CEF y syslog, escritos localmente e ingeridos por tu propio forwarder. Sin nube en el camino. Una función Enterprise.
Sign me up