Historique timestampé

Publié le par Peck

Cet article se trouve aussi sur http://linux-attitude.fr/post/Antisynchronistiquement

Niveau
:
Résumé : PROMPT_COMMAND=

Aujourd'hui vous avez découvert un problème sur une machine.
- "Mais que s'est-il passé ?"
- "Mais qui a fait ça ?"
- "Mais il faudrait stocker les dates dans les historiques !"

Ok, faisons ça ...

Première méthode, simple, exécutons une commande à chaque ligne exécutée qui va nous stocker cette information dans un nouvel historique. Notez qu'on ne peut pas mettre cette information dans .bash_history, ca mettrait le bazar.
$ export PROMPT_COMMAND='echo `date +"%F %T"` `history 1`>> ~/.bash_timestamp'

C'est bien, mais on peut faire beaucoup mieux : pas de sous-processus (vive les perfs), pas de duplication de ligne lorsqu'on tape une ligne vide, pas de No de sequence

$ H2=0
$ export PROMPT_COMMAND='H=`history 1` ; H1=${H:0:6} ; [ $H1 -eq $H2 ] || echo `date +"%F %T"` "${H:6}" >> ~/.bash_timestamp ; H2=$H1'


C'est bien, maintenant nous voudrions avoir l'historique de tous les utilisateurs.
Mettons tout ça dans /etc/bash.bashrc, donc pour tout le monde, avec quelques adaptations :
$ H2=0
$ export PROMPT_COMMAND='H=`history 1` ; H1=${H:0:6} ; [ $H1 -eq $H2 ] || echo `date +"%F %T"` "$USER" "${H:6}" >> /var/log/bash_logs ; H2=$H1'

Pour que ça marche, il nous faut un fichier inscriptible par tout le monde.
$ touch /var/log/bash_logs
$ chmod 666 /var/log/bash_logs

Et nous allons nous préserver de la mauvaise foi des utilisateurs qui voudraient modifier ces logs a posteriori.
# en root
$ chattr +a /var/log/bash_logs

Notez qu'on ne se préserve que de leur mauvaise foi mais qu'il est impossible de se préserver de la malveillance, car il suffit de redéfinir son PROMPT_COMMAND pour que rien ne soit loggué.

Publié dans admin

Commenter cet article

Phil Defer 24/10/2007 10:54

/var/log/bash_logs {
   rotate 15
   missingok
   notifempty
   daily
   create 662 root root
   compress

   prerotate
     chattr -a /var/log/bash_logs
   endscript

   postrotate
     chattr +a /var/log/bash_logs
     chmod o-w /var/log/bash_logs.*.gz
   endscript
}

annah c. h. 23/10/2007 16:31

Pourquoi ne pas utiliser la variable HISTTIMEFORMAT ?$ echo $HISTTIMEFORMAT %Y%m%d-%H:%M $ history 3 1020 20071023-16:20 help history 1021 20071023-16:20 echo $HISTTIMEFORMAT 1022 20071023-16:20 history 3

Peck 23/10/2007 20:18

annah m'a tuer ...Heureusement on conserve un intéret de l'article qui est de sauvegarder les logs en commun.

Phil Defer 22/10/2007 00:07

et le mode 662 ne serait-t-il pas mieux approprié ? Cela empeche tout le mode de lire les commandes de tout le monde....

Phil Defer 21/10/2007 23:14

Ooops j'ai publié un peu vite.... dites monsieur Peck si vous pouviez revoir les sauts de lignes ça serait super et dire que ce stanza est à placer dans un des fichiers de /etc/logrotate.d/

Phil Defer 21/10/2007 23:12

/var/log/bash_logs {
   rotate 15
   missingok
   notifempty
   daily
   create 666 root root
   compress
   postrotate
     chattr +a /var/log/bash_logs
   endscript
}

Peck 22/10/2007 00:05

Cool ! Merci.