Comme évoqué lors de mon précédent article, je vais détailler un cas pratique de configuration de l’audit. Le contexte technique est le suivant : enregistrer l’ensemble des exécutions provenant des utilisateurs. Le système Solaris (11.3) héberge des Zones non Globales.
La configuration de l’audit dans les Zones non Globales s’effectue de deux manières. Soit la stratégie est opérée par la Zone Globale : la configuration est alors identique à chaque Zone non Globale, les enregistrements d’audit sont disponibles sur la Zone non Globale. Soit la stratégie est opérée pour chaque Zone non Globale : la configuration peut être adaptée à chaque environnement, les enregistrements d’audit sont disponibles sur chacun des environnements.
Un point important à spécifier, si vous exécutez des BrandZ (Solaris 10) sur la Zone Globale, la stratégie opérée par la Zone Globale ne fonctionnera pas pour les BrandZ. Seule la configuration par Zone non Globale fonctionnera dans ce contexte.
Dans ce cas pratique, j’applique la stratégie pour chaque Zone non Globale. Il faut donc ajouter la stratégie suivante sur la Zone Globale du système.
# auditconfig -setpolicy +perzone
Sur chaque Zone non Globale de ce système, le service d’audit doit être activé.
# audit -s # auditconfig -getcond audit condition = auditing
Le but est d’enregistrer l’ensemble des exécutions des utilisateurs. Pour obtenir des enregistrements pertinents, il est intéressant d’ajouter la stratégie argv (cela permet d’associer les arguments d’une commande). L’ajout de cette stratégie est à positionner dans chaque Zone non Globale. Sa mise en place dans la Zone Globale peut avoir sont intérêt notamment si certaines commandes (ou connexion) s’exécutent depuis celle-ci via zlogin(1M).
# auditconfig -setpolicy +argv
La stratégie d’audit sur la Zone Globale doit être la suivante.
# auditconfig -getpolicy configured audit policies = argv,cnt,perzone active audit policies = argv,cnt,perzone
La stratégie d’audit par Zone non Globale doit être la suivante.
# auditconfig -getpolicy configured audit policies = argv,cnt active audit policies = argv,cnt
La classe d’audit gérant les exécutions se nomme ex. Elle prend en compte tous les événements execve(2M) (incluant pfexec(1M) si celui est actif sur votre système).
0x0000000080000000:ex:exec
# auditrecord -c ex execve system call execve See execve(2) event ID 23 AUE_EXECVE class ps,ex (0x0000000080100000) header path [attribute] omitted on error [exec_arguments] output if argv policy is set [exec_environment] output if arge policy is set subject [use_of_privilege] return pfexec system call pfexec See execve(2) with pfexec enabled event ID 116 AUE_PFEXEC class ps,ex,ua,as (0x0000000080160000) header path pathname of the executable path pathname of working directory [privilege] privileges if the limit or inheritable set are changed [privilege] privileges if the limit or inheritable set are changed [process] process if ruid, euid, rgid or egid is changed exec_arguments [exec_environment] output if arge policy is set subject [use_of_privilege] return
On associe la classe d’audit « ex » à la classe d’audit « lo » (gestion des connexions utilisateurs) aussi bien pour les événements provenants d’utilisateurs que des événements provenant du système (événements attribuables et non-attribuables).
# auditconfig -setflags lo,ex user default audit flags = ex,lo(0x80001000,0x80001000) # auditconfig -setnaflags lo,ex non-attributable audit flags = ex,lo(0x80001000,0x80001000)
Les classes d’audit activées sur la Zone Globale sont les suivantes.
# auditconfig -getnaflags -getflags active non-attributable audit flags = ex,lo(0x80001000,0x80001000) configured non-attributable audit flags = ex,lo(0x80001000,0x80001000) active user default audit flags = ex,lo(0x80001000,0x80001000) configured user default audit flags = ex,lo(0x80001000,0x80001000)
Les classes d’audit activées sur chaque Zone non Globale sont les suivantes.
# auditconfig -getnaflags -getflags active non-attributable audit flags = ex,lo(0x80001000,0x80001000) configured non-attributable audit flags = ex,lo(0x80001000,0x80001000) active user default audit flags = ex,lo(0x80001000,0x80001000) configured user default audit flags = ex,lo(0x80001000,0x80001000)
Pour appliquer les modifications des classes d’audit, il est nécessaire de l’indiquer au système et d’exécuter les commandes suivantes sur chaque environnement (sur la Zone Globale et sur toutes les Zones non Globales).
# auditconfig -conf Configured 283 kernel events. # auditconfig -aconf Configured non-attributable event mask.
Par défaut, l’ensemble des enregistrements sont écrits via le plugin audit_binfile(5M). Un seul fichier est généré pour l’ensemble des enregistrements. A vous de voir selon votre activité, si vous devez limiter ce fichier selon sa taille ou la périodicité. J’opte souvent pour les deux.
# auditconfig -setplugin audit_binfile p_age=1d # auditconfig -setplugin audit_binfile p_fsize=512M # auditconfig -getplugin audit_binfile Plugin: audit_binfile (active) Attributes: p_dir=/var/audit;p_minfree=1;p_fsize=512M;p_age=1d
Cette modification est à faire sur chaque environnement (sur Zone Globale et sur toutes les Zones non Globales). Pensez tout de même à mettre en place une suppression de ces fichiers (une fois qu’ils sont sauvegardés) sinon vous risquez de saturer votre pool ZFS.
# crontab –l root | grep audit 0 5 * * * find /var/share/audit -type f -mtime +4 -exec /usr/bin/rm {} \;
Il vous est maintenant possible de suivre l’activité des utilisateurs sur le(s) système(s). Par exemple, vous pouvez diagnostiquer facilement ce genre d’événement dans votre journal d’audit.
<record version="2" event="execve(2)" host="compile" iso8601="2016-09-04 16:31:31.235 +02:00"> <path>/usr/bin/rm</path> <attribute mode="100555" uid="root" gid="bin" fsid="65538" nodeid="49437" device="18446744073709551615"/> <exec_args><arg>rm</arg><arg>/etc/hosts </arg></exec_args> <subject audit-uid="bruno" uid="bruno" gid="grpadm" ruid="bruno" rgid="grpadm" pid="1062" sid="3492816039" tid="11705 136704 gw.homeunix.org"/> <return errval="success" retval="0"/> </record>