Bash: journaliser l'historique de commandes dans syslog : Différence entre versions

De TechWik
Aller à : navigation, rechercher
m (Activation de la fonction de log avec bash 4.1+)
m (Méthode via trap DEBUG)
Ligne 15 : Ligne 15 :
 
     unset PROMPT_COMMAND
 
     unset PROMPT_COMMAND
 
     if [ -n "`fc -ln -0 2>/dev/null`" ] && [ -n "$BASH_COMMAND" ]; then
 
     if [ -n "`fc -ln -0 2>/dev/null`" ] && [ -n "$BASH_COMMAND" ]; then
          __cmd2syslog "$BASH_COMMAND"
+
      __cmd2syslog "$BASH_COMMAND"
 
     fi
 
     fi
 
   }
 
   }
Ligne 21 : Ligne 21 :
 
   {
 
   {
 
     cmdline=$1
 
     cmdline=$1
     cmdexec=`echo $cmdline | awk '{print $1}'`
+
     remssh=""
    echo $cmdexec | grep -q "^/"
+
     if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then
     if [ $? -ne 0 ]; then
+
       remssh=" (non-interactive SSH from $SSH_CLIENT)"
       unalias which 2>/dev/null
 
                        fullexec=`which $cmdexec 2>/dev/null | awk '{print $1}'`
 
    else
 
      fullexec=$cmdexec
 
 
     fi
 
     fi
     warntxt=""
+
     logger -d -p local6.debug -t bash "${USER}[$$]${remssh}: $cmdline"
    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
 
   if [ -n "$PS1" ]; then
Ligne 44 : Ligne 31 :
 
   fi
 
   fi
 
* ce script sera lu par /etc/bashrc et pris en compte automatiquement au lancement d'un shell bash interactif (test sur PS1).
 
* 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:
 
* 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
 
   local6.*                                                /var/log/secure

Version du 1 février 2018 à 07:52

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.