Auditd : monitoring de données en temps réel
Auditd
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.
Prise en main
L’installation est très facile, et comme l’outil a fait ses preuves, on peut l’installer directement depuis les dépôts officiels.
$ apt-get install audit
Et oui, cela suffit…
Configuration
La configuration d’audit se trouve sous /etc/audit/. On y trouve auditd.conf, qui est la conf à proprement parler du daemon auditd et audit.rules qui est destiné à contenir vos règles en dur.
# ls -asl /etc/audit/ total 24 4 drwxr-x--- 2 root root 4096 2011-09-02 15:13 ./ 12 drwxr-xr-x 140 root root 12288 2011-09-05 15:23 ../ 4 -rw-r----- 1 root root 680 2009-07-27 21:07 auditd.conf 4 -rw-r----- 1 root root 373 2009-07-27 21:07 audit.rules
La conf ressemble à ça :
# # 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 = 4 disp_qos = lossy dispatcher = /sbin/audispd name_format = NONE ##name = mydomain max_log_file = 5 max_log_file_action = ROTATE space_left = 75 space_left_action = SYSLOG action_mail_acct = root admin_space_left = 50 admin_space_left_action = SUSPEND disk_full_action = SUSPEND disk_error_action = SUSPEND ##tcp_listen_port = tcp_listen_queue = 5 ##tcp_client_ports = 1024-65535 tcp_client_max_idle = 0 enable_krb5 = no krb5_principal = auditd ##krb5_key_file = /etc/audit/audit.key
Cette conf nous apprend notamment l’emplacement du log généré par le daemon, ce qui nous permettra d’y jeter un œil plus tard, pour extraction.
Quant à audit.rules, à la base, il est un peu vide, comme vous pouvez le constater : un -D pour tout flusher, une instruction d’augmentation de buffer, en dehors de cela, tout reste à faire.
$ cat /etc/audit/audit.rules # 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
Il y a donc 2 manières différentes de faire des règles : en statique dans le fichier de conf /etc/audit/audit.rules, ou à la volée.
Bien sûr, les seules différences entre statique et à la volée sont que :
- 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
Comme c’est plus facile, et que c’est pratique, nous allons créer quelques règles à la volée.
Pour information, voici les options que j’ai renseigné :
- 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
k-root # auditctl -w /etc/passwd -p war -k password-file k-root # 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.
Comme on peut le voir, pour le moment, aucun évènement n’a eu lieu… Mais c’est sans compter sur k-user, qui va grepper root sur ledit fichier…
k-user $ grep root /etc/passwd root:x:0:0:root:/root:/bin/bash
Immédiatement, la tentative -fructueuse- est journalisée et vue par auditd :
k-root # 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 ?
k-root # 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 :
k-root # 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 vous 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.
k-root # 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 k-root # auditctl -d exit,never -W /etc/shadow -k shadow-file k-root # auditctl -l LIST_RULES: exit,always watch=/etc/passwd perm=rwa key=passwd-file
A titre d’information, le delete all a déjà été vu dans le fichier de règles : l’option en question est -D. Bon à savoir quand on veut resetter notre daemon :)