Saltar al contenido

auditd a fondo: la telemetría de Linux que casi nadie configura bien

    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.

    ConjuntoEnfoqueCuá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 distroSubconjunto 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.

    CampoSignificadoPor qué importa
    auidaudit UID: la identidad real de quien inició la sesión, invariable aunque haga su/sudoEs el campo para atribuir una acción a una persona; uid puede ser root tras un sudo
    uid / gid / euidIdentidad efectiva en el momento de la syscallUn euid=0 con auid de un usuario normal = escalada o sudo; contrástalos
    exe / commRuta del ejecutable y nombre corto del comandoPunto de partida de cualquier búsqueda
    keyLa etiqueta que pusiste en la reglaEl filtro primario en ausearch y en el SIEM
    success / exitSi la syscall tuvo éxito y su código de retornoDistingue un intento fallido (exit=-13 EACCES) de una acción consumada
    pid / ppidProceso y proceso padreReconstruir la cadena: ¿quién lanzó esta shell?
    sesIdentificador de sesión de loginAgrupa 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é controlaAjuste habitual
    backlog_limitTamaño de la cola del kernel hacia auditd8192 o 16384 en servidores con carga; el valor por defecto (64-320) se desborda enseguida
    backlog_wait_timeSi el kernel espera cuando la cola está llena (penaliza latencia) o descarta0 para no penalizar procesos a costa de posibles pérdidas; valorar según criticidad
    lostContador acumulado de eventos perdidosDebe 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 configuradaEmpezar sin límite y medir; poner límite solo con un plan para el excedente
    max_log_file / num_logs / max_log_file_actionRotación del log localDimensionar 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.

    MecanismoCómo funcionaNotas
    audisp-syslog + rsyslog/syslog-ngEl plugin de syslog reenvía cada evento; rsyslog lo manda cifrado (RELP/TLS) al colectorSencillo 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/LogstashMuy cómodo para Elastic; recuerda el conflicto por el socket: decide si el dueño es Auditbeat o auditd
    Agente de WazuhEl agente recoge audit.log, aplica sus decoders y reglas y lo eleva al managerEncaja 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 detectarRegla / claveSeñal a vigilar en el SIEM
    Shell o intérprete lanzado por un servicio web-a always,exit -S execve -F key=execEXECVE 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 identityRegistro 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 persistenceCreació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=modulesCualquier 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 incipientereglas de syscall connect filtradas por puertos/destinos no habitualesConexiones 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)

    Resumen de privacidad

    Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.