Auditoría de seguridad para nuestro equipo basado en Debian/Ubuntu

0 Flares Twitter 0 Facebook 0 Email -- Google+ 0 Reddit 0 StumbleUpon 0 Pin It Share 0 LinkedIn 0 Buffer 0 0 Flares ×

Para detectar y responder eficazmente a cualquier incidente de seguridad en nuestro equipo, es importante contar con datos de registro adecuados para que los eventos relevantes para la seguridad que tienen lugar en un sistema queden correctamenre registrados. Estos registros pueden incluir ejecución de procesos, acceso a archivos, creación de usuarios y otros.

En particular, los registros de ejecución de procesos son increíblemente valiosos. Cuando se recopilan correctamente de los sistemas, pueden ayudar a crear un seguimiento de todas las acciones que tuvieron lugar en él. De manera inversa, para atacar un sistema, se pueden consultar los registros de la víctima para monitorizar su actividad.

Un mecanismo clave para obtener este tipo de datos de registro en un sistema Linux es el subsistema de auditoría, parte del kernel de Linux. El subsistema de auditoría se puede utilizar para registrar eventos del kernel, como llamadas específicas del sistema y eventos del usuario. Consiste en un subsistema del kernel que implementa el registro, y un demonio de auditoría recopila estos registros y los escribe en un archivo con todos ellos.

Hay un conjunto de herramientas que se pueden usar para configurar la generación de eventos. Estos incluyen auditctl, que permite la configuración de configuraciones y parámetros de cómo se generan los eventos, aureport, que se puede usar para generar un informe de eventos recopilados por el demonio de auditoría, y ausearch, que se puede usar para buscar en los registros.

Para implementar auditd en Debian, primero debe asegurarse de que el demonio de auditoría y el marco de despacho de auditoría estén correctamente instalados:

apt-get install auditd audispd-plugins

Una vez instalados, se pueden implementar un conjunto de reglas inicial editando el archivo /etc/audit/rules.d/audit.rules. El siguiente es un conjunto de reglas basada en la configuración de mejores prácticas de Linux Auditd de Florian Roth, y desarrollada por Maarten Van Horenbeeck, informático belga actualmente responsable de seguridad de la información en Zendesk, empresa creadora de los populares softwares para webs de venta en línea.

Una vez guardada la configuración, hay que reiniciar auditd con para volver a cargar la configuración. Esta es la que proponemos como ejemplo:

## Auditd configuration
## Configuration hint:
:
## -w watch file system object, -p sets [r|w|x|a]
## -a add rule: exit, upon syscall exit

## Remove any existing rules
-D

## Having a large buffer ensures we avoid dropping logs
-b 8192

## Failure Mode
## Possible values are 0 (silent), 1 (printk, print a failure message),
## and 2 (panic, halt the system).
-f 1

## Audit the audit logs, and execution of auditd reporting tools

-w /var/log/audit/ -k auditlog
-w /etc/audit/ -p wa -k auditconfig
-w /etc/libaudit.conf -p wa -k auditconfig
-w /etc/audisp/ -p wa -k audispconfig
-w /sbin/auditctl -p x -k audittools
-w /sbin/auditd -p x -k audittools
-a always,exit -F dir=/var/log/audit/ -F perm=r -F auid>=1000 -F auid!=unset -k audittools
-a always,exit -F path=/usr/sbin/ausearch -F perm=x -k audittools
-a always,exit -F path=/usr/sbin/aureport -F perm=x -k audittools
-a always,exit -F path=/usr/sbin/aulast -F perm=x -k audittools
-a always,exit -F path=/usr/sbin/aulastlogin -F perm=x -k audittools
-a always,exit -F path=/usr/sbin/auvirt -F perm=x -k audittools

## Log all process execution: disabled here by default due to load
# -a exit,always -S execve -k cmd
## Log all process executions by root
-a exit,always -F arch=b64 -F euid=0 -S execve -k rootcmd
-a exit,always -F arch=b32 -F euid=0 -S execve -k rootcmd

## Identify creation of filesystem nodes and file system mounts
-a exit,always -F arch=b32 -S mknod -S mknodat -k specialfiles
-a exit,always -F arch=b64 -S mknod -S mknodat -k specialfiles
-a exit,always -F arch=b32 -S mount -S umount -S umount2 -k mount
-a exit,always -F arch=b64 -S mount -S umount2 -k mount

## Clock and time zone changes
-a exit,always -F arch=b32 -S adjtimex -S settimeofday -S clock_settime -k time
-a exit,always -F arch=b64 -S adjtimex -S settimeofday -S clock_settime -k time
-w /etc/localtime -p wa -k localtime

## Updates to cron
-w /etc/cron.allow -p wa -k cron
-w /etc/cron.deny -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
-w /etc/cron.daily/ -p wa -k cron
-w /etc/cron.hourly/ -p wa -k cron
-w /etc/cron.monthly/ -p wa -k cron
-w /etc/cron.weekly/ -p wa -k cron
-w /etc/crontab -p wa -k cron
-w /var/spool/cron/crontabs/ -k cron

## Credential/user/group/login changes
-w /etc/group -p wa -k etcgroup
-w /etc/passwd -p wa -k etcpasswd
-w /etc/gshadow -k etcgroup
-w /etc/shadow -k etcpasswd
-w /etc/security/opasswd -k opasswd
-w /usr/bin/passwd -p x -k passwd_modification
-w /usr/sbin/groupadd -p x -k group_modification
-w /usr/sbin/groupmod -p x -k group_modification
-w /usr/sbin/addgroup -p x -k group_modification
-w /usr/sbin/useradd -p x -k user_modification
-w /usr/sbin/usermod -p x -k user_modification
-w /usr/sbin/adduser -p x -k user_modification
-w /etc/login.defs -p wa -k login
-w /etc/securetty -p wa -k login
-w /var/log/faillog -p wa -k login
-w /var/log/lastlog -p wa -k login
-w /var/log/tallylog -p wa -k login

## Changes to network configurations
-w /etc/hosts -p wa -k hosts
-w /etc/network/ -p wa -k network

## system startup scripts
-w /etc/inittab -p wa -k init
-w /etc/init.d/ -p wa -k init
-w /etc/init/ -p wa -k init

## library search paths
-w /etc/ld.so.conf -p wa -k libpath

## kernel parameters
-w /etc/sysctl.conf -p wa -k sysctl

## modprobe configuration
-w /etc/modprobe.conf -p wa -k modprobe

## pam configuration
-w /etc/pam.d/ -p wa -k pam
-w /etc/security/limits.conf -p wa -k pam
-w /etc/security/pam_env.conf -p wa -k pam
-w /etc/security/namespace.conf -p wa -k pam
-w /etc/security/namespace.init -p wa -k pam

## system configuration changes
-w /etc/ssh/sshd_config -k sshd
-a exit,always -F arch=b32 -S sethostname -k hostname
-a exit,always -F arch=b64 -S sethostname -k hostname
-w /etc/issue -p wa -k etcissue
-w /etc/issue.net -p wa -k etcissue

## Capture all failures to access on critical elements
-a exit,always -F arch=b64 -S open -F dir=/etc -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/bin -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/sbin -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/usr/bin -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/usr/sbin -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/var -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/home -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/srv -F success=0 -k unauthedfileacess

## Monitor for use of process ID change (switching accounts) applications
-w /bin/su -p x -k priv_esc
-w /usr/bin/sudo -p x -k priv_esc
-w /etc/sudoers -p rw -k priv_esc

## Monitor usage of commands to change power state
-w /sbin/shutdown -p x -k power
-w /sbin/poweroff -p x -k power
-w /sbin/reboot -p x -k power
-w /sbin/halt -p x -k power

## Do not allow configuration changes
## -e 0 disables, -e 1 enables, -e 2 locks configuration until reboot
-e 1

/etc/init.d/auditd restart

Hay varias formas de obtener registros y tomar medidas al respecto. Primero, los registros se escriben en /var/log/audit.log en la mayoría de los sistemas. Estos registros tienen el siguiente aspecto:

type=SYSCALL msg=audit(1520912790.481:50015): arch=c000003e syscall=59 success=yes exit=0 a0=132ed88 a1=132ef48 a2=12de208 a3=5d3 items=2 ppid=18673 pid=18677 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1669 comm=»tail» exe=»/usr/bin/tail» key=»rootcmd»
type=EXECVE msg=audit(1520912790.481:50015): argc=3 a0=»tail» a1=»-f» a2=»audit.log»
type=CWD msg=audit(1520912790.481:50015): cwd=»/var/log/audit»

Estos tres registros fueron generados por la ejecución de un comando raíz de tail -f /var/log/audit.log, utilizando la configuración anterior.

Muestran que en el directorio de trabajo actual (CWD) de /var/log/audit, el usuario root ejecutó «tail -f audit.log». Otra forma de acceder a los registros es mediante el uso de aureport. Aureport, ejecutado sin parámetros, generará una salida que muestra la cantidad de eventos generados y su distribución:

user@daemon-box:/var/log/audit$ sudo aureport

Summary Report
======================
Range of time in logs: 02/20/2018 01:17:01.139 – 03/13/2018 03:48:03.960
Selected time for report: 02/20/2018 01:17:01 – 03/13/2018 03:48:03.960
Number of changes in configuration: 204
Number of changes to accounts, groups, or roles: 0
Number of logins: 9
Number of failed logins: 9
Number of authentications: 17
Number of failed authentications: 3
Number of users: 3
Number of terminals: 9
Number of host names: 3
Number of executables: 142
Number of commands: 350
Number of files: 595
Number of AVC’s: 0
Number of MAC events: 9
Number of failed syscalls: 11422
Number of anomaly events: 0
Number of responses to anomaly events: 0
Number of crypto events: 0
Number of integrity events: 0
Number of virt events: 0
Number of keys: 33
Number of process IDs: 19394
Number of events: 42861

Se puede limitar este informe a un período de tiempo específico a través de:

aureport –start 03/01/2018 00:00:00 –end 03/30/2018 00:00:00

Con ausearch, también se puede obtener todos los registros relacionados con un usuario específico:

ausearch -ua username

Es probable que quien realice la audotoría desee mover los registros fuera del equipo de inmediato, para asegurarse de que un atacante no pueda modificarlos (incluso si está rastreando el acceso a los registros de auditoría utilizando la configuración de muestra anterior).

Para esto se puede utilizar rsyslog u otro demonio que permita la transmisión a través de TLS, o intente utilizar audisp-remote para iniciar sesión en un servidor de registro remoto.

Hay información interesante sobre cómo aprovechar los registros auditados en Splunk aquí y en Graylog aquí.

Fuente: Debian

Diego Herchhoren