Dovecot speichert lokal von Postfix zugestellte Nachrichten im Postfach des jeweiligen Benutzers. Benutzer authentifizieren sich mit ihrem Kerberos Ticket oder Passwort, um Zugriff auf ihre Nachrichten über IMAP zu erhalten. Das veraltete POP3 aktivieren wir nicht.
Dovecot besteht aus mehreren Komponenten, von denen wir Folgende verwenden:
apt install dovecot-{core,lmtpd,imapd,ldap,gssapi,sieve,managesieved}
Für den Schlüsselaustausch erzeugen wir einen Satz Diffie-Hellmann-Parameter.
openssl dhparam -out /etc/ssl/dh4096.pem 4096
Dovecot verwendet das Let's Encrypt Zertifikat für TLS. Klartext-Passwörter werden ausschließlich über verschlüsselte Verbindungen via PAM geprüft, oder besser noch via GSSAPI gegen Kerberos authentifiziert.
/etc/dovecot/dovecot.conf#auth_verbose = yes #disable_plaintext_auth = yes ssl_dh = </etc/ssl/dh4096.pem ssl_key = </etc/letsencrypt/live/illusioni.de/privkey.pem ssl_cert = </etc/letsencrypt/live/illusioni.de/fullchain.pem auth_mechanisms = plain gssapi auth_krb5_keytab = /etc/krb5/dovecot.keytab auth_gssapi_hostname = "$ALL" userdb { driver = ldap args = /etc/dovecot/dovecot-ldap.conf } passdb { driver = pam }
Sobald ein neues Zertifikat ausgestellt wird, laden wir die Konfiguration neu.
/etc/letsencrypt/renewal-hooks/post/reloaddoveadm reload
In dieser Konfiguration bezieht Dovecot Benutzerdaten aus dem LDAP-Verzeichnis mit den zuvor erstellten Zugangsdaten. Der Benutzer-Filter findet Datensätze entweder anhand des Benutzernamens oder der hinterlegten Elektropost-Adresse. Die Benutzer-Attribute ordnen die von Dovecot benötigten Informationen den LDAP-Attributen zu.
uris = ldap://localhost tls = yes tls_ca_cert_file = /etc/ssl/ca.crt base = ou=users,dc=illusioni,dc=de dn = cn=dovecot,ou=daemons,dc=illusioni,dc=de dnpass = Password user_filter = (|(uid=%u)(mail=%u)) user_attrs = \ =mail=mbox:/srv/mail/%{ldap:uid},\ =home=%{ldap:homeDirectory},\ =uid=%{ldap:uidNumber},\ =gid=%{ldap:gidNumber}
Nun sollte doveadm user '*'
alle Benutzer auflisten,
die Elektropost empfangen können.
Eintreffende Nachrichten werden dann auf die Postfächer verteilt.
Ob man sich für das Maildir- oder das Mbox-Format entscheidet ist
Geschmackssache. Der Platzhalter %u
steht für den
Benutzernamen, %d
für den Namen der Internet-Domäne,
falls man diese in den Pfad einbauen möchte. Desweiteren werden
häufig verwendete Ordner mit angelegt.
/etc/dovecot/dovecot.confmail_location = mbox:/srv/mail/%u namespace inbox { inbox = yes; mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = create special_use = \Junk } mailbox Trash { auto = create special_use = \Trash } mailbox Archive { auto = subscribe special_use = \Archive } mailbox Sent { auto = subscribe special_use = \Sent } }
Dieser Abschnitt legt fest, welche Protokolle mit welchen Erweiterungen gestartet werden.
/etc/dovecot/dovecot.confprotocols = lmtp imap sieve protocol lmtp { postmaster_address = postmaster@illusioni.de mail_plugins = sieve } protocol imap { mail_plugins = imap_sieve } protocol sieve { }
Postfix authentifiziert Benutzer über den von Dovecot angebotenen SASL-Mechanismus und liefert lokal zuzustellende Nachrichten an den LMTP-Daemon aus. Dazu legen diese Dienste Unix Domain Sockets mit entsprechenden Zugriffsrechten an.
/etc/dovecot/dovecot.confservice auth { unix_listener /var/spool/postfix/private/dovecot-auth { mode = 0660 user = postfix group = postfix } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } }
Mit dem Pidgeonhole Plugin kann der LDA eingehende Nachrichten auf Unterordner verteilen. Die Filterregeln lassen sich zum Beispiel über das Sieve Plugin für Mozilla Thunderbird verwalten. Außerdem können Benutzer den Spamfilter trainieren, indem Sie Nachrichten in den Junk-Ordner hinein oder hinaus verschieben.
/etc/dovecot/dovecot.confservice managesieve-login { } service managesieve { } plugin { sieve = ~/.dovecot.sieve sieve_dir = ~/sieve sieve_plugins = sieve_imapsieve sieve_extprograms sieve_pipe_bin_dir = /etc/dovecot/sieve sieve_global_extensions = +vnd.dovecot.pipe # From elsewhere to Junk folder imapsieve_mailbox1_name = Junk imapsieve_mailbox1_causes = COPY imapsieve_mailbox1_before = file:/etc/dovecot/sieve/report-spam.sieve # From Junk folder to elsewhere imapsieve_mailbox2_name = * imapsieve_mailbox2_from = Junk imapsieve_mailbox2_causes = COPY imapsieve_mailbox2_before = file:/etc/dovecot/sieve/report-ham.sieve }
Dazu muss man noch einen Satz Sieve-Skripte erstellen, die beim Verschieben von Nachrichten in den Junk-Ordner diese als Spam trainieren…
/etc/dovecot/sieve/report-spam.sieverequire ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"]; if environment :matches "imap.email" "*" { set "email" "${1}"; } pipe :copy "learn-spam.sh" [ "${email}" ];
…oder beim Hinausverschieben als Ham.
/etc/dovecot/sieve/report-ham.sieverequire ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"]; if environment :matches "imap.mailbox" "*" { set "mailbox" "${1}"; } if string "${mailbox}" "Trash" { stop; } if environment :matches "imap.user" "*" { set "username" "${1}"; } pipe :copy "learn-ham.sh" [ "${email}" ];
Und die referenzierten Shell-Skripte für Spam…
/etc/dovecot/sieve/learn-spam.shexec /usr/bin/rspamc -h localhost:11334 learn_spam
…und Ham.
/etc/dovecot/sieve/learn-ham.shexec /usr/bin/rspamc -h localhost:11334 learn_ham
Zum Schluß werden die Sieve-Skripte noch kompiliert und schließlich Dovecot neu gestartet.
sievec /etc/dovecot/sieve/report-ham.sieve sievec /etc/dovecot/sieve/report-spam.sieve chmod +x /etc/dovecot/sieve/learn-ham.sh chmod +x /etc/dovecot/sieve/learn-spam.sh systemctl restart dovecot
Ein manueller Test zeigt, ob die Verbindung per TLS funktioniert.
openssl s_client -connect localhost:143 -starttls imap a login "User" "Password" a OK Logged in b select inbox ^D