27 votes

Comment enregistrer toutes les commandes Bash de tous les utilisateurs sur un serveur ?

Notre petite entreprise utilise un serveur Ubuntu 11.10, auquel quelques personnes ont un accès SSH. Les terminaux actuels sont aussi parfois utilisés. Comment pouvons-nous enregistrer localement toutes les commandes Bash exécutées, avec l'utilisateur et l'horodatage ?

Nous pouvons supposer que personne n'est mal intentionné et n'essaie activement d'éviter la journalisation, mais nous préférerions tout de même que les utilisateurs n'aient pas un accès direct en écriture à leurs fichiers journaux. Les sessions simultanées doivent être gérées correctement.

39voto

Pour les interpréteurs de commandes BASH, modifiez le fichier de configuration de l'exécution BASH à l'échelle du système :

sudo -e /etc/bash.bashrc

Ajouter à la fin de ce fichier :

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Configurer l'enregistrement pour "local6" avec un nouveau fichier :

sudo -e /etc/rsyslog.d/bash.conf

Et le contenu...

local6.*    /var/log/commands.log

Redémarrer rsyslog :

sudo service rsyslog restart

Déconnexion. Connectez-vous. Voilà !

Mais j'ai oublié la rotation des journaux :

sudo -e /etc/logrotate.d/rsyslog

Il existe une liste de fichiers journaux à faire tourner de la même manière...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

Ajoutez donc le nouveau fichier journal des commandes bash dans cette liste :

/var/log/commands.log

Économisez.

5voto

Arnaud Leymet Points 2387

Vous pourriez utiliser snoopy .

Snoopy logger peut convenir à votre objectif. Il ne s'agit pas d'une solution de journalisation incontournable, mais plutôt d'un outil utile pour les administrateurs diligents qui préfèrent garder une trace de leurs propres actions.

Divulgation : Je suis le mainteneur de snoopy.

4voto

Sabacon Points 36458

Un système de comptabilité des processus peut s'avérer utile à cet égard, notamment la acct qui fournit les commandes lastcomm et ac.

La commande ac permet d'obtenir des statistiques sur le temps de connexion des utilisateurs, en heures. Il s'agit du temps pendant lequel l'utilisateur a été connecté au système, soit à distance via SSH ou un terminal série, soit sur la console.

La commande lastcomm affiche des informations sur les commandes précédemment exécutées. Les entrées les plus récentes sont indiquées en haut de la liste. La quantité totale de temps CPU utilisée par chaque processus est également affichée.

Un ancien tutoriel qui peut être utile est ici :

http://www.linuxjournal.com/article/6144?page=0,1

D'autres commandes de comptabilité comme last et ainsi de suite peuvent être trouvées dans ce tutoriel :

http://www.techrepublic.com/article/system-accounting-in-linux/1053377

0voto

palig Points 1861

Pour faire en sorte que les sessions multiples n'écrasent pas le fichier d'historique, vous devrez mettre "shopt -s histappend" dans un fichier de démarrage Bash. Voir aussi cette question sur le même problème.

0voto

Essayez ceci (les solutions ci-dessus ne fonctionneront pas à 100% avec bash 4.3) :

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

ceci fait la journalisation ET empêche la journalisation des timestamps qui sont utilisés pour le fichier d'historique de bash. le piège est nécessaire, puisque bash enverra les signaux au "subjob" après avoir appuyé strg+c plusieurs fois (testé avec bash 4.3). ceci forcera la déconnexion de l'utilisateur actuel (e.g. connecté avec sudo)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X