Un pré-requis à une bonne politique de sécurité consiste à tracer l’ensemble des commandes des utilisateurs. De nombreuses solutions passent par la modification de la variable d’environnement PROMPT_COMMAND dans le /etc/bash.bashrc. Problème évident, c’est pour bash uniquement entre autres défauts.
Un meilleur moyen de journaliser les commandes shell lancées par les utilisateurs consiste à procéder à la surveillance au niveau kernel et surveiller les appels systèmes execve. Pour cela, il suffit d’installer le package Ubuntu auditd ou audit sous RHEL/CentOS et de définir ces règles attendues dans le fichier /etc/audit/audit.rules :
-a exit,always -F arch=b64 -S execve -a exit,always -F arch=b32 -S execve
Un redémarrage de service plus tard via systemctl restart auditd.service et vous devriez avoir dans les logs :
type=SYSCALL msg=audit(1515528873.798:63): arch=c000003e syscall=59 success=yes exit=0 a0=5652c9478ab8 a1=5652c94799b8 a2=5652c94775d0 a3=7f5e64fa1b78 items=2 ppid=5976 pid=5977 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="apt" exe="/usr/bin/apt" key=(null) type=EXECVE msg=audit(1515528873.798:63): argc=3 a0="apt" a1="install" a2="john" type=PATH msg=audit(1515528873.798:63): item=0 name="/usr/bin/apt" inode=152 dev=fc:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
Il est également possible de restreindre les logs du root uniquement (ou l’Effective UID) de cette manière :
-a exit,always -F arch=b64 -F euid=0 -S execve -a exit,always -F arch=b32 -F euid=0 -S execve
Il ne reste plus qu’à historiser les logs dans un serveurs syslog centralisé.