Bash: journaliser l'historique de commandes dans syslog

De TechWik
Révision datée du 28 juillet 2018 à 15:57 par Toine (discussion | contributions) (ajout coloration de syntaxe)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
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
 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.