Pour savoir quelle IP a exécuté une certaine commande sous Linux en utilisant ssh

10

Il existe un serveur auquel de nombreux utilisateurs accèdent à l'aide de ssh. J'essaie de comprendre quel utilisateur a exécuté une certaine commande.

Je peux connaître la liste des utilisateurs accédant actuellement au serveur en utilisant who également Je connais la liste des commandes exécutées en utilisant history.

Mais comment savoir quel utilisateur a exécuté une commande comme cp file1.sh file2.shsur le serveur? L'utilisateur a déjà exécuté la commande et s'est déconnecté

Manu K Mohan
la source

Réponses:

4

Chaque nouvel utilisateur se connectant génère une nouvelle sshdsession avec un PID spécifique. Vous pouvez utiliser pstreepour imprimer les commandes héritées de quelle sshdsession, puis recouper ce PID /var/log/auth.log.

Exemple (anonymisé): je me suis connecté à un serveur distant avec 3 sessions simultanées, avec le même utilisateur distant. Je veux maintenant savoir de quelle adresse IP le client est venu qui a exécuté la commande watch date.

$ pstree -p | grep watch
        |           |-sshd(15243)---sshd(15342)---bash(15343)---watch(15450)
$ sudo grep 15243 /var/log/auth.log
Mar  7 15:37:29 XXXXXXXXXX sshd[15243]: Accepted publickey for XXXXXXXXXX from 12.34.56.78 port 48218 ssh2
Mar  7 15:37:29 XXXXXXXXXX sshd[15243]: pam_unix(sshd:session): session opened for user XXXXXXXXXX by (uid=0)
Mar  7 15:37:44 XXXXXXXXXX sudo: XXXXXXXXXX : TTY=pts/7 ; PWD=/home/XXXXXXXXXX ; USER=root ; COMMAND=/bin/grep 15243 /var/log/auth.log

pstree -pmontre que la watchcommande est héritée de sshdPID 15243. greping pour ce PID en /var/auth/auth.logmontre que c'est IP 12.34.56.78 qui a démarré cette session. C'est donc également l'utilisateur qui a démarré watch.

Quant à trouver historyspécifiquement pour cet utilisateur, il ne peut pas être fait à partir de ce que je peux voir lorsque tous les utilisateurs distants utilisent le même utilisateur SSH local. De plus, il peut facilement être usurpé / inactivé / etc., il n'est donc pas vraiment fiable. Si elle est enregistrée dans le fichier historique, vous pouvez simplement rechercher la cpcommande et regarder en arrière dans le fichier, mais si elle n'est pas là, alors il n'y a pas grand-chose à faire.

Daniel Andersson
la source
Il dit cette erreur grep: /var/log/auth.log: No such file or directory:-(
Manu K Mohan
@ManuKMohan: Vous n'avez pas indiqué sur quel système vous vous trouvez. Sous RHEL / Fedora / Scientific Linux / etc., Le fichier correspondant est /var/log/secure.
Daniel Andersson
Anderson J'utilise Ubuntu
Manu K Mohan
@ManuKMohan: Si /var/log/auth.log.1, etc., existent, essayez-les pour voir s'ils contiennent les informations. Ensuite, redémarrez rsyslog( sudo service rsyslog restart) et voyez s'il commence à se remplir auth.log, ce qu'il devrait déjà faire. SSHD se connecte /var/log/auth.logpar défaut dans Ubuntu , donc à moins que vous n'ayez explicitement modifié les cibles de journalisation via /etc/ssh/ssd_configou /etc/syslog.conf(vous pouvez vérifier dans quel fichier le authniveau est enregistré ici), il devrait y être. Sinon: quelque chose ne va pas :-).
Daniel Andersson
1

Vous pouvez ajouter ces deux lignes à / etc / profile ou / etc / bashrc afin de consigner toutes les commandes exécutées par bash:

whoami="$(whoami)@$(echo $SSH_CONNECTION | awk '{print $1}')"                                                                                                  
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local3.debug "$whoami [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Cela utilisera syslog pour enregistrer chaque commande exécutée avec l'utilisateur qui l'a fait et son adresse IP dans un format comme celui-ci:

Jan  8 08:43:49 xpto local3.debug root: root@192.168.x.y [29385]: ls -al [0]

De plus, vous pouvez ajouter la ligne ci-dessous à votre configuration syslog (/etc/syslog.conf) pour rediriger les messages local3 vers un fichier spécifique.

local3.*                                                /var/log/prompt.log
Filipe
la source
Maintenant, c'est syslog-ngcomme amélioration et le fichier de configuration l'est /etc/syslog-ng/syslog-ng.conf .
Timo
1

Vous pouvez utiliser snoopy pour cela.

Vous devez le configurer pour enregistrer la variable d'environnement personnalisée (SSH_CLIENT) en spécifiant IP =% {env: SSH_CLIENT} dans la définition du format de message de journal (indicateur ./configure ou configurable dans snoopy.ini depuis la version 2.x).

Divulgation: Snoopy mainteneur ici.

Bostjan Skufca
la source
0

En supposant que vous utilisez bash, historyvous n'afficherez que VOTRE historique de ligne de commande. Par défaut, il lit ~/.bash_historyl'historique. Notez que cela peut être changé (bien que très peu probable) en faisant quelque chose comme HISTFILE=/home/userFoo/.my_alt_history.

En supposant que vous êtes root sur la boîte, vous pouvez parcourir tous les répertoires de l'utilisateur et lire leurs historiques pour voir qui exécute cette commande.

user1146334
la source
Oh, et s'ils sont néfastes, ils pourraient facilement effacer cette commande de leur histoire. S'ils sont activement sur la boîte exécutant la commande, vous pouvez le voir avecps -aux | grep "cp file1.sh file2.sh"
Tous les utilisateurs accèdent à distance au même nom d'utilisateur du serveur à l'aide de ssh. Je veux savoir quelle adresse IP a accédé à cet utilisateur et exécuté la commande.
Manu K Mohan
Ce n'est pas une bonne politique que de nombreux utilisateurs partagent un nom d'utilisateur et un mot de passe.
pjc50