Bash: journaliser l'historique de commandes dans syslog

De TechWik
Révision datée du 1 février 2018 à 07:52 par Toine (discussion | contributions) (Méthode via trap DEBUG)
Aller à : navigation, rechercher

Activation de la fonction de log avec bash 4.1+

A partir de la version 4.1, on peut demander la journalisation dans syslog de l'hisstorique bash à la compilation. Il suffit de compiler avec l'option SYSLOG_HISTORY positionnée dans config-top.h. Voir Rpmbuild avec modifications (ajout de patch). S'assurer que la configuration de rsyslog est cohérence avec le 'facility' utilisé pour journaliser dans config-top.h.

  • Avantage: plus fiable que le trap DEBUG ci-dessous (mais implique de désactiver tout autre shell pour être complète)
  • Inconvénients: implique de refaire le patch+compilation à chaque mise à jour du package bash.

Méthode via trap DEBUG

Le trap DEBUG de bash associé à la variable BASH_COMMAND permet de journaliser toute commande exécutée dans syslog.

  • ajouter le fichier logcmd.sh dans /etc/profile.d, (permissions 644 = rwxr--r--), et le contenu
 function cmd2syslog
 {
   unset PROMPT_COMMAND
   if [ -n "`fc -ln -0 2>/dev/null`" ] && [ -n "$BASH_COMMAND" ]; then
     __cmd2syslog "$BASH_COMMAND"
   fi
 }
 function __cmd2syslog
 {
   cmdline=$1
   remssh=""
   if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then
     remssh=" (non-interactive SSH from $SSH_CLIENT)"
   fi
   logger -d -p local6.debug -t bash "${USER}[$$]${remssh}: $cmdline"
 }
 if [ -n "$PS1" ]; then
   trap cmd2syslog DEBUG
 fi
  • ce script sera lu par /etc/bashrc et pris en compte automatiquement au lancement d'un shell bash interactif (test sur PS1).
  • la fonction __cmd2syslog est destinée à être appelée dans le cas de commande non interactive via ssh, en ajoutant dans /etc/bashrc:
 if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then
   . /etc/profile.d/logcmd.sh
   __cmd2syslog "$BASH_EXECUTION_STRING"
 fi
  • ici, on utilise local6.debug pour logger, il faut ajouter une règle dans rsyslog.conf (ou équivalent) pour journaliser dans un fichier, par exemple dans log secure:
 local6.*                                                /var/log/secure
  • Avantage: facile à mettre en oeuvre sans recompiler bash.
  • Inconvénients:
    • méthode très facile à contourner (il suffit de détourner ou annuler le trap DEBUG).
    • peut générer un peu de déchet avec set -x sur un shell interactif.
    • spécifique à bash.