Supervisión del sistema con psacct/acct y audit

By | May 22, 2018

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 🙂