Chemnitzer (AFS)-login
Ausgangssituation
Die unbefriedigende Integration der AFS-Authentisierung
in den Login-Vorgang auf UNIX-Systemen unter verschiedenen Bedingungen
war Anlaß für uns, ausgehend von einer frei verfügbaren
login-Implementation (aus dem logdaemon-Paket,
Quelle: ftp://ftp.win.tue.nl/pub/security
) eine eigene, auf unsere Bedingungen zugeschnittene, Implementation
des login-Programms zu schaffen.
Ziel
Diese Implementation soll folgendes leisten:
- login ins UNIX (und ins AFS für AFS-Nutzer)
- Zusammenarbeit mit dem ESRA-telnetd
- Zusammenarbeit mit den AFS-Versionen des rlogind, inetd und rsh bzw.
remsh
- Integration des One-Time-Passwort-Verfahrens SKEY
- Auswertung systemspezifischer Konfigurationsfiles (z.B. /etc/default/login
und /etc/logindevperm im Solaris 2.x)
- Auswertung systemunabhängiger Konfigurationsfiles (z.B. /etc/login.access
zur Zugangssteuerung, /etc/fbtab zum Setzen von Eigentümerangaben
und Zugriffsrechten von Files und Geräten bei login - sonst nur in
SunOS 4.x üblich)
- Erzeugen einer einheitlichen Umgebung (Environment-Variablen)
- Anfertigen sinnvoller und vollständiger Logging-Informationen
- Erzeugen korrekter Einträge in umtp-, utmpx-, wtmp-, lastlog-,
... Files
Authentisierungsvorgang
Der Authentisierungsvorgang läuft folgendermaßen ab:
- prüfen, ob es einen passwd-Eintrag für den Nutzer gibt (lokal
in /etc/passwd oder im NIS)
- gibt es keinen Eintrag oder enthält das password-Feld das Zeichen
'*', wird der Login-Vorgang abgebrochen ("Login incorrect")
- sonst weiter bei Schritt 2
- Erzeugen einer Process
Authentication Group (PAG)
- prüfen, ob der Nutzer einen Eintrag in der SKEY-Datenbasis besitzt
(/etc/skeykeys)
- falls ja, SKEY-Login-Möglichkeit anbieten, weiter bei Schritt
4
- falls nein, Passwort abfragen, weiter bei Schritt 5
- prüfen, ob das eingegebene Passwort das richtige One-Time-Passwort
war
- falls ja, weiter bei Schritt 7
- falls nein, weiter bei Schritt 5
- prüfen, ob das eingegebene Passwort das AFS-Passwort ist
- falls ja, Token ermitteln und an Cache Manager übergeben, dann
weiter bei Schritt 9
- falls nein, weiter bei Schritt 6
- prüfen, ob das eingegebene Passwort, das richtige UNIX-Passwort
ist
- falls ja, weiter bei Schritt 7
- falls nein, Login-Vorgang abbrechen ("Login incorrect")
- prüfen, ob der Nutzer einen AFS-Account besitzt (dieser Zweig
wird nur durchlaufen, wenn der Nutzer entweder einen Eintrag in der SKEY-Datenbasis
besitzt und zuerst das richtige One-Time-Passwort eingegeben hat - Schritte
3 und 4 - oder sich das lokale/NIS-Passwort und das AFS-Passwort des Nutzers
unterscheiden und der Nutzer zuerst das richtige lokale/NIS-Passwort eingegeben
hat - Schritte 5 und 6)
- falls ja, weiter bei Schritt 8
- falls nein, weiter bei Schritt 9
- erneute Abfrage und Test des AFS-Passworts ("Enter AFS Password:"),
falls das Passwort richtig war, beschaffen eines Tokens und Übergeben
an den Cache Manager, falls nicht, entsprechenden Hinweis auf nicht beschafftes
AFS-Token geben, in jedem Fall weiter bei Schritt 9
- komplettieren des Login-Vorgangs durch
- Auswerten der Konfigurationsfiles
- Einträge in utmp-, utmpx-, lastlog- ... Files vornehmen
- Setzen der Prozeß-UIDs und -GIDs
- Starten der Shell
Von diesem Authentisierungsvorgang wird unter der folgenden Bedingung
abgewichen:
- wenn der Nutzer den ESRA-telnet-Client
(/uni/global/bin/telnet) verwendet und an der Zielmaschine des
telnet-Vorgangs der ESRA-telnetd
installiert ist, so wird der gesamte Authentisierungsvorgang bereits zwischen
telnet und telnetd abgewickelt und das login-Programm
so aufgerufen, daß es mit Schritt 9 startet
Beachten Sie:
Da zur Authentisierung der lokal verwaltete Nutzereintrag (aus /etc/passwd
bzw. der NIS-Map) zuerst in Verbindung mit der AFS-Authentisierung
benutzt wird (Schritt 5), sollte dieses Login-Programm nur an Maschinen
eingesetzt werden, an denen die AFS-Zelle identisch mit der Verwaltung
von /etc/passwd bzw. der NIS-Domain gehalten wird.
Für Maschinen außerhalb des URZ ist daher genau zu prüfen,
ob dieses Login-Programm verwendet werden kann!
systemunabhängige Konfigurationsfiles
/etc/login.access
Dieses File wird ausgewertet nachdem der Authentisierungsvorgang abgeschlossen
ist. Es enthält eine Zugangssteuertabelle, in der festgelegt werden
kann, welche Nutzerkennzeichen zum login von welchen entfernten Hosts aus
oder an welchen lokal angeschlossenen Terminals erlaubt bzw. verboten sind.
Die Auswertung erfolgt so, daß der erste Eintrag, der auf eine (user,
host) Kombination bzw. (user, tty) Kombination zutrifft, die login-Berechtigung
angibt. Jeder Eintrag besteht aus drei Feldern
permission : users : origins
Das erste Feld (permission) muß eines der Zeichen '+'
(Zugang erlauben) oder '-' (Zugang verbieten) sein.
Das zweite Feld (users) enthält eine Liste von einem oder
mehreren
- Nutzerkennzeichen,
- Gruppennamen (laut /etc/group),
- Netzgruppennamen (nur bei Verwendung von NIS und nur Netzgruppen, die
Nutzerkennzeichen enthalten) in der Form @usernetgroup,
- das Schlüsselwort ALL.
Das dritte Feld (origins) enthält eine Liste von einem oder
mehreren
- Terminalgerätenamen (tty names) von lokal angeschlossenen Terminals,
- Hostnamen,
- Internet-Domain-Namen (beginnend mit einem '.')
- IP-Adressen,
- IP-Subnetzen (endend mit einem '.'),
- Netzgruppennamen (nur bei Verwendung von NIS und nur Netzgruppen, die
Hostnamen enthalten) in der Form @hostnetgroup,
- das Schlüsselwort ALL oder
- das Schlüsselwort LOCAL (entspricht jedem Namen, der
keinen '.' enthält).
Mit Hilfe des Schlüsselwortes EXCEPT können sehr
kompakte Zugangslisten erstellt werden, etwa in der Form
- : ALL EXCEPT hinz kunz : ALL
Mit folgender Bedeutung: das Login ist für alle Nutzerkennzeichen
verboten, außer für die Kennzeichen hinz und kunz.
Das folgende Beispiel beschreibt eine Maschine, an der folgende Regeln
gelten sollen:
- an der Console darf sich nur root anmelden
- über das Netz dürfen sich nur Mitglieder der Netzgruppe urz_mitarbeiter
anmelden
- alle anderen Nutzerkennzeichen dürfen nicht verwendet werden
+ : root : console
+ : @urz_mitarbeiter : ALL
- : ALL : ALL
/etc/skey.access
Dieses File steuert die Zulässigkeit der Verwendung von Klartext-Passworten.
Aus der Beschreibung des Authentisierungsvorgangs geht hervor, daß
selbst dann, wenn ein Nutzer einen Eintrag in der SKEY-Datenbasis besitzt
und er die Aufforderung erhält, ein One-Time-Passwort einzugeben,
auch die Eingabe eines Klartext-Passwortes akzeptiert wird. Das trifft
jedoch nur zu, wenn es das File /etc/skey.access nicht gibt. Sobald
dieses File existiert, werden von solchen Nutzern nur noch One-Time-Passworte
akzeptiert, es sei denn, das Login erfolgt an der Console.
In diesem File können Regeln formuliert werden, die angeben, unter
welchen Bedingungen von diesen Nutzern auch Klartext-Passworte akzeptiert
werden. Es wird so ausgewertet, daß der erste zutreffende Eintrag
das Verhalten von login bestimmt.
Die Einträge haben die folgende Form:
permit condition condition...
deny condition condition...
Nach den Schlüsselworten permit und deny kann
eine Liste von Bedingungen (condition) angegeben werden. Diese Liste
kann auch leer sein, dann wird die Verwendung von Klartext-Passworten entweder
generell erlaubt (permit) oder verboten (deny).
Die Bedingungen werden folgendermaßen angegeben:
- hostname name
- internet netnumber netmask
- port teminal_device_name
- user nutzerkennzeichen
- group gruppenname
Das folgende Beispiel beschreibt eine Maschine, an der die Nutzer hinz
und kunz bei Anmelden immer ein One-Time-Passwort angeben müssen,
alle anderen Nutzer dürfen ihr Klartext-Passwort angeben, es sein,
sie kommen von einem Rechner außerhalb des Subnetzes 134.109.0.0.
deny user hinz
deny user kunz
deny internet 134.109.0.0 255.255.0.0
permit
In Kombination mit dem oben stehenden Beispiel für /etc/login.access
und dem Einsatz des ESRA-telnetd
kann man so folgendes erreichen:
- an der Console kann sich außer root niemand anmelden
- über das Netz können sich nur Mitglieder der Netzgruppe urz_mitarbeiter
anmelden, wobei folgende Festlegungen gelten
- wenn zum Login der ESRA-telnet-Client (/uni/global/bin/telnet)
verwendet wird, so können alle Mitglieder der Netzgruppe urz_mitarbeiter
Ihr Klartext-Passwort verwenden (dieses wird durch das SRA-Verfahren jedoch
immer verschlüsselt übertragen)
- wird zum Login ein anderer telnet-Client oder der rlogin-Client benutzt,
so müssen die Nutzer hinz und kunz das SKEY-Verfahren
benutzen, während alle anderen Mitglieder auch mit ihrem Klartext-Passwort
Zugang erhalten, solange der Login-Vorgang von einem Rechner aus angestoßen
wird, dessen IP-Adresse mit 134.109. beginnt, sonst müssen
auch diese Nutzer das SKEY-Verfahren zum Login verwenden
/etc/fbtab
Dieses File wird verwendet, um während des Login-Vorgangs bestimmte
Files und Geräte dem sich anmeldenden Nutzer zuzuordnen. Sinnvollerweise
sind das die Geräte, die ohnehin nur durch direkten Zugriff benutzt
werden können, wie Floppy- und CD-ROM-Laufwerke, Keyboard, Maus, Framebuffer,
etc.
Die Idee für dieses Konfigurationsfile stammt aus dem Login-Programm
von SunOS 4.x. Diese Login-Version führt diesen Mechanismus auch für
andere Systeme ein. Der Aufbau dieses Files entspricht dem Aufbau von /etc/logindevperm(4)
im Solaris 2.x.
systemabhängige Konfigurationsfiles
Solaris 2
- /etc/default/login
die Verwendung dieses Files ist erläutert im login-Manual: login(1)
- /etc/logindevperm
Im Gegensatz zum systemeigenen login-Programm wird dieses File nur ausgewertet,
wenn es /etc/fbtab (siehe oben) nicht gibt. Der Aufbau dieses
Files ist aber identisch mit /etc/fbtab, siehe logindevperm(4)
Environment-Variablen
Von login werden mindestens diese Environment-Variablen gesetzt.
HOME |
Pfadname des Home-Verzeichnisses |
LOGNAME |
Login-Kennzeichen |
MAIL |
Pfadname der Mailbox |
PATH |
Suchpfad für Kommandos (systemabhängig) |
SHELL |
Pfadname der Login-Shell |
TERM |
Terminaltyp |
REMOTEHOST |
nur bei login von entferntem Rechner: vollständiger Hostname des
entfernten Rechners |
DISPLAY |
nur wenn der Client auf dem entfernten Rechner diese Variable "durchreicht" |
Von diesem login werden security-relevante Umgebungsvariablen
(IFS, LD_LIBRARY_PATH, ...; siehe auch CERT-Advisory CA-95:14)
zurückgesetzt.
Verfügbarkeit
Das Programm ist derzeit für folgende Plattformen verfügbar:
- Solaris 2.x (sun4c_53, sun4m_53, sun4c_54, sun4m_54,sun4x_55)
- SunOS 4.1.x (sun4c_411, sun4m_412)
- Linux
Besonderheiten
Solaris 2
- Dieses login-Programm kann nicht in Systemen verwendet werden, die
auf C2-Security umgestellt wurden.
Installation und Verwendung
Das login-Programm ist in verschiedenen Versionen im Pfad /uni/global/bin
für die Plattformen, für es bisher verfügbar ist, zu finden.
Dort liegen die folgenden Programme:
- login.afs
diese Version enthält die oben beschriebene Funktionaliät, einschließlich
der Berücksichtigung von AFS und SKEY
- login.noafs
diese Version enthält die oben beschriebene Funktionaliät, jedoch
ohne AFS-Authentisierung, SKEY ist enthalten
- für Linux-Systeme ab Kernel Version 2.0.1 gibt es das login-Programm
in vier verschiedenen Versionen, wobei der Name des Binaries jeweils den
implementierten Funktionsumfang angibt: login.noafs.noshadow, login.noafs.shadow,
login.afs.noshadow, login.afs.shadow
Zur Installation ist das ausgewählte login-Programm (also login.afs
oder login.noafs) anstelle des systemeigenen login-Programms zu
installieren. Die Rechte müssen dabei genauso gesetzt werden, wie
beim systemeigenen login. Wenn dieses login-Programm auch vom ESRA-telnetd
benutzt werden soll, so muß es unter dem Namen sralogin
erreichbar sein, siehe auch ESRA
.
Auf AFS-Maschinen (nicht für Linux) ist dieses Programm auch als
/usr/afsws/bin/login (siehe Verfügbarkeit) erreichbar.
Thomas
Müller, 24. November 1995, 4. Oktober 1996