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:

CN=Dovecot Administrator,OU=ServiceAccounts,DC=domain,DC=local

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:

apt-get install dovecot-ldap dovecot-imapd postfix-ldap

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:

rm /etc/dovecot/conf.d/10-ssl.conf
apt-get install dovecot-ldap dovecot-imapd

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:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail
mkdir /var/vmail
chown vmail:vmail /var/vmail

Dovecot

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

rm -r /etc/dovecot/*

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

nano /etc/dovecot/dovecot-ldap.conf.ext

Der Inhalt:

hosts = 192.168.99.1 # Windows Active Directory
dn = CN=Dovecot Administrator,OU=ServiceAccounts,DC=domain,DC=local
dnpass = MeinPasswortDesServiceAccounts
tls = no # Benötige ich (!) nicht 
auth_bind = yes # Für die Dauer der Authentifizierung bindet sich Dovecot als einloggender Mailuser
ldap_version = 3
base = OU=People,DC=domain,DC=local # Meine OU mit Benutzern
scope = subtree # Oder "base", falls nicht rekursiv in der OU gesucht werden soll
user_attrs = \
  =quota_rule=*:bytes=%{ldap:quotaBytes}, \
  =home=/var/vmail/%d/%{ldap:sAMAccountName}, \
  =mail=maildir:/var/vmail/%d/%{ldap:sAMAccountName}/Maildir
user_filter = (&(mail=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) # Nur Personen, nur nicht-deaktivierte, nur mit Mail-Attribut
pass_filter = (&(mail=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) # Nur Personen, nur nicht-deaktivierte, nur mit Mail-Attribut
iterate_attrs = mail=user # Wird vor allem von "doveadm" benötigt, um Benutzer zu finden
iterate_filter = (objectClass=person)

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:

chown root: /etc/dovecot/dovecot-ldap.conf.ext ; chmod 600 /etc/dovecot/dovecot-ldap.conf.ext

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

nano /etc/dovecot/dovecot.conf
auth_mechanisms = plain login
mail_uid = vmail
mail_gid = vmail
ssl_cert = </etc/ssl/mail.crt
ssl_key = </etc/ssl/mail.key
login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k"
mail_plugins = quota
ssl_protocols = !SSLv3 !SSLv2
ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
log_timestamp = "%Y-%m-%d %H:%M:%S "
protocols = imap
listen = *
auth_cache_size = 50000 # ~ 200 Benutzer mit Passwort
auth_cache_ttl = 300 # in Sekunden, 5 Minute
auth_cache_negative_ttl = 30 # wenn Benutzer nicht existierte bei letztem Check

userdb {
  args = /etc/dovecot/dovecot-ldap.conf.ext
  driver = ldap
}
passdb {
  args = /etc/dovecot/dovecot-ldap.conf.ext
  driver = ldap
}

service auth {
  unix_listener /var/spool/postfix/private/auth_dovecot {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }
  user = root
}

service dict {
    unix_listener dict {
        mode = 0660
        user = vmail
        group = vmail
    }
}

namespace inbox {
  inbox = yes
  location =
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = subscribe
    special_use = \Junk
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
  prefix =
}

protocol imap {
  mail_plugins = quota imap_quota
}

plugin {
  quota = maildir:User quota
}

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“:

smtp      inet  n       -       -       -       -       smtpd
submission inet n       -       -       -       -       smtpd
  -o smtpd_enforce_tls=yes
  -o smtpd_tls_security_level=encrypt
  -o tls_preempt_cipherlist=yes
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -   n   n   -   2   pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

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“.

nano /etc/postfix/main.cf

Der Inhalt:

smtpd_banner = $myhostname
biff = no
inet_protocols = ipv4
append_dot_mydomain = no
readme_directory = /usr/share/doc/postfix
smtpd_tls_cert_file = /etc/ssl/mail.crt
smtpd_tls_key_file = /etc/ssl/mail.key
smtpd_tls_security_level=may
smtp_tls_cert_file = /etc/ssl/mail.crt
smtp_tls_key_file = /etc/ssl/mail.key
smtp_tls_security_level=may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_auth_only = yes
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_ciphers=high
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
smtpd_tls_eecdh_grade = strong
myhostname = hostname.domain.tld # zum Beispiel mail.domain.tld
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = hostname.domain.tld localhost # Hier darf AUF KEINEN FALL eine virtuelle Domäne stehen!
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
disable_vrfy_command = yes
smtpd_helo_required = yes
smtpd_sasl_type=dovecot
smtpd_sasl_path=private/auth_dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps
smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch,
   reject_unknown_sender_domain,
   permit_sasl_authenticated
smtpd_recipient_restrictions = permit_sasl_authenticated,
   permit_mynetworks,
   reject_rbl_client zen.spamhaus.org,
   reject_unauth_destination,
   reject_unknown_reverse_client_hostname,
smtpd_data_restrictions =
   reject_unauth_pipelining,
   permit
virtual_mailbox_base = /var/vmail/
virtual_alias_domains =
virtual_minimum_uid = 104
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = dovecot
html_directory = /usr/share/doc/postfix/html
sender_bcc_maps =
recipient_bcc_maps =
relay_domains =
relay_recipient_maps =
smtpd_sasl_local_domain = domain.tld # Wird angehangen, wenn keine Domäne angegeben wurde
virtual_mailbox_domains = domain.tld # Alle virtuellen Domänen
smtpd_sender_login_maps = proxy:ldap:/etc/postfix/ldap/sender_login_maps.cf
virtual_mailbox_maps = proxy:ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
virtual_alias_maps = proxy:ldap:/etc/postfix/ldap/virtual_group_maps.cf
dovecot_destination_recipient_limit=1 # Notwendig für die Gruppenfunktion

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

nano /etc/postfix/ldap/sender_login_maps.cf

Inhalt:

server_host     = 192.168.99.1
server_port     = 389
version         = 3
bind            = yes
start_tls       = no
bind_dn         = CN=Dovecot Administrator,OU=ServiceAccounts,DC=domain,DC=local
bind_pw         = MeinPasswortDesServiceAccounts
search_base     = OU=People,DC=domain,DC=local
scope           = sub
query_filter    = (&(mail=%s)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute= mail

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

nano /etc/postfix/ldap/virtual_group_maps.cf

Inhalt:

server_host     = 192.168.99.1
server_port     = 389
version         = 3
bind            = yes
start_tls       = no
bind_dn         = CN=Dovecot Administrator,OU=ServiceAccounts,DC=domain,DC=local
bind_pw         = MeinPasswortDesServiceAccounts
search_base     = OU=People,DC=domain,DC=local
scope           = sub
query_filter    = (&(objectClass=group)(mail=%s))
leaf_result_attribute = mail
special_result_attribute = member
result_attribute= mail
debuglevel      = 0

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

nano /etc/postfix/ldap/virtual_mailbox_maps.cf

Inhalt:

server_host     = 192.168.99.1
server_port     = 389
version         = 3
bind            = yes
start_tls       = no
bind_dn         = CN=Dovecot Administrator,OU=ServiceAccounts,DC=domain,DC=local
bind_pw         = MeinPasswortDesServiceAccounts
search_base     = OU=People,DC=domain,DC=local
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

Die neuen Proxymaps bitte noch absichern vor fremden Zugriff:

chmod 744 /etc/postfix/ldap/*

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:

(&(mail=%s)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))

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.

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

  1. 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?

  2. 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!

  3. 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é

  4. 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

  5. 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:

      postmap -q user.name@domain.tld ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf

      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

          result_format = %u/inbox/
          query_filter    = (&(mail=%s)(objectclass=inetOrgPerson))

          Dovecot Queries

          user_attrs = \
            =home=%{ldap:homeDirectory}, \
            =mail=maildir:%{ldap:homeDirectory}/inbox
          user_filter = (&(mail=%u)(objectClass=inetOrgPerson))
          pass_filter = (&(mail=%u)(objectClass=inetOrgPerson))
          iterate_filter = (objectClass=inetOrgPerson)
          

          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.