Um zu wissen, welche IP einen bestimmten Befehl unter Linux mit ssh ausgeführt hat

10

Es gibt einen Server, auf den viele Benutzer mit ssh zugreifen. Ich versuche herauszufinden, welcher Benutzer einen bestimmten Befehl ausgeführt hat.

Ich kann die Liste der Benutzer kennen, die derzeit mit auf den Server zugreifen. who Außerdem kenne ich die Liste der Befehle, die mit ausgeführt werden history.

Aber woher weiß man, welcher Benutzer einen Befehl wie cp file1.sh file2.shauf dem Server ausgeführt hat? Der Benutzer hat den Befehl bereits ausgeführt und sich abgemeldet

Manu K Mohan
quelle

Antworten:

4

Jeder neue Benutzer, der eine Verbindung herstellt, erzeugt eine neue sshdSitzung mit einer bestimmten PID. Sie können pstreedrucken, welche Befehle von welcher sshdSitzung geerbt werden , und diese PID dann überprüfen /var/log/auth.log.

Beispiel (anonymisiert): Ich habe mich mit 3 gleichzeitigen Sitzungen bei einem Remote-Server mit demselben Remote-Benutzer angemeldet. Ich möchte jetzt herausfinden, von welcher IP der Client kam, der den Befehl ausgeführt hat 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 -pzeigt, dass der watchBefehl von sshdPID 15243 geerbt wurde. Wenn grepfür diese PID in /var/auth/auth.loggezeigt wird, dass IP 12.34.56.78 diese Sitzung gestartet hat. Daher ist dies auch der Benutzer, der gestartet hat watch.

Das Finden historyfür speziell diesen Benutzer kann nicht anhand dessen erfolgen, was ich sehen kann, wenn alle Remotebenutzer denselben lokalen SSH-Benutzer verwenden. Außerdem kann es leicht gefälscht / inaktiviert / usw. werden, so dass es nicht wirklich zuverlässig ist. Wenn es in der Verlaufsdatei gespeichert ist, können Sie einfach nach dem cpBefehl suchen und in der Datei rückwärts schauen. Wenn er jedoch nicht vorhanden ist, gibt es nicht viel zu tun.

Daniel Andersson
quelle
Es sagt diesen Fehler grep: /var/log/auth.log: No such file or directory:-(
Manu K Mohan
@ManuKMohan: Sie haben nicht angegeben, auf welchem ​​System Sie sich befinden. Unter RHEL / Fedora / Scientific Linux / etc. Ist die entsprechende Datei /var/log/secure.
Daniel Andersson
Anderson Ich benutze Ubuntu
Manu K Mohan
@ManuKMohan: Wenn /var/log/auth.log.1usw. vorhanden sind, versuchen Sie es, um festzustellen , ob sie die Informationen enthalten. Starten Sie anschließend neu rsyslog( sudo service rsyslog restart) und prüfen Sie, ob es mit dem Auffüllen beginnt auth.log, was bereits geschehen sollte. SSHD meldet sich /var/log/auth.logstandardmäßig in Ubuntu an . Wenn Sie also die Protokollierungsziele nicht explizit über /etc/ssh/ssd_configoder geändert haben /etc/syslog.conf(Sie können hier überprüfen, in welcher Datei die authEbene protokolliert wird), sollte sie dort vorhanden sein. Wenn nicht: etwas ist los :-).
Daniel Andersson
1

Sie können diese beiden Zeilen zu / etc / profile oder / etc / bashrc hinzufügen, um alle von bash ausgeführten Befehle zu protokollieren:

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]"'

Dabei wird syslog verwendet, um jeden ausgeführten Befehl zusammen mit dem Benutzer und seiner IP-Adresse in einem Format wie dem folgenden aufzuzeichnen:

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

Zusätzlich können Sie die folgende Zeile zu Ihrer Syslog-Konfiguration (/etc/syslog.conf) hinzufügen, um die local3-Nachrichten in eine bestimmte Datei umzuleiten.

local3.*                                                /var/log/prompt.log
Filipe
quelle
Jetzt ist es syslog-ngals Verbesserung und die Konfigurationsdatei ist /etc/syslog-ng/syslog-ng.conf .
Timo
1

Sie könnten dafür snoopy verwenden .

Sie müssten es so konfigurieren, dass eine benutzerdefinierte Umgebungsvariable (SSH_CLIENT) protokolliert wird, indem Sie IP =% {env: SSH_CLIENT} in der Definition des Protokollnachrichtenformats angeben (Flag ./configure oder konfigurierbar in snoopy.ini seit Version 2.x).

Offenlegung: Snoopy Betreuer hier.

Bostjan Skufca
quelle
0

Angenommen, Sie verwenden bash, historywird nur IHR Befehlszeilenverlauf angezeigt . Standardmäßig wird der Verlauf gelesen ~/.bash_history. Beachten Sie, dass dies geändert werden kann (obwohl dies höchst unwahrscheinlich ist), indem Sie so etwas tun HISTFILE=/home/userFoo/.my_alt_history.

Angenommen, Sie befinden sich im Stammverzeichnis der Box, können Sie alle Verzeichnisse des Benutzers durchsuchen und deren Verlauf lesen, um festzustellen, wer diesen Befehl ausführt.

user1146334
quelle
Oh, und wenn sie schändlich sind, könnten sie diesen Befehl leicht aus ihrer Geschichte streichen. Wenn sie sich aktiv auf der Box befinden, auf der der Befehl ausgeführt wird, können Sie ihn mitps -aux | grep "cp file1.sh file2.sh"
Alle Benutzer greifen über ssh remote auf denselben Benutzernamen des Servers zu. Ich möchte wissen, welche IP auf diesen Benutzer zugegriffen und den Befehl ausgeführt hat.
Manu K Mohan
Es ist keine gute Richtlinie, wenn viele Benutzer einen Benutzernamen und ein Kennwort teilen.
pjc50