Las herramientas audit y psacct/acct son de gran utilidad para tener controlado qué ocurre en nuestro sistema: qué usuarios han entrado a la máquina, acciones realizadas, procesos lanzados, etc… Aunque por el nombre puedan parecer lo mismo no lo son:
- Audit mediante un componente integrado como subsistema del Kernel Linux se encarga de capturar las llamadas a sistema de las aplicaciones para posteriormente mandar la información de dichas llamadas al demonio auditd. Éste se encarga de procesar dicha información y generar los logs de auditoría que podemos consultar con comandos como aureport, ausearch, aulast…
- La segunda herramienta tiene un nombre distinto según la distribución: psacct (Process Accounting) en RHEL/derivadas y acct (Accounting) en Debian/derivadas. Con esta herramienta podemos ver fácilmente qué usuarios entran a la máquina, qué comandos lanzan, etc… pudiendo detectar acciones u operaciones que comprometan la integridad del sistema.
Instalación y gestión de servicio
Para instalarlas según la distribución que tengamos:
# En Debian y derivadas apt-get install acct auditd # En RHEL y derivadas yum install psacct audit
Una vez instaladas el servicio es gestionado mediante systemctl:
# Iniciar auditd, común a todas las distros systemctl start auditd.service # El nombre de servicio es acct para Debian y derivadas systemctl start acct.service # Para RHEL y de la familia, el nombre es psacct systemctl start psacct.service
Para habilitar el servicio en el arranque de la máquina utilizaremos la opción enable según proceda:
systemctl enable auditd.service systemctl enable acct.service systemctl enable psacct.service
Explorando los logs de auditoría (audit)
El demonio auditd va alimentando los logs de auditoría con valiosa información que podemos explorar con los comandos que aporta la herramienta. Para un resumen global de los eventos del servidor ejecutamos aureport:
[root@jota-pc ~]# aureport Summary Report ====================== Range of time in logs: 04/16/2018 21:51:03.118 - 04/18/2018 21:09:29.944 Selected time for report: 04/16/2018 21:51:03 - 04/18/2018 21:09:29.944 Number of changes in configuration: 119 Number of changes to accounts, groups, or roles: 0 Number of logins: 5 Number of failed logins: 0 Number of authentications: 34 Number of failed authentications: 0 Number of users: 6 Number of terminals: 8 Number of host names: 1 Number of executables: 10 Number of commands: 16 Number of files: 0 Number of AVC's: 0 Number of MAC events: 0 Number of failed syscalls: 0 Number of anomaly events: 43 Number of responses to anomaly events: 0 Number of crypto events: 0 Number of integrity events: 0 Number of virt events: 243 Number of keys: 0 Number of process IDs: 463 Number of events: 5764
Casi de las primeras cosas que nos interesa ver es si se ha colado algún indeseable en nuestro servidor. Las opciones -l (ver logins) y –auth (ver autenticaciones) son muy útiles. Si tenemos servidor gráfico veremos entradas correspondientes a las sesiones iniciadas en gdm3, kde, etc…
[root@jota-pc ~]# aureport -l Login Report ============================================ # date time auid host term exe success event ============================================ 1. 04/17/2018 07:14:31 -1 ? ? /usr/lib/gdm3/gdm-session-worker yes 154 2. 04/17/2018 19:48:32 -1 ? ? /usr/lib/gdm3/gdm-session-worker yes 154 3. 04/17/2018 19:50:43 -1 ? ? /usr/lib/gdm3/gdm-session-worker yes 148 4. 04/18/2018 07:13:08 -1 ? ? /usr/lib/gdm3/gdm-session-worker yes 155 5. 04/18/2018 15:52:04 -1 ? ? /usr/lib/gdm3/gdm-session-worker yes 154 ...
Autenticaciones:
[root@jota-pc ~]# aureport --auth | head -20 Authentication Report ============================================ # date time acct host term exe success event ============================================ 1. 04/16/2018 21:51:03 debian-security-support ? ??? /bin/su yes 7 2. 04/16/2018 21:51:03 debian-security-support ? ??? /bin/su yes 17 3. 04/16/2018 21:51:03 debian-security-support ? ??? /bin/su yes 28 4. 04/16/2018 23:09:00 jota ? /dev/tty2 /usr/lib/gdm3/gdm-session-worker yes 495 5. 04/17/2018 07:14:20 Debian-gdm ? /dev/tty1 /usr/lib/gdm3/gdm-session-worker yes 59 6. 04/17/2018 07:14:21 Debian-gdm ? /dev/tty1 /usr/lib/gdm3/gdm-session-worker yes 75 7. 04/17/2018 07:14:31 jota ? /dev/tty1 /usr/lib/gdm3/gdm-session-worker yes 145 8. 04/17/2018 07:14:45 root ? /dev/pts/3 /bin/su yes 160 9. 04/17/2018 19:48:21 Debian-gdm ? /dev/tty1 /usr/lib/gdm3/gdm-session-worker yes 59 10. 04/17/2018 19:48:22 Debian-gdm ? /dev/tty1 /usr/lib/gdm3/gdm-session-worker yes 77 11. 04/17/2018 19:48:32 jota ? /dev/tty1 /usr/lib/gdm3/gdm-session-worker yes 145 12. 04/17/2018 19:48:47 root ? /dev/pts/3 /bin/su yes 160 13. 04/17/2018 19:50:30 Debian-gdm ? /dev/tty1 /usr/lib/gdm3/gdm-session-worker yes 53 14. 04/17/2018 19:50:31 Debian-gdm ? /dev/tty1 /usr/lib/gdm3/gdm-session-worker yes 69 15. 04/17/2018 19:50:42 jota ? /dev/tty1 /usr/lib/gdm3/gdm-session-worker yes 139
Eventos de virtualización. Podemos observar el usuario que lanza el evento, hora, cgroup, disco que utiliza la máquina virtual, interfaz de red, memoria/CPU asignadas…
[root@jota-pc ~]# auvirt --all-events down root Tue Apr 17 00:37 res wcg-node3 root Tue Apr 17 07:14 - 07:33 (00:19) cgroup deny all res wcg-node3 root Tue Apr 17 07:14 - 07:33 (00:19) cgroup allow path rw /virt/kvm/vms/WCG_ubuntu_server_1604_node3.qcow2 res wcg-node3 root Tue Apr 17 07:14 - 07:33 (00:19) cgroup allow major rw pty res wcg-node3 root Tue Apr 17 07:14 - 07:33 (00:19) disk start /virt/kvm/vms/WCG_ubuntu_server_1604_node3.qcow2 res wcg-node3 root Tue Apr 17 07:14 - 07:33 (00:19) net start mi:su:pe:rm:ac:78 res wcg-node3 root Tue Apr 17 07:14 - 07:33 (00:19) mem start 1048576 res wcg-node3 root Tue Apr 17 07:14 - 07:33 (00:19) vcpu start 1 start wcg-node3 root Tue Apr 17 07:14 - 07:33 (00:19) ...
Anomalías con la opción -n (por ejemplo, cuando una interfaz se pone en modo promiscuo:
[root@jota-pc ~]# aureport -n Anomaly Report ========================================= # date time type exe term host auid event ========================================= 1. 04/16/2018 21:54:28 ANOM_PROMISCUOUS ? ? ? -1 42 2. 04/16/2018 21:54:27 ANOM_PROMISCUOUS ? ? ? -1 40 3. 04/16/2018 21:54:31 ANOM_PROMISCUOUS ? ? ? -1 44 4. 04/17/2018 07:14:12 ANOM_PROMISCUOUS /sbin/brctl (none) ? -1 40 5. 04/17/2018 07:14:23 ANOM_PROMISCUOUS /usr/sbin/libvirtd (none) ? -1 94 6. 04/17/2018 07:14:23 ANOM_PROMISCUOUS /usr/sbin/libvirtd (none) ? -1 110 7. 04/17/2018 07:14:23 ANOM_PROMISCUOUS /usr/sbin/libvirtd (none) ? -1 126 8. 04/17/2018 07:33:47 ANOM_PROMISCUOUS ? ? ? -1 459 9. 04/17/2018 07:33:49 ANOM_PROMISCUOUS ? ? ? -1 462 10. 04/17/2018 07:33:52 ANOM_PROMISCUOUS ? ? ? -1 464 11. 04/17/2018 19:48:15 ANOM_PROMISCUOUS /sbin/brctl (none) ? -1 40 12. 04/17/2018 19:48:24 ANOM_PROMISCUOUS /usr/sbin/libvirtd (none) ? -1 93 13. 04/17/2018 19:48:24 ANOM_PROMISCUOUS /usr/sbin/libvirtd (none) ? -1 109 14. 04/17/2018 19:48:24 ANOM_PROMISCUOUS /usr/sbin/libvirtd (none) ? -1 125 15. 04/17/2018 19:49:36 ANOM_PROMISCUOUS ? ? ? -1 211 16. 04/17/2018 19:49:41 ANOM_PROMISCUOUS ? ? ? -1 213 17. 04/17/2018 19:49:47 ANOM_PROMISCUOUS ? ? ? -1 216 18. 04/17/2018 19:50:24 ANOM_PROMISCUOUS /sbin/brctl (none) ? -1 38 19. 04/17/2018 19:50:33 ANOM_PROMISCUOUS /usr/sbin/libvirtd (none) ? -1 87 20. 04/17/2018 19:50:34 ANOM_PROMISCUOUS /usr/sbin/libvirtd (none) ? -1 103 21. 04/17/2018 19:50:34 ANOM_PROMISCUOUS /usr/sbin/libvirtd (none) ? -1 119 22. 04/17/2018 20:02:14 ANOM_PROMISCUOUS /sbin/brctl pts3 ? 1000 450 ...
Combinando varias opciones podemos agrupar tipos de eventos y nº de ocurrencias:
[root@jota-pc ~]# aureport -e -i --summary Event Summary Report ====================== total type ====================== 3835 SECCOMP 496 SERVICE_START 386 SERVICE_STOP 216 USER_ACCT 212 USER_START 188 CRED_ACQ 187 LOGIN 180 VIRT_RESOURCE 178 CRED_DISP 178 USER_END 103 NETFILTER_CFG 40 ANOM_PROMISCUOUS 34 USER_AUTH 33 VIRT_CONTROL 30 VIRT_MACHINE_ID 16 CONFIG_CHANGE 6 DAEMON_START 5 USER_LOGIN 5 SYSTEM_BOOT 5 SYSTEM_SHUTDOWN 5 SYSTEM_RUNLEVEL 5 DAEMON_END 4 CRED_REFR 3 ANOM_ABEND
Búsqueda de eventos asociados a un determinado usuario con ausearch:
[root@jota-pc apache2]# ausearch -ui 1000 | head ---- time->Mon Apr 16 21:56:26 2018 type=USER_END msg=audit(1523908586.107:52): pid=16627 uid=1000 auid=1000 ses=4 msg='op=PAM:session_close acct="root" exe="/bin/su" hostname=? addr=? terminal=/dev/pts/3 res=success' ---- time->Mon Apr 16 21:56:26 2018 type=CRED_DISP msg=audit(1523908586.107:53): pid=16627 uid=1000 auid=1000 ses=4 msg='op=PAM:setcred acct="root" exe="/bin/su" hostname=? addr=? terminal=/dev/pts/3 res=success' ---- time->Mon Apr 16 21:56:57 2018 type=SECCOMP msg=audit(1523908617.195:54): auid=1000 uid=1000 gid=1000 ses=3 pid=20620 comm="chromium" exe="/usr/lib/chromium/chromium" sig=0 arch=c000003e syscall=273 compat=0 ip=0x7f380e75f434 code=0x50000 ---- ...
Logins en el sistema con aulast, similar al comando last:
[root@jota-pc apache2]# aulast | head reboot system boot 4.9.0-6-amd64 Tue Apr 17 07:14 - 07:33 (00:19) jota ? ? Tue Apr 17 07:14 - crash reboot system boot 4.9.0-6-amd64 Tue Apr 17 19:48 - 19:49 (00:01) jota ? ? Tue Apr 17 19:48 - crash reboot system boot 4.9.0-6-amd64 Tue Apr 17 19:50 - 00:39 (04:48) jota ? ? Tue Apr 17 19:50 - crash reboot system boot 4.9.0-6-amd64 Wed Apr 18 07:12 - 07:33 (00:21) jota ? ? Wed Apr 18 07:13 - crash reboot system boot 4.9.0-6-amd64 Wed Apr 18 15:51 - 00:40 (08:48) jota ? ? Wed Apr 18 15:52 - crash
Revisando procesos con psacct/acct
Por ejemplo, comandos lanzados por root (pueden ser de procesos cuyo propietario sea root)
[root@jota-pc ~]# lastcomm --user root | head lastcomm root pts/3 0.06 secs Mon May 21 22:11 man root pts/3 0.00 secs Mon May 21 22:10 pager root pts/3 0.00 secs Mon May 21 22:10 man F root pts/3 0.00 secs Mon May 21 22:10 nroff root pts/3 0.00 secs Mon May 21 22:10 groff root pts/3 0.00 secs Mon May 21 22:10 grotty root pts/3 0.00 secs Mon May 21 22:10 troff root pts/3 0.01 secs Mon May 21 22:10 tbl root pts/3 0.00 secs Mon May 21 22:10 preconv root pts/3 0.00 secs Mon May 21 22:10
Resumen de uso de tiempo de CPU por proceso:
root@jota-pc ~]# sa -c | head 13771 100.00% 108091.40re 100.00% 539.24cp 100.00% 0avio 29621k 112 0.81% 13385.99re 12.38% 194.22cp 36.02% 0avio 106679k ***other* 2 0.01% 882.17re 0.82% 187.15cp 34.71% 0avio 813120k JS Helper 2 0.01% 182.83re 0.17% 76.19cp 14.13% 0avio 718848k Web Content 3 0.02% 898.13re 0.83% 21.06cp 3.91% 0avio 431013k gnome-shell 2 0.01% 42.75re 0.04% 15.21cp 2.82% 0avio 1458176k worker 3 0.02% 913.45re 0.85% 11.57cp 2.15% 0avio 346325k metricbeat 5 0.04% 903.76re 0.84% 6.97cp 1.29% 0avio 65389k pulseaudio* 109 0.79% 17617.91re 16.30% 5.15cp 0.96% 0avio 111066k gdbus 2 0.01% 36.01re 0.03% 4.70cp 0.87% 0avio 406400k virt-manager*
Por usuario con la opción -m:
[root@jota-pc ~]# sa -mc 13793 100.00% 108154.42re 100.00% 539.24cp 100.00% 0avio 29578k jota 1370 9.93% 49120.19re 45.42% 444.45cp 82.42% 0avio 64864k root 10119 73.36% 36738.60re 33.97% 72.50cp 13.45% 0avio 4946k libvirt-qemu 1037 7.52% 47.48re 0.04% 18.79cp 3.48% 0avio 231930k kibana 7 0.05% 913.97re 0.85% 2.39cp 0.44% 0avio 199750k Debian-gdm 212 1.54% 7358.31re 6.80% 0.41cp 0.08% 0avio 45162k clamav 6 0.04% 913.98re 0.85% 0.39cp 0.07% 0avio 38475k www-data 42 0.30% 10320.45re 9.54% 0.20cp 0.04% 0avio 23395k grafana 3 0.02% 913.28re 0.84% 0.03cp 0.01% 0avio 232491k colord 11 0.08% 913.26re 0.84% 0.03cp 0.01% 0avio 135750k daemon 16 0.12% 0.08re 0.00% 0.02cp 0.00% 0avio 8877k elasticsearch 60 0.44% 0.03re 0.00% 0.01cp 0.00% 0avio 174407k _apt 900 6.53% 0.35re 0.00% 0.00cp 0.00% 0avio 3216k rtkit 3 0.02% 913.90re 0.84% 0.00cp 0.00% 0avio 46432k geoclue 6 0.04% 0.55re 0.00% 0.00cp 0.00% 0avio 88704k man 1 0.01% 0.00re 0.00% 0.00cp 0.00% 0avio 6638k
Me queda pendiente integrar audit con Kibana mediante Audit Beat, para ver cosas como esta:
Pero eso es harina de otro post 🙂