17.17 Benutzerauthentifizierung von Dovecot über LDAP
In Abschnitt 10.3, »POP3/IMAP-Server mit Dovecot«, haben wir den IMAP-Server Dovecot ausführlich beleuchtet und auch die grundlegenden Fragen zur Einrichtung eines IMAP-Servers erklärt. Wenn Sie Ihre Nutzer bereits in einem LDAP-Server verwalten, können Sie die Authentifizierung von Dovecot mit wenigen Handgriffen umrüsten und ebenfalls an diesen LDAP-Server binden. Bei Debian/Ubuntu müssen Sie das Paket »dovecot-ldap« separat installieren, bei SUSE ist die LDAP-Unterstützung im Grundpaket bereits enthalten.
Ganz am Ende der Datei /etc/dovecot/conf.d/10-auth.conf können Sie nun die Authentifizierungsquelle an LDAP anpassen. Deaktivieren Sie alle anderen Authentifizierungsmethoden, und binden Sie stattdessen auth-ldap.conf.ext ein (siehe Listing 17.87):
#!include auth-deny.conf.ext
#!include auth-master.conf.ext
#!include auth-system.conf.ext
#!include auth-sql.conf.ext
!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext
Listing 17.87 Die LDAP-Definition in Dovecot einbinden
Darüber wird auf die Konfigurationsdatei /etc/dovecot/dovecot-ldap.conf verwiesen, die nicht nur Zugangsdaten zum LDAP-Server beinhaltet, sondern auch LDAP-Suchfilter für die User- und Passwortsuche definiert. Bei der Definition der Suchfilter können Sie auf drei Variablen zurückgreifen:
-
%u
auf die vollständige Mailadresse oder den Usernamen, also user@example.com -
%n
auf den Localpart von Mailadresse oder den Usernamen, also den Text bis zum @-Zeichen: user. Ist kein @-Zeichen vorhanden, ist %u identisch mit %n. -
%d
auf den Domainpart von Mailadresse oder den Usernamen, also den Text nach dem @-Zeichen: example.com. Ist kein @-Zeichen vorhanden, bleibt %d leer.
Durch ein zusätzliches »L« wird der Parameter lowercase, also »in Kleinschreibung«, verwendet. Sie sollten sich grundsätzlich »%Lu«, »%Ln« oder »%Ld« angewöhnen. Auch wenn die Groß- und Kleinschreibung bei LDAP ignoriert wird, ist sie bei Datenbankabfragen oder bei der Definition des Homeverzeichnisses des Nutzers (siehe Listing 17.88) elementar wichtig.
Haben Sie im LDAP ganz normale Userdaten in den Objektklassen posixAccount definiert, können Sie eine Authentifizierung mit folgenden LDAP-Einstellungen vornehmen, wenn sich Ihre User mit der User-ID anmelden sollen (siehe Listing 17.88):
hosts = ldap.example.com
dn = cn=dovecot,dc=example,dc=com
dnpass = <ldappasswort>
ldap_version = 3
base = ou=user,dc=example,dc=com
scope = subtree
user_attrs = homeDirectory=home, uid=uid, gid=gid
user_filter = (&(objectClass=posixAccount)(uid=%Ln))
pass_attrs = uid=user, userPassword=password
pass_filter = (&(objectClass=posixAccount)(uid=%Ln))
Listing 17.88 Konfiguration des LDAP-Zugriffs zum Login mittels UID
In den Parametern dn und bind_dn ist ein spezieller LDAP-Bind (Benutzer) konfiguriert, der die Berechtigung haben muss, Benutzerdaten aus dem LDAP-Server zu erfragen. Achten Sie darauf, dass dieser User im LDAP angelegt und gegebenenfalls mit den passenden ACLs versehen ist. Sie können Postfix und Dovecot hier guten Gewissens den gleichen LDAP-User verwenden lassen. Allerdings müssen Sie in diesem Beispiel dafür Sorge tragen, dass alle E-Mails, die Sie von Postfix mittels LMTP an Dovecot routen, bereits die UID als Localpart der Mailadresse (= %n) verwenden, also an uid@example.com adressiert sind.
[+] Sind bei Ihnen Localpart und UID nicht identisch, müssen Sie Ihre E-Mails vorher in Postfix (wie eben in Abschnitt 17.16 gezeigt) über die virtual_alias_map an uid@example.com weiterleiten lassen.
Bequemer ist es, wenn Sie auf ein LDAP-Schema zurückgreifen können, das bereits ein mail-Attribut aufweist. Dann können Sie dieses Attribut direkt in den user_filter einbinden und die Suche nach der Mailadresse als ODER-Abfrage auf dieses Attribut erweitern. So müssen Sie die Adressen in Postfix vorher nicht umschreiben lassen:
user_attrs = uid=user, homeDirectory=home, uid=uid, gid=gid
user_filter = (&(objectClass=posixAccount)(|(uid=%u)(mail=%u)))
pass_attrs = uid=user, userPassword=password
pass_filter = (&(objectClass=posixAccount)(uid=%u))
Listing 17.89 Konfiguration des LDAP-Zugriffs zur direkten Suche der Mailadresse
Beachten Sie, dass in dieser Variante trickreich auch beim uid-Attribut auf %u zurückgegriffen wurde. Ein %n könnte dafür sorgen, dass ein Localpart einer Mailadresse auf eine nur zufällig identische User-ID eines anderen Anwenders zutrifft.
Möchten Sie hingegen, dass sich Ihre User nicht mit ihrer User-ID, sondern stets mit ihrer vollen Mailadresse anmelden, können Sie Ihre Filter entsprechend anpassen und auf den Rückgriff auf die User-ID verzichten:
user_attrs = homeDirectory=home, uid=uid, gid=gid
user_filter = (&(objectClass=posixAccount)(mail=%u))
pass_attrs = userPassword=password
pass_filter = (&(objectClass=posixAccount)(mail=%u))
Listing 17.90 Konfiguration des LDAP-Zugriffs zum Login mit Mailadresse
[+] Die Kommandos »doveadm user« und »doveadm auth test« helfen, wie schon in Abschnitt 10.3.3, »User-Authentifizierung«, gezeigt, beim Debugging der Userabfrage.
In Abschnitt 10.3, »POP3/IMAP-Server mit Dovecot«, haben wir Ihnen geraten, auf dem IMAP- Server für alle Anwender die stets gleiche ID 10.000 zu verwenden. Außerdem haben wir empfohlen, den Speicherpfad der E-Mails nach /srv/vmail/<domain>/<user> zu verlegen, um die virtuellen Mailnutzer von existierenden Shell-Nutzern klar getrennt zu halten. Sie können über einen einfachen Trick dafür sorgen, dass Dovecot diese Werte automatisch so setzt und abweichende Werte im LDAP ignoriert. Passen Sie dazu die Parameter user_attrs und pass_attrs so wie in Listing 17.91 an:
user_attrs = =home=/srv/vmail/%Ld/%Lu, =uid=10000, =gid=10000
pass_attrs = =userdb_home=/srv/vmail/%Ld/%Lu, =userdb_uid=10000, =userdb_gid=10000
Listing 17.91 Konfiguration statischer LDAP-Suchergebnisse für Dovecot
Achten Sie dabei penibel auf die mehrfach gesetzten Gleichheitszeichen. Es ist richtig, dass die Einträge für uid, gid und home mit einem »leeren« Gleichheitszeichen beginnen, denn davor stünde ursprünglich ja das auszulesende LDAP-Attribut.