Ubuntu

Auditando sistemas Linux con el demonio Audit


El demonio Audit de Linux es un framework que permite auditar eventos en sistemas Linux. En esta entrada veremos cómo instalarlo, configurarlo y cómo usarlo para realizar auditoría de sistema y seguridad.

Auditando cosas

El uso de un framework potente de auditoría nos permite monitorizar muchos tipos de evento así como auditar el propio sistema. Algunos ejemplos incluyen:

  • Auditar el acceso y modificación de ficheros
    • Ver quién ha modificado un fichero concreto
    • Detectar cambios no autorizados
  • Monitorizar funciones y llamadas al sistema
  • Detectar anomalías como fallos de procesos
  • Establecer trampas para la detección de intrusos
  • Grabar los comandos ejecutados por un usuario concreto

Componentes

El framework consta de varios componentes:

Kernel:

  • audit: se engancha en el kernel para capturar los eventos y dirigirlos a auditd

Binarios:

  • auditd: demonio que captura eventos y lo almacena (fichero log)
  • auditctl: herramienta para configurar auditd
  • audispd: demonio para multiplexar eventos
  • aureport: herramienta de informes que lee la información del fichero de log (auditd.log)
  • ausearch: visor de eventos (auditd.log)
  • autrace: usa el componente audit del kernel para trazar binarios
  • aulast: similar a last, pero usando el framework audit
  • aulastlog: similar a lastlog, pero usando el framework audit
  • ausyscall: mapea ID de syscall con su nombre
  • auvirt: muestra información de audit relacionada con máquinas virtuales

Ficheros:

  • audit.rules: usado por auditctl para leer las reglas que tiene que usar
  • auditd.conf: fichero de configuración de auditd

Instalación

Debian/Ubuntu: apt-get install auditd audispd-plugins

Red Hat/CentOS/Fedora: normalmente viene pre-instalado (paquetes: audit y audit-libs)

Configuración

La configuración del demonio audit se lleva a cabo mediante dos ficheros, uno para el propio demonio (auditd.conf) y otro para las reglas utilizadas por la herramienta auditctl (audit.rules).

auditd.conf

El fichero auditd.conf configura el demonio audit de Linux (auditd) y se centra en dónde y cómo se deberían trazar los eventos. También define cómo comportarse ante el llenado del disco, la rotación del fichero de log y el número de logs a mantener. Normalmente la configuración por defecto será apropiada para la mayoría de sistemas.

audit.rules

Para configurar qué eventos deberían ser auditados, el framework audit utilizar un fichero de reglas llamado audit.rules.

Como con la mayoría de cosas, en una instalación limpia viene sin ninguna regla cargada. Las reglas activas se pueden determinar ejecutando el comando auditctl con el parámetro -l.


[root@host ~]# auditctl -l
No rules

En caso de de haya alguna regla cargada, se pueden eliminar usando auditctl con el parámetro -D.

Comencemos monitorizando algo, digamos por ejemplo el fichero /etc/passwd. Pondremos un ‘ojo’ en el fichero mediante la definición de su path y los permisos a observar:


auditctl -a exit,always -F path=/etc/passwd -F perm=wa

Al definir la opción path, indicamos al framework audit qué directorio o fichero queremos observar. Los permisos determinan el tipo de acceso que lanzará un evento. Aunque son similares a los permisos de los fichero, date cuenta que hay una diferencia importante entre los dos. Las cuatro opciones son:

  • r = lectura
  • w = escritura
  • x = ejecución
  • a = cambio de atributo

Conocer el evento concreto o el acceso al fichero se puede trazar de forma rápida usando la herramienta ausearch.


[root@host audit]# ausearch -f /etc/passwd

time->Tue Mar 18 15:17:25 2014
type=PATH msg=audit(1395152245.230:533): item=0 name=”/etc/passwd” inode=137627 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0 nametype=NORMAL
type=CWD msg=audit(1395152245.230:533): cwd=”/etc/audit”
type=SYSCALL msg=audit(1395152245.230:533): arch=c000003e syscall=188 success=yes exit=0 a0=d14410 a1=7f66eec38db7 a2=d4ea60 a3=1c items=1 ppid=1109 pid=4900 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=2 comm=”vi” exe=”/bin/vi” subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)

Alguno de los detalles destacados de esta salida son:

La hora del evento y el nombre del objeto, el path de trabajo actual (cwd), la syscall involoucrada, el ID del usuario auditado (auid) y el binario (exe) que ha ejecutado la acción sobre el fichero. Fíjate en que auid define el usuario original que ha hecho log-in. El resto de campos de ID de usuario podrían indicar diferente usuario, dependiendo del usuario efectivo usado durante el lanzamiento de un evento.

Convirtiendo llamadas al sistema

Las llamadas al sistema (syscall) se trazan mediante un valor numérico. Como puede existir solapamiento en estos valores entre diferentes arquitecturas, también se traza la arquitectura activa.

Usando uname -m podemos determinar la arquitectura y usar ausyscall para determinar lo que representa la llamada numérica 188.


[root@host audit]# ausyscall x86_64 188
setxattr

Ahora sabemos que fue una modificación de los atributos, lo cual tiene sentido ya que definimos nuestro observador para que lanzase un evento ante un cambio de atributo (perm=a).

¿Has usado una regla temporal y quieres volver a usar la reglas viajas? Refresca la reglas de audit a partir de un fichero:

auditctl -R /etc/audit/audit.rules

Auditando procesos bajo Linux

Similar al uso de strace, el framework audit tiene una herramienta llamada autrace. Utiliza el framework audit y añade las reglas correspondientes para la captura de información y su traza. Podemos mostrar la información obtenida usando ausearch.

Realización de una traza:

root@host:~# autrace /bin/ls /tmp
autrace cannot be run with rules loaded.
Please delete all rules using ‘auditctl -D’ if you really wanted to
run this command.
root@host:~# auditctl -D
No rules
root@host:~# autrace /bin/ls /tmp
Waiting to execute: /bin/ls
atop.d mc-root mongodb-27017.sock suds
Cleaning up…
Trace complete. You can locate the records with ‘ausearch -i -p 20314’

Mostrar los ficheros relacionados mediante ausearch:

root@host:~# ausearch –start recent -p 21023 –raw | aureport –file –summary

File Summary Report
===========================
total file
===========================
1 /bin/ls
1 (null) inode=1975164 dev=08:02 mode=0100755 ouid=0 ogid=0 rdev=00:00
1 /etc/ld.so.cache
1 /lib/x86_64-linux-gnu/libselinux.so.1
1 /lib/x86_64-linux-gnu/librt.so.1
1 /lib/x86_64-linux-gnu/libacl.so.1
1 /lib/x86_64-linux-gnu/libc.so.6
1 /lib/x86_64-linux-gnu/libdl.so.2
1 /lib/x86_64-linux-gnu/libpthread.so.0
1 /lib/x86_64-linux-gnu/libattr.so.1
1 /proc/filesystems
1 /usr/lib/locale/locale-archive
1 /tmp

Auditar el acceso a un fichero por parte de un usuario

El framework audit se puede usar para monitorizar syscalls, incluyendo el acceso a ficheros. Si quieres saber qué ficheros concretos son accedidos por un ID de usuario, puedes usar una regla como esta:


auditctl -a exit,always -F arch=x86_64 -S open -F auid=80

  • -F arch=x86_64 Define la arquitectura usada (uname -m), para monitorizar la syscall correcta (algunas llamadas al sistema son ambiguas entre arquitecturas).
  • -S open Selecciona la syscall “open”
  • -F auid=80 El ID de usuario

Este tipo de información es realmente útil para la detección de intrusiones, pero también para la realización de análisis forenses en sistemas Linux.

vía
Linux Auditd Best Practice Configuration

Una respuesta a “Auditando sistemas Linux con el demonio Audit

Deja un comentario