Dovecot, Postfix – Mit LDAP zum Active Directory

Postfix, Dovecot, MS AD

Heute gibt es einen Artikel zu Dovecot, Postfix und die Anbindung an ein Active Directory via LDAP.
Verwendet habe ich Debian Jessie (da schon „bald“ stable) sowie Microsoft Windows Server 2012 R2.

Dovecot sollte in Version >=2.1 vorliegen, um Postfix müssen sich die wenigsten Gedanken machen. Ich denke, dass alle Distributionen eine Version ausliefern, die aktuell genug ist.

Ich gehe an vielen Stellen nicht so sehr ins Detail, wie es sich viele vielleicht wünschen. Besonders die allgemeine Konfiguration von Dovecot und Postfix lasse ich größtenteils aus oder erkläre sie einfach nicht weiter (sorry).
Ich denke, dass ich mit diesem Artikel viele offene Fragen zu Linux-Mailserver + Active Directory klären- oder zumindest in die richtige Richtung stoßen kann.
Die Syntax sieht ab und zu wild aus, ist aber gar nicht so schwer. Es braucht einfach etwas Zeit.
Seid mir nicht böse, dass auf den Screenshot „dc=debinux“ und nicht „dc=domain“ zu sehen ist… ;-)

Was in diesem Setup ebenso möglich ist, ist das Erstellen von Gruppen innerhalb der OU „People“ (im Verlauf beschrieben…) mit einer E-Mailadresse, deren Mitglieder diese Mails empfangen.
Eine Quota wird ebenso mit einem (benutzerdefiniertem) Attribut aus dem Active Directory ausgelesen.

Changelog

  • 03. Dez 2014 – Caching von Login-Daten, wenn LDAP offline für 5 Minuten

Vorbereitungen

In meinem Active Directory erstelle ich einen Account für den LDAP-Bind vom Mailserver zum AD, den DN („Distinguished Name“) notiere ich mir:

Dovecot, Postfix, Active Directory Abbildung 1
Dovecot, Postfix, Active Directory Abbildung 1

Dovecot, Postfix, Active Directory Abbildung 2
Dovecot, Postfix, Active Directory Abbildung 2

Der „Distinguished Name“ lautet also:

Als nächstes benötige ich ein eigenes Attribut „quotaBytes“, welches global für alle Benutzer zur Verfügung stehen soll.
Im Technet ist verständlich beschrieben, wie ich ein eigenes Attribut in ein AD einpflege:

Achtung: Allerdings ist es notwendig, das erstellte Attribut anschließend noch einmal zu öffnen und „Replicate this attribute to the Global Catalog“ anzuhaken.

Meine Benutzer lege ich in der OU „People“ ab.

Dovecot, Postfix, Active Directory Abbildung 3
Dovecot, Postfix, Active Directory Abbildung 3

Auf Seite des Linux-Servers werden folgende Pakete installiert:

Postfix wird nach dem Standort/der Art des Servers fragen, eure Auswahl spielt keine Rolle, da die Konfiguration später sowieso gelöscht wird.
Sollten während der Dovecot-Installation Fehler auftreten, liegt das einfach am fehlenden Zertifikat für SSL und ist überhaupt kein Problem.
Die entsprechende Konfigurationsdatei kann gelöscht- und die Pakete erneut installiert werden:

Bevor ich fortfahre, erstelle ich den Benutzer „vmail“ mit der UID 5000 und die Gruppe „vmail“ mit der GID 5000.
Dovecot wird später (im Verlauf) angewiesen, seine Privilegien auf diesen User zu reduzieren, nachdem die Authentifizierung erfolgreich war.
Mail soll im Verzeichnis „/var/vmail“ liegen, welches das Heimverzeichnis des Users „vmail“ wird:

Dovecot

Der Übersichtlichkeit wegen, lösche ich alle Beispiel-Konfigurationsdateien:

Für eine Kopplung von Dovecot zum AD, habe ich folgende LDAP-Konfiguration erstellt.
Hinter den Optionen einige Erklärungen:

Der Inhalt:

Zu „user_attrs“:
– Die „quota_rule“ muss im AD nicht in Byte angegeben werden, auch möglich sind Werte wie „100M“ oder „2G“.
– Der Parameter „home“ ist das Heimverzeichnis des Mailusers. Dieses sollte niemals dem Mailverzeichnis entsprechen.
– Jedoch können „home“ und „mail“ zwei komplett unterschiedliche Verzeichnisse sein.

Ich entscheide mich „mail“ innerhalb von „home“ abzulegen. Zum besseren Verständnis:

Home: /var/vmail/domain.tld/user.name
Mail: /var/vmail/domain.tld/user.name/Maildir

Abschließend die Datei vor fremdem Zugriff schützen:

Hier nun im nächsten Schritt eine simple „dovecot.conf“-Vorlage.

In dieser Konfiguration wird es lediglich IMAP- und die Möglichkeit der Quota-Nutzung geben. Die üblichen Verzeichnisse/“Mailboxen“ werden beim Einloggen erstellt.
Erwähnenswert ist der Socket innerhalb von „service dict“, welcher verständlicherweise als „vmail“ gestartet werden muss.
„service auth“ wird den Socket für Postfix bereitstellen, über den sich dieses dann authentifizieren kann. Daher ist der Pfad innerhalb der „chroot“-Umgebung „/var/spool/postfix“ und ausgeführt als postfix:postfix.
Dass „ssl_cert“ und „ssl_key“ anzupassen sind, brauche ich keinem zu sagen. :)

Postfix

Wieder eine sehr einfache Vorlage für die Konfiguration der Datei „/etc/postfix/master.cf“:

In letzten beiden Zeilen wird die Übergabe der Mail an Dovecot beschrieben. Ansonsten wurde lediglich der „submission“ Port 587/tcp aktiviert. Hier muss ich mit STARTTLS eine sichere Verbindung initiieren.
Für den Listener auf Port 25 wird dies optional ebenso möglich- aber nicht notwendig sein.

Nun zur Datei „/etc/postfix/main.cf“.

Der Inhalt:

Obiges ist wieder nur eine Vorlage, welche ich zum Teil bei fufix abgeguckt habe. Natürlich ohne MySQL Proxymaps.
Unbedingt anpassen: myhostname, mydestination, smtpd_sasl_local_domain, virtual_mailbox_domains

Bitte NICHT die externe Domäne unter mydestination eintragen

Der Inhalt der Proxymaps lautet wie folgt:

1. – /etc/postfix/ldap/sender_login_maps.cf

Inhalt:

2. – /etc/postfix/ldap/virtual_group_maps.cf

Inhalt:

3. – /etc/postfix/ldap/virtual_mailbox_maps.cf

Inhalt:

Die neuen Proxymaps bitte noch absichern vor fremden Zugriff:

Abschließend noch ein paar Worte zu den obigen Proxymaps. Vieles kann jedoch aus der Dovecot-Konfiguration abgeleitet werden.
Der „query_filter“ ist, logisch, ein Filter für die Suche, zum Beispiel:

Hier würde nach Personen gesucht mit der Mailadresse „%s“, die nicht deaktiviert sind („userAccountControl:XYZ“).
Alles muss zutreffen, daher der Operator „&“ gleich zu Beginn. Es gibt viele verschiedene Operatoren und Active Directory-spezifische Filter.
Der Parameter „result_attribute“ ist der Wert, der zurück gegeben wird. Er kann leer sein, wenn kein Treffer erzielt wurde.

20 Antworten auf “Dovecot, Postfix – Mit LDAP zum Active Directory

  1. Dennis

    Hallo,

    ich habe die Config für ein System mit OpenXchange und Auth gegen den UCS (AD-Imitat mit Samba4) verwendet. Bei einem neu angelegten Nutzer steht im mail.err:
    Error: Namespace “: mkdir(/var/mail/vmail/nutzername) failed: Permission denied (euid=2035() egid=5074() missing +w perm: /var/mail/vmail/, dir owned by 5000:5000 mode=0755)
    Die EUID und EGID sind die IDs aus dem AD des neuen Users. Laut der Config soll doch vmail die Verzeichnisse anlegen, oder?

  2. Chris

    Jetzt haben wir 2019 und Deine Anleitung ist felsenklar. Zwar für den Anfänger, vermutlich, nicht direkt durchschaubar, aber für jemanden der bereits hier und da was gemacht hat, eine super Zeitbrücke. Es macht Spaß mit Deiner Anleitung. Vielen Dank :)

    1. Chris

      In case someone gets the error message: Server is unwilling to process the request, while creating an attribute.

      For you guys that setup an AD DC with Samba 4. In order to be able to create Attributes, there is one additionally thing we need to write in /etc/samba/smb.conf.

      Add into [Global] this line:
      dsdb:schema update allowed=true

      After that, restart the samba-ad-dc service to activate the changes.

  3. odd_zymosis

    Hallo,

    ich weiss die Anleitung ist nicht mehr taufrisch, aber die bisher beste und strukturierteste die ich gefunden hatte.
    Leider ist die Anleitung wohl nicht mehr komplett.

    Mir scheint als würde die Beispielkonfiguration der dovecot.conf fehlen :(
    Kannst du das evtl nochmal fixen?

  4. Swen

    Eine Frage noch zur dieser Konfiguration.

    Die Postfächer werden nach diesem Setup erst nach dem ersten Einloggen angelegt. So spuckt mir Postfix beim Testen, das der Benutzer unbekannt wäre, aus. Kann dies trotz ohne Interaktion des Benutzers angeschoben werden?

  5. Swen

    Erstmal Danke für das gute Tutorial!

    Ich nutze einen Ubuntu-Server als Mail-Server. Hatte mich erst an diese Anleitung gehalten:

    http://www.my-it-brain.de/wordpress/der-eigene-mailserver-start-der-artikelreihe/

    Als ich die ersten Benutzer anlegen wollte, empfand ich den Weg alles über das Terminal zu machen sehr mühsam, vor allem wenn es über 1000 Postfächer später mal werden sollen. Daher fand ich die Authentifizierung über ein AD sehr erleichtern. Beim Testen von Postfix, spuckte mir die Konsole aber folgende Fehler aus:

    ● postfix.service – LSB: Postfix Mail Transport Agent
    Loaded: loaded (/etc/init.d/postfix; bad; vendor preset: enabled)
    Drop-In: /run/systemd/generator/postfix.service.d
    └─50-postfix-$mail-transport-agent.conf
    Active: active (running) since Fr 2017-04-21 15:24:29 CEST; 3 days ago
    Docs: man:systemd-sysv-generator(8)
    Tasks: 7
    Memory: 4.8M
    CPU: 15.217s
    CGroup: /system.slice/postfix.service
    ├─11415 /usr/lib/postfix/sbin/master
    ├─11427 qmgr -l -t unix -u
    ├─19257 tlsmgr -l -t unix -u -c
    ├─29436 trivial-rewrite -n rewrite -t unix -u -c
    ├─29438 pickup -l -t unix -u -c
    ├─29439 cleanup -z -t unix -u -c
    └─30540 proxymap -t unix -u

    Apr 25 10:17:11 mail postfix/cleanup[29439]: F2A904840402: message-id=
    Apr 25 10:17:11 mail postfix/proxymap[30540]: warning: dict_ldap_lookup: Search error -7: Bad search filter
    Apr 25 10:17:11 mail postfix/cleanup[29439]: warning: proxy:ldap:/etc/postfix/ldap/virtual_group_maps.cf lookup error for \“xxx@xxx.de\“
    Apr 25 10:17:11 mail postfix/cleanup[29439]: warning: F2A904840402: virtual_alias_maps map lookup problem for xxx@xxx.de — message not accepted, try again later
    Apr 25 10:18:12 mail postfix/pickup[29438]: warning: 001894840402: message has been queued for 3 days
    Apr 25 10:18:12 mail postfix/pickup[29438]: 001894840402: uid=1000 from=
    Apr 25 10:18:12 mail postfix/cleanup[29439]: 001894840402: message-id=
    Apr 25 10:18:12 mail postfix/proxymap[30540]: warning: dict_ldap_lookup: Search error -7: Bad search filter
    Apr 25 10:18:12 mail postfix/cleanup[29439]: warning: proxy:ldap:/etc/postfix/ldap/virtual_group_maps.cf lookup error for \“xxx@xxx.de\“
    Apr 25 10:18:12 mail postfix/cleanup[29439]: warning: 001894840402: virtual_alias_maps map lookup problem for xxx@xxx.de — message not accepted, try again later

    Laut Fehlermeldung hat er ein Problem mit den query_filter. Könnten Sie mir einen Denkanstoß geben, wo der Fehler liegt?

    Meine Konfig:
    virtual_group_maps.cf

    server_host = 192.168.x.x
    server_port = 389
    version = 3
    bind = yes
    start_tls = no
    bind_dn = CN=Dovecot Admin,OU=Dienstkonten,DC=x,DC=x
    bind_pw = xxx
    search_base = OU=Benutzerkonten,DC=x,DC=x
    scope = sub
    query_filter = (&(mail=%s)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
    result_attribute = mail
    result_format = %d/%u/Maildir/
    debuglevel = 0

    Viele Grüße! Und Vielen Dank für Ihr Feedback!

  6. Michael Hieke

    Hi André,

    vielen Dank für die ausführliche und gut nachvollziehbare Anleitung, hat mir sehr geholfen.

    Ich bin gerade bei der Umstellung auf ein Active Directory und habe jetzt den Stand erreicht dass ich von einem PC in der Domäne den neu installierten Mail-Server verwenden kann. Thunderbird authentifiziert sich dabei über SSL/TLS mit unverschlüsseltem Password. Es ist mir bisher noch nicht gelungen, eine der anderen Authentifizierungsmethoden (Kerberos oder NTLM) zum funktionieren zu bekommen. Möglicherweise etwas off-topic, aber hättest Du vielleicht einen Tipp dazu? Ziel ist single-sign-on…

    Vielen Dank
    Michael

    1. André P. Autor

      Hi Michael,
      leider noch nicht selber implementiert, aber schon das ein oder andere zu gelesen. Aber auch nur in Mailing Lists und im Dovecot Wiki.
      Kannst uns ja mal up-to-date halten, wenn du Fortschritte machst. :-)
      Viele Grüße
      André

  7. Patrick Bloy

    Hallo,

    ich finde Deinen Beitrag wirklich genial und sitze grad daran ihn umzusetzen um daraus ein kleines Mailsystem für unsere Hochschule zu basteln.
    Mag sein, dass ich da grad etwas auf dem Schlauch stehe, aber irgendwie sehe ich die Angaben für das Quota-Attribut im AD nicht. Mir ist klar, dass dort die Mailboxgröße gespeichert werden soll und es wahrscheinlich Integer sein soll, ganz sicher bin ich mir jedoch nicht.

    Liebe Grüße
    Patrick

  8. Noname

    Der letzten Teil des Tutorials wirft bei mir Probleme auf. Beim Versuch eine Mail zu empfangen sucht Postfix in der AC nach einem passenden Account für die Empfängeradresse. Allerdings LDAP laut den logs keinen passenden Account. Ersetzt man den lookup in der AC durch einen einfachen lokalen lookup (‚virtual_mailbox_maps = hash:/etc/postfix/vmailbox‘ mit einer passenden vmailbox Datei) funktioniert alles reibungslos.
    Jemand eine Idee woran es liegen könnte?

    1. André P. Autor

      Hi,
      dazu bitte auf jeden Fall deine „virtual_mailbox_maps“ posten und die Angaben, gegen was du abfragst. Im Artikel ist es das Attribut „mail“. Prüfst du evtl. gegen den sAMAccountName? Was loggt Postfix? (Auch mal das Debugging einschalten.)
      Ein Hinweis zum schnelleren Testen der LDAP-Abfrage:

      Viele Grüße
      André

      1. Noname

        Hallo,
        vielen Dank für die schnelle Antwort!
        Vom Aufbau her habe ich es so gemacht, dass neue Mails im Ordner /var/vmail/username/inbox gespeichert werden. Das Auflösung beim Empfangen einer Mail von der Mailadresse zum passenden Ordner würde mit folgender vmailbox Datei einwandfrei funktionieren:
        /etc/postfix/vmailbox
        username1@mydomain.de username1/inbox
        username2@mydomain.de username2/inbox
        username3@mydomain.de username3/inbox

        Wenn ich nun auf LDAP Auflösung umstelle und versucht eine Mail von einem kommerziellen Provider an mich zu senden kommt folgende Meldung in /var/log/mail.info (→ LDAP scheint die Mailadresse nicht in seinem Verzeichnis zu finden):
        Apr 10 10:24:40 debian postfix/smtpd[2343]: connect from mout.gmx.net[212.227.17.20]
        Apr 10 10:24:40 debian postfix/smtpd[2343]: NOQUEUE: reject: RCPT from mout.gmx.net[212.227.17.20]: 550 5.1.1 : Recipient address rejected: User unknown in virtual mailbox table; from= to= proto=ESMTP helo=
        Apr 10 10:24:40 debian postfix/smtpd[2343]: disconnect from mout.gmx.net[212.227.17.20]

        Die dict_ldap_debug Logzeilen habe ich der übersichtlichkeit des Kommentars hier hinterlegt:
        https://www.dropbox.com/sh/bxhgjbjgredccky/AACiaS7fM0gLgXywxCwWLZOia?dl=0

        hier die Ausschnitte aus meinen Konfigdateien:
        /etc/postfix/main.cf

        virtual_mailbox_domains = mydomain.de
        virtual_mailbox_base = /var/vmail
        virtual_mailbox_maps = ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
        #virtual_mailbox_maps = hash:/etc/postfix/vmailbox #für die Variante mit vmailbox Datei
        virtual_minimum_uid = 1000
        virtual_uid_maps = static:5000
        virtual_gid_maps = static:5000

        /etc/postfix/ldap/virtual_mailbox_maps.cf
        server_host = 192.168.178.35
        server_port = 389
        version = 3
        bind = yes
        start_tls = no
        bind_dn = cn=postfix,ou=ServiceAccounts,dc=mydomain,dc=de
        bind_pw = ldappasswort
        search_base = ou=people,dc=mydomain,dc=de
        scope = sub
        result_attribute = mail
        result_format = %u/inbox/
        debuglevel = 3

        Und zum Schluss noch ein Beispielnutzer aus meinem LDAP Verzeichnis:

        dn: uid=username,ou=people,dc=mydomain,dc=de
        objectClass: inetOrgPerson
        objectClass: posixAccount
        objectClass: top
        cn: Username
        gidNumber: 5000
        homeDirectory: /var/vmail/username
        sn: Username
        uid: username
        uidNumber: 5000
        displayName: Username
        givenName: Username
        mail: username@mydomain.de
        userPassword:: usernamepassword

        Vielen Dank für die Hilfe im Voraus!
        Noname

        1. André P. Autor

          Hi,
          hui – viele Infos, sehr gut, danke! :-)
          Das ist ein OpenLDAP, oder? Da ist es ein bissl anders als beim AD:
          Hier mal auf die Schnelle angepasste Queries:

          Postfix Queries

          Dovecot Queries

          Da fehlt natürlich jetzt die Anweisung für die Quota, da deine User scheinbar kein Quota-Attribut haben. Ist nicht schlimm, wollte es nur anmerken. :-)

          Vielleicht klappt es ja schon so. Ansonsten habe ich nur einen blöden Flüchtigkeitsfehler gemacht. Könnte aber gerne auch mal drauf schauen.

          Viele Grüße

          /Edit: Es fehlten Klammern.
          /Edit2: Typo…

          1. Noname

            Ja, ich benutze OpenLDAP und habe die Quota Regelung erstmal außen vor gelassen.
            Mit deinen Hinweisen konnte ich das Problem lösen:
            Ich hatte vorher die Filterregel query_filter weggelassen da mein LDAP Verzeichnis zu testzwecken nur mit einigen Testaccounts bestückt war bei denen kein Account gefiltert werden musste. Leider versteht Postfix es falsch wenn man das Attribut query_filter einfach komplett rauslässt und filtert wohl alles heraus.
            Mit der Zeile „query_filter = (&(mail=%s)(objectclass=inetOrgPerson))“ empfängt nun Postfix Mails von Usern die sich in meinem LDAP Verzeichnis befinden und sich mindestens einmal über IMAP angemeldet haben (sonst existiert kein Ordner in /var/vmail/).

            Vielen Dank für deine Hilfe, ich hab nun endlich Mein Traumserversetup vollständig!

        2. Noname

          …bei meinen Konfigs oben hat sich ein Fehler eingeschlichen, die Inbox sollte nicht im Maildir-Format gespeichert werden:
          /etc/postfix/ldap/virtual_mailbox_maps.cf

          result_format = %u/inbox #ohne abschließenden „/“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.