Security/Audit/Auditd/Brief
Introduction
Auditd est un outil qui permet de monitorer les accès aux données et de pouvoir offrir un support stable pour l’exploitation des logs. Auditd fait partie d’un ensemble de composants qui ont pour fonctionnalités de gérer les règles de surveillance et d’afficher les rapports.
Auditd est le daemon qui tourne en fond, en userspace, et qui est au coeur de la récupération des informations.
Tous les événement d'audit sont enregistrés dans le fichier de log <path>/var/log/audit/audit.log</path>.
Configuration
La configuration d’audit se trouve sous <path>/etc/audit/</path>. On y trouve <path>auditd.conf</path>, qui est la conf à proprement parler du daemon <app>auditd</app> et <path>audit.rules</path> qui est destiné à contenir vos règles en dur. fichier <path>/etc/audit/auditd.conf </path>: configuration du daemon
#
# This file controls the configuration of the audit daemon
#
log_file = /var/log/audit/audit.log
log_format = RAW
log_group = root
priority_boost = 4
flush = INCREMENTAL
freq = 20
num_logs = 5
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file = 6
max_log_file_action = ROTATE
space_left = 75
space_left_action = email
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = single
disk_full_action = SUSPEND
disk_error_action = SUSPEND
##tcp_listen_port =
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
enable_krb5 = no
krb5_principal = auditd
##krb5_key_file = /etc/audit/audit.key
Fichier <path>/etc/audit/audit.rules</path>: Définition des règles
# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.
# First rule - delete all
-D
# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 320
# Feel free to add below this line. See auditctl man page
-w /sbin/insmod -p x -k modules
-w /sbin/rmmod -p x -k modules
-w /sbin/modprobe -p x -k modules
-a always,exit -F arch=b64 -S init_module -S delete_module -k modules
-w /etc/sudoers -p wa -k actions
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=500 -F auid!=4294967295 -k delete
-a always,exit -F arch=b64 -S mount -F auid>=500 -F auid!=4294967295 -k export
-a always,exit -F arch=b32 -S setxattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S setxattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S removexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S removexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S lsetxattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S lsetxattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S lremovexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S lremovexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S lchown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S lchown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S fsetxattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fsetxattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S fremovexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fremovexattr -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S fchownat -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fchownat -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S fchown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fchown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S fchmodat -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fchmodat -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S fchmod -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S fchmod -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S chown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S chown -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b32 -S chmod -F auid>=500 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S chmod -F auid>=500 -F auid!=4294967295 -k perm_mod
-w /etc/selinux/ -p wa -k MAC-policy
-a always,exit -F arch=b64 -S sethostname -S setdomainname -k audit_network_modifications
-w /etc/issue -p wa -k audit_network_modifications
-w /etc/issue.net -p wa -k audit_network_modifications
-w /etc/hosts -p wa -k audit_network_modifications
-w /etc/sysconfig/network -p wa -k audit_network_modifications
-w /etc/group -p wa -k audit_account_changes
-w /etc/passwd -p wa -k audit_account_changes
-w /etc/gshadow -p wa -k audit_account_changes
-w /etc/shadow -p wa -k audit_account_changes
-w /etc/security/opasswd -p wa -k audit_account_changes
-w /etc/localtime -p wa -k audit_time_rules
-a always,exit -F arch=b64 -S clock_settime -k audit_time_rules
-a always,exit -F arch=b64 -S settimeofday -k audit_time_rules
-a always,exit -F arch=b64 -S adjtimex -k audit_time_rules
-a always,exit -F path=/sbin/netreport -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/sbin/unix_chkpwd -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/sbin/pam_timestamp_check -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/bin/mount -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/bin/su -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/bin/ping -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/bin/ping6 -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/bin/umount -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/lib64/dbus-1/dbus-daemon-launch-helper -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/usernetctl -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/postdrop -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/suexec -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/postqueue -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/userhelper -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/staprun -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/newgrp -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/chage -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/gpasswd -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/at -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/write -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/sudo -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/chfn -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/passwd -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/wall -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/locate -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/lockfile -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/crontab -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/ssh-agent -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/pkexec -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/bin/chsh -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/libexec/polkit-1/polkit-agent-helper-1 -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/libexec/openssh/ssh-keysign -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/libexec/utempter/utempter -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/libexec/pt_chown -F perm=x -F auid>=500 -F auid!=4294967295 -k privileged
-a always,exit -F arch=b64 -S creat -S open -S openat -S truncate -S ftruncate -F exit=-EACCES -F auid>=500 -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>=500 -F auid!=4294967295 -k access
-e 2
Gérer les règles
Il y a donc 2 manières différentes de faire des règles : en statique dans le fichier de conf <path>/etc/audit/audit.rules</path>, ou à la volée.
Bien sûr, les seules différences entre statique et à la volée sont que :
- l'ajout à la volée ne survit pas à un reboot, alors que statique se lancera avec le daemon auditd
- la syntaxe des règles statiques est la même que celles à la volée, mis à part l’invocation de auditctl.
Création et gestions des règles
Pour information, voici les options pour créer un watch sur le fichier <path>/etc/passwd</path>, qui relèvera toute tentative en read, write ou append sur ce fichier:
- w : watch, activer la surveillance
- p war : fixer le filtre concernant les permissions pour la surveillance d’un fichier. Ici, r pour read, w pour write, x pour execute, a pour append.
- k passwd-file : clé unique permettant d’identifier l’objet de la requête
auditctl -w /etc/passwd -p war -k password-file
On tente maintenant de chercher le mot 'root dans le fichier <path>/etc/passwd</path>, à partir d'un utilisateur standard
grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
ausearch -f /etc/passwd
J’ai crée un watch sur le fichier /etc/passwd, qui relèvera toute tentative en read, write ou append sur le fichier.
Immédiatement, la tentative -fructueuse- est journalisée et vue par auditd :
ausearch -f /etc/passwd
----
time->Fri Sep 2 15:16:50 2011
type=PATH msg=audit(1314969410.095:9): item=0 name="/etc/passwd" inode=1982554 dev=08:01 mode=0100644 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1314969410.095:9): cwd="/home/k-user/Documents"
type=SYSCALL msg=audit(1314969410.095:9): arch=40000003 syscall=5 success=yes exit=4 a0=b763b078 a1=80000 a2=1b6 a3=8295090
items=1 ppid=6893 pid=28672 auid=4294967295 uid=3100 gid=3000 euid=3100 suid=3100 fsuid=3100 egid=3000 sgid=3000 fsgid=3000
tty=(none) ses=4294967295 comm="ps" exe="/bin/ps" key="password-file"
----
time->Fri Sep 2 15:16:52 2011
type=PATH msg=audit(1314969412.095:10): item=0 name="/etc/passwd" inode=1982554 dev=08:01 mode=0100644 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1314969412.095:10): cwd="/home/k-user/Documents"
type=SYSCALL msg=audit(1314969412.095:10): arch=40000003 syscall=5 success=yes exit=4 a0=b7669078 a1=80000 a2=1b6 a3=86c6090
items=1 ppid=6893 pid=28673 auid=4294967295 uid=3100 gid=3000 euid=3100 suid=3100 fsuid=3100 egid=3000 sgid=3000 fsgid=3000
tty=(none) ses=4294967295 comm="ps" exe="/bin/ps" key="password-file"
---- [...]
On peut faire aussi un peu plus lisible, grâce à l’option -i qui interprètera les id (uid, guid, date, …). Plus facile pour le coup d’œil, n’est-ce pas ?
ausearch -f /etc/passwd -i
----
type=PATH msg=audit(02/09/2011 15:16:50.095:9) : item=0 name=/etc/passwd inode=1982554 dev=08:01 mode=file,644 ouid=root ogid=root
rdev=00:00
type=CWD msg=audit(02/09/2011 15:16:50.095:9) : cwd=/home/k-user/Documents
type=SYSCALL msg=audit(02/09/2011 15:16:50.095:9) : arch=i386 syscall=open success=yes exit=4 a0=b763b078 a1=80000 a2=1b6 a3=8295090
items=1 ppid=6893 pid=28672 auid=unset uid=k-user gid=k-user euid=k-user suid=k-user fsuid=k-user egid=k-user sgid=k-user fsgid=k-user
tty=(none) ses=4294967295 comm=ps exe=/bin/ps key=password-file
----
type=PATH msg=audit(02/09/2011 15:16:52.095:10) : item=0 name=/etc/passwd inode=1982554 dev=08:01 mode=file,644 ouid=root ogid=root
rdev=00:00
type=CWD msg=audit(02/09/2011 15:16:52.095:10) : cwd=/home/k-user/Documents
type=SYSCALL msg=audit(02/09/2011 15:16:52.095:10) : arch=i386 syscall=open success=yes exit=4 a0=b7669078 a1=80000 a2=1b6 a3=86c6090
items=1 ppid=6893 pid=28673 auid=unset uid=k-user gid=k-user euid=k-user suid=k-user fsuid=k-user egid=k-user sgid=k-user fsgid=k-user
tty=(none) ses=4294967295 comm=ps exe=/bin/ps key=password-file
----
Les commandes de base sont intuitives, par exemple, le listing des règles en place :
auditctl -l
LIST_RULES: exit,always watch=/etc/passwd perm=rwa key=password-file
LIST_RULES: exit,always watch=/etc/shadow perm=rwax key=shadow-file
La suppression d’une règle (attention, une, et autant le dire que les doublons ne sont pas conseillés).
En parlant de doublon, étant donné que l’évaluation d’une règle est parfois coûteuse, comme par exemple l’évaluation de tous les syscall, la factorisation d’expression est préconisée.
auditctl -l
LIST_RULES: exit,always watch=/etc/shadow perm=rwxa key=shadow-file
LIST_RULES: exit,always watch=/etc/passwd perm=rwa key=passwd-file
auditctl -d exit,never -W /etc/shadow -k shadow-file
auditctl -l
LIST_RULES: exit,always watch=/etc/passwd perm=rwa key=passwd-file
Reporting
Pour ce qui est du reporting, pas de problème non plus, un tas d’options permettant en plus de mettre le focus sur ce que vous avez vraiment envie de consulter.
Pour savoir un peu ce qui tourne, on appellera auditctl.
auditctl -s
AUDIT_STATUS: enabled=2 flag=1 pid=995 rate_limit=0 backlog_limit=320 lost=0 backlog=0
Alors que pour le reporting à proprement parler, on passera par aureport : ici pour les évènements…
aureport -e
1840. 02/09/2011 16:14:25 1846 USER_AUTH -1 yes
1841. 02/09/2011 16:14:25 1847 CRED_REFR -1 yes
1842. 02/09/2011 16:14:23 1840 SYSCALL -1 yes
Et là pour lister les authentifications, réussi ou pas d’ailleurs
aureport --auth
Authentication Report
============================================
# date time acct host term exe success event
============================================
1. 02/09/2011 15:16:46 root ? pts/26 /bin/su yes 4
2. 02/09/2011 16:14:25 k-user ? :0 /usr/lib/kde4/libexec/kcheckpass yes 1846
Et enfin, une vue d’ensemble, à la logwatch :
aureport --summary
Summary Report
======================
Range of time in logs: 19/03/2014 16:03:21.987 - 20/03/2014 15:31:42.762
Selected time for report: 19/03/2014 16:03:21 - 20/03/2014 15:31:42.762
Number of changes in configuration: 182
Number of changes to accounts, groups, or roles: 0
Number of logins: 19
Number of failed logins: 10
Number of authentications: 74
Number of failed authentications: 1
Number of users: 3
Number of terminals: 11
Number of host names: 3
Number of executables: 29
Number of files: 37409
Number of AVC's: 3
Number of MAC events: 23
Number of failed syscalls: 174
Number of anomaly events: 0
Number of responses to anomaly events: 0
Number of crypto events: 291
Number of keys: 11
Number of process IDs: 27664
Number of events: 45825
Auditd est un outil bien pratique, à porter de main, qui peut être appliqué dans un contexet de sécurisation et de monitoring comme de reporting sur des modifications effectuées sur les données du système.
Il permet d’avoir un état des lieux concis et indiscutable et de pouvoir remonter le fil des évènements sans devoir dépendre totalement des informations fournies (ou pas) par les auteurs des modifs.