Wenn man alle Kommandos, die ein User in eine Shell tippt loggen will, dann gibt es dafür verschiedene Lösungen, die meist die Installation von speziellen Softwarepaketen erfordern. Das ist bei sensiblen Systemen nötig, um erfolgreiche Angriffe zumindest im Nachhinein verstehen zu können oder Benutzerfehler zu erkennen. Es geht auch ohne spezielle Software ganz einfach. Zumindest in bash
.
Man braucht dafür das Programm logger
, das unter Debian und Ubunutu teil des Pakets bsdutils
ist und daher fast immer vorinstalliert ist. Dieses Tool kann Syslog-Nachrichten erzeugen, die dann vom Syslog-Daemon auf dem System verarbeitet werden. Im Beispiel verwende ich die Syslog-Facility „user
“ und überlasse dem syslogd
(etwa syslog-ng
) die weitere Verarbeitung.
Alles, was man tun muss ist die Datei /etc/bash.bashrc
anzupassen und folgende Zeilen am Ende hinzuzufügen:
TERM_IP=$(who -m | awk '{print $5}'|sed 's/.\(.*\)./\1/')
TERM_DEV=$(tty | sed 's/\/dev\///')
logger -p user.notice -t clilog --sd-param origin.software=\"bash\" "User $USER logged IN on $TERM_DEV $TERM_IP"
readonly HISTTIMEFORMAT="$TERM_DEV $TERM_IP $USER Cmd: "
readonly PROMPT_COMMAND="logger -p user.notice -t clilog --sd-param origin.software=\"bash\" "$(echo -e "$(history 1)")"'
readonly unset HISTCONTROL
Das Ergebnis ist ein Logeintrag im log /var/log/user.log
für jeden Befehl, den ein User absetzt mit Datum, Uhrzeit, verwendeter Konsole (TERM_DEV
) und im Falle von ssh der IP, von der aus verbunden wurde (TERM_IP
):
Sep 29 09:12:43 meinlinux clilog[3559529]: 304 pts/0 192.168.11.10 eliyah Cmd: ls
Einen kleinen Schönheitsfehler hat die Lösung: Wenn ein User sich ausloggt und wieder einloggt, dann wird der letzte Befehl vor dem Ausloggen noch mal geloggt mit falscher Uhrzeit. Da aber die History-ID die selbe ist, kann ein Forensiker das schnell erkennen. Beispiel:
Sep 29 09:23:23 meinlinux clilog[3564393]: 312 pts/0 192.168.11.10 eliyah Cmd: ls
Sep 29 09:29:02 meinlinux clilog[3567219]: User eliyah logged IN on pts/0 192.168.11.10
Sep 29 09:29:04 meinlinux clilog[3567351]: 312 pts/0 192.168.11.10 eliyah Cmd: ls
Um zu verhindern, dass ein Angreifer die Logs löscht, sollten sie natürlich auf einen remote Syslog-Server geschrieben werden. Und wenn der Angreifer root-Rechte hat, kann er natürlich ab diesem Moment seine Spuren verwischen und das Logging deaktivieren. Aber erst ab dann!