Freitag, 23. November 2007
Die meisten werden es kennen: Wo man sich auch immer in der IT-Landschaft bewegt benötigt man Zugangsdaten. Vielerorts sind diese noch nicht vereinheitlicht (Stichwort Single-Sign-On, Kerberos etc.) – Administratoren wie Endbenutzer müssen sich eine Vielzahl von Benutzernamen und Passwörtern merken, um der täglichen Arbeit nachzugehen.
Wenn wie bei mir auf der Arbeit hingegen bereits ein von einer anderen Einheit betriebenes LDAP-Verzeichnis besteht, kann man dieses bei der Bewirtschaftung von Web-Applikationen zur Benutzer-Authentifizierung und -Authorisierung hinzuziehen.
In der hier vorliegenden Anleitung erläutere ich, wie Web-Verzeichnis gegen unbefugten Zugriff geschützt werden. Zum Einsatz kommen Debian und Apache 2.2 – ich gehe davon aus, dass beides bereits ordnungsgemäss installiert und konfiguriert wurde.
OpenLDAP & Hilfsprogramme installieren
Als erstes installiert man OpenLDAP sowie die ldap-utils mit einigen nützlichen Hilfsprogrammen:
apt-get install slapd
apt-get install ldap-utils
OpenLDAP lässt man aber unkonfiguriert, denn ein aktiver LDAP-Server befindet sich ja bereits im Netzwerk und versieht seinen Dienst.
Anschliessend passt man die Konfiguration von OpenLDAP an:
$ cat /etc/ldap/ldap.conf
BASE o=org,c=ch
URI ldaps://ldap.domain.tld
TLS_CACERTDIR /etc/ldap/cacerts
TLS_REQCERT never
SSL-Zertifikate
In unserem Falle reichte es, in /etc/ldap einen Symlink auf /etc/ssl/certs einzurichten. Der LDAP-Server verwendet ein Standard-Zertifikat von CyberTrust, welches bei Debian schon von Beginn weg dabei ist (?).
Bei einer frischen Debian-Installation (4.0r3) existiert dieses Verzeichnis nicht; Zertifikate sind auf dem System standardmässig keine vorhanden. Zuerst gilt es nun also, das Zertifikat des Servers herauszufinden:
openssl s_client -connect ldap.domain.tld:636 -showcerts
Anhand dieser Angaben sucht man über Google nach dem „<anbieter> global root“ des Anbieters (bspw. Cybertrust) und gelangt so normalerweise sofort zu den gesuchten Information. In meinem Fall war es:
ct_root.pem
Dieses Zertifikat laden wir uns herunter und legen es im Verzeichnis /etc/ldap/cacerts ab.
Anstelle in der ldap.conf explizit ein Zertifikat anzugeben, überlassen wir es OpenLDAP, das richtige Ding zu eruiren. Das klappt natürlich nur, wenn der Sysadmin des LDAP-Servers nicht selbst ein Zertifikat gebastelt hat.
Testlauf
Um zu überprüfen, ob OpenLDAP korrekt konfiguriert wurde, lässt man eine erste Abfrage laufen:
$ ldapsearch -x "uid=maeby"
# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: uid=maeby
# requesting: ALL
#
# maeby, suborg, org, ch
dn: ...
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
objectClass: ...
objectClass: ...
objectClass: ...
uid: maeby
shadowFlag: 1
description: temporary staff account, imported from domain
homeDirectory: /home/maeby
uidNumber: 0001
gidNumber: 0010
cn: Mario Aeby
loginShell: /bin/bash
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
Wenn dies klappt, geht es zum nächsten Schritt:
Apache 2.2 konfigurieren
Als erstes aktiviert man die zwei LDAP-Module:
$ cd /etc/apache2/mods-enabled
ln -s ../mods-available/ldap.load
ln -s ../mods-available/authnz_ldap.load
Es empfiehlt sich, einen LDAP-Cache einzurichten. Im selben Verzeichnis (/etc/apache2/mods-enabled) erstellt man deshalb eine Datei ldap.conf mit folgendem Inhalt:
$ cat /etc/apache2/mods-enabled/ldap.conf
# Enable the LDAP connection pool and shared
# memory cache. Enable the LDAP cache status
# handler. Requires mod_ldap and mod_auth_ldap
LDAPSharedCacheSize 2000000
LDAPCacheEntries 1024
LDAPCacheTTL 28800
LDAPOpCacheEntries 1024
LDAPOpCacheTTL 28800
# specify shared memory file, to activate cache
LDAPSharedCacheFile /var/cache/apache2/ldap.cache
Web-Verzeichnisse schützen
Das Vorgehen ist ähnlich zu einer Authentifikation über eine htpasswd-Datei, abgesehen davon dass man einige andere Befehle einsetzt:
$ cat .htaccess
AuthType Basic
AuthName Test
AuthLDAPURL "ldaps://ldap.domain.tld/o=org,c=ch?uid"
AuthzLDAPAuthoritative on
AuthBasicProvider ldap
Require ldap-user maeby bgates sjobs
Anstelle Benutzer kann man auch Gruppen spezifizieren – oder gar spezielle Filter mitgeben, die erfüllt sein müssen.