Skip to the content.

Règles d'Audit

Objectif du document

L'objectif de ce document est de fournir les informations permettants de comprendre et rédiger des règles d'audit d'un système Linux.

Il est le plus synthétique/pratique possible. Pour plus de détails, les sources se trouvent à la fin du document.

Vocabulaire

auditd : Service qui intercepte les interactions entre l'espace utilisateur et le noyau du système.

règle d'audit : Condition pour qu'auditd génère un évènement lors d'une interception.

évènement : Message généré par auditd et qui donne des informations sur ce qu'il s'est passé. Auditd génère plusieurs évènements pour une action (ex: à l'exécution d'un programme, auditd pourra générer une log pour la commande, et une autre pour indiquer le répertoire de la commande).

Principe des règles d'audit

Il existe 3 types de règles :

Concernant les règles d'appel système, pour chaque interaction avec le noyau :

  1. Auditd intercepte l'appel système
  2. Parcourt les règles d'audit dans l'ordre de leur déclaration
  3. La première règle qui match est traitée

Comme auditd peut donner beaucoup d'informations sur des évènements qui se produisent souvent, il faut faire attention à l'utilité/quantité/qualité des règles qu'on met en place, et toujours tester avant de mettre en production, puis optimiser dans le temps.

Syntaxe des règles d'audit

Paramétrage d'auditd

# supprime toutes les règles d'audit
-D

# si le buffer de traitement atteint 1000 évènements à traiter, auditd déclenche l'action d'échec
-b 1000
# idem si on atteint 10 d'évènement par seconde
-r 10
# auditd est dans l'état activé
-e 1
# l'action d'échec est d'enregistrer l'évènement dans le journal du noyau
-f 1

# ignore les erreurs lors de la lecture du fichier de conf
-i

Il existe 4 principales options de paramétrage d'auditd :

Surveillance du système de fichier

Même s'il n'existent que par retro compatibilité, contrairement aux règles d'appel système, les watch n'impactent par les performances en fonction du nombre de règles. Pour surveiller un fichier/dossier, c'est la méthode à privilégier. Si on a besoin d'une règle plus expressive (les accès par root, les utilisateurs humains, etc) on transformera le watch en appel système.

Les règles de surveillance du système de fichier (ou watch) sont de la forme suivante :

# surveiller les accès en écriture et les changements d'attribut du fichier /etc/passwd
-w /etc/passwd -p wa
# surveiller les exécutions sur tous les fichiers du dossier /bin/
-w /bin/ -p x

L'ajout d'un slash de fin dans le chemin ne différencie pas un fichier d'un dossier. Si l'element final du chemin existe, -w met l'equivalent d'un -a -F path=... si c'est un fichier, et -a -F dir=... si c'est un dossier.

Si l'element final du chemin n'existe pas, la règle sera ajoutée avec l'équivalent d'un -a -F path=.... Si le fichier est créé plus tard, il sera surveillé. Si le dossier est créé plus tard, il sera surveillé, mais pas récursivement.

Surveillance des appels système

Chaque règle d'appel système est ajoutée à un moteur de correspondance qui intercepte chaque appel système de chaque programme de la machine. Une règle d'appel système supplémentaire impacte donc un peu plus les performances du système.

# intercepter des changements de temps lorsque l'utilisateur original est humain, sur les architectures 32 et 64 bits
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -S clock_settime -F auid>=1000 -k T1070.006_2
-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S clock_settime -F auid>=1000 -k T1070.006_1

# equivalent à -w /etc/passwd -p rw
-a always,exit -F path=/etc/passwd -F perm=rw
# equivalent à -w /usr/bin/ -p x
-a always,exit -F dir=/usr/bin/ -F perm=x

Les valeurs de champ -F importantes à comprendre sont :

Sources