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

21

Notre petite entreprise gère un serveur Ubuntu 11.10, auquel deux personnes ont accès SSH. Les terminaux réels sont parfois également utilisés. Comment pouvons-nous enregistrer localement toutes les commandes Bash exécutées, ainsi que l'utilisateur et l'horodatage?

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

Étain
la source

Réponses:

32

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

sudo -e /etc/bash.bashrc

Ajoutez à la fin de ce fichier:

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

Configurer la journalisation pour "local6" avec un nouveau fichier:

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

Et le contenu ...

local6.*    /var/log/commands.log

Redémarrez rsyslog:

sudo service rsyslog restart

Connectez - Out. Connectez-vous. Voila!

Mais j'ai oublié la rotation des journaux:

sudo -e /etc/logrotate.d/rsyslog

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

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

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

/var/log/commands.log

Sauver.


la source
J'ai oublié la rotation du journal que j'ai ajoutée à la réponse.
1
Cette méthode fonctionne, mais je pourrais inventer une méthode autour d'elle (avec csh, .bash_logout peut-être). J'irais avec la solution acct de Sabacon. Ce sont d'excellentes lectures: linuxjournal.com/article/6144 et beginlinux.com/blog/2010/01/…
2
Je crois que cela peut être facilement désactivé par l'utilisateur en réinitialisant ou en désinstallant PROMPT_COMMANDou en exécutant simplement un shell non bash.
Stefan Lasiewski
1
@Benubird, il semble qu'il y ait quelques niveaux d'installation prédéfinis, 8 d'entre eux étant local0-local7: en.wikipedia.org/wiki/Syslog . 0 signifie urgence, 7 signifie débogage et 6 est juste timide de 7, "messages opérationnels normaux".
munchybunch
1
@yukashima parce que les journaux peuvent devenir de gros fichiers s'ils ne sont pas supprimés, la rotation signifie faire pivoter les fichiers journaux et supprimer les plus anciens pour garder les journaux plus petits ...
Badr Elmers
4

Un système de comptabilité des processus peut être utile à cet égard, en particulier le package acct qui fournit les commandes lastcomm et ac.

Les commandes ac impriment des statistiques sur le temps de connexion des utilisateurs, en heures. Il s'agit de la durée pendant laquelle 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 données en haut de la liste. La quantité totale de temps processeur 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

Sabacon
la source
lastcomm est assez inutile comme enregistreur de commandes. Il enregistre uniquement l'exécutable qui a été exécuté. Aucun argument, commutateur ou chemin d'accès n'est enregistré.
Phil_1984_
3

Vous pouvez utiliser snoopy .

L'enregistreur Snoopy peut convenir à votre objectif. Il n'est pas destiné à être une solution de journalisation inévitable, mais plutôt un outil utile pour les administrateurs diligents qui préfèrent suivre leurs propres actions.

Divulgation: Je suis le mainteneur snoopy.

Bostjan Skufca
la source
Veuillez fournir des instructions sur son installation et son utilisation dans la réponse.
muru
1
Des instructions d'installation détaillées sont disponibles sur la page github de snoopy, qui est la principale ressource snoopy en ce moment: github.com/a2o/snoopy . Je fournis à nouveau des instructions d'installation dans d'autres endroits, car l'emplacement principal est maintenu par la conception et d'autres non. BTW Readme vient d'être mis à jour pour être plus structuré.
Bostjan Skufca
1
Peut-être. Mais sans même un résumé des étapes nécessaires pour l'utiliser, il s'agit d'une réponse de lien uniquement et susceptible d'être supprimée.
muru
1
Eh bien, j'ai fourni un pointeur vers une solution alternative et viable. Si ce n'est pas le but de ce site, alors il devrait certainement être supprimé, avec mon compte.
Bostjan Skufca
2
@BostjanSkufca n'a pas besoin d'être offensé. C'est juste une chose Stack Exchange d'avoir au moins des réponses raisonnablement autonomes. Si vous êtes si fortement opposé à l'ajout d'étapes, c'est votre souhait. Mon downvote reste. Quelqu'un le votera probablement.
muru
3

Vous pouvez trouver ici un script pour consigner toutes les commandes / commandes bash dans un fichier texte ou un serveur syslog sans utiliser de correctif ou un outil exécutable spécial.

Très facile à déployer, car il s'agit d'un simple script shell qui doit être appelé une fois lors de l'initialisation du bash .

C'est gratuit et j'espère qu'il répond à vos besoins.

François Scheurer
la source
1
C'est une bonne réponse, mais il est préférable d'inclure les étapes et le script dans le corps de la réponse, au lieu de créer un lien vers votre blog. Pouvez-vous modifier votre réponse pour l'inclure?
Tom Brossman
2
Site désormais indisponible
Gaia
0

Pour prendre soin de plusieurs sessions sans écraser 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.

pdp
la source
0

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;'

cela fait la journalisation ET il empêche la journalisation des horodatages utilisés pour le fichier d'historique bash. le piège est nécessaire, car bash enverra les signaux au "sous-emploi" après avoir appuyé plusieurs fois sur strg + c (testé avec bash 4.3). cela forcera la déconnexion de l'utilisateur actuel (par exemple connecté avec sudo)

Hans-Joachim Kliemeck
la source
0

Vous pouvez également essayer d'installer acct. Acct conserve une piste d'audit détaillée de ce qui se fait sur vos systèmes Linux.

sudo apt-get install acct
edwinksl
la source