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

De TechWik
Aller à : navigation, rechercher
(i)
 
m (ajout coloration de syntaxe)
 
(3 révisions intermédiaires par le même utilisateur non affichées)
Ligne 3 : Ligne 3 :
 
A partir de la version 4.1, on peut demander la journalisation dans syslog de l'hisstorique bash à la compilation.  
 
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)]].  
 
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)
 
* 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.  
+
* Inconvénients: implique de refaire le patch+compilation à chaque mise à jour du package bash.
  
 
== Méthode via trap DEBUG ==
 
== 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.
 
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
 
* ajouter le fichier logcmd.sh dans /etc/profile.d, (permissions 644 = rwxr--r--), et le contenu
 +
<syntaxhighlight lang="bash" line='line'>
 
   function cmd2syslog
 
   function cmd2syslog
 
   {
 
   {
 
     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 20 : Ligne 22 :
 
   {
 
   {
 
     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
 
     trap cmd2syslog DEBUG
 
     trap cmd2syslog DEBUG
 
   fi
 
   fi
 +
</syntaxhighlight>
 
* 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:
 +
<syntaxhighlight lang="bash" line='line'>
 +
  if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then
 +
    . /etc/profile.d/logcmd.sh
 +
    __cmd2syslog "$BASH_EXECUTION_STRING"
 +
  fi
 +
</syntaxhighlight>
 +
 
* 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
Ligne 52 : Ligne 50 :
 
** peut générer un peu de déchet avec set -x sur un shell interactif.  
 
** peut générer un peu de déchet avec set -x sur un shell interactif.  
 
** spécifique à bash.
 
** spécifique à bash.
 +
 +
[[Category:Bash]]
 +
[[Category:Syslog]]

Version actuelle datée du 28 juillet 2018 à 15:57

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
 1   function cmd2syslog
 2   {
 3     unset PROMPT_COMMAND
 4     if [ -n "`fc -ln -0 2>/dev/null`" ] && [ -n "$BASH_COMMAND" ]; then
 5       __cmd2syslog "$BASH_COMMAND"
 6     fi
 7   }
 8   function __cmd2syslog
 9   {
10     cmdline=$1
11     remssh=""
12     if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then
13       remssh=" (non-interactive SSH from $SSH_CLIENT)"
14     fi
15     logger -d -p local6.debug -t bash "${USER}[$$]${remssh}: $cmdline"
16   }
17   if [ -n "$PS1" ]; then
18     trap cmd2syslog DEBUG
19   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:
1   if [ -n "$SSH_CLIENT" ] && [ -n "$BASH_EXECUTION_STRING" ]; then
2     . /etc/profile.d/logcmd.sh
3     __cmd2syslog "$BASH_EXECUTION_STRING"
4   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.