Howto: Ubuntu 10.04 LTS Client mit Kerberos und LDAP

Standard

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:

  1. Sichere Anmeldung am System mittels Kerberos
  2. Benutzer und Gruppeninformationen sollen aus dem zentralen LDAP-Verzeichnis kommen
  3. LDAP-Benutzer sollen automatisch Mitglieder lokaler Systemgruppen werden, um z.B. Zugriff auf Geräte zu habe
  4. Nicht existierende Home-Directories sollen beim ersten Anmelden erstellt werden
  5. 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.

6 thoughts on “Howto: Ubuntu 10.04 LTS Client mit Kerberos und LDAP

  1. MK

    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?

    • Tuxevara

      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.

  2. MK

    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.

  3. mk

    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

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.