Apache 2.2 gegen LDAP authentifizieren

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.