Linux Embedded

Le blog des technologies libres et embarquées

Auditing sous Linux

Introduction

L’auditing est un mécanisme de journalisation d’événements système. Il est essentiellement utilisé dans un contexte de sécurité ou de contrôle du respect d’une réglementation.

 

Son but est la surveillance des appels système, des accès aux fichiers sensibles, et il peut être interfacé avec des SIEM (Security Information and Event Management). On l’utilise généralement pour surveiller des systèmes de façon préventive afin de détecter des tentatives d’intrusion ou prévenir des actes de malveillance, mais aussi à posteriori pour analyser finement les compromissions qui ont pu avoir lieu, grâce à des enregistrements d’événements permettant de savoir qui a fait quoi, et quand.
Cependant, il ne protège pas les systèmes de façon active contrairement à des logiciels comme SELinux, Apparmor, iptables, fail2ban, etc.

 

Bien que l’on puisse l’utiliser, avec des outils appropriés, pour analyser des applications multi-processus fortement consommatrices de temps CPU, comme par exemple BitBake (de Yocto), l’auditing n’est pas initialement conçu pour analyser les performances des applications dans un but d’optimisation. Il est différent du profiling, qui, lui, permet la collecte d’informations servant à l’optimisation de programmes ou processus en détectant par exemple des sur-consommations de temps CPU ou des appels de fonctions très nombreux, parfois trop nombreux, voire inutiles.

 

Leurs domaines d’utilisation sont donc différents et ils ne doivent pas être confondus :

  • l’auditing est lié à la sécurité, la traçabilité et la conformité,
  • le profiling est lié à l’analyse de la performance et à l’optimisation.

1. Principe de fonctionnement

L'auditing Linux permet, grâce à l'interception des appels systèmes, de collecter des événements correspondant à une politique de sécurité définie dans les règles de sécurité du système. Ces événements sont stockés dans des fichiers de logs ASCII (dans lesquels les événements sont séparés par le code ASCII GS), et peuvent ensuite être consultés et analysés à des fins diverses.

 

La configuration de l'audit est définie dans un fichier servant à spécifier les paramètres du démon d'audit, et dans d'autres fichiers servant à définir les règles d'audit.

Plusieurs commandes permettent d'extraire de l'information de ces fichiers de logs, selon différents critères comme, par exemple, les dates et tranches horaires ou les types d'événements. D'autres permettent d'extraire des informations relatives aux connexions des utilisateurs.

2. Les logiciels utilisés

Le système d’audit de Linux utilise le sous-système d'audit du noyau, capable d'intercepter les appels systèmes et d'identifier leurs paramètres puis de générer des événements, et des applications s’exécutant dans l’espace utilisateur, dont les fonctions sont de configurer le système d’audit ou de gérer le stockage et l’extraction d’événements.

Le principal programme s’exécutant dans l’espace utilisateur et impliqué dans l’audit est le démon (daemon) auditd. Celui-ci communique avec le système d’audit du noyau grâce à une interface Netlink.
Peu après son lancement, auditd s’abonne à la socket NETLINK_AUDIT, puis se met en attente de réception d’événements en provenance du noyau. Lorsqu’un message arrive, il peut le stocker dans un fichier de logs, le transmettre à un plug-in ou l’envoyer à un serveur distant, selon sa configuration. Il peut également modifier des règles d’audit, notamment dans le cas où il est associé à un plug-in.

On notera que dans des versions un peu anciennes de l'audit, le démon auditd communiquait avec un processus nommé audispd (pour "dispatcher") qui avait la charge de ventiler les événements vers des plug-ins ou des fichiers de logs. Ce programme a été fusionné avec auditd dans la version 3.0.0 et a maintenant disparu : c'est dorénavant auditd qui écrit dans les fichiers de logs.

Un autre programme essentiel est auditctl, qui offre la possibilité de manipuler dynamiquement les règles d’audit en communiquant directement avec le noyau via l’interface Netlink.

Les autres commandes disponibles sont les suivantes :
 

  • ausearch
    Effectue des recherches d’informations dans les logs, selon de multiples critères.

  • aureport
    Génère des rapports statistiques.

  • augenrules
    Shell script qui effectue un traitement des fichiers de règles contenus dans le répertoire /etc/audit/rules.d pour produire le fichier /etc/audit/audit.rules.

  • aulast
    Affiche l’historique des connexions et déconnexions des utilisateurs à partir des logs d’audit. Fonctionne comme la commande last, mais utilise les données auditées par auditd.

  • aulastlog
    Affiche la dernière connexion des utilisateurs.
    Fonctionne comme la commande lastlog, mais utilise les logs d’audit au lieu du fichier /var/log/lastlog.

  • autrace
    Permet de tracer l’exécution d’un programme (comme strace) en ajoutant automatiquement des règles d’audit pour suivre les appels système effectués par le programme tracé, qu’il lance avec les arguments spécifiés. Les événements collectés peuvent ensuite être analysés à l’aide de ausearch ou aureport. Il est utile pour diagnostiquer ou auditer en détail les comportements d’un binaire.

  • ausyscall
    Donne la correspondance entre le nom des appels système (syscalls) et leur numéro en fonction de l’architecture du système (par exemple x86_64, i386, , etc.).
    Permet de s’assurer que des directives dans lesquelles l’architecture n’a pas été spécifiée couvriront les architectures ciblées, ou, dans le cas contraire, permettra d’identifier les règles pour lesquelles il sera nécessaire de spécifier explicitement l’architecture. Voir la page de manuel pour un exemple.

  • auvirt
    Affiche les données d’audit relatives aux machines virtuelles.

3. Installation

Le système d’audit Linux est installé sous Debian à l’aide de la commande suivante, sous root :

# apt install auditd

ou, à partir d’un compte utilisateur autorisé :

$ sudo apt install auditd

La visualisation des packages liés à l'auditing est effectuée classiquement avec la commande dpkg :

# dpkg -l | grep audit
ii auditd 1:3.0.9-1 amd64 User space tools for security auditing
ii libaudit-common 1:3.0.9-1 all Dynamic library for security auditing - common files
ii libaudit1:amd64 1:3.0.9-1 amd64 Dynamic library for security auditing
ii libauparse0:amd64 1:3.0.9-1 amd64 Dynamic library for parsing security auditing

4. Activation, désactivation, statut de l’audit

Le système d'audit doit être actif pour pouvoir effectuer une collecte d'événements.

Sous Debian, il est démarré à l'aide de la commande :

$ sudo systemctl start auditd

Si l'on veut qu'il soit démarré au lancement du système, il doit être activé de la façon suivante :

$ sudo systemctl enable auditd

Remarque : afin d'alléger leur écriture, nous omettrons la commande sudo dans les commandes ultérieures.

L'audit peut être arrêté à l'aide de la commande :

# systemctl stop auditd

et désactivé avec :

# systemctl disable auditd

Son état peut être contrôlé avec la commande :

# systemctl status auditd

et son état d'activité peut être affiché à l'aide de la commande :

# auditctl -s

qui affichera des informations telles que :

enabled 1
failure 1
pid 747
rate_limit 0
backlog_limit 8192
lost 0
backlog 0
backlog_wait_time 60000
backlog_wait_time_actual 0
loginuid_immutable 0 unlocked

La valeur qui suit le mot-clé "enabled" indique le statut : 0 = désactivé, 1 = activé.

Il est possible de suspendre temporairement l'auditing à l'aide de la commande :

# auditctl -e 0

et de le relancer avec :

# auditctl -e 1

La configuration peut être verrouillée à l'aide de la commande :

# auditctl -e 2

Cette commande empêche toute modification ultérieure de la configuration de l'auditing jusqu'au prochain reboot. Si le verrouillage est demandé dans la configuration, il doit évidemment figurer en dernière instruction du fichier de règles.

Si l'on souhaite l'activation de l'audit dès le démarrage du noyau, il faut ajouter la chaîne :

audit=1

dans la configuration grub spécifiant les paramètres de boot du noyau.
Lorsque l'audit est installé et actif, on peut observer des processus supplémentaires sur la machine :

1 S root          40       2  0  80   0 -     0 kaudit 15:26 ?        00:00:00 [kauditd]
5 S root         543       1  0  76  -4 -  3282 do_sel 15:26 ?        00:00:00 /sbin/auditd

5. Configuration

5.1. Configuration du démon auditd

Le fichier de configuration du démon auditd est /etc/audit/auditd.conf. Une version par défaut du fichier de configuration est créée lors de l’installation du package. L’administrateur du système peut ensuite l’éditer pour modifier manuellement la configuration. Sur Debian 12 (bookworm), la version par défaut contient ceci :

#
# This file controls the configuration of the audit daemon
#
local_events = yes
write_logs = yes
log_file = /var/log/audit/audit.log
log_group = adm
log_format = ENRICHED
flush = INCREMENTAL_ASYNC
freq = 50
max_log_file = 8
num_logs = 5
priority_boost = 4
name_format = NONE
##name = mydomain
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
verify_email = yes
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
use_libwrap = yes
##tcp_listen_port = 60
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
transport = TCP
krb5_principal = auditd
##krb5_key_file = /etc/audit/audit.key
distribute_network = no
q_depth = 2000
overflow_action = SYSLOG
max_restarts = 10
plugin_dir = /etc/audit/plugins.d
end_of_event_timeout = 2

Nous ne décrirons que quelques paramètres dans cet article. Si vous cherchez une information particulière sur l'un d'entre eux, sachez qu'ils sont tous sont décrits dans la page de manuel auditd.conf(5).

Parmi les paramètres notables figurent :

  • log_file :
    sa valeur sert à spécifier le pathname du fichier de collecte des événements.
    La valeur généralement utilisée pour le fichier de logs est /var/log/audit/audit.log, mais elle peut être modifiée à l'aide de ce paramètre.
     
  • log_format :
    accepte les valeurs RAW et ENRICHED. Le format RAW est celui dans lequel le noyau envoie les informations brutes. Le format ENRICHED est un format dans lequel les informations uid, gid, syscall, architecture, et adresse de socket sont interprétées et converties relativement au système local. Cela permet d'analyser plus facilement les logs, sachant que ces valeurs n'ont pas forcément la même signification d'un serveur à l'autre.
     
  • priority_boost :
    sa valeur, allant de 0 à 4, sert à indiquer le niveau d'augmentation de priorité à utiliser (priority boost), la valeur par défaut étant 0.
     
  • flush :
    les valeurs possibles de ce paramètre sont none, incremental, incremental_async, data, et sync :
    - none : pas d'effort particulier pour faire un flush des enregistrements sur disque,
    - incremental : dans ce cas, le paramètre freq est utilisé pour déterminer la fréquence des flushes sur disque,
    - incremental_async : même signification que le paramètre incremental, mais le sync sur disque est fait de façon asynchrone,
    - data : cette valeur demande que les données soient toujours synchronisées avec le disque, de façon prioritaire par rapport aux métadonnées (par utilisation de fdatasync() au lieu de fsync())
     
  • action_mail_acct :
    doit contenir une adresse e-mail ou un alias valide.

Il y a aussi un certain nombre de paramètres servant à dicter le comportement du démon en fonction de la place disque disponible (space_left, space_left_action, admin_space_left, etc.), de façon à anticiper une éventuelle saturation.
 

D'autres paramètres relatifs à la gestion des logs vont être décrits dans le paragraphe suivant.

5.2. Rotation des logs par auditd

auditd est capable d'effectuer une rotation des fichiers de logs mais il ne sait se baser que sur la taille des fichiers. Les paramètres utilisés sont :

  • log_file : pathname du fichier de logs,
  • max_log_file : taille maximum autorisée du fichier avant rotation, en Mo,
  • num_logs : nombre maximum de fichiers de logs à garder après rotation,
  • max_log_file_action : action à effectuer quand la taille max_log_file est atteinte, les actions
    étant :

      - ignore : ne rien faire,
      - syslog : envoyer un avertissement (warning) à syslog,
      - suspend : suspendre la journalisation,
      - rotate : effectuer une rotation des fichiers de logs,
      - keep_logs : similaire à rotate, mais ne tient pas compte de num_logs.

Les paramètres par défaut sous Debian 12 sont :

   log_file = /var/log/audit/audit.log
   max_log_file = 8
   num_logs = 5
   max_log_file_action = ROTATE

5.3. Rotation des logs par logrotate

Si l'on souhaite effectuer une rotation des logs en fonction du temps plutôt qu'en fonction de la taille, on doit passer par un outil externe tel que logrotate, par exemple.

On pourra positionner les paramètres d'auditd de cette façon :

log_file = /var/log/audit/audit.log
max_log_file_action = ignore

Peu importe la valeur des deux autres paramètres, elles seront ignorées.

Cette nouvelle configuration pourra être rechargée à l'aide de la commande :

# systemctl reload auditd

La configuration de logrotate (dans /etc/logrotate.d/auditd) pourra ressembler à la suivante, mais les commentaires devront être supprimés car ils peuvent poser problème pour certains des mots-clés :

/var/log/audit/audit.log {
    daily                   # Rotation journalière des logs
    rotate 30               # Conservation des 30 derniers fichiers
    compress                # Compression des anciens fichiers
    delaycompress           # Différer la compression jusqu'à la
                            # prochaine rotation
    missingok               # Pas d'erreur si le fichiers est absent
    notifempty              # Pas de rotation si fichier vide
    create 0600 root root   # Permissions pour les nouveaux fichiers 
    sharedscripts           # Lancer 1 fois le script postrotate
    postrotate
        systemctl restart auditd > /dev/null 2>&1 || true
    endscript
}

Elle peut être testée à l'aide de la commande :

# logrotate -f /etc/logrotate.d/auditd

5.4. Définition des règles d’audit

Les règles d’audit sont définies dans le fichier /etc/audit/audit.rules. Ce fichier est généralement généré automatiquement lors du boot du système par le lancement du script augenrules, qui utilise les fichiers situées dans le répertoire /etc/audit/rules.d et les concatène en respectant l’ordre de tri des noms de fichiers. Ces derniers doivent posséder l'extension .rules, faute de quoi ils seront ignorés par la commande. Le fait de répartir les règles sous forme d'un ensemble de fichiers permet une plus grande modularité et une plus grande facilité de gestion.

Les options -D (delete all rules), -b (backlog size), -f (failure mode) et -e (enabled flag), lorsqu’elles sont présentes dans les fichiers de configuration, ont toutefois une position fixe déterminée par le script : elles se trouvent respectivement en première, deuxième, troisième et dernière position dans le fichier produit (voir man page auditctl(8)).

Les règles du fichier /etc/audit/audit.rules sont lues par la commande auditctl au démarrage du système et chargées dans le noyau.

Voici quelques exemples de règles d'audit :

-a exit,always -F arch=b64 -S execve
-a exit,always -F arch=b32 -S execve


Ces deux règles servent à indiquer au noyau que l'on souhaite tracer les exécutions de processus avec execve(), dans les modes 64 bits et 32 bits.

-a exit,always -F arch=b64 -S execve -k process_start
-a exit,always -F arch=b32 -S execve -k process_start
-a exit,always -F arch=b64 -S exit_group -k process_end
-a exit,always -F arch=b32 -S exit_group -k process_end

Les règles précédentes servent à tracer les créations de processus (labellisées avec le texte process_start) et les fins de processus (labellisées avec le texte process_end).

-a exit,always -F arch=b64 -S openat2 -k file_access
-a exit,always -F arch=b32 -S openat2 -k file_access

Cet exemple montre comment on peut demander à tracer les ouvertures de fichiers utilisant l'appel système openat2(), pour les architectures 64 bits et 32 bits.

Si maintenant nous voulons surveiller les permissions du fichier /etc/ssh/sshd_config, mais sans placer de directives de façon permanente dans les fichiers de règles, nous pouvons utiliser une commande telle que la suivante :

# auditctl -w /etc/ssh/sshd_config -p rwxa -k sshconfigchange

Ici, l'option -w permet de surveiller un pathname, et l'option -p définit les permissions qui déclencheront la génération d'un événement. L'argument qui suit l'option -k est une chaîne arbitraire qui permet de tracer des événements. Nous verrons dans le paragraphe 8 comment récupérer les logs relatifs aux potentiels événements générés par cette règle.

6. Les informations collectées

L'auditing collecte des événements comportant un grand nombre d'informations, parmi lesquelles figurent, de manière non exhaustive :

  • le type d'événement,
  • un timestamp avec date et heure,
  • un numéro de séquence d'événement,
  • les noms (réel, effectif, etc.) de l'utilisateur ayant effectué l'appel système,
  • les noms (réel, effectif, etc.) des groupes de l'utilisateur ayant effectué l'appel système,
  • le résultat de l'événement (succès ou échec : success=yes/no),
  • l'ID du processus (PID),
  • l'ID du processus parent (PPID),
  • les capabilities du processus,
  • le répertoire courant,
  • le pathname,
  • le numéro d'i-node,
  • le numéro de device,
  • une clé d'identification d'événement définie par l'administrateur,
  • etc.

7. Types d’événements traités

Les événements d’audit gérés dans le code de l’auditing Linux sont données ci-après. Ils sont tirés du fichier audit-userspace/lib/audit-records.h disponible dans l’arborescence du code d’audit en espace utilisateur disponible sur github, et qui peut être récupéré par la commande :
$ git clone https://github.com/linux-audit/audit-userspace.git

Voici donc les événements disponibles (dont le préfixe AUDIT_ a été volontairement supprimé pour une meilleure lisibilité) :

FIRST_USER_MSG            1100    /* First user space message */
LAST_USER_MSG             1199    /* Last user space message */
USER_AUTH                 1100    /* User system access authentication */
USER_ACCT                 1101    /* User system access authorization */
USER_MGMT                 1102    /* User acct attribute change */
CRED_ACQ                  1103    /* User credential acquired */
CRED_DISP                 1104    /* User credential disposed */
USER_START                1105    /* User session start */
USER_END                  1106    /* User session end */
USER_AVC                  1107    /* User space avc message */
USER_CHAUTHTOK            1108    /* User acct password or pin changed */
USER_ERR                  1109    /* User acct state error */
CRED_REFR                 1110    /* User credential refreshed */
USYS_CONFIG               1111    /* User space system config change */
USER_LOGIN                1112    /* User has logged in */
USER_LOGOUT               1113    /* User has logged out */
ADD_USER                  1114    /* User account added */
DEL_USER                  1115    /* User account deleted */
ADD_GROUP                 1116    /* Group account added */
DEL_GROUP                 1117    /* Group account deleted */
DAC_CHECK                 1118    /* User space DAC check results */
CHGRP_ID                  1119    /* User space group ID changed */
TEST                      1120    /* Used for test success messages */
TRUSTED_APP               1121    /* Trusted app msg - freestyle text */
USER_SELINUX_ERR          1122    /* SE Linux user space error */
USER_CMD                  1123    /* User shell command and args */
USER_TTY                  1124    /* Non-ICANON TTY input meaning */
CHUSER_ID                 1125    /* Changed user ID supplemental data */
GRP_AUTH                  1126    /* Authentication for group password */
SYSTEM_BOOT               1127    /* System boot */
SYSTEM_SHUTDOWN           1128    /* System shutdown */
SYSTEM_RUNLEVEL           1129    /* System runlevel change */
SERVICE_START             1130    /* Service (daemon) start */
SERVICE_STOP              1131    /* Service (daemon) stop */
GRP_MGMT                  1132    /* Group account attr was modified */
GRP_CHAUTHTOK             1133    /* Group acct password or pin changed */
MAC_CHECK                 1134    /* User space MAC decision results */
ACCT_LOCK                 1135    /* User's account locked by admin */
ACCT_UNLOCK               1136    /* User's account unlocked by admin */
USER_DEVICE               1137    /* User space hotplug device changes */
SOFTWARE_UPDATE           1138    /* Software update event */
FIRST_DAEMON              1200
LAST_DAEMON               1299
DAEMON_RECONFIG           1204    /* Auditd should reconfigure */
DAEMON_ROTATE             1205    /* Auditd should rotate logs */
DAEMON_RESUME             1206    /* Auditd should resume logging */
DAEMON_ACCEPT             1207    /* Auditd accepted remote connection */
DAEMON_CLOSE              1208    /* Auditd closed remote connection */
DAEMON_ERR                1209    /* Auditd internal error */
FIRST_EVENT               1300
LAST_EVENT                1399
FIRST_SELINUX             1400
LAST_SELINUX              1499
FIRST_APPARMOR            1500
LAST_APPARMOR             1599
AA                        1500    /* Not upstream yet */
APPARMOR_AUDIT            1501
APPARMOR_ALLOWED          1502
APPARMOR_DENIED           1503
APPARMOR_HINT             1504
APPARMOR_STATUS           1505
APPARMOR_ERROR            1506
APPARMOR_KILL             1507
FIRST_KERN_CRYPTO_MSG     1600
LAST_KERN_CRYPTO_MSG      1699
FIRST_KERN_ANOM_MSG       1700
LAST_KERN_ANOM_MSG        1799
INTEGRITY_FIRST_MSG       1800
INTEGRITY_LAST_MSG        1899
INTEGRITY_DATA            1800 /* Data integrity verification */
INTEGRITY_METADATA        1801 // Metadata integrity verification
INTEGRITY_STATUS          1802 /* Integrity enable status */
INTEGRITY_HASH            1803 /* Integrity HASH type */
INTEGRITY_PCR             1804 /* PCR invalidation msgs */
INTEGRITY_RULE            1805 /* Policy rule */
INTEGRITY_EVM_XATTR       1806 /* New EVM-covered xattr */
INTEGRITY_POLICY_RULE     1807 /* Integrity Policy rule */
FIRST_ANOM_MSG            2100
LAST_ANOM_MSG             2199
ANOM_LOGIN_FAILURES       2100 // Failed login limit reached
ANOM_LOGIN_TIME           2101 // Login attempted at bad time
ANOM_LOGIN_SESSIONS       2102 // Max concurrent sessions reached
ANOM_LOGIN_ACCT           2103 // Login attempted to watched acct
ANOM_LOGIN_LOCATION       2104 // Login from forbidden location
ANOM_MAX_DAC              2105 // Max DAC failures reached
ANOM_MAX_MAC              2106 // Max MAC failures reached
ANOM_AMTU_FAIL            2107 // AMTU failure
ANOM_RBAC_FAIL            2108 // RBAC self test failure
ANOM_RBAC_INTEGRITY_FAIL  2109 // RBAC file integrity failure
ANOM_CRYPTO_FAIL          2110 // Crypto system test failure
ANOM_ACCESS_FS            2111 // Access of file or dir
ANOM_EXEC                 2112 // Execution of file
ANOM_MK_EXEC              2113 // Make an executable
ANOM_ADD_ACCT             2114 // Adding an acct
ANOM_DEL_ACCT             2115 // Deleting an acct
ANOM_MOD_ACCT             2116 // Changing an acct
ANOM_ROOT_TRANS           2117 // User became root
ANOM_LOGIN_SERVICE        2118 // Service acct attempted login
ANOM_LOGIN_ROOT           2119 // Root login attempted
ANOM_ORIGIN_FAILURES      2120 // Origin has too many failed login
ANOM_SESSION              2121 // The user session is bad
FIRST_ANOM_RESP           2200
LAST_ANOM_RESP            2299
RESP_ANOMALY              2200 /* Anomaly not reacted to */
RESP_ALERT                2201 /* Alert email was sent */
RESP_KILL_PROC            2202 /* Kill program */
RESP_TERM_ACCESS          2203 /* Terminate session */
RESP_ACCT_REMOTE          2204 /* Acct locked from remote access*/
RESP_ACCT_LOCK_TIMED      2205 /* User acct locked for time */
RESP_ACCT_UNLOCK_TIMED    2206 /* User acct unlocked from time */
RESP_ACCT_LOCK            2207 /* User acct was locked */
RESP_TERM_LOCK            2208 /* Terminal was locked */
RESP_SEBOOL               2209 /* Set an SE Linux boolean */
RESP_EXEC                 2210 /* Execute a script */
RESP_SINGLE               2211 /* Go to single user mode */
RESP_HALT                 2212 /* take the system down */
RESP_ORIGIN_BLOCK         2213 /* Address blocked by iptables */
RESP_ORIGIN_BLOCK_TIMED   2214 /* Address blocked for time */
RESP_ORIGIN_UNBLOCK_TIMED 2215 /* Address unblocked from timed */
FIRST_USER_LSPP_MSG       2300
LAST_USER_LSPP_MSG        2399
USER_ROLE_CHANGE          2300 /* User changed to a new role */
ROLE_ASSIGN               2301 /* Admin assigned user to role */
ROLE_REMOVE               2302 /* Admin removed user from role */
LABEL_OVERRIDE            2303 /* Admin is overriding a label */
LABEL_LEVEL_CHANGE        2304 /* Object's level was changed */
USER_LABELED_EXPORT       2305 /* Object exported with label */
USER_UNLABELED_EXPORT     2306 /* Object exported without label */
DEV_ALLOC                 2307 /* Device was allocated */
DEV_DEALLOC               2308 /* Device was deallocated */
FS_RELABEL                2309 /* Filesystem relabeled */
USER_MAC_POLICY_LOAD      2310 /* Userspc daemon loaded policy */
ROLE_MODIFY               2311 /* Admin modified a role */
USER_MAC_CONFIG_CHANGE    2312 /* Change made to MAC policy */
USER_MAC_STATUS           2313 /* Userspc daemon enforcing change */
FIRST_CRYPTO_MSG          2400
CRYPTO_TEST_USER          2400 /* Crypto test results */
CRYPTO_PARAM_CHANGE_USER  2401 /* Crypto attribute change */
CRYPTO_LOGIN              2402 /* Logged in as crypto officer */
CRYPTO_LOGOUT             2403 /* Logged out from crypto */
CRYPTO_KEY_USER           2404 /* Create,delete,negotiate */
CRYPTO_FAILURE_USER       2405 /* Fail decrypt,encrypt,randomiz */
CRYPTO_REPLAY_USER        2406 /* Crypto replay detected */
CRYPTO_SESSION            2407 /* Record parameters set during
                                  TLS session establishment */
CRYPTO_IKE_SA             2408 /* Record parameters related to
                                  IKE SA */
CRYPTO_IPSEC_SA           2409 /* Record parameters related to
                                  IPSEC SA */
LAST_CRYPTO_MSG           2499
FIRST_VIRT_MSG            2500
VIRT_CONTROL              2500 /* Start,Pause,Stop VM/container */
VIRT_RESOURCE             2501 /* Resource assignment */
VIRT_MACHINE_ID           2502 /* Binding of label to VM/cont */
VIRT_INTEGRITY_CHECK      2503 /* Guest integrity results */
VIRT_CREATE               2504 /* Creation of guest image */
VIRT_DESTROY              2505 /* Destruction of guest image */
VIRT_MIGRATE_IN           2506 /* Inbound guest migration info */
VIRT_MIGRATE_OUT          2507 /* Outbound guest migration info */
LAST_VIRT_MSG             2599
FIRST_USER_MSG2           2100    /* More userspace messages */
LAST_USER_MSG2            2999
BPF                       1334 /* BPF load/unload */
EVENT_LISTENER            1335 /* audit mcast sock join/part */
URINGOP                   1336 /* io_uring operations */
OPENAT2                   1337 /* openat2 open_how flags */
DM_CTRL                   1338 /* Device Mapper target control */
DM_EVENT                  1339 /* Device Mapper events */
ANOM_CREAT                1703 /* Suspicious file creation */

8. Recherche d'informations dans les logs d’audit

La recherche d'événements est effectuée à l'aide de la commande ausearch. Elle a de très nombreuses options que nous ne pouvons pas décrire dans cet article. Référez-vous la page de manuel ausearch(8) pour les découvrir toutes.

Il est important de noter qu'un appel système peut engendrer une multitude d'événements d'audit, et qu'il est facile de les corréler grâce à un numéro de séquence qui est commun aux événements liés à un même appel système. Dans l'exemple qui suit, l'appel système est execve, et il engendre les événements dont les types sont spécifiés après la chaîne type= . Ils ont tous le numéro de séquence 976.

type=PROCTITLE msg=audit(08/20/2025 11:42:21.397:976) : proctitle=/usr/bin/dpkg --print-foreign-architectures 

type=PATH msg=audit(08/20/2025 11:42:21.397:976) : item=2 name=/lib64/ld-linux-x86-64.so.2 inode=262159 dev=fe:01 mode=file,755 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 

type=PATH msg=audit(08/20/2025 11:42:21.397:976) : item=1 name=/usr/bin/dpkg inode=262789 dev=fe:01 mode=file,755 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 

type=PATH msg=audit(08/20/2025 11:42:21.397:976) : item=0 name=/usr/bin/dpkg inode=262789 dev=fe:01 mode=file,755 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 

type=CWD msg=audit(08/20/2025 11:42:21.397:976) : cwd=/root 

type=EXECVE msg=audit(08/20/2025 11:42:21.397:976) : argc=2 a0=/usr/bin/dpkg a1=--print-foreign-architectures 

type=SYSCALL msg=audit(08/20/2025 11:42:21.397:976) : arch=x86_64 syscall=execve success=yes exit=0 a0=0x55bab76b0f70 a1=0x55bab740a120 a2=0x55bab73885b0 a3=0x485e652cb946122b items=3 ppid=1471 pid=1611 auid=mb uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts0 ses=2 comm=dpkg exe=/usr/bin/dpkg subj=unconfined key=(null) 

En observant les attributs des événements ci-dessus, on peut repérer des informations telles que PID, PPID, UID, eUID, sUID, TTY, CWD, des capabilities, etc. Il y a donc une multitude d'informations que l'on peut récupérer et analyser, selon les besoins.

Si l'on souhaite récupérer les éventuels événements générés suite à la définition de la règle identifiée par sshconfigchange au paragraphe 5.4, on peut utiliser la commande :

# ausearch -k sshconfigchange -i

qui affiche des informations ressemblant à :

type=PROCTITLE msg=audit(08/28/2025 11:07:32.711:635) : proctitle=chmod 755 sshd_config
type=PATH msg=audit(08/28/2025 11:07:32.711:635) : item=0 name=sshd_config inode=4458032 dev=fe:01 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(08/28/2025 11:07:32.711:635) : cwd=/etc/ssh
type=SYSCALL msg=audit(08/28/2025 11:07:32.711:635) : arch=x86_64 syscall=fchmodat success=yes exit=0 a0=AT_FDCWD a1=0x5604ee19c4d0 a2=0755 a3=0x7f99181c3fb8 items=1 ppid=958 pid=1385 auid=mb uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts0 ses=2 comm=chmod exe=/usr/bin/chmod subj=unconfined key=sshconfigchange

Des lignes de ce type peuvent parfois être nombreuses pour certains événéments, et leur analyse visuelle peut être grandement facilitée par des configurations adaptées de la commande de colorisation hl (https://github.com/mbornet-hl/hl).

Extrait colorisé des logs d'audit

9. Production de rapports d’audit

La commande aureport produit une synthèse relative aux logs d'audit. Elle comporte également de nombreuses options de sélection qui sont décrites dans la page de manuel de aureport(8). Ces options permettent, entre autres, de choisir le type d'événement pour lequel il faut afficher une synthèse : tentatives d'authentification, modifications de configuration, connexions, modifications de compte, exécution de programmes, etc. Voici un exemple de résultat d'exécution, provenant d'une VM Debian 12 peu fréquemment utilisée, qui montre le rapport principal, à savoir une synthèse des différents événements présents dans les logs :

# aureport
 
Summary Report
======================
Range of time in logs: 08/20/2025 11:42:21.009 - 08/27/2025
12:05:40.199
Selected time for report: 08/20/2025 11:42:21 - 08/27/2025
12:05:40.199
Number of changes in configuration: 18
Number of changes to accounts, groups, or roles: 0
Number of logins: 2
Number of failed logins: 0
Number of authentications: 11
Number of failed authentications: 0
Number of users: 5
Number of terminals: 10
Number of host names: 2
Number of executables: 108 
Number of commands: 129 
Number of files: 179 
Number of AVC's: 0
Number of MAC events: 0
Number of failed syscalls: 113 
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: 0
Number of process IDs: 696 
Number of events: 1602

Le rapport principal est le seul qui ne fait pas figurer les numéros d'événement.
En voici un autre qui montre les tentatives d'authentification :

# aureport -au
 
Authentication Report
============================================
# date time acct host term exe success event
============================================
1. 08/21/2025 11:13:39 mb 192.168.122.1 ssh /usr/sbin/sshd yes 243
2. 08/21/2025 11:13:45 root ? /dev/pts/0 /usr/bin/su yes 321
3. 08/21/2025 11:18:34 nobody ? ? /usr/bin/su yes 398
4. 08/21/2025 11:18:34 nobody ? ? /usr/bin/su yes 427
5. 08/21/2025 11:18:34 nobody ? ? /usr/bin/su yes 436
6. 08/27/2025 11:31:29 mb 192.168.122.1 ssh /usr/sbin/sshd yes 242
[...]
27. 09/01/2025 10:38:29 nobody ? ? /usr/bin/su yes 502
28. 09/01/2025 10:38:29 nobody ? ? /usr/bin/su yes 512
29. 09/01/2025 11:29:28 mb 192.168.122.1 ssh /usr/sbin/sshd yes 788
30. 09/01/2025 11:29:34 root ? /dev/pts/1 /usr/bin/su yes 817

Les rapports générés par aureport sont des synthèses qui peuvent être utilisées à des fins statistiques, ils ne fournissent pas d'informations détaillées sur les événements.

10. Synthèse relative aux VMs

La commande auvirt peut afficher des synthèses relatives à l'audit des machines virtuelles exécutées sur le système. En voici deux exemples :

# auvirt --start today --summary
Range of time for report:       Fri Aug 29 10:24 - Fri Aug 29 12:40
Number of guest starts:         5
Number of guest stops:          2
Number of resource assignments: 75
Number of related AVCs:         2
Number of related anomalies:    0
Number of failed operations:    0
# auvirt --start today
debian12-yocto        	root     Fri Aug 29 10:24
alpha                 	root     Fri Aug 29 10:25
beta                  	root     Fri Aug 29 10:25
eta                   	root     Fri Aug 29 10:25 - 12:40  (02:14
gamma                 	root     Fri Aug 29 10:25 - 12:38  (02:12

11. Exemples d’utilisation de commandes

Voici ci-dessous quelques exemples d'utilisation possible des commandes décrites précédemment.

11.1. auditctl

  • auditctl -s
    Affiche le statut de l'audit
     
  • auditctl -l
    Affiche la liste des règles configurées
     
  • auditctl -e 0
    Désactive temporairement l'audit
     
  • auditctl -e 1
    Réactive l 'audit
     
  • auditctl -e 2
    Verrouille la configuration de l'audit : un reboot est nécessaire pour modifier la configuration.
     

11.2. ausearch

  • ausearch -m 2>&1 1>/dev/null | grep '^Valid message types are:' | sed 's/^Valid message types are: //' | tr ' ' '\n' |
    sed '/^[ ]*$/d' | less -RX
    Cette commande affiche la liste des types de messages que l'on peut passer en argument à la commande ausearch après l'option -m :

    ACCT_LOCK
    ACCT_UNLOCK
    ADD_GROUP
    ADD_USER
    ALL
    ANOM_ABEND
    ANOM_ACCESS_FS
    [...]
    CRYPTO_SESSION
    CRYPTO_IKE_SA
    CRYPTO_IPSEC_SA
    VIRT_CONTROL
    VIRT_RESOURCE
    VIRT_MACHINE_ID
    VIRT_INTEGRITY_CHECK
    VIRT_CREATE
    VIRT_DESTROY
    VIRT_MIGRATE_IN
    VIRT_MIGRATE_OUT
    
  • ausearch -m ALL -i
    Affiche tous les événements enregistrés dans l'audit en interprétant localement certaines valeurs numériques telles ques que UID, eUID, GID, eGID, etc.
     
  • ausearch -m execve -i
    Affiche tous les événements de type EXECVE en interprétant certaines valeurs numériques.
     

11.3. aureport

  • aureport -x --summary
    Affiche une synthèse des programmes exécutés sur le système.
     
  • aureport -k
    Affiche les événements associés aux règles nommées (key).
     

11.4. aulast

  • aulast
    Affiche la liste des connexions utilisateurs en se basant sur les logs d'audit.

    # aulast
    mb       pts/0        192.168.122.1    Thu Aug 21 11:13 - 15:31  (04:18)
    reboot   system boot  6.1.0-37-amd64   Thu Aug 21 11:13 - 15:31  (04:18)
    reboot   system boot  6.1.0-37-amd64   Wed Aug 27 11:31 
    mb       pts/0        192.168.122.1    Wed Aug 27 11:31   still logged in
    
  • aulast --bad
    Affichage la liste des connexions qui ont échoué.

    # aulast --bad
    (invalid sshd     192.168.122.1    Tue Sep  2 14:02 - 14:02  (00:00)
    (invalid sshd     192.168.122.1    Tue Sep  2 14:02 - 14:02  (00:00)
    (invalid sshd     192.168.122.1    Tue Sep  2 14:02 - 14:02  (00:00)
    (invalid sshd     192.168.122.1    Tue Sep  2 14:02 - 14:02  (00:00)
    (invalid sshd     192.168.122.1    Tue Sep  2 14:02 - 14:02  (00:00)
    (invalid sshd     ::1              Tue Sep  2 14:15 - 14:15  (00:00)
    (invalid sshd     ::1              Tue Sep  2 14:15 - 14:15  (00:00)
    (invalid sshd     ::1              Tue Sep  2 14:15 - 14:15  (00:00)
    (invalid sshd     ::1              Tue Sep  2 14:15 - 14:15  (00:00)
    (invalid sshd     ::1              Tue Sep  2 14:15 - 14:15  (00:00)
    

11.5. aulastlog

  • aulastlog
    Affiche la dernière connexion des utilisateurs.

    # aulastlog
    Username         Port         From               Latest
    root                                             **Never logged in**
    daemon                                           **Never logged in**
    bin                                              **Never logged in**
    sys                                              **Never logged in**
    sync                                             **Never logged in**
    games                                            **Never logged in**
    man                                              **Never logged in**
    lp                                               **Never logged in**
    mail                                             **Never logged in**
    news                                             **Never logged in**
    uucp                                             **Never logged in**
    proxy                                            **Never logged in**
    www-data                                         **Never logged in**
    backup                                           **Never logged in**
    list                                             **Never logged in**
    irc                                              **Never logged in**
    _apt                                             **Never logged in**
    nobody                                           **Never logged in**
    systemd-network                                  **Never logged in**
    systemd-timesync                                 **Never logged in**
    messagebus                                       **Never logged in**
    sshd                                             **Never logged in**
    dnsmasq                                          **Never logged in**
    avahi                                            **Never logged in**
    speech-dispatcher                                **Never logged in**
    pulse                                            **Never logged in**
    saned                                            **Never logged in**
    lightdm                                          **Never logged in**
    polkitd                                          **Never logged in**
    rtkit                                            **Never logged in**
    colord                                           **Never logged in**
    mb               /dev/pts/0   192.168.122.1      08/27/2025 11:31:29
    yoctouser                                        **Never logged in**
    
  • aulastlog --user root
    Affiche la dernière connexion de l'utilisateur spécifié (ici : root).

    # aulastlog --user root
    Username         Port         From               Latest
    root             /dev/pts/1   192.168.122.1      09/02/2025 14:20:27
    

12. Interfaces avec d'autres logiciels

12.1. Les plug-ins

Il existe, sous Debian, un package appelé audispd-plugins (audit dispatcher plug-in) contenant des plug-ins pour le système d'auditing. Ce package peut être installé à l'aide de la commande :

# apt install audispd-plugins

Il peut être utilisé pour transférer des événements d'audit à syslog, faire suivre des logs à travers un socket Unix (AF_UNIX) ou exécuter un script (exec) en réponse à des événements. C'est une extension à auditd qui permet de traiter les événements de différentes façons en fonction des logiciels consommateurs.

12.2. Les SIEM (Security Information and Event Manager)

Il est possible d'interfacer auditd avec des SIEM, comme par exemple Wazuh. Ce dernier va exploiter les logs d'auditd directement grâce à la configuration suivante à placer dans le fichier /var/ossec/etc/ossec.conf :

<localfile>
    <location>/var/log/audit/audit.log</location>
    <log_format>audit</log_format>
</localfile>

Grâce aux informations remontées par auditd, Wazuh peut détecter des tentatives d'intrusion ou d'autres comportements suspects. 

13. Impact sur les performances du système

Il  faut être conscient de l'effet de l'activation de l'auditing sur les performances d'un système, particulièrement si ce système est en production avec des contraintes fortes. Activer l'audit avec des règles générant beaucoup d'événements, comme la surveillance de l'appel système execve() par exemple, peut avoir un impact significatif et fortement dégrader les performances du système.

Il faut également se méfier de potentiels effets de seuils qui se produiraient par un simple ajout d'une règle dans un système déjà fortement audité : un effet d'engorgement du backlog aurait des conséquences potentiellement graves sur le fonctionnement d'un système.
Le cas échéant, une augmentation du nombre de buffers constituant le backlog pour être opérée à l'aide de l'option -b de la commande auditctl. La valeur courante de ce paramètre peut être affichée à l'aide de la commande :

# auditctl -s | grep backlog_limit

14. Fichiers relatifs au système d'audit

De nombreux fichiers sont liés à l'audit Linux, que ce soit des commandes système, des bibliothèques, des fichiers de configuration ou d'état, des fichiers d'exemples ou des pages de manuel, etc.
Nous allons en lister un grand nombre ci-dessous afin de les identifier et de pouvoir les trouver rapidement sur le système si nécessaire.

14.1. Commandes système

/usr/sbin/auditctl
/usr/sbin/auditd
/usr/sbin/augenrules
/usr/sbin/aureport
/usr/sbin/ausearch
/usr/sbin/autrace
/usr/sbin/audisp-syslog
/usr/sbin/audisp-remote      (pour les plug-ins)
/usr/sbin/audispd-zos-remote (pour les plug-ins)
/usr/bin/aulast
/usr/bin/aulastlog
/usr/bin/ausyscall
/usr/bin/auvirt

14.2. Bibliothèques

/usr/lib/x86_64-linux-gnu/libaudit.so.1
/usr/lib/x86_64-linux-gnu/libauparse.so.0

14.3. Fichiers headers

/usr/include/linux/audit.h
[audit-userspace] /lib/audit-records.h

14.4. Fichiers de configuration

/etc/audit/auditd.conf
/etc/audit/audit.rules
 
/etc/audit/rules.d/*.rules
/etc/audit/plugins.d/*      (pour les plug-ins)
/etc/audit/zos-remote.conf  (pour les plug-ins)
 
/etc/libaudit.conf

14.5. Fichiers utilisés pour le fonctionnement des processus

/var/run/auditd.pid
/var/run/audispd_events (pour les plug-ins)

14.6. Fichiers d'exemples

/usr/share/doc/auditd/*
/usr/share/doc/auditd/examples/rules/*.rules

15. Man pages

Les pages de manuel ci-dessous décrivent les commandes, les fichiers de configurations ou certains fonctionnements liés au système d'audit.

15.1. Man pages des commandes système

auditctl(8)
auditd(8)
augenrules(8)
aureport(8)
ausearch(8)
autrace(8)
audisp-syslog(8)   (pour les plug-ins)
audisp-remote(8)   (pour les plug-ins)
aulast(8)
aulastlog(8)
ausyscall(8)
auvirt(8)

15.2. Man pages des fichiers de configuration

auditd.conf(5)
audit.rules(7)
libaudit.conf(5)

15.3. Man page de fonctionnement des plug-ins

    auditd-plugins(5)

16. Dépôts publics du projet d’audit

Le projet d’auditing sous Linux est un projet libre dont les sources et la documentation se trouvent sur des dépôts github :

  • audit-kernel
    Il s’agit de la partie de l’audit contenue dans le noyau Linux, c’est la partie centrale qui fait le travail d’audit.
    L’URL de son dépôt est :
    https://github.com/linux-audit/audit-kernel
     
  • audit-userspace
    Ce dépôt contient tous les programmes s'exécutant dans l'espace utilisateur, le démon lui-même et toutes les autres commandes.
    L'URL du dépôt est :
    https://github.com/linux-audit/audit-userspace
     
  • audit-testsuite
    Ce dépôt contient un jeu de tests de non-régression.
    L'URL du dépôt est :
    https://github.com/linux-audit/audit-testsuite
     
  • audit-documentation
    Ce dépôt contient la documentation et les spécifications liées au projet.
    L'URL du dépôt est :
    https://github.com/linux-audit/audit-documentation
     

Conclusion

Cet article constitue une introduction à l'utilisation de l'audit sous Linux. Il est généralement employé dans le monde des serveurs, mais on peut aussi envisager de l'utiliser dans une distribution Yocto pour des besoins très spécifiques. Cela fera peut-être l'objet d'un prochain article.

Bibliographie

Les documents de références officiels concernant l'audit Linux sont évidemment les pages de manuel, le site audit-documentation et les sites de codes sources citées au paragraphe précédent. Toutefois, pour les compléter de façon plus vulgarisatrice, voici une liste d'URL fournissant des descriptions de l'audit dont certaines pourront vous sembler moins rébarbatives, ainsi que des exemples complémentaires de règles :

1. Comprehensive Guide to Auditd for Linux Embedded Systems: Security Auditing and Compliance, https://koansoftware.com/comprehensive-guide-to-auditd-for-linux-embedded-systems/

2. Red-Hat : Configure Linux system auditing with auditd, https://www.redhat.com/en/blog/configure-linux-auditing-auditd/a>

3. GNU Linux Magazine France, , Journalisez les actions de vos utilisateurs avec Auditd, HS 93, nov. 2017, https://connect.ed-diamond.com/GNU-Linux-Magazine/glmfhs-093/journalisez-les-actions-de-vos-utilisateurs-avec-auditd/

4. Arch Linux : Linux audit system, https://pmhahn.github.io/audit/

5. Audit framework, https://wiki.archlinux.org/title/Audit_framework

6. Audit d'un système Linux avec l'outil Auditd, https://www.linkedin.com/pulse/audit-dun-syst%C3%A8me-linux-avec-loutil-auditd-sylvanus-hougbekey-cfbof/

7. Linux Audit :Tuning auditd: high-performance Linux Auditing, https://linux-audit.com/linux-audit-framework/tuning-auditd-high-performance-linux-auditing

8. SUSE : Understanding Linux Audit, https://documentation.suse.com/en-us/sles/12-SP5/html/SLES-all/cha-audit-comp.html

9. ANSSI : Recommandations de configuration d'un système GNU / Linux,https://cyber.gouv.fr/sites/default/files/document/fr_np_linux_configuration-v2.0.pdf

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.