Zum Inhalt springen

BenutzeraktivitätLogsNetzwerk

wtmp, btmp, utmp und lastlog: Login-Daten unter Linux

Binäre Login-Daten unter Linux: wtmp-Sitzungshistorie, btmp-Fehlversuche, utmp-Live-Sitzungen, lastlog pro UID und die Nachfolger wtmpdb/lastlog2.

Speicherort
/var/log/wtmp
Belegt
Wer sich an welchem Terminal von welchem Host angemeldet hat, wann die Sitzung endete und wann das System neu gestartet wurde
Zeitstempel
utmp-Datensätze: Sekunden seit der Unix-Epoche + Mikrosekunden (32-Bit-Felder), UTC. wtmpdb: Mikrosekunden seit der Epoche
Zugriff
wtmp/utmp/lastlog für alle lesbar; btmp nur für root (oder die Gruppe utmp)
Aufbewahrung
logrotate: monatlich, 1 alte Generation für wtmp und btmp; lastlog bis zum Überschreiben
Sicherung
UAC, Velociraptor, cp -a

Was es ist

Linux führt die Login-Buchhaltung in einer Familie binärer Dateien mit gemeinsamem Datensatzformat, struct utmp (siehe wtmp und btmp). wtmp ist eine nur fortgeschriebene Historie von Anmeldungen, Abmeldungen, Boots und Shutdowns; btmp erfasst fehlgeschlagene Anmeldungen; utmp enthält nur die gerade offenen Sitzungen. lastlog hat ein anderes Format: ein Slot fester Größe pro UID mit der letzten Anmeldung des jeweiligen Kontos.

Geschrieben werden diese Dateien von login, sshd, Display-Managern und PAM-Modulen, unabhängig von syslog. Genau diese Unabhängigkeit macht ihren forensischen Wert aus: Sie überstehen oft die Bearbeitung von Textlogs und widersprechen ihnen, wenn nur eine Quelle manipuliert wurde.

Weil der klassische Datensatz 32-Bit-Zeitfelder verwendet, ersetzen neuere Distributionen die Dateien durch SQLite-Datenbanken: wtmpdb für wtmp und lastlog2 (seit 2.40 Teil von util-linux) für lastlog.

Wo es liegt

DateiPfadLesewerkzeugHinweise
wtmp/var/log/wtmp, /var/log/wtmp.1lastHistorie von Sitzungen, Neustarts, Shutdowns
btmp/var/log/btmp, /var/log/btmp.1lastbFehlgeschlagene Anmeldungen, Modus 0600/0660
utmp/run/utmp (/var/run/utmp)who, wtmpfs: nur aktuelle Sitzungen, nach Neustart weg
lastlog/var/log/lastloglastlogSparse-Datei, nach UID indiziert
wtmpdb (openSUSE, Upstream-Standard)/var/lib/wtmpdb/wtmp.dbwtmpdb lastSQLite, Y2038-sicher
wtmpdb (Debian 13)/var/log/wtmp.dbwtmpdb lastDebian legt einen Link unter /var/lib/wtmpdb/wtmp.db an
lastlog2/var/lib/lastlog/lastlog2.dblastlog2SQLite, Y2038-sicher

Hinweise zu Distributionen: openSUSE Tumbleweed und MicroOS haben /run/utmp, /var/log/wtmp und /var/log/lastlog zugunsten von systemd-logind, wtmpdb und lastlog2 aufgegeben. Debian 13 (trixie) hat last, lastb und lastlog entfernt; die Ersatzwerkzeuge wtmpdb und lastlog2 (samt ihren PAM-Modulen) müssen nach einem Upgrade separat installiert werden (lslogins gehört weiterhin zu util-linux), ein trixie-Host hat also womöglich überhaupt keine Login-Datenbank. RHEL/Fedora und Ubuntu-LTS-Releases nutzen meist noch die klassischen Dateien; prüfen Sie, was im Image vorhanden ist.

Was es belegt

  • Interaktive Anmeldungen mit Benutzer, Terminal (pts/N, tty1, :0), entferntem Host oder IP, Beginn und Ende.
  • Neustarts und Shutdowns (Pseudo-Benutzer reboot und shutdown auf Terminal ~), einschließlich abrupter Enden, bei denen eine Sitzung keine Abmeldung hat (crash oder gone - no logout in last).
  • Fehlgeschlagene Anmeldungen mit dem versuchten Benutzernamen, der auch versehentlich ins Benutzerfeld getippte Passwörter enthalten kann. Behandeln Sie btmp als sensibel.
  • Die letzte Anmeldung jedes Kontos aus lastlog, auch wenn wtmp bereits wegrotiert wurde.
  • Es zeigt keine nicht interaktive Aktivität: ssh host command, scp/sftp und viele automatisierte Anmeldungen belegen kein TTY und fehlen oft. Nutzen Sie dafür auth.log/secure und das Journal.

Wichtige Felder

struct utmp (384 Bytes pro Datensatz auf gängigen 64-Bit-glibc-Systemen):

FeldBedeutung
ut_type1 RUN_LVL, 2 BOOT_TIME, 5 INIT_PROCESS, 6 LOGIN_PROCESS, 7 USER_PROCESS (Anmeldung), 8 DEAD_PROCESS (Abmeldung)
ut_pidPID des Login-Prozesses
ut_lineTerminal (pts/0), max. 32 Bytes
ut_idTerminal-Suffix oder inittab-ID
ut_userBenutzername, max. 32 Bytes; bei Abmeldedatensätzen in wtmp leer
ut_hostEntfernter Host oder, bei Boot-Datensätzen, die Kernelversion, max. 256 Bytes
ut_sessionSitzungs-ID
ut_tvtv_sec und tv_usec, auf Biarch-Plattformen beide 32 Bit
ut_addr_v6Entfernte IP (IPv4 im ersten Wort)

struct lastlog: ll_time (32-Bit-Epoche), ll_line (32 Bytes), ll_host (256 Bytes), 292 Bytes pro Slot am Offset UID x 292. wtmpdb speichert pro Zeile Type, User, Login, Logout, TTY, RemoteHost und Service (den PAM-Dienst).

Zeitstempel

Klassische Datensätze speichern Sekunden seit der Unix-Epoche plus Mikrosekunden, UTC. last gibt die Zeiten in der lokalen Zeitzone des Analysesystems aus, setzen Sie also TZ=UTC. Die 32-Bit-Felder laufen im Januar 2038 über. wtmpdb speichert Login und Logout als Mikrosekunden seit der Epoche.

TZ=UTC last -F -i -x -f /mnt/evidence/var/log/wtmp
sqlite3 wtmp.db "SELECT User, TTY, RemoteHost, Service,
  datetime(Login/1000000,'unixepoch'), datetime(Logout/1000000,'unixepoch') FROM wtmp;"

Aufbewahrung

Die Standardabschnitte von logrotate rotieren wtmp und btmp monatlich und behalten eine alte Generation (wtmp.1, btmp.1); rechnen Sie also mit ein bis zwei Monaten Historie. Die Abschnitte stehen je nach Distribution in /etc/logrotate.conf oder in /etc/logrotate.d/wtmp und btmp. utmp wird bei jedem Boot geleert. lastlog behält dauerhaft einen Datensatz pro UID, der bei jeder Anmeldung überschrieben wird. wtmpdb rotate verschiebt alte Einträge in datierte wtmp_<date>.db-Dateien neben der Datenbank (/var/lib/wtmpdb/ upstream, /var/log/ unter Debian).

Sicherung

Kopieren Sie die Dateien mit Metadaten. Die Größe ist aussagekräftig: Eine wtmp, die kein Vielfaches der Datensatzgröße ist oder viel kleiner als erwartet, ist ein Befund.

cp -a /mnt/evidence/var/log/{wtmp,wtmp.1,btmp,btmp.1,lastlog} /cases/2026-017/ 2>/dev/null
cp -a /mnt/evidence/var/lib/wtmpdb /mnt/evidence/var/lib/lastlog /cases/2026-017/ 2>/dev/null
cp -a /mnt/evidence/var/log/wtmp.db /cases/2026-017/ 2>/dev/null
# Live only: current sessions
cp -a /run/utmp /media/ir/ && who -a > /media/ir/who.txt

UAC sammelt /var/log und /var/run/utmp und führt bei der Live-Response last, lastb, lastlog und utmpdump aus. Velociraptors Linux.Sys.LastUserLogin parst wtmp*-Dateien auf dem Endpunkt.

Auswertung

last -F -i -x -f wtmp            # full dates, IPs, system events
lastb -F -i -f btmp              # failed logins
utmpdump wtmp > wtmp.txt         # every record and field, text
wtmpdb last -F -f wtmp.db        # wtmpdb databases
lastlog2 -d lastlog2.db          # lastlog2 databases

Der klassische Befehl lastlog liest die Datei des laufenden Systems. Lesen Sie die 292-Byte-Slots einer Image-Kopie daher mit einem kurzen Skript (Slotnummer = UID, reine Null-Slots überspringen). Der Plaso-Parser utmp verarbeitet wtmp, btmp und utmp für Super-Timelines. Linux Log Parser liest auth.log / secure, syslog, Journal-Dateien, audit.log und wtmp / btmp / lastlog im Browser und führt sie in einer Zeitleiste mit rekonstruierten Login-Sitzungen zusammen; es wird nichts hochgeladen.

Tipps für die Untersuchung

  • Arbeiten Sie auf einem Analysesystem, dessen last zum Datensatzformat passt (64-Bit-glibc). Debian 13 liefert last nicht mehr aus; verwenden Sie einen util-linux-Build einer anderen Distribution oder Plaso.
  • Suchen Sie in der Ausgabe von utmpdump nach genullten Datensätzen, rückwärts laufenden Zeitstempeln und Anmeldungen ohne Abmeldung. utmpdump -r wandelt bearbeiteten Text zurück in Binärdaten, für root ist Manipulation also einfach: Belegen Sie sie über Widersprüche zu auth.log, dem Journal und USER_LOGIN in audit.log.
  • Eine Häufung von btmp-Einträgen von einer IP, gefolgt von einer wtmp-Anmeldung von derselben IP, ist das klassische Muster eines erfolgreichen Brute-Force-Angriffs.
  • Ist eine lastlog-Zeit neuer als der letzte passende wtmp-Datensatz, hat wtmp Einträge verloren (Rotation oder Löschung).
  • Vergleichen Sie die Kernelversion in ut_host bei reboot-Datensätzen mit den installierten Kerneln, um Boots in einen unerwarteten Kernel zu erkennen.
  • Eine wtmp oder btmp mit null Bytes und alter mtime auf einem aktiven Server ist ein häufiges Anti-Forensik-Zeichen (> /var/log/wtmp).

Siehe auch