Auditando ficheros en Linux (Audit)

audit en Linux

Por el bien de la seguridad de los sistemas es altamente recomendable auditar el acceso, escritura, lectura o ejecución de los ficheros más críticos del sistema operativo.

Por suerte, hace mucho tiempo que en cualquier distribución de Linux podemos instalar la utilidad audit para realizar estas funciones.

Instalación de audit

En Linux RedHat instalaremos y habilitaremos audit con los siguientes comandos:

yum install audit
systemctl enable audit
systemctl start audit

Auditando un fichero de Linux

Uno de los ficheros más críticos para la seguridad de nuestro sistema operativo es el /etc/passwd. Por lo que nos interesa auditarlo para saber qué procesos y usuarios están accediendo y modificándolo.

Para auditar el fichero passwd, ejecutaremos el siguiente comando:

auditctl -w /etc/passwd -p war -k password-file
  • -w /etc/passwd: Significa que insertamos un «watch» en el fichero passwd. Es decir, que lo estamos auditando.
  • -p war: Se refiere a los permisos que queremos auditar: r lectura, w escritura, x ejecución, a append o escritura al fina del fichero.
  • -k password-file: Insertamos una cadena de texto que luego podemos utilizar para realizar búsquedas para la regla que acabamos de utilizar, ya que el fichero de log de audit es muy largo. Con un texto personalizado, encontraremos más fácilmente los eventos relacionados con cada regla.

En el siguiente ejemplo, también añadimos el permiso de ejecución a la auditoría:

auditctl -w /etc/shadow -k shadow-file -p rwxa

Eliminar llamadas a funciones del sistema

Si quisiérmos eliminar de la auditoría ciertos eventos, como el código «exit» del comando mount, por ejemplo, para que el log de audit no ocupe tanto espacio, podemos configurar reglas específicas:

auditctl -a exit,never -S mount

Buscando eventos en el log de audit

Antes habíamos configurado reglas para auditar el fichero /etc/passwd. Si queremos analizar quién ha accedido o modificado este fichero, utilizaremos el comando ausearch.

[root]# ausearch -f /etc/passwd |head -15
----
time->Fri May 15 18:14:04 2020
type=PROCTITLE msg=audit(1589559244.918:563888): proctitle=2F6574632F6F70742F65726D2F7573657264656C002D720064786D6172627279
type=PATH msg=audit(1589559244.918:563888): item=0 name="/etc/passwd" inode=141045 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=CWD msg=audit(1589559244.918:563888):  cwd="/var/opt/erm/client"
type=SYSCALL msg=audit(1589559244.918:563888): arch=c000003e syscall=2 success=yes exit=12 a0=55aa83bd5ac0 a1=20902 a2=ffffff00 a3=8 items=1 ppid=6775 pid=6776 auid=50000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=26708 comm="userdel" exe="/usr/sbin/userdel" key="CFG_passwd"
----
time->Fri May 15 18:14:04 2020
type=CONFIG_CHANGE msg=audit(1589559244.993:563895): auid=50000 ses=26708 op=updated_rules path="/etc/passwd" key="CFG_passwd" list=4 res=1
----
time->Fri May 15 18:14:04 2020
type=PROCTITLE msg=audit(1589559244.993:563896): proctitle=2F6574632F6F70742F65726D2F7573657264656C002D720064786D6172627279
type=PATH msg=audit(1589559244.993:563896): item=4 name="/etc/passwd" inode=142876 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 objtype=CREATE cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1589559244.993:563896): item=3 name="/etc/passwd" inode=141045 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 objtype=DELETE cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1589559244.993:563896): item=2 name="/etc/passwd+" inode=142876 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 objtype=DELETE cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
[root]#

Como vemos, tenemos información tan valiosa como la hora, el comando que ha accedido, lo que ha ejecutado, si ha acabado bien, el id del usuario y su gid.

ausearch también lo podemos combinar con otros comandos de filtrado como grep para extraer la información exacta que queremos. Por ejemplo:

[root]# ausearch -f /etc/passwd |egrep "comm|cwd" -B1 |more
type=PATH msg=audit(1589559244.918:563888): item=0 name="/etc/passwd" inode=141045 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL cap_fp
=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=CWD msg=audit(1589559244.918:563888):  cwd="/var/opt/erm/client"
type=SYSCALL msg=audit(1589559244.918:563888): arch=c000003e syscall=2 success=yes exit=12 a0=55aa83bd5ac0 a1=20902 a2=ffffff00 a3=8 items=1 ppid=6775 p
id=6776 auid=50000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=26708 comm="userdel" exe="/usr/sbin/userdel" key="CFG_passwd"
--
type=PATH msg=audit(1589559244.993:563896): item=0 name="/etc/" inode=131076 dev=fd:00 mode=040755 ouid=0 ogid=3 rdev=00:00 objtype=PARENT cap_fp=000000
0000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=CWD msg=audit(1589559244.993:563896):  cwd="/var/opt/erm/client"
type=SYSCALL msg=audit(1589559244.993:563896): arch=c000003e syscall=82 success=yes exit=0 a0=7ffd8042ba80 a1=55aa83bd5ac0 a2=7ffd8042b9f0 a3=69622f3a63
696d6b items=5 ppid=6775 pid=6776 auid=50000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=26708 comm="userdel" exe="/usr/sbin/
userdel" key="CFG_passwd"
--

Configuración del fichero audit.rules

El fichero audit.rules sirve para crear reglas de auditoría permanentes y llevar un control más claro de todas las reglas de auditoría que nos interesan.

Las reglas creadas con auditctl no son permanentes.

En el fichero audit.rules configuramos los parámetros, exactamente igual, que lo habíamos hecho con auditctl.

[root]# grep passwd /etc/audit/audit.rules
-w /etc/passwd -p wa -k CFG_passwd
-w /etc/shadow -p wa -k CFG_passwd
-w /etc/security/opasswd -p wa -k CFG_passwd
[root]#

Tras modificar el fichero audit.rules, tendremos que reiniciar el servicio auditd.

A tener en cuenta: Dependiendo de la versión del sistema operativo, puede que el fichero lo encuentres en /etc/audit/rules.d/audit.rules.

Reglas de audit recomendadas

Para tener el sistema bien auditado, recomiendo configurar las siguientes reglas:

time-change
--a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time-change
--a always,exit -F arch=b64 -S clock_settime -k time-change
--a always,exit -F arch=b32 -S clock_settime -k time-change
--w /etc/localtime -p wa -k time-change
-## Identity
--w /etc/group -p wa -k identity
--w /etc/passwd -p wa -k identity
--w /etc/gshadow -p wa -k identity
--w /etc/shadow -p wa -k identity
--w /etc/security/opasswd -p wa -k identity
-## Network environment
--a always,exit -F arch=b64 -S sethostname -S setdomainname -k system-locale
--a always,exit -F arch=b32 -S sethostname -S setdomainname -k system-locale
--w /etc/issue -p wa -k system-locale
--w /etc/issue.net -p wa -k system-locale
--w /etc/hosts -p wa -k system-locale
--w /etc/sysconfig/network -p wa -k system-locale
-## MAC
--w /etc/selinux/ -p wa -k MAC-policy
-## Login/Logoff
--w /var/log/lastlog -p wa -k logins
--w /var/run/faillock/ -p wa -k logins 
-## Session Initiation
--w /var/run/utmp -p wa -k session
--w /var/log/wtmp -p wa -k session
--w /var/log/btmp -p wa -k session
-## Discreccional Access Control
--a always,exit -F arch=b64 -S chmod -S fchmod -S fchmodat -F auid>=1000 -F auid!=4294967295 -k perm_mod
--a always,exit -F arch=b32 -S chmod -S fchmod -S fchmodat -F auid>=1000 -F auid!=4294967295 -k perm_mod
--a always,exit -F arch=b64 -S chown -S fchown -S fchownat -S lchown -F auid>=1000 -F auid!=4294967295 -k perm_mod
--a always,exit -F arch=b32 -S chown -S fchown -S fchownat -S lchown -F auid>=1000 -F auid!=4294967295 -k perm_mod
--a always,exit -F arch=b64 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid>=1000 -F auid!=4294967295 -k perm_mod
--a always,exit -F arch=b32 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid>=1000 -F auid!=4294967295 -k perm_mod
-## Unauthorized file access
--a always,exit -F arch=b64 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=4294967295 -k access
--a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EACCES -F auid>=1000 -F auid!=4294967295 -k access
--a always,exit -F arch=b64 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=4294967295 -k access
--a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EPERM -F auid>=1000 -F auid!=4294967295 -k access
-## Comandos privilegiados
--a always,exit -F path=/usr/bin/mount -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/chsh -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/chfn -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/write -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/passwd -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/wall -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/gpasswd -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/sudo -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/pkexec -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/crontab -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/su -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/ssh-agent -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/chage -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/umount -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/bin/newgrp -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/libexec/sssd/krb5_child -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/libexec/sssd/selinux_child -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/libexec/sssd/proxy_child -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/libexec/sssd/ldap_child -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/libexec/openssh/ssh-keysign -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/libexec/dbus-1/dbus-daemon-launch-helper -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/libexec/utempter/utempter -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/lib/polkit-1/polkit-agent-helper-1 -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/sbin/usernetctl -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/sbin/postqueue -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/sbin/postdrop -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/sbin/userhelper -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/sbin/netreport -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
--a always,exit -F path=/usr/sbin/pam_timestamp_check -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-## System mounts
--a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=4294967295 -k mounts
--a always,exit -F arch=b32 -S mount -F auid>=1000 -F auid!=4294967295 -k mounts
-## File deletion
--a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
--a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
-## Sudoers
--w /etc/sudoers -p wa -k scope
--w /etc/sudoers.d -p wa -k scope
-## Sudolog
--w /var/log/sudo.log -p wa -k actions 
-## kernel modules
--w /sbin/insmod -p x -k modules
--w /sbin/rmmod -p x -k modules
--w /sbin/modprobe -p x -k modules
--a always,exit arch=b64 -S init_module -S delete_module -k modules 
-# Systemd/systemctl
--a exit,always -F arch=b64 -S execve -F path=/usr/lib/systemd
--a exit,always -F arch=b64 -S execve -F path=/usr/bin/systemctl
-# Reboot
--a exit,always -F arch=b64 -S execve -F path=/usr/sbin/reboot -k reboot
--a exit,always -F arch=b64 -S execve -F path=/usr/sbin/poweroff -k reboot
-# dnf/yum
--a always,exit -F perm=x -F path=/usr/bin/dnf -F key=software-installer
--a always,exit -F perm=x -F path=/usr/bin/yum -F key=software-installer

Auditar el reboot del sistema

Si queremos añadir reglas para saber quién rebota el sistema operativo, modificaremos el fichero audit.rules de la siguiente manera:

-a exit,always -F arch=b64 -S execve -F path=/sbin/reboot -k reboot
-a exit,always -F arch=b64 -S execve -F path=/sbin/init -k reboot
-a exit,always -F arch=b64 -S execve -F path=/sbin/poweroff -k reboot
-a exit,always -F arch=b64 -S execve -F path=/sbin/shutdow -k reboot

audit: kauditd hold queue overflow

Durante el arranque de uno de los sistemas que administro, RedHat 8.5 en este caso, he visto el mensaje «audit: kauditd hold queue overflow»:

audit: kauditd hold queue overflow

Ese mensaje significa que audit quiere escribir más líneas en el log de las que caben en su «buffer de memoria».

Para solucionar esto, modifiqué los parámetros del kernel, añadiendo la directiva «audit_backlog_limit=8192» para limitar a 8192 bytes el tamaño del buffer a escribir en el log:

Directiva audit_backlog_limit en los parametros del kernel de Linux

Te puede interesar

COMPÁRTEME

Deja un comentario