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
- Linux Log ParserBrowser
- last / lastbCLI · in Linux enthalten
- utmpdumpCLI · in Linux enthalten
- wtmpdbCLI · Open Source
- PlasoCLI · Open Source
- VelociraptorPlattform · Open Source
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
| Datei | Pfad | Lesewerkzeug | Hinweise |
|---|---|---|---|
| wtmp | /var/log/wtmp, /var/log/wtmp.1 | last | Historie von Sitzungen, Neustarts, Shutdowns |
| btmp | /var/log/btmp, /var/log/btmp.1 | lastb | Fehlgeschlagene Anmeldungen, Modus 0600/0660 |
| utmp | /run/utmp (/var/run/utmp) | who, w | tmpfs: nur aktuelle Sitzungen, nach Neustart weg |
| lastlog | /var/log/lastlog | lastlog | Sparse-Datei, nach UID indiziert |
| wtmpdb (openSUSE, Upstream-Standard) | /var/lib/wtmpdb/wtmp.db | wtmpdb last | SQLite, Y2038-sicher |
| wtmpdb (Debian 13) | /var/log/wtmp.db | wtmpdb last | Debian legt einen Link unter /var/lib/wtmpdb/wtmp.db an |
| lastlog2 | /var/lib/lastlog/lastlog2.db | lastlog2 | SQLite, 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
rebootundshutdownauf Terminal~), einschließlich abrupter Enden, bei denen eine Sitzung keine Abmeldung hat (crashodergone - no logoutinlast). - 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):
| Feld | Bedeutung |
|---|---|
ut_type | 1 RUN_LVL, 2 BOOT_TIME, 5 INIT_PROCESS, 6 LOGIN_PROCESS, 7 USER_PROCESS (Anmeldung), 8 DEAD_PROCESS (Abmeldung) |
ut_pid | PID des Login-Prozesses |
ut_line | Terminal (pts/0), max. 32 Bytes |
ut_id | Terminal-Suffix oder inittab-ID |
ut_user | Benutzername, max. 32 Bytes; bei Abmeldedatensätzen in wtmp leer |
ut_host | Entfernter Host oder, bei Boot-Datensätzen, die Kernelversion, max. 256 Bytes |
ut_session | Sitzungs-ID |
ut_tv | tv_sec und tv_usec, auf Biarch-Plattformen beide 32 Bit |
ut_addr_v6 | Entfernte 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
lastzum Datensatzformat passt (64-Bit-glibc). Debian 13 liefertlastnicht mehr aus; verwenden Sie einen util-linux-Build einer anderen Distribution oder Plaso. - Suchen Sie in der Ausgabe von
utmpdumpnach genullten Datensätzen, rückwärts laufenden Zeitstempeln und Anmeldungen ohne Abmeldung.utmpdump -rwandelt 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 undUSER_LOGINin 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_hostbeireboot-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).