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é.
Publicité

Publié dans admin

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
P
/var/log/bash_logs {<br />    rotate 15<br />    missingok<br />    notifempty<br />    daily<br />    create 662 root root<br />    compress<br /> <br />    prerotate<br />      chattr -a /var/log/bash_logs<br />    endscript<br /> <br />    postrotate<br />      chattr +a /var/log/bash_logs<br />      chmod o-w /var/log/bash_logs.*.gz<br />    endscript<br /> }
Répondre
A
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
Répondre
P
annah m'a tuer ...Heureusement on conserve un intéret de l'article qui est de sauvegarder les logs en commun.
P
et le mode 662 ne serait-t-il pas mieux approprié ? Cela empeche tout le mode de lire les commandes de tout le monde....
Répondre
P
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/
Répondre
P
/var/log/bash_logs {<br />    rotate 15<br />    missingok<br />    notifempty<br />    daily<br />    create 666 root root<br />    compress<br />    postrotate<br />      chattr +a /var/log/bash_logs<br />    endscript<br /> }
Répondre
P
Cool ! Merci.