Manchmal möchte Kolumnist Charly wissen, was er wann auf einem Server Geniales getan hat. Eine unfehlbare Gedächtnisstütze zu finden? Peanuts!
Bei der Arbeit plagen mich manchmal Erinnerungslücken: Wie hieß das schicke Tool, mit dem ich die LEDs an einer bestimmten Netzwerkkarte habe blinken lassen, um sie im Serverschrank finden zu können? Oder: Wie hatte ich damals alle Dateien in einem Verzeichnis, die älter als sieben Tage waren, gelöscht? Die Antwort auf all diese Fragen kennt die Bash-History, aber die ist gemäß Murphys Gesetz immer zu kurz. Außerdem quält die Unsicherheit: Auf welchem Server hat das Ganze stattgefunden?
Eine mögliche Lösung ist Snoopy. Die kleine Bibliothek mit dem Hundenamen wickelt sich als Wrapper um »execve()« und wacht immer dann auf, wenn der Rechner ein Kommando ausführt. Viele Distributionen haben Snoopy im Zwinger, ansonsten hilft Github unter [1] weiter. Damit Snoopy gleich beim Systemstart aktiv wird, ist ein Eintrag in »/etc/ld.so.preload« notwendig. Hier füge ich die folgende Zeile hinzu: »/Pfad/snoopy.so« . Pfad ist in der Regel »lib« . Wenn ich Snoopy selbst kompiliere, liegt die Bibliothek auch gern unter »/usr/local/lib/« oder ähnlich.
Snoopy selbst zu kompilieren besitzt einen Vorteil: Ich kann vorher in den Quellen die Headerdatei »snoopy.h« editieren. Setze ich dort
#define ROOT_ONLY 1
wird Snoopy nur Kommandos loggen, die mit Rootrechten ablaufen. Installiere ich das Tool dagegen aus den Distributionsrepositories, ist diese Option nicht gesetzt und es loggt alle Kommandos aller Privilegien-Coleur.
Snoopy schreibt, wenn ich es nicht anders konfiguriere, in »/var/log/auth.log« . Abbildung 1 zeigt das Log einiger einfacher Kommandos. Die Gliederung bleibt stets gleich: Jeder Eintrag beginnt mit der Benutzer-ID, gefolgt von der Sitzungs-ID und dem verwendeten TTY. Danach kommt das jeweils aktuelle Verzeichnis. Das ist wichtig, weil Snoopy Kommandos wie »cd /etc« nicht protokolliert. Im Dateisystem zu navigieren ist für den Beagle also nicht das Gleiche wie eine Datei auszuführen.
Danach kommt der vollständige Pfad zu der ausgeführten Datei und zuletzt das expandierte Kommando. Eine Expansion können zum Beispiel Aliases hervorrufen. Viele Distributionen führen beispielsweise »ls –color=auto« aus, wenn ich lediglich »ls« eintippe – Snoopy erschnüffelt auch dies.
Sammelstelle
Jetzt muss ich die Logs nur noch an einer zentralen Stellen konsolidieren. Einen Server konfiguriere ich so, dass er Log-Nachrichten anderer Maschinen empfangen kann. Wenn dort etwa Rsyslog läuft, genügt es, ihm beim Start den Parameter »-r« mitzugeben, und schon ist Rsyslog auf Empfang.
Den anderen Servern bringe ich bei, Einträge in »/var/log/auth.log« zusätzlich an den frisch gebackenen Syslog-Server zu schicken. Dazu ergänze ich nur eine Zeile in der Syslog-Konfiguration:
auth,authpriv.* @192.168.2.80
Das Auth-Log wächst in der Regel nicht gerade ins Unendliche, weshalb ich nur wöchentlich oder gar monatlich rotieren lasse. Mit Snoopy füllt sich Tag für Tag ein beachtliches Archiv meiner administrativen Heldentaten – Tippfehler und ähnliche Peanuts inklusive.
Infos
- Snoopy: https://github.com/a2o/snoopy







