Ich habe in den letzten Tagen mal in meinem LAN das Kerberos-Zeitalter ausgerufen. LDAP habe ich schon lange im Einsatz, aber bisher nicht zu Authentifizierung. Folgende Anforderungen habe ich für mich definiert:
- Sichere Anmeldung am System mittels Kerberos
- Benutzer und Gruppeninformationen sollen aus dem zentralen LDAP-Verzeichnis kommen
- LDAP-Benutzer sollen automatisch Mitglieder lokaler Systemgruppen werden, um z.B. Zugriff auf Geräte zu habe
- Nicht existierende Home-Directories sollen beim ersten Anmelden erstellt werden
- Mobile Geräte müssen auch ohne Netzwerkverbindung eine Authentifizierung ermöglichen
Auf Serverseite habe ich ebenfalls ein Ubuntu 10.04 LTS laufen (mein Mediacenter System). Dort habe ich bereits Kerberos und LDAP nach der Anleitung aus dem Ubuntu Serverguide eingerichtet.
Die anderen Anleitungen des Serverguides sind leider nun dann hilfreich, wenn man nur Kerberos oder nur LDAP-Authentifizierung machen möchte. Abgesehen davon schießen sich die Tools pam-auth-update
und auth-client-config
gegenseitig in’s Knie, weshalb man schon genau wissen sollte was man tut. Andernfalls hat man sich schneller aus dem eigenen System ausgesperrt als man Kerberos rückwärts buchstabieren kann. Ich verwende daher ein eigenes auth-client-config
Profil für die Anpassungen an der nsswitch.conf
und alle Änderungen an PAM nehme ich mittels pam-auth-update
vor.
Fangen wir also mit der Installation der benötigten Pakete an. Als Basis dient eine ganz gewöhnliche Ubuntu 10.04 Desktop Installation.
sudo aptitude install libpam-krb5 libpam-ldap libpam-ccreds krb5-user nscd nss-updatedb
Während der Installation wird die Kerberos Realm und die LDAP-Verbindungsparameter von debconf
abgefragt.
Auch wenn wir eigentlich libpam-ldap
gar nicht benötigen installiert sich das als Abhängigkeit ohnehin mit. libpam-ccreds
sorgt dafür, dass wir bei Nicht-Erreichen des Kerberos Server dennoch eine Anmeldung durchführen können, sofern der entsprechende Benutzer schon einmal angemeldet war.
Nun optimieren wir noch ein wenig die Standardwerte für LDAP-Timeout und das Verhalten, wenn der Server nicht erreicht werden kann. Dazu habe ich folgende Werte in der /etc/ldap.conf
auskommentiert und angepasst:
ldap_version 3
timelimit 5
bind_timelimit 5
bind_policy soft
Damit das System nicht versucht numerische UID < 1000 (in der Regel lokale Systembenutzer) per LDAP aufzulösen muss einmal nssldap-update-ignoreusers
ausgeführt werden.
Um nun dem System beizubringen, bei der Suche nach Benutzer- oder Gruppeninformationen zunächst die Dateien /etc/passwd
bzw. /etc/groups
zu befragen, dann das LDAP-Verzeichnis und bei Nicht-Erreichbarkeit die zwischengespeicherte NSS Datenbank zu nehmen, muss ein entsprechendes auth-client-config
-Profil erstellt werden. Wir nehmen als Namen dafür einfach den DNS Namen der Domäne.
# /etc/auth-client-config/profile.d/example.com
[example.com]
nss_passwd=passwd: files ldap [NOTFOUND=return] db
nss_group=group: files ldap [NOTFOUND=return] db
nss_shadow=shadow: files
nss_netgroup=netgroup: nis
und aktivieren das Ganze mit:
auth-client-config -t nss -p example.com
Haben wir bei der Konfiguration der LDAP-Einstellungen alles richtig gemacht, sollte es nun möglich sein, mit getent passwd
und getent groups
die zusammengesetzte Liste aus Lokalen- und LDAP-Benutzern bzw. Gruppen zu erhalten. Damit diese Informationen auch offline Verfügbar sind, führt man nss_updatedb
wie folgt aus:
sudo nss_updatedb ldap
Nun kann der richtige Spaß beginnen: Die PAM Authentifizierung. Dazu müssen einige Dateien unter /usr/share/pam-configs/
angelegt werden. Teils ist es nicht ganz Nachvollziehbar, warum diese nicht schon vorhanden sind, da es die Benutzung auf dem System vorhandener PAM-Module doch deutlich erschwert. Auf der einen Seite mag pam-auth-config
es nicht eigene Änderungen an den /etc/pam.d/common-* Dateien zu machen, auf der anderen Seite fehlen Konfigurationsdateien um relativ gebräuchliche PAM-Module über pam-auth-config
zu aktivieren. Schein derzeit Alles ein bisschen in Bewegung zu sein.
Zum Erstellen nicht existenter Home-Directories benötigen wir eine Konfiguration für das PAM-Modul mkhomedir. Die sieht wie folgt aus:
# /usr/share/pam-configs/mkhomedir
Name: Create missing home directory on login
Default: yes
Priority: 0
Session-Type: Additional
Session-Final:
required pam_mkhomedir.so skel=/etc/skel umask=0077 silent
Um Nicht-Lokale Benutzer nach der Anmeldung für die Dauer der Sitzung Mitglied in lokalen Gruppen werden zu lassen benötigen wir das PAM-Modul group. Die Mitgliedschaften werden über die Datei /etc/security/group.conf
verwaltet. Die entpsrechende Konfiguration zu Benutzung mit pam-auth-config
findet sich im Folgenden:
# /usr/share/pam-configs/group
Name: Default group memberships
Default: yes
Priority: 0
Auth-Type: Additional
Auth:
optional pam_group.so
So, kommen wir nun zum Sahnehäubchen der Konfiguration: Die Offline-Anmeldung ermöglichen. Die Konfiguration für libpam-ccreds
ist dabei auf zwei Dateien aufzuteilen. Eine konfiguriert das Prüfen der Anmeldedaten und ggf. das Aktualisieren der Zwischengespeicherten Informationen, die Andere das Speichern der Passwörter. Die Dateien sehen wie folgt aus und stammen aus einem aktuelleren libpam-ccreds
Debianpaket (Debian Squeeze oder Ubuntu Maverick) bei dem sich dem Fehlen der entsprechenden Dateien bereits angenommen wurde.
# /usr/share/pam-configs/ccreds-check
Name: Ccreds credential caching - password checking
Default: yes
Priority: 0
Auth-Type: Primary
Auth:
[success=end default=ignore] pam_ccreds.so minimum_uid=1000 action=validate use_first_pass
[default=ignore] pam_ccreds.so minimum_uid=1000 action=update
# /usr/share/pam-configs/ccreds-save
Name: Ccreds credential caching - password saving
Default: yes
Priority: 512
Auth-Type: Additional
Auth:
optional pam_ccreds.so minimum_uid=1000 action=store
Nun kommt der grosse Moment wo das Ganze im System aktiviert wird. Wir führen den Befehl
sudo pam-auth-update
aus und wählen alle Profile ausser LDAP aus. Das soll es gewesen sein. Alle Anforderungen sind mit der Konfiguration erfüllt.
Hut ab für den Eintrag. 😉 Sehr gut gemacht. 😉
danke für die gute anleitung.
leider bekam ich (mit linux mint 12 bzw. ubuntu 11.10) beim einloggen immer einen “Authentication Failure” ohne weitere hinweise im syslog oder im auth.log (einzig die erfolgreiche anmeldung am krb war da zu sehen).
lösungen (oder eher workarounds) hierfür sind:
– ldap in der nsswitch.conf auch bei shadow eintragen
– dem ldap-account die objectClass ‘shadowAccount’ wegnehmen
– die pam_ldap.so wenigstens im common-account eintragen (common-auth ist nicht nötig)
sind alles recht unschöne workarounds; einzig halbwegs sinnvoll erscheint die letzte möglichkeit, wobei diese dann die autoconfig via pam-auth-config überschreibt und somit deaktiviert
gibts vielleicht noch ne andere lösung?
Der letzte Workaround klingt am sinnvollsten. Leider habe ich das ganze bisher auch unter nichts aktuellerem als 10.04 LTS eingerichtet. Ich weiss aber, dass sich z.B. in Debian 6.0 das ganze PAM Zeug zwischenzeitlich auch geaendert hat.
Wenn man irgendetwas an der PAM Config aendern will, sollte man selber entsprechende Auth-Profile erstellen und die dann mittels pam-auth-update bzw. auth-client-config aktivieren. Ich befuerchte nur, dass sowas kein Dist-Upgrade ueberlebt.
ok, ich hab mir jetzt ein zweites ldap-profil angelegt:
#############
Name: LDAP Account (no Authentication)
Default: yes
Priority: 128
Account-Type: Primary
Account:
[success=end default=ignore] pam_ldap.so
#############
damit scheint es zu funktionieren.
danke nochmal für die anleitung.
update:
das “authentication failure”-problem tritt so auch beim offline anmelden via pam_ccreds auf. um das zu umgehen muss in meinem ldap-account-profil die zeile
[success=end default=ignore] pam_ldap.so
geändert werden in
[success=end authinfo_unavail=end default=ignore] pam_ldap.so
Ah okay. Danke fuer den Hinweis.