Wie kann ich eine lokale Aufzeichnung mit Zeitstempel aller Remote-Befehle führen, die ich verwende ssh
(Befehlszeilen-OpenSSh-Client wurde über gestartet bash
)?
Bedarf:
Wesentlich:
- 100% clientseitig ohne Serverprotokollierung
- Konfiguriert oder installiert pro Benutzer mit Protokollen, die im Home-Verzeichnis des Benutzers gespeichert sind.
- Unterstützung für die Unterscheidung zwischen mehreren gleichzeitigen Sitzungen mit verschiedenen Benutzern und Hosts.
- Nicht aufdringlich (muss nicht jedes Mal aktiviert werden und beeinträchtigt die Verwendung von ssh nicht wesentlich)
Hohe Priorität:
- Entweder wird die Ausgabe nicht so weit wie möglich protokolliert oder herausgefiltert
- Entweder werden Passworteinträge nicht protokolliert oder die Datei wird verschlüsselt
- Zeigt die tatsächlich verwendeten Befehle an (nachdem Tab / Verlauf abgeschlossen wurde, wurden Backspaces, CTRL+ Cusw. verarbeitet).
Schön zu haben:
- Protokolliert auch Befehle in verketteten Sitzungen (Befehle, die während der Remote- Sitzung
ssh
oder insu <user>
Sitzungen eingegeben wurden ). - Sitzungsstart und -ende sollten protokolliert werden
- Eine einfache
bash
, nicht root-basierte Lösung wäre am besten (vielleicht einalias
oder einbash
Wrapper-Skript für denssh
Befehl?)
- Protokolliert auch Befehle in verketteten Sitzungen (Befehle, die während der Remote- Sitzung
Mein Können:
- Ich bin nicht neu in der Programmierung, lerne aber noch
bash
und die "Linux-Methode", daher wären Codebeispiele mit kurzen Erklärungen sehr willkommen.
Mögliche Strategien
- Keylogger - Problem: Protokolliert Passwörter, protokolliert keine Registerkarte / Verlaufsvervollständigung (siehe Glenns Antwort )
screen
mit Scrollback-Dumping einmal pro Sekunde unddiff
dazwischen, um neue Scrollback-Zeilen zu finden - Problem: Wie kann dies auf nützliche automatisierte Weise implementiert werden?ssh "$@" | tee >(some_cleaner_function >> $logfile)
- Problem: Kann nicht mit mehrzeiligen Befehlen oder Verlauf in verketteten Sitzungen umgehen, sorgfältige Bereinigung erforderlich (siehe meine Antwort)- Eine Kombination einiger der oben genannten
Ein Beispiel
Die folgende SSH-Sitzung:
user@local:~$ ssh user@remote
Last login: Tue Jun 17 16:34:23 2014 from local
user@remote:~$ cd test
user@remote:~/test$ ls
a b
user@remote:~/test$ exit
Könnte zu einem Protokoll führen ~/logs/ssh.log
wie:
2014-06-17 16:34:50 [user@remote - start]
2014-06-17 16:34:51 [user@remote] cd test
2014-06-17 16:34:52 [user@remote] ls
2014-06-17 16:34:53 [user@remote] exit
2014-06-17 16:34:53 [user@remote - end]
Oder es wird möglicherweise für jede Sitzung ein separates Protokoll mit der Befehlszeile erstellt, mit der die Sitzung oben in der Datei gestartet wird.
bash
shell
command-line
openssh
Oleg
quelle
quelle
Antworten:
Ihre Frage hat mich fasziniert. Ich wollte ursprünglich keine Antwort geben, aber ich war süchtig.
Dies verwendet
expect
und es ist wirklich ein Key Logger.Anmerkungen:
uptime
Befehl) eingibt, wird in der Protokolldatei "upp \ t" angezeigt, nicht "uptime".^?
(Rücktaste-) Zeichen in der Protokolldatei angezeigt.quelle
Ich verwende derzeit das unten stehende Bash-Skript. Es hat viele Probleme, aber es ist die einzige Lösung, die ich gefunden habe und die alle Anforderungen, Prioritäten und "nice to haves" (zumindest die meiste Zeit) erfüllt.
In dieser Antwort wird erläutert, warum das lokale Protokollieren von SSH-Sitzungen so schwierig ist.
Probleme mit dem Skript, die ich bisher gefunden habe:
Mehrzeilige Befehle verursachen Probleme:
Verkettete Sitzungen (Verwenden von
ssh
odersu
Befehle am Remote-Ende) führen dazu, dass beim Scrollen des Verlaufs anstelle der tatsächlich verwendeten Befehle gescrollte Befehle aufgezeichnet werdenDie regulären Ausdrücke können verbessert werden und müssen möglicherweise für bestimmte Umgebungen geändert werden:
cat -v
vor dem Reinigen nicht druckbare Zeichen konvertiere . Infolgedessen kann gültiger Inhalt entfernt werden, wenn Sie jemals Zeichenfolgen wie^[[
in Ihren Befehlen verwenden.Kein Bash-Abschluss des SSH-Befehls, z. B. für den Hostnamen.Sie können bash Abschluss erhalten , wenn Sie dieses Skript Aliasssh
mitalias ssh="sshlog"
Skriptquelle und Installation:
Fügen Sie zur Installation Folgendes in ~ / bin / sshlog ein und machen Sie es ausführbar. Rufen Sie an mit
sshlog <ssh command options>
. Optional Alias 'ssh' in der .bashrc-Datei des Benutzers.Beispiel für einen Protokollinhalt:
quelle
Ich habe eine weniger komplizierte Antwort und sicherlich keinen Keylogger. Ich verstehe nicht, dass Sie vom Serverprotokoll unabhängig sind (dies bedeutet, dass alle Aktionen auf dem Server ausgeführt werden müssen und alle Protokolle serverseitige Protokolle sind), und daher dachte ich, dass eine gute Idee darin besteht, an systemweites bashrc zu übergeben ein Eingabeaufforderungsbefehl wie:
In Debian sollten Sie die Datei: /etc/bash.bashrc und in Centos die Datei / etc / bashrc bearbeiten
Wenn Sie mit der Protokollierung für die Sitzung beginnen möchten, in der Sie sich befinden, müssen Sie die von Ihnen bearbeitete Datei als Quelle angeben, z. B. ausführen:
in einem Debian-System oder
in einem Centos-System.Von nun an wird jeder Befehl jeder SSH-Sitzung unter / var / log / syslog auf einem Debian-System und unter / var / log / messages auf einem Centos-System protokolliert.
Wenn Sie sie in einer separaten Datei protokollieren und nicht mit anderen Protokolldateien verwechseln möchten, können Sie Folgendes verwenden:
Anstelle des vorherigen PROMPT_COMMAND-Beispiels konfigurieren Sie dann das rsyslogd nach Bedarf.Bearbeiten Sie beispielsweise in einem Debian-System die Datei /etc/rsyslog.conf : Ändern Sie die Zeile:
zu und fügen Sie die folgende Zeile am Ende der Datei hinzu:dann ausführen:
quelle
Wie wäre es
strace -o /tmp/ssh_log -ff -s8192 -T -ttt -fp $(pidof sshd)
? Dies protokolliert alle SSH-Sitzungen. Sie können ein Werkzeug benötigen , das Protokoll anschließend, oder einfach nur Gebrauch zu analysierengrep
,awk
usw.-f
: Spur gegabelte Kinder-ff
: Melden Sie jedes Kind separat anssh_log.PID
-s8192
: Erhöhen Sie das String-Protokollierungslimit (falls erforderlich).-T -ttt
: Mikrosekundenstempelung in Sekunden seit der Epoche-p N
: an pid anhängenN
quelle