So zeichnen Sie alle Ihre Terminalsitzungen automatisch mit dem Skriptdienstprogramm auf

28

Was ich erreichen möchte, ist, dass ich meine Terminalsitzungen automatisch aufzeichnen kann, wenn ich Yakuake / Konsole verwende.

Es ist einfach zu erreichen, wenn ich zu Beginn meiner Sitzung Folgendes mache:

script -f /home/$USER/bin/shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log

Aber ich möchte das automatisch ausführen, wenn ich Yakuake starte oder einen neuen Tab öffne.

Die Verwendung von .bashrc funktioniert nicht, da eine Endlosschleife erstellt wird, wenn "script" eine neue Sitzung öffnet, die wiederum .bashrc liest und ein anderes "script" startet und so weiter.

Vermutlich muss ich Yakuake / Konsole also irgendwie skripten, um "script" einmal auszuführen, wenn ein neuer Tab geöffnet wird. Die Frage ist wie?

Stan
quelle
versuchen Sie die problematische Lösung mit dem Schleifenproblem, aber stellen Sie das execam Anfang der Zeile voran . Es sollte die script -fPID in derselben Shell starten .
Hanan N.
Interessante erweiterte Version dieser Frage ist auch, wie man Nicht-Rad-Benutzer als Root zwingt, alle ihre Sessions zu skripten ...
Yordan Georgiev

Antworten:

26

Wenn jemand seine Terminalsitzungen - einschließlich SSH-Sitzungen (!) - mithilfe des scriptDienstprogramms automatisch aufzeichnen möchte, gehen Sie wie folgt vor.

Fügen Sie die folgende Zeile am Ende .bashrcIhres Basisverzeichnisses hinzu oder auf andere Weise, /etc/bash.bashrcwenn Sie nur die Sitzungen aller Benutzer aufzeichnen möchten. Wir testen, ob der übergeordnete Prozess von Shell nicht vorhanden ist, scriptund führen ihn dann aus script.

Für Linux:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -f $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

Wechseln Sie für BSD und macOS script -fzu script -F:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -F $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

Das ist alles!

Wenn Sie jetzt ein neues Terminal öffnen, sehen Sie:

Script started, file is /home/username/file_name.log

scriptschreibt Ihre Sitzungen in eine Datei in Ihrem Home-Verzeichnis und benennt sie in etwa 30-Nov-11_00-11-12_shell.logso.

Mehr anpassung:

  • Sie können Ihre Sitzungen an eine große Datei anhängen, anstatt für jede Sitzung mit eine neue zu erstellen script -a /path/to/single_log_file
  • Sie können einstellen, wohin die Dateien geschrieben werden, indem Sie den Pfad nach script -f(Linux) oder script -F(BSD und macOS) ändern.

Diese Antwort setzt scriptnatürlich voraus, dass Sie installiert haben . Auf Debian-basierten Distributionen scriptist Teil des bsdutilsPakets.

Stan
quelle
Sie können Ihre Frage und deren Titel selbst bearbeiten. Klicken Sie einfach auf die editSchaltfläche, die direkt darunter angezeigt wird.
Mat
8
Möglicherweise möchten Sie ein ${RANDOM}und / oder $$zum Dateinamen hinzufügen, da das Starten von zwei Shells innerhalb einer Sekunde zu einer Kollision von Dateinamen führt. Persönlich script.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.logstelle ich oft sicher, dass die Dateien automatisch nach Datum und Uhrzeit sortiert werden und dass sie innerhalb von TZ konsistent sind. Ich kenne den Host, der sie initiiert hat, ich kenne den Besitzprozess und es gibt keine Namenskollisionen. Ich benutze ${USER}es selten, weil es normalerweise nur für mich ist.
Nicerobot
"Vergewissern Sie sich, dass Sie / var / log / script erstellt und für andere schreibbar gemacht haben", haben Sie geschrieben. Ich habe mich gefragt, ob es aus Sicherheitsgründen ratsam ist, in diesem Fall "sudo chmod 777 / var / log / script" zu verwenden.
Teo
10

Obwohl diese Frage von einer Person gestellt wurde, die ihre eigenen Sitzungen aufzeichnen wollte, kann ein alternativer Anwendungsfall ein Systemadministrator sein, der verfolgen möchte, was verschiedene Benutzer tun.

Ich befürchte, dass eine scriptsystemweite Ausführung bashrcnicht für den Fall geeignet ist, dass Benutzer der Maschine es ablehnen, Aufzeichnungen ihrer Sitzungen anzufertigen.

Benutzer, die inkognito bleiben möchten, können die Protokollierung umgehen, indem sie sshd auffordern, eine andere Shell zu öffnen (z. B. zsh), oder ausführen bash --rcfile ___, um /etc/bash.bashrcdas Laden zu verhindern .

Ein alternativer Ansatz

In diesem Handbuch aus dem Jahr 2008 ( archiviert ) wird eine andere Methode verwendet , um scriptdie Ausführung zu erzwingen , wenn sich ein Benutzer mit ssh anmeldet. Dazu müssen sich Benutzer mit einem öffentlichen / privaten Schlüssel anmelden.

Dazu fügen Sie der Benutzerdatei .ssh/authorized_keysvor dem Schlüssel ein Skript hinzu :

command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....

Das log-session( archivierte ) Skript entscheidet dann, ob es ausgeführt wird oder nicht, um /usr/bin/scriptdie Sitzung dieses Benutzers zu protokollieren.

exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE

Um zu verhindern, dass der Benutzer den hinzugefügten Befehl entfernt, muss der Administrator den Besitz der Benutzerdatei übernehmen authorized_keys.

chown root:root ~user/.ssh/authorized_keys

Leider bedeutet dies, dass der Benutzer keine zusätzlichen Schlüssel selbst hinzufügen oder, was noch wichtiger ist, den vorhandenen Schlüssel widerrufen kann, wenn er kompromittiert wurde, was alles andere als ideal ist.

Vorbehalte

In der Standardkonfiguration von sshd ist es üblich, dass Benutzer SFTP über ihre ssh-Anmeldung ausführen können. Auf diese Weise können Benutzer Dateien bearbeiten, ohne dass die Änderungen protokolliert werden. Wenn der Administrator nicht möchte, dass Benutzer dies tun können, sollte er entweder die Protokollierung für SFTP aktivieren oder den Dienst deaktivieren. Auch dann können Benutzer noch unsichtbare Änderungen an Dateien vornehmen, indem sie auf ihrem Terminal Folgendes ausführen:

curl "http://users.own.server/server/new_data" > existing_file

Möglicherweise können solche Änderungen mithilfe eines Copy-on-Write-Dateisystems überwacht werden, das den gesamten Dateiversionsverlauf aufzeichnet.

Ein ähnlicher Trick würde es einem Benutzer ermöglichen, Befehle auszuführen, ohne dass sie protokolliert werden:

curl "http://users.own.server/server/secret_commands_824" | sh

Ich kenne keine einfachen Lösungen dafür. Möglichkeiten könnten sein:

  • Alle Netzwerkdaten protokollieren (und später entwirren).
  • Protokollierung aller Systemaufrufe.

So etwas könnte mit auditd möglich sein .

Aber wie auch immer...

Es ist unwahrscheinlich, dass die Protokollierung von Benutzersitzungen Administratoren echte Sicherheit bietet. Standardmäßig kann ein Benutzer nur seine eigenen Dateien manipulieren und das System nicht beschädigen. Wenn ein böswilliger Benutzer es geschafft hat, die Berechtigungen zu erweitern, kann er die Protokollierung deaktivieren und die Protokolle löschen (es sei denn, der Administrator hat Protokolle so konfiguriert, dass sie nur anhängbar auf einem separaten Computer gespeichert werden).

Administratoren, die Benutzersitzungen automatisch protokollieren, sollten die Benutzer wahrscheinlich darüber informieren . In einigen Gerichtsbarkeiten verstößt diese Form der Datenerfassung möglicherweise gegen Datenschutzgesetze . Zumindest wäre es den Nutzern gegenüber respektvoll, sie darauf aufmerksam zu machen.

Es ist wahrscheinlicher, dass ein Administrator daran interessiert ist, die Sitzungen von sudoBenutzern zu protokollieren . Das könnte vielleicht in einer anderen Antwort oder in einer anderen Frage angegangen werden.

joeytwiddle
quelle
2

Anstatt:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||

Ich würde ... benutzen:

grep -qx "$PPID" <(pgrep -x "script") ||

Die doppelten Anführungszeichen sind in diesem Fall nicht erforderlich, aber ich neige dazu, sie trotzdem als Standard zu verwenden. Ich empfehle auf jeden Fall, den Schalter "x" sowohl für das grep als auch für das pgrep zu verwenden, um eine seltene, aber problematische Übereinstimmung mit Teilzeichenfolgen zu vermeiden.

William Dye
quelle