auditd a fondo:
la telemetría de Linux que casi nadie configura bien
Serie Blue Team | unfantasmaenelsistema.com
En Windows, cuando alguien habla de telemetría para detección, la conversación gira enseguida hacia Sysmon: creación de procesos con línea de comandos, hashes, conexiones de red, todo en un canal ordenado. En Linux la respuesta equivalente lleva instalada por defecto en casi todas las distribuciones desde hace veinte años y se llama auditd, el demonio de espacio de usuario del subsistema de auditoría del kernel. El problema no es que falte: es que casi nadie lo configura más allá de las cuatro reglas que trae de fábrica, y esas cuatro reglas no detectan nada interesante.
Este artículo explica cómo está montado el subsistema de auditoría por dentro, la diferencia entre vigilar llamadas al sistema y vigilar ficheros, qué conjuntos de reglas de referencia merece la pena adoptar, cómo se leen los eventos sin perder la cabeza, cómo controlar el ruido y el impacto en rendimiento, y cómo enviar todo eso a un SIEM. El objetivo es que auditd deje de ser una casilla marcada en una auditoría de cumplimiento y pase a ser una fuente de detección de la que el equipo se fía.
Qué aprenderás en este artículo
La arquitectura: kernel audit, auditd, auditctl y las herramientas de consulta ausearch/aureport · Reglas de syscall frente a watches de fichero: qué vigila cada tipo y cuándo usar cada uno · Qué conjuntos de reglas de referencia adoptar (Linux Audit del proyecto, el mapeo a MITRE de Neo23x0) · Cómo leer los campos de un evento y reconstruir un execve legible · Cómo dimensionar backlog y tasa de eventos, y cómo excluir ruido sin cegarte · Cómo enviar la auditoría a un SIEM (rsyslog, Auditbeat, Wazuh) y dónde encajan Sysmon for Linux y eBPF
1. Cómo está montado el subsistema de auditoría
La auditoría de Linux vive en el kernel. Hay un componente del núcleo que intercepta eventos —llamadas al sistema, accesos a ficheros vigilados, eventos de seguridad de otros subsistemas como SELinux— y los envía por un socket de tipo netlink a un único proceso de espacio de usuario. Ese proceso es auditd. Solo puede haber uno, y es quien decide qué se hace con cada registro: normalmente escribirlo en /var/log/audit/audit.log.
- Kernel audit: la maquinaria dentro del núcleo. No se configura directamente; se le cargan reglas desde el espacio de usuario.
- auditd: el demonio. Lee del kernel y persiste los eventos. Su comportamiento (rotación, acción cuando el disco se llena, formato) se ajusta en /etc/audit/auditd.conf.
- auditctl: la herramienta que carga y consulta reglas en caliente. `auditctl -l` lista las reglas activas; `auditctl -s` muestra el estado (pérdidas, backlog, tasa).
- augenrules: ensambla los ficheros de /etc/audit/rules.d/*.rules en el conjunto que se carga al arrancar. Es donde se dejan las reglas de forma persistente.
- ausearch y aureport: consulta y resumen del log. ausearch filtra por clave, usuario, syscall o rango de tiempo; aureport da recuentos y vistas agregadas.
- auditispd (dispatcher): reenvía una copia de cada evento a plugins —por ejemplo al que habla con syslog— para envío en tiempo real a un SIEM.
auditd y el resto del mundo se pelean por el mismo socket
Solo un proceso puede recibir del kernel audit a la vez. Si instalas un agente (Auditbeat, el módulo de algunos EDR) que abre su propia conexión, puede desplazar a auditd o entrar en conflicto. Decide quién es el dueño del socket y haz que los demás lean del log o del dispatcher, no del kernel directamente.
2. Dos formas de vigilar: syscalls y watches
Todas las reglas de auditoría se reducen a dos tipos, y confundirlos es la causa número uno de reglas que no disparan.
2.1 Reglas de llamada al sistema (-a)
Vigilan la ejecución de una syscall concreta, opcionalmente filtrada por argumentos: arquitectura, UID que la invoca, código de retorno, valor de un parámetro. Son la herramienta para detectar acciones: ejecutar un binario (execve), cargar un módulo del kernel (init_module, finit_module), cambiar la hora (adjtimex), montar un sistema de ficheros (mount).
# Toda ejecucion de un binario en sistemas de 64 bits, etiquetada 'exec' -a always,exit -F arch=b64 -S execve -F key=exec # Carga de modulos del kernel (persistencia / rootkits) -a always,exit -F arch=b64 -S init_module -S finit_module -S delete_module -F key=modules # Cambios de reloj (anti-forense) -a always,exit -F arch=b64 -S adjtimex -S settimeofday -S clock_settime -F key=time-change
2.2 Watches de fichero o directorio (-w)
Vigilan accesos a una ruta: w escritura, a cambio de atributos, r lectura, x ejecución. Son la herramienta para detectar cambios de estado: que alguien toque /etc/passwd, /etc/sudoers, las unidades de systemd o los directorios de cron.
# Modificacion de cuentas y credenciales -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/sudoers -p wa -k scope -w /etc/sudoers.d/ -p wa -k scope # Persistencia por tareas programadas -w /etc/crontab -p wa -k cron -w /etc/cron.d/ -p wa -k cron -w /etc/systemd/system/ -p wa -k systemd-units # Manipulacion de los propios logs y reglas de auditoria -w /var/log/audit/ -p wra -k auditlog -w /etc/audit/ -p wa -k auditconfig
Un watch es en realidad azúcar sintáctico: internamente se traduce a reglas de syscall sobre las llamadas de apertura y modificación filtradas por ese inodo. Por eso un watch sobre un directorio cubre los ficheros que ya contiene, pero conviene revisarlo tras cambios estructurales.
Etiqueta SIEMPRE con -k (o -F key=)
La clave es el texto que luego usas para buscar: `ausearch -k identity`. Sin claves consistentes, el log es una masa indiferenciada. Usa un vocabulario corto y estable (exec, identity, cron, modules, network-connect) y documéntalo.
3. No empieces de cero: conjuntos de reglas de referencia
Escribir el conjunto de reglas a mano lleva semanas y siempre se olvida algo. Hay dos referencias maduras que conviene tomar como punto de partida y luego recortar.
| Conjunto | Enfoque | Cuándo usarlo |
|---|---|---|
| Linux Audit (linux-audit/audit-userspace, carpeta rules) | Reglas de ejemplo por objetivo de cumplimiento: STIG, PCI-DSS, NISPOM. Muy completas y muy ruidosas. | Base cuando tienes una obligación de cumplimiento concreta que citar |
| Neo23x0/auditd (Florian Roth) | Orientado a detección: cada regla mapeada a una técnica de MITRE ATT&CK, con la clave nombrada por la táctica. Equilibrio pensado para SIEM. | Base por defecto para un equipo azul que quiere señales, no un informe de auditor |
| Reglas de la CIS Benchmark de tu distro | Subconjunto mínimo que exige el benchmark (identidad, hora, red, montajes, acceso a ficheros de sistema). | Complemento para cerrar los puntos que el auditor va a comprobar |
El flujo recomendado: parte del conjunto de Neo23x0, cárgalo en un equipo de laboratorio representativo, deja pasar un día de uso normal y mira con aureport qué claves generan el 90 % del volumen. Esas son las candidatas a recortar o a filtrar antes de llevar el conjunto a producción.
# Colocar el fichero de reglas y regenerarlas sudo cp audit.rules /etc/audit/rules.d/audit.rules sudo augenrules --load sudo auditctl -l | wc -l # cuantas reglas activas # Que claves generan mas eventos en el ultimo dia sudo aureport --key --summary -ts today # Ver el detalle de una clave concreta, ya interpretada sudo ausearch -k modules -i -ts today
4. Leer un evento: campos clave y el execve legible
Un evento de auditoría no es una línea, es un grupo de registros que comparten un mismo identificador de evento (el par tiempo:serie que aparece como `msg=audit(1725360000.123:4567)`). Una ejecución de proceso genera al menos tres registros: SYSCALL (quién, qué syscall, resultado), EXECVE (los argumentos, uno por campo a0, a1, a2…) y PROCTITLE (el título del proceso). Los watches añaden un registro PATH por cada ruta implicada y un CWD con el directorio de trabajo.
| Campo | Significado | Por qué importa |
|---|---|---|
| auid | audit UID: la identidad real de quien inició la sesión, invariable aunque haga su/sudo | Es el campo para atribuir una acción a una persona; uid puede ser root tras un sudo |
| uid / gid / euid | Identidad efectiva en el momento de la syscall | Un euid=0 con auid de un usuario normal = escalada o sudo; contrástalos |
| exe / comm | Ruta del ejecutable y nombre corto del comando | Punto de partida de cualquier búsqueda |
| key | La etiqueta que pusiste en la regla | El filtro primario en ausearch y en el SIEM |
| success / exit | Si la syscall tuvo éxito y su código de retorno | Distingue un intento fallido (exit=-13 EACCES) de una acción consumada |
| pid / ppid | Proceso y proceso padre | Reconstruir la cadena: ¿quién lanzó esta shell? |
| ses | Identificador de sesión de login | Agrupa toda la actividad de una misma sesión interactiva |
El registro EXECVE guarda cada argumento por separado y, si contiene caracteres no imprimibles o espacios, lo codifica en hexadecimal. Leerlo en crudo es incómodo. La opción -i de ausearch (interpret) traduce UID a nombres, marcas de tiempo a fechas y decodifica esos argumentos; para reconstruir la línea de comando completa y legible se usa habitualmente el script aushape o utilidades como audisp-tools, y en el SIEM se normaliza a un único campo tipo process.command_line.
# Todas las ejecuciones de un usuario concreto hoy, interpretadas sudo ausearch -ts today -ua alice -k exec -i # Reconstruir un evento completo por su id sudo ausearch -a 4567 -i # Resumen de ejecutables mas vistos y de intentos fallidos de acceso sudo aureport -x --summary sudo aureport -f --summary --failed
5. Ruido, pérdidas y rendimiento
auditd puede llegar a ser caro. Cada syscall vigilada añade trabajo en una ruta caliente del kernel, y un conjunto de reglas mal recortado en un servidor con mucha actividad de ficheros puede generar gigabytes al día y, peor, perder eventos. El estado se consulta con `auditctl -s`.
| Parámetro (auditctl -s / auditctl) | Qué controla | Ajuste habitual |
|---|---|---|
| backlog_limit | Tamaño de la cola del kernel hacia auditd | 8192 o 16384 en servidores con carga; el valor por defecto (64-320) se desborda enseguida |
| backlog_wait_time | Si el kernel espera cuando la cola está llena (penaliza latencia) o descarta | 0 para no penalizar procesos a costa de posibles pérdidas; valorar según criticidad |
| lost | Contador acumulado de eventos perdidos | Debe quedarse en 0; si sube, faltan reglas de exclusión o backlog |
| rate (en auditd.conf) | Límite de eventos por segundo antes de aplicar la acción configurada | Empezar sin límite y medir; poner límite solo con un plan para el excedente |
| max_log_file / num_logs / max_log_file_action | Rotación del log local | Dimensionar para varios días; action=rotate, nunca ‘suspend’ en producción |
La forma correcta de bajar el volumen no es quitar reglas de detección, es excluir explícitamente el ruido conocido con reglas de tipo exclude o con filtros por campo, dejándolo documentado.
# Excluir un tipo de evento entero que no aporta (ejemplo: CWD) -a always,exclude -F msgtype=CWD # No auditar la actividad de un servicio muy ruidoso por su uid dedicado -a never,exit -F arch=b64 -F uid=vector -F key=exclude-vector # Ignorar accesos de los propios procesos de monitorizacion a un directorio -a never,exit -F dir=/var/lib/node_exporter -F key=exclude-metrics
Cada exclusión es un punto ciego que tú creas
Un `-a never` por uid es cómodo, pero si un atacante consigue ejecutar como ese usuario de servicio, deja de verse. Prefiere exclusiones estrechas (una ruta, un tipo de mensaje) a exclusiones amplias (todo un usuario), y revisa la lista de exclusiones en cada auditoría interna.
6. Enviar la auditoría a un SIEM
El log local es para el forense en la máquina; la detección se hace en el SIEM. Hay tres caminos habituales para sacar los eventos en tiempo real, y todos parten del dispatcher de auditd.
| Mecanismo | Cómo funciona | Notas |
|---|---|---|
| audisp-syslog + rsyslog/syslog-ng | El plugin de syslog reenvía cada evento; rsyslog lo manda cifrado (RELP/TLS) al colector | Sencillo y sin agente extra; el evento va multilínea, hay que reensamblarlo por su id en el SIEM |
| Auditbeat (Elastic) | Lee del kernel o del log, reensambla el evento, lo normaliza a ECS y lo envía a Elasticsearch/Logstash | Muy cómodo para Elastic; recuerda el conflicto por el socket: decide si el dueño es Auditbeat o auditd |
| Agente de Wazuh | El agente recoge audit.log, aplica sus decoders y reglas y lo eleva al manager | Encaja con el artículo de montar un SIEM con Wazuh; el mapeo a ATT&CK ya viene hecho en buena parte del ruleset |
Sea cual sea el transporte, en el SIEM hay dos tareas ineludibles: reensamblar los registros de un mismo evento en un documento único, y normalizar los campos (auid, exe, key) a tu esquema común para poder correlacionar con la telemetría de Windows y de red. Sin ese trabajo de normalización, auditd es un log que se consulta a mano, no una fuente de detección.
# Activar el reenvio por syslog del dispatcher # /etc/audit/plugins.d/syslog.conf active = yes direction = out path = builtin_syslog type = builtin args = LOG_INFO format = string
7. Dónde encajan Sysmon for Linux y eBPF
auditd no es la única opción y no siempre es la mejor. Conviene saber qué aporta cada alternativa para combinarlas en lugar de elegir a ciegas.
- Sysmon for Linux (de Microsoft/Sysinternals, sobre eBPF) produce un esquema de eventos idéntico al de Sysmon en Windows: creación de proceso con línea de comandos ya montada, conexiones de red, creación de ficheros, carga de módulos. Si tu detección está construida sobre reglas estilo Sysmon (o Sigma con logsource de Sysmon), esto te da continuidad entre plataformas. Por dentro se apoya en el mismo subsistema audit o en eBPF según la versión del kernel.
- eBPF puro (Falco, Tetragon, Tracee) observa el kernel sin cargar módulos y con un coste por evento generalmente menor que las reglas de syscall de audit, además de dar contexto de contenedores y de red que auditd no tiene. Es el camino natural para hosts con muchos contenedores.
- auditd sigue siendo insustituible para lo que exige cumplimiento (es el mecanismo que citan STIG, CIS y PCI), para entornos donde no puedes desplegar eBPF, y por su granularidad fina sobre accesos a ficheros concretos. Muchos entornos maduros ejecutan auditd para watches de ficheros de sistema y eBPF/Falco para comportamiento en tiempo de ejecución.
No es una elección excluyente
auditd para cambios en /etc, credenciales, módulos del kernel y lo que pida el auditor; Sysmon for Linux o Falco para procesos, red y contenedores. Lo que importa es que la telemetría llegue normalizada al mismo sitio.
8. Casos de uso concretos
| Qué quieres detectar | Regla / clave | Señal a vigilar en el SIEM |
|---|---|---|
| Shell o intérprete lanzado por un servicio web | -a always,exit -S execve -F key=exec | EXECVE de bash/sh/python con ppid de nginx, apache o php-fpm |
| Modificación de cuentas o sudoers | -w /etc/passwd -w /etc/shadow -w /etc/sudoers -p wa -k identity | Registro PATH con nametype=NORMAL sobre esas rutas y auid distinto del proceso de gestión habitual |
| Persistencia por cron o systemd | -w /etc/cron.d/ -w /etc/systemd/system/ -p wa -k persistence | Creación o edición de unidades/tareas fuera de una ventana de cambios y sin ticket asociado |
| Carga de un módulo de kernel (rootkit) | -a always,exit -S init_module -S finit_module -F key=modules | Cualquier evento con esta clave en un servidor que no actualiza kernel en ese momento |
| Alteración de la propia auditoría | -w /etc/audit/ -p wa -k auditconfig + -e 2 (reglas inmutables) | Eventos CONFIG_CHANGE, o una parada del servicio auditd sin cambio planificado |
| Exfiltración incipiente | reglas de syscall connect filtradas por puertos/destinos no habituales | Conexiones salientes desde procesos que normalmente no hablan con Internet |
Hazte inmune a la manipulación con la última línea del fichero de reglas: -e 2, que marca el conjunto como inmutable hasta el siguiente reinicio. A partir de ahí, cambiar las reglas exige reiniciar la máquina, y ese reinicio es en sí mismo una señal.
Marco legal y ámbito de uso
auditd registra actividad de personas: qué ejecuta cada usuario, cuándo inicia sesión, a qué ficheros accede. Desplegarlo sobre sistemas corporativos exige respetar la normativa laboral y de protección de datos: información previa y por escrito a la plantilla sobre qué se registra y para qué, proporcionalidad, minimización y plazos de conservación (RGPD y LOPDGDD, y el art. 20.3 del Estatuto de los Trabajadores en cuanto al control empresarial). El acceso o la interceptación no autorizados de sistemas y datos ajenos están tipificados en los arts. 197 bis, 197 ter y 264 del Código Penal. Todo lo de este artículo se aplica a sistemas propios o a una organización que te ha autorizado por escrito a monitorizarlos, y las pruebas que generan telemetría se hacen en un laboratorio aislado.
Conclusión
auditd ya está en tus servidores. La diferencia entre que sea una casilla de cumplimiento y que sea una fuente de detección real está en tres decisiones: adoptar un conjunto de reglas orientado a detección y mapeado a ATT&CK en lugar de las cuatro reglas por defecto, etiquetar cada regla con una clave estable para poder buscar, y hacer el trabajo de reensamblado y normalización en el SIEM en lugar de dejar el log tirado en cada máquina.
A partir de ahí, el mantenimiento es el mismo ciclo de siempre: medir el volumen por clave, excluir el ruido conocido con reglas estrechas y documentadas, vigilar el contador de eventos perdidos y sellar el conjunto con -e 2. Y donde auditd se queda corto —procesos, red, contenedores— complementarlo con Sysmon for Linux o con Falco sobre eBPF, no sustituirlo.
Referencias y recursos
github.com/linux-audit/audit-userspace — código de auditd y reglas de ejemplo por objetivo de cumplimiento · github.com/Neo23x0/auditd — conjunto de reglas orientado a detección, mapeado a MITRE ATT&CK · Páginas de manual: auditd.conf(5), auditctl(8), ausearch(8), aureport(8), audit.rules(7) · Linux Audit Documentation (Project) y la CIS Benchmark de tu distribución para el mínimo de cumplimiento · github.com/Sysinternals/SysmonForLinux y falco.org — las alternativas/complementos sobre eBPF · Nuestros artículos sobre Sysmon, reglas Sigma, MITRE ATT&CK y montar un SIEM con Wazuh — el contexto donde encaja auditd
unfantasmaenelsistema.com | Seguridad, sistemas y todo lo que no debería funcionar (pero funciona)

