Linux als LDAP/Kerberos-Client in einer Windows 2008 ADS

23. Januar 2009 | Von | Kategorie: Admin

Heute bin ich wieder über ein Problem gestolpert für das es recht wenig Dokumentation im Internet gibt. Dabei handelt es sich sicherlich um ein häufiges auftretendes Problem:

  • Windows 2008 ADS mit zentraler Benutzerverwaltung
  • Wenige Linux Systeme auf denen gleiche Kennwörter verwendet werden sollen

Dies geht mit wenigen Schritten und Anpassungen auf beiden Seiten.  Hierzu müssen unter Windows einige Software-Pakete nachinstalliert werden. Dann kann der Linux-Client über LDAP und Kerberos an die ADS gehängt werden. Anschließend erhält der Benutzer bei seiner Anmeldung unter Linux ein vollwertiges Kerberos-Ticket, welches mit dem Konqueror, Thunderbird und anderen Clients sogar ein Single-Sign-On bei dem Zugriff auf die Windows-Applikationen ermöglicht!

Windows 2008:

  1. Zunächst muss ein Windows 2008 System vorhanden sein. Ich habe für meinen Test eine neue Installation mit Hilfe einer 180 Tage Testversion von Microsoft aufgesetzt.
  2. Anschließend installiert man die Rolle  „Active Directory Domänendienste“. Hierbei können die Defaultwerte übernommen werden. Meine Domäne lautet: „ost.example.com“.
  3. Nun wird der Rollendienst „Identity Managment für Unix“ (IDMU) nachinstalliert. Der NIS-Server wird auch benötigt auch wenn wir ihn später nicht starten werden. Achtung: Es ist der Rollendienst, nicht die Rolle. Die Dienste befinden sich im Assistenten etwas tiefer.
  4. Nun ist spätestens ein Neustart fällig.
  5. Rufen Sie nun die Benutzerverwaltung auf und legen Sie zunächst eine neue Gruppe an. Vergeben Sie dabei auch eine NIS-Domäne in der UNIX-Attributes Registerkarte. Alternativ können Sie auch eine vorhandene Gruppe editieren.
  6. Legen Sie nun einen neuen Benutzer (hier ralfunix) an, dem Sie ebenfalls entsprechende Werte in der Registerkarte UNIX-Attributes zuordnen.
  7. Zusätzlich brauchen wir auch noch einen Dummy-Benutzer (hier ldapuser) für die späteren LDAP-Anfragen. Dies muss kein UNIX-Benutzer sein. Er kann auch Mitglied der Gruppe Domänen-Gäste sein. Vergeben Sie allen Benutzern ein Kennwort.
  8. Wir brauchen auch noch ein Computer-Konto. Dieses können Sie auch gleich anlegen (hier linux)

Nun müssen wir für eine Zeitsynchronisation unter Windows sorgen. Kerberos ist sehr pingelig was Zeitverschiebungen betrifft:

  1. w32tm /config /syncfromflags:manual /manualpeerlist:“ptbtime1.ptb.de, ptbtime2.ptb.de“
  2. w32tm /config /reliable:YES /update
  3. w32tm /resync

Jetzt erzeugen wir eine Kerberos-Keytab für unsere Linux-Box. Jedes System welches Mitglied der Domäne ist, benötigt eine derartige Keytab-Datei:

  1. ktpass.exe -princ HOST/linux.example.com@OST.EXAMPLE.COM -mapuser OST/linux$ -crypto all -pass kennwort -ptype KRB5_NT_PRINCIPAL -out filename.keytab

Hierbei ist der FQDN meines Linux-Rechners linux.example.com. Das Computerkonto ist in der Domäne OST und heisst linux. Die Realm heisst OST.EXAMPLE.COM. Die Keytab wird in der Datei filename.keytab exportiert. Diese muss nun mit einem Werkzeug wie WinSCP auf die Linux-Maschine transportiert werden.

Hierzu benötigen wir nun das Linux-System. Ich habe hier zunächst ein OpenSuse 11.1. Dort habe ich zunächst die Kerberos und LDAP-Bibliotheken installiert. Nun passen wir die Datei /etc/krb5.conf an:

[libdefaults]
default_realm = OST.EXAMPLE.COM
clockskew = 300

[realms]
OST.EXAMPLE.COM = {
kdc = win-7673j5wjo3q.ost.example.com
default_domain = ost.example.com
admin_server = win-7673j5wjo3q.ost.example.com
}

[logging]
kdc = FILE:/var/log/krb5/krb5kdc.log
admin_server = FILE:/var/log/krb5/kadmind.log
default = SYSLOG:NOTICE:DAEMON

[domain_realm]
.ost.example.com = OST.EXAMPLE.COM

[appdefaults]
pam = {
ticket_lifetime = 1d
renew_lifetime = 1d
forwardable = true
proxiable = false
minimum_uid = 1
}

Ja, mein DC hat den unausprechlichen Namen win-7673j5wjo3q.ost.example.com.

Die übertragene Datei filename.keytab kann nun umbenannt werden in /etc/krb5.keytab. Der Befehl klist sollte den Inhalt anzeigen:

# klist -k
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
3 HOST/linux.example.com@OST.EXAMPLE.COM
3 HOST/linux.example.com@OST.EXAMPLE.COM
3 HOST/linux.example.com@OST.EXAMPLE.COM
3 HOST/linux.example.com@OST.EXAMPLE.COM
3 HOST/linux.example.com@OST.EXAMPLE.COM

Soweit, so gut. Nun können Sie bereits versuchen mit kinit ein Ticket zu erhalten:

# kinit ralfunix
Password for ralfunix@OST.EXAMPLE.COM: kennwort
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: ralfunix@OST.EXAMPLE.COM

Valid starting     Expires            Service principal
01/27/09 17:44:13  01/28/09 03:44:15  krbtgt/OST.EXAMPLE.COM@OST.EXAMPLE.COM
renew until 01/28/09 17:44:13

Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached

Perfekt, Tickets werden bereits ausgeliefert!

Nun kümmern wir uns um den Name-Service-Switch. Damit das Linux-System auch die Benutzer kennt, muss nicht nur Kerberos und die Authentifizierung über PAM, sondern auch die Namensauflösung konfiguriert werden.

LDAP:

Zunächst prüfen wir, ob unser Dummybenutzer schon funktioniert:

# ldapsearch -h 192.168.0.5 -b dc=ost,dc=example,dc=com -D ldapuser@ost.example.com -W -x

Hierbei geben wir mit -h die IP-Adresse unseres DC als Host an. Die Domäne geben wir mit -b als LDAP-Baum an. Mit -D geben wir unseren LDAP-Dummy-Benutzer an. Hierbei muss die Realm mit @ angehängt werden. Ausnahmsweise ist die Schreibweise der Realm egal. Mit -W werden wir nach dem Kennwort gefragt und mit -x wählen wir die Kennwort-basierte Authentifizierung. Der Befehl sollte nach Eingabe des richtigen Kennwortes keine Fehler sondern den Inhalt des LDAP-Baums ausgeben!

Nun können wir den Name Service Caching Daemon stoppen, die NSS-LDAP-Bibliotheken installieren und die Datei /etc/ldap.conf anpassen:

/etc/ldap.conf:

host win-7673j5wjo3q.ost.example.com
debuglevel 255
base dc=ost,dc=example,dc=com
binddn ldapuser@ost.example.com
bindpw ldapuser
bind_policy soft
pam_lookup_policy yes
nss_initgroups_ignoreusers root,ldap
nss_base_passwd         dc=ost,dc=example,dc=com?sub
nss_base_shadow         dc=ost,dc=example,dc=com?sub
nss_base_group          dc=ost,dc=example,dc=com?sub?&(objectCategory=group)(gidnumber=*)
nss_map_objectclass posixAccount user
nss_map_objectclass shadowAccount user
nss_map_attribute uid sAMAccountName
nss_map_attribute homeDirectory unixHomeDirectory
nss_map_attribute shadowLastChange pwdLastSet
nss_map_objectclass posixGroup group
nss_map_attribute uniqueMember member
pam_login_attribute sAMAccountName
pam_filter objectclass=User
pam_password ad

Anschließend sollte direkt der folgende Befehl funktionieren. Dann können wir den Name Service Caching Daemon (nscd) wieder starten.

# id ralfunix
uid=10000(ralfunix) gid=10000(gruppe) groups=10000(gruppe)

Nun konfigurieren wir PAM, dass es Kerberos bzw. LDAP verwendet. Zunächst müssen hierfür die notwendigen Bibliotheken pam_ldap und pam_krb5 installiert werden. Dann ist es wichtig, dass die meisten modernen Linux-Distributionen eine zentrale PAM-Dateien für die Konfiguration auf dem System vorsehen. Bei Suse sind es die Datei /etc/pam.d/common-* deren Inhalt ich im folgenden angebe:

common-auth:
auth    required        pam_env.so
auth    sufficient      pam_unix2.so
auth    required        pam_krb5.so     use_first_pass

common-account:
account requisite       pam_unix2.so
account sufficient      pam_localuser.so
account required        pam_ldap.so

common-session:
session required        pam_limits.so
session required        pam_unix2.so
session required        pam_ldap.so
session optional        pam_umask.so

common-password:
password        sufficient      pam_krb5.so
password        requisite       pam_pwcheck.so  nullok cracklib
password        required        pam_unix2.so    use_authtok nullok

Nun sollte die Anmeldung als Benutzer ralfunix mit dessen Windows-Kennwort möglich sein. Anschließend sollte auch das Ticket verfügbar sein.

Post to Twitter Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to Ping.fm Post to Reddit

Tags: | | |

Schreibe einen Kommentar

Fühle dich ermuntert einen Kommentar, Anmerkungen, Hinweise oder deine Ideen zum Thema zu hinterlassen. Wir freuen uns über deine Rückmeldung.