Wie protokolliere ich alle Bash-Befehle aller Benutzer auf einem Server?

21

Unsere kleine Firma betreibt einen Ubuntu Server 11.10, auf den einige Leute SSH-Zugriff haben. Manchmal werden auch die eigentlichen Terminals verwendet. Wie können wir alle Bash-Befehle zusammen mit Benutzer- und Zeitstempel lokal protokollieren?

Wir können davon ausgehen, dass niemand schändlich ist und aktiv versucht, die Protokollierung zu vermeiden, aber wir würden es dennoch vorziehen, dass die Benutzer keinen direkten Schreibzugriff auf ihre Protokolldateien haben. Gleichzeitige Sitzungen müssen korrekt behandelt werden.

Zinn
quelle

Antworten:

32

Bearbeiten Sie für BASH-Shells die systemweite BASH-Laufzeitkonfigurationsdatei:

sudo -e /etc/bash.bashrc

An das Ende dieser Datei anhängen:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Richten Sie die Protokollierung für "local6" mit einer neuen Datei ein:

sudo -e /etc/rsyslog.d/bash.conf

Und der Inhalt ...

local6.*    /var/log/commands.log

Starten Sie rsyslog neu:

sudo service rsyslog restart

Ausloggen. Einloggen. Voila!

Aber ich habe die Holzrotation vergessen:

sudo -e /etc/logrotate.d/rsyslog

Es gibt eine Liste von Protokolldateien, die auf die gleiche Weise gedreht werden können ...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

Fügen Sie also die neue bash-command-Protokolldatei in diese Liste ein:

/var/log/commands.log

Speichern.


quelle
Ich habe die Protokollrotation vergessen, die ich der Antwort hinzugefügt habe.
1
Dieser Weg funktioniert, aber ich könnte eine Methode dafür erfinden (mit csh, vielleicht .bash_logout). Ich würde mich für Sabacons Lösung entscheiden. Dies waren ausgezeichnete Ergebnisse : linuxjournal.com/article/6144 und beginlinux.com/blog/2010/01/…
2
Ich glaube, dass dies vom Benutzer leicht deaktiviert werden kann, indem einfach PROMPT_COMMANDeine Nicht-Bash-Shell zurückgesetzt oder deaktiviert oder ausgeführt wird.
Stefan Lasiewski
1
@Benubird es sieht so aus, als gäbe es ein paar voreingestellte Einrichtungsstufen, von denen 8 local0-local7 sind: en.wikipedia.org/wiki/Syslog . 0 bedeutet Notfall, 7 bedeutet Debug, und 6 ist nur knapp bei 7, "normalen Betriebsmeldungen".
Munchybunch
1
@yukashima, da Protokolle zu großen Dateien werden können, wenn sie nicht gelöscht werden. Drehen bedeutet, dass die Protokolldateien gedreht und die älteren gelöscht werden, um die Protokolle kleiner zu halten ...
Badr Elmers
4

In dieser Hinsicht kann ein Prozessabrechnungssystem hilfreich sein, insbesondere das Paket acct , das die Befehle lastcomm und ac bereitstellt.

Der Befehl ac gibt eine Statistik über die Verbindungszeit der Benutzer in Stunden aus. Dies ist die Zeitspanne, in der der Benutzer über SSH oder ein serielles Terminal oder über die Konsole mit dem System verbunden war.

Der Befehl lastcomm zeigt Informationen zu den zuvor ausgeführten Befehlen an. Die neuesten Einträge stehen oben in der Liste. Außerdem wird die Gesamt-CPU-Zeit angezeigt, die jeder Prozess verwendet hat.

Ein altes Tutorial, das hilfreich sein könnte, ist hier:

http://www.linuxjournal.com/article/6144?page=0,1

Andere Abrechnungsbefehle wie last und so weiter finden Sie in diesem Tutorial:

http://www.techrepublic.com/article/system-accounting-in-linux/1053377

Sabacon
quelle
lastcomm ist als Befehlslogger ziemlich sinnlos. Es wird nur die ausführbare Datei aufgezeichnet, die ausgeführt wurde. Es werden keine Argumente, Schalter oder Pfade protokolliert.
Phil_1984_
3

Sie könnten snoopy verwenden .

Der Snoopy Logger passt möglicherweise gut zu Ihrem Zweck. Es ist nicht als unvermeidbare Protokollierungslösung gedacht, sondern als hilfreiches Tool für fleißige Administratoren, die lieber den Überblick über ihre eigenen Aktionen behalten möchten.

Offenlegung: Ich bin snoopy Betreuer.

Bostjan Skufca
quelle
Bitte geben Sie in der Antwort Anweisungen zur Installation und Verwendung.
muru
1
Detaillierte Installationsanweisungen finden Sie auf der Snoopy Github-Seite, die derzeit die wichtigste Snoopy-Ressource darstellt: github.com/a2o/snoopy . Ich erteile an anderen Stellen Installationsanweisungen, da der primäre Standort vom Design abhängig ist und andere nicht. BTW Readme wurde gerade aktualisiert, um strukturierter zu sein.
Bostjan Skufca
1
Vielleicht so. Ohne eine Zusammenfassung der dafür erforderlichen Schritte handelt es sich jedoch um eine reine Linkantwort, die wahrscheinlich gelöscht wird.
muru
1
Nun, ich lieferte einen Hinweis auf eine alternative und praktikable Lösung. Wenn dies nicht der Grund für diese Website ist, sollte sie auf jeden Fall zusammen mit meinem Konto gelöscht werden.
Bostjan Skufca
2
@BostjanSkufca muss nicht beleidigt sein. Es ist nur eine Sache von Stack Exchange, zumindest vernünftigerweise in sich geschlossene Antworten zu haben. Wenn Sie so stark gegen das Hinzufügen von Schritten sind, ist das Ihr Wunsch. Meine Gegenstimme bleibt. Jemand wird es wahrscheinlich befürworten.
muru
3

Sie finden hier ein Skript, mit dem Sie alle Bash- Befehle / -Infos in eine Textdatei oder einen Syslog- Server schreiben können, ohne einen Patch oder ein spezielles ausführbares Tool zu verwenden.

Sehr einfach zu implementieren, da es sich um ein einfaches Shell-Skript handelt, das bei der Initialisierung der Bash einmal aufgerufen werden muss .

Es ist kostenlos und ich hoffe, es entspricht Ihren Bedürfnissen.

François Scheurer
quelle
1
Dies ist eine gute Antwort, aber es ist vorzuziehen, die Schritte und das Skript in den Hauptteil der Antwort aufzunehmen, anstatt auf Ihr Blog zu verlinken. Können Sie bitte Ihre Antwort bearbeiten, um dies aufzunehmen?
Tom Brossman
2
Seite jetzt nicht verfügbar
Gaia
0

Um zu gewährleisten, dass mehrere Sitzungen die Verlaufsdatei nicht überschreiben, müssen Sie "shopt -s histappend" in eine Bash-Startdatei einfügen. Siehe auch diese Frage zum selben Problem.

pdp
quelle
0

Versuchen Sie dies (die obigen Lösungen funktionieren mit Bash 4.3 nicht zu 100%):

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

Dies führt die Protokollierung durch UND verhindert die Protokollierung von Zeitstempeln, die für die Bash-Verlaufsdatei verwendet werden. die trap wird benötigt, da bash nach mehrmaligem drücken von strg + c die signale an den "subjob" sendet (getestet mit bash 4.3). dies erzwingt die Abmeldung des aktuellen Benutzers (zB mit sudo eingeloggt)

Hans-Joachim Kliemeck
quelle
0

Sie können auch versuchen, acct zu installieren. Acct führt einen detaillierten Audit-Trail über die Aktivitäten auf Ihren Linux-Systemen.

sudo apt-get install acct
edwinksl
quelle