Bash: journaliser l'historique de commandes dans syslog

De TechWik
Révision datée du 29 janvier 2018 à 12:29 par Toine (discussion | contributions) (Activation de la fonction de log avec bash 4.1+)
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
   cmdexec=`echo $cmdline | awk '{print $1}'`
   echo $cmdexec | grep -q "^/"
   if  [ $? -ne 0 ]; then
     unalias which 2>/dev/null
                       fullexec=`which $cmdexec 2>/dev/null | awk '{print $1}'`
   else
     fullexec=$cmdexec
   fi
   warntxt=""
   if [ -n "$fullexec" ]; then
     cmdown=`ls -l $fullexec | awk '{print $3}'`
                       [ "$cmdown" = "root" ] || warntxt=" WARNING suspect command? $fullexec"
               fi
               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}[$$]${warntxt}${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).
  • 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.