Consola y flota

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.

~6 min de lectura · Consola y flota

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_attack y fail_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.
La fuente de verdad forense sigue siendo el 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:

PlataformaRuta
Linux/etc/poisonzero/siem.json
macOS / Windows<directorio de config>/siem.json (directorio modificable con POISONZERO_CONFIG_DIR)
jsonsiem.json
{
  "enabled": true,
  "dir": "/var/log/poisonzero-siem",
  "formats": ["json", "cef", "syslog"],
  "syslog_target": "siem.example.com:514",
  "syslog_network": "udp",
  "group": "splunk"
}
CampoSignificado
enabledInterruptor principal. false o archivo ausente: exportación desactivada.
dirDirectorio de salida; se crea con modo 0755 si falta.
formatsCualquier subconjunto de json, cef, syslog. Cada formato activado escribe un archivo rotatorio.
syslog_targethost:port opcional de un receptor syslog en vivo. Omítelo para salida solo a archivo.
syslog_networkudp (predeterminado) o tcp.
groupGrupo 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.
Archivo ausente, 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

ArchivoContenido
audit.jsonUn objeto JSON por línea
audit.cefUna línea CEF por evento
audit.syslogUna 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 *.1 al llegar a 10 MiB; el espejo queda acotado en disco.
  • Permisos por defecto: el directorio se crea con 0755 y los archivos se escriben con 0600. 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 opcional group: el directorio pasa a 0750, los archivos a 0640, 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 *.1 ya 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.
Usa un grupo de forwarder dedicado. Nunca un grupo amplio como 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:

ClaveTipoSignificado
tsstringRFC 3339 UTC. Se estampa al renderizar si la entrada no traía marca de tiempo.
actionstringUna de las acciones de auditoría listadas arriba. detected_kept significa: detectado pero deliberadamente dejado intacto; una detección, nunca contada como bloqueo.
pathstringRuta absoluta del archivo afectado.
reasonstringMotivo legible o mensaje del clasificador.
dangernumberDe 0 a 1, presente solo en decisiones de IA.
threat_levelstringlow, medium o high: el nivel de amenaza derivado y la primera entrada de la severidad CEF y syslog.
app_idstringIdentidad del daemon; se estampa desde la identidad del daemon cuando la entrada no la trae.
agentstringNombre del agente, cuando se conoce.
categorystringCategoría de ataque, cuando el modelo la rellena.
groundedbooleanSi la evidencia aparece literalmente en el cambio evaluado; presente solo cuando hay evidencia.
evidence_sha256, evidence_lengthstring, numberSHA-256 y longitud de la cita de evidencia. La cita en sí nunca se escribe; ver abajo.
jsonLínea de audit.json
{"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 cita literal de la evidencia nunca sale de la bóveda por esta exportación. Cada formato lleva solo su SHA-256 y su longitud, la misma regla de redacción que el nivel predeterminado de la exportación OpenTelemetry.

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 CEFOrigenNotas
rttsHora del evento (RFC 3339).
actactionDecisión tomada.
fnamepathArchivo afectado.
msgreasonMotivo o mensaje del clasificador.
appapp_idIdentidad del daemon.
suseragentNombre del agente.
cs1categoryCon cs1Label=Category.
cs2threat_levelCon cs2Label=ThreatLevel.
cn1dangerCon 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.

textLínea de audit.cef
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:

EntradaSeveridad syslog
Nivel de amenaza highwarning (4)
Nivel de amenaza mediumnotice (5)
Nivel de amenaza lowinformational (6)
Sin nivel: quarantine, revert, meta_attack, fail_closedwarning (4)
Sin nivel: quarantine_reversible, detected_keptnotice (5)
Sin nivel: allow y todo lo demásinformational (6)
textLínea de audit.syslog
<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 SIEMExportación OpenTelemetry
TransporteArchivos locales (más reenvío syslog opcional)Push OTLP/HTTP a un colector
AlcanceCada acción de auditoría, allow incluidaEventos de detección; allow nunca se exporta
FormatosLíneas JSON, CEF, syslog RFC 5424OTLP con atributos poisonzero.* fijos
Niveles de detalleNinguno: la evidencia siempre es hash más longitudhashes, redacted, full (decisión local)
ConfiguraciónUn archivo local, nunca gestionado desde la nubePerfil 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.

¿Te resultó útil?

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