Linux-Magazin-Logo Die Zeitschrift für Linux-Professionals

Aus dem Nähkästchen geplaudert: Benutzer zurückverfolgen

Who is who?

Marc André Selig

Admins müssen bei Bedarf schnell ermitteln, welcher User sich wann und von wo auf ihrem System angemeldet hat. Mit diesem Wissen schützen sie ihre Computer vor Missbrauch und können im Ernstfall die Eindringlinge zurückverfolgen. Die Kommandos »who«, »w« und »last« liefern die Daten.

Computernetzwerke sind schon enorm praktisch. Um den Cluster an der Universität aus der Ferne zu warten, melde ich mich bequem über das Netz an und installiere ein Sendmail-Update vom heimischen Sofa aus. Mein unüberschaubares Spam-Aufkommen filtert ein Rechner in Pennsylvania, den ich ebenso selbstverständlich in meiner Wohnung programmiere.

Segen und Fluch der ständigen Erreichbarkeit

Leider gelten diese umfassenden Freiheiten auch für üble Zeitgenossen aller Art. Wer auf irgendeinem Wege die Zugangscodes eines Unix-Rechners ergattert hat - egal ob es sich dabei um einen Benutzernamen mit Passwort oder um einen kryptographischen Schlüssel handelt -, kann sich in der Regel von überall aus anmelden. Solange viele Unix-Administratoren nebenher auch noch auf Windows-Maschinen arbeiten (oder spielen), kommen Würmer und Trojanische Pferde immer wieder mal an ihre Zugangscodes heran.

Firewalls und virtuelle private Netze machen zwar den potenziellen Tätern das Einbrechen schwer, sie sind jedoch für viele kleine Firmen und Privatleute zu unhandlich und umständlich einzurichten. Umsichtige Admins untersuchen daher regelmäßig, wer sich auf ihren Rechnern alles tummelt und woher der Login kommt. So erkennen sie Unregelmäßigkeiten und können die Eindringlinge verjagen.

Wer online ist

Einen ersten Überblick der gerade angemeldeten Benutzer schafft der Befehl »who« (Abbildung 1). Er zeigt neben dem Benutzernamen und der Herkunft auch Datum und Uhrzeit des Logins sowie die (virtuelle) Konsole, an der der betreffende User arbeitet.

Abbildung 1: Das »who«-Kommando listet alle derzeit angemeldeten Benutzer. Baier arbeitet am X-Server der Konsole (»:0«), während sich »wwwadm« und »mas« remote eingeloggt haben.

Auf diesem Computer sind gerade drei User angemeldet: »baier« arbeitet an der Konsole und hat einen X-Server (»:0«) sowie eine ganze Reihe zusätzlicher Terminals geöffnet (»pts/X«). Wahrscheinlich handelt es sich bei Letzteren um XTerm-Fenster. Neben »baier« ist noch der Account »wwwadm« zu sehen, der sich über die Maschine »zpidsu5.uni-trier.de« angemeldet hat, außerdem »mas«, von »acb6ae4b.ipt.aol.com« kommend, offenbar einem Wählzugang.

Mit dem Who-Befehl nahe verwandt ist »w« (Abbildung 2), das auf den meisten Linux-Systemen ergänzend zur Verfügung steht. Praktischerweise ist »w« kürzer zu tippen und zeigt obendrein die Uptime des Computers sowie die gerade bearbeitete Befehlszeile auf dem jeweiligen PTY (Pseudoterminal).

Abbildung 2: Unter Linux informiert »w« noch etwas ausführlicher als »who«. Es zeigt in der ersten Zeile zusätzlich die Uptime des Rechners sowie dessen Last.

Wer online war

Die beiden Klassiker »who« und »w« zeigen immer die gerade angemeldeten Benutzer. Die sinnvolle Erweiterung ist »last« (Abbildung 3), es zeigt die letzten Logins. Die Liste geht zurück bis zum Beginn der jeweiligen Buchführung - da können durchaus tausende Zeilen zusammenkommen.

Abbildung 3: Wer sich für die Historie interessiert, ruft »last« auf. Das Tool listet die letzten Logins zusammen mit ihrem Ursprung und Zeitraum.

Gerade auf viel benutzten Rechner wäre diese Masse ohne zusätzliche Hilfe nur schwer zu beherrschen. Daher kennt »last« zwei wichtige Einschränkungen: Auf Wunsch beschränkt es die Liste auf einen einzelnen Benutzernamen oder manchmal auch auf ein Terminal (etwa »tty1« für die Linux-Konsole). Zweitens führt ein Parameter wie »-20« dazu, dass »last« nur die letzten (jüngsten) 20 Logins anzeigt. Beide Einschränkungen lassen sich kombinieren: »last -5 mas« listet die letzten fünf Logins des Users »mas« (Abbildung 3).

Ihre Informationen beziehen »who« und »last« aus speziellen Protokolldateien. Das File »utmp« verzeichnet die aktuell angemeldeten Benutzer und findet sich auf modernen Linux-Systemen im Verzeichnis »/var/run«. In »wtmp« protokolliert das System alle Logins und Logouts; diese Datei steht oft in »/var/log«. Die exakte Position beider Files ist von der Philosophie und dem Alter der Linux-Distribution abhängig; relativ häufige Fundorte sind noch »/var/spool« und »/var/adm« sowie »/etc«.

In »wtmp« ist eine Liste aller An- und Abmeldungen (als Binärformat) zu finden. Beim Login an der Konsole schreibt eines der Systemprogramme »init«, »agetty« oder »login« den entsprechenden Datensatz. »init« hält auch den Logout im Protokoll fest, das sogar Reboots und ähnliche Ereignisse aufzeichnet.

Datenbasis: »wtmp« und »utmp«

Im Gegensatz dazu enthält »utmp« genau einen Datensatz für jeden Benutzer. Sie speichert nur den jeweils letzten Login. Je nach Aktualität der Libc sieht »utmp« eventuell sehr groß aus: Traditionell ist die Datei genau so lang, dass für alle möglichen numerischen Benutzerkennungen je ein Eintrag hineinpasst. Bei über 65000 erlaubten Usern ist das ziemlich viel Platz. Damit sie diesen Platz nicht sinnlos verschwendet, enthält die Datei Löcher: Die ungenutzten Abschnitte sind nur mit Nullen gefüllt, werden aber nicht auf Festplatte gespeichert. Dieser Trick beschleunigt auch die Zugriffe auf die Datei.

Programme sollten »wtmp« und »utmp« nicht direkt lesen oder beschreiben. Ordentliche Software greift nur über die Bibliotheksfunktionen »utmpname()«, »setutent()«, »getutent()« und »getutid« zu. Manche Unix-Varianten verwenden »wtmpx« und »utmpx« statt »wtmp« und »utmp«, um die Daten in einem erweiterten Format zu speichern. Das ist unter Linux unnötig, da die ursprünglichen Dateiformate bereits alle entsprechenden Anforderungen erfüllen.

Die Zugriffsrechte sind meist so gesetzt, dass jeder User die Datenbanken lesen darf, während nur ausgewählte Prozesse schreiben können. Schreibzugriff haben unter anderem »init« für Abmeldungen und Wechsel des Runlevels (einschließlich Booten und Herunterfahren), die »getty«-Prozesse und »sshd« für echte und virtuelle TTYs, »login« für eine erfolgreiche Anmeldung, »sessreg« für Logins an der grafischen Benutzeroberfläche mittels »xdm« & Co. sowie in vielen Umgebungen die grafischen Terminals wie »xterm«.

Meist ist es nicht nötig, komplizierte Benutzergruppen zu definieren, nur um die Zugriffe auf »utmp« und »wtmp« sauber zu regeln. Das für den Login benutzte Programm ergänzt die Datenbank noch bevor es seine Root-Rechte aufgibt und die Rechte des Users annimmt, der sich anmeldet.

Noch mehr Protokolle

Die vorgestellten Datenbanken geben Aufschluss über zahlreiche Aktivitäten auf dem Rechner. Sie sind aber darauf angewiesen, dass jeder beteiligte Prozess sich an die Konventionen hält und die Dateien korrekt aktualisiert. Zudem müssen die gespeicherten Daten einer peinlich genau vordefinierten Struktur entsprechen. Beispielsweise ist die maximale Länge des Hostnamens, von dem aus eine Anmeldung erfolgt, meist empfindlich beschränkt. Abgekürzte Hostnamen wie »pd90249e0.dip.t-« aus Abbildung 3 sind nett, aber für forensische Zwecke beim Verfolgen eines Einbruchs unbrauchbar.

Zusätzliche Informationen sind manchmal unverzichtbar. Besonders bei komplizierten Anmeldevorgängen - etwa bei kryptographischer Authentifizierung - sind detaillierte Fehlermeldungen wichtig. Sie landen meist in einer zentralen Protokollstelle, dem so genannten Syslog. Darauf wird die nächste Folge des Workshops eingehen. (fjl)