web-dev-qa-db-fra.com

Comment enregistrer la connexion / la commande client SSH?

J'aimerais savoir comment je pourrais enregistrer les lignes de commande SSH un utilisateur utilise sur un serveur. Pour un exemple, si l'utilisateur Alex sur mon serveur effectue les commandes suivantes:

$ cd /tmp
$ touch myfile
$ ssh [email protected]
$ ssh [email protected]
$ vim anotherfile
$ ssh [email protected]

Je souhaite enregistrer les commandes SSH utilisées sur le serveur dans un fichier qui ressemble à:

[2014-07-25 10:10:10] Alex : ssh [email protected]
[2014-07-25 10:18:20] Alex : ssh [email protected]
[2014-07-25 11:15:10] Alex : ssh [email protected]

Je ne me soucie pas de ce qu'il a fait pendant sa session SSH, je veux juste savoir quand et où il a fait une connexion à un autre serveur.

L'utilisateur n'utilise pas bash et j'aimerais éviter de manipuler .bash_history quand même lorsque l'utilisateur peut le modifier.

Tout indice à ce sujet?

Merci :)

eDIT: Pour être plus précis:

un utilisateur se connecte à un serveur A puis connecte à partir du serveur A au serveur B. Je souhaite suivre le serveur auquel il se connecte via SSH du serveur A.

5
Kevin Merigot

Vous pouvez le faire de trois manières différentes comme je le vois - il y a probablement beaucoup d'autres moyens de le faire aussi! La meilleure méthode serait de joindre un outil d'audit aux appels des noyaux Sysexec afin qu'il soit introuvable par l'utilisateur, etc. Les deux autres manières seraient simplement de modifier l'environnement Shell pour la connecter.

Au lieu de moi (attraper le code/réponses de Google) vous indiquant comment le faire. Je vais vous donner des liens vers des sites qui ont déjà expliqué cela détaillé. J'espère que c'est exactement ce dont vous avez besoin.

BTW, le moyen le plus simple est de loin simplement pour inclure quelque chose dans votre principal bishrc/profil pour affecter tous les utilisateurs.

Quoi qu'il en soit, voici des liens vers des solutions BACHRC.

1) Solution BASHRC: Comment enregistrer les commandes exécutées par tous les utilisateurs de Linux? 2) Solution Bashrc/Trap: Bash: Historique à Syslog

L'autre sens (niveau du noyau) serait d'examiner les outils d'audit ou d'ACCT. Il existe de nombreux sites qui vous indiquent comment configurer la journalisation des commandes via Kernel Sysexec appels.

3
davidbl

Voici un script que vous pouvez utiliser pour capturer l'ID utilisateur et d'autres informations pour mettre dans un logfile avant de lancer le SSH. Je l'ai testé avec plusieurs commandes de SSH multilignes très complexes.

#!/bin/bash

# Title......: ssh (wrapper)
# Description: this script replaces the ssh binary and runs the real binary after logging the connection attempt

# variables
#----------------------------------
REALBINARY=/usr/bin/sshu
THISHOST=$(uname -n)
LOGFILE=/var/log/sshclient.log
CALLINGPROC=$(ps -o comm= $PPID)

log() {  # creates a basic log entry; $LOGFILE must be defined
 echo "$(date '+%Y-%m%d %H:%M:%S %Z') $$  $*">>$LOGFILE
}

SSHTARGETOPTS=$(echo "$@" | head -1)
while getopts :l: OPT 2> /dev/null
do
 case "$OPT" in
  l) TARGETUSER="$OPTARG" ;;
 esac
done

#after parsing with getopts, OPTIND will be the positional parameter number of the first argument after the options
FIRSTARG=$(echo $SSHTARGETOPTS | awk "{print \$$OPTIND}")
#if there is an '@' symbol in the FIRSTARG, parse out the LOGIN and TARGETSERVER, if not, TARGETSERVER is FIRSTARG
if [[ "$FIRSTARG" =~ '@' ]] ; then
 TARGETUSER="${FIRSTARG%@*}"
 TARGETSERVER=${FIRSTARG##*@}
else
 TARGETSERVER="$FIRSTARG"
fi
TARGETUSER="${TARGETUSER:-$LOGNAME}"

if [[ "$Sudo_USER" ]] ; then
 log "$THISHOST CallingProc='$CALLINGPROC' Sudo_USER='$Sudo_USER' became LOGNAME='$LOGNAME' ssh to TARGETSERVER='$TARGETSERVER' as TARGETUSER='$TARGETUSER' with command '$0 $SSHTARGETOPTS'"
else
 log "$THISHOST CallingProc='$CALLINGPROC' LOGNAME='$LOGNAME' ssh to TARGETSERVER='$TARGETSERVER' as TARGETUSER='$TARGETUSER' with command '$0 $SSHTARGETOPTS'"
fi

exec $REALBINARY "$@"
2
raker