Unabhängigkeitsmail 3: Dovecot

Obwohl mein erweiterter Mailstack funktional nichts mehr zu wünschen übrig lässt, geht mir die gegen Cyrus gerichtete Empfehlung der Postfix-Community (Dovecot provides an alternative that may be worth considering.) nicht aus dem Kopf, und nachdem ich so weit gekommen bin, traue ich mir auch den Betrieb eines eigenen IMAP-Servers zu.

Die Dovecot-Dokumentation ist nur auf den ersten Blick etwas einschüchternd, und mit Hilfe des Ubuntu-Wikis komme ich gut voran. Für den Heimbedarf (weniger als 5 Benutzerkonten, keine serverseitigen Mailfilter) werden drei Pakete benötigt:

apt-get install dovecot-core dovecot-imapd dovecot-lmtpd

Die Konfiguration erfolgt vollständig in /etc/dovecot/conf.d/. Im Gegensatz zu Rspamd haben die Dovecot-Maintainer umfangreich kommentierte Beispieldateien bereitgestellt, aus denen allerdings nur wenige Parameter benötigt werden

# 10-auth.conf disable_plaintext_auth = yes auth_default_realm = eden.one auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@ !include auth-passwdfile.conf.ext

Keine Klartext-Passwörter ohne SSL, Benutzernamen ohne Domäne/Realm werden um eden.one ergänzt, die Kreativität bei der Wahl von Benutzernamen wird zum Schutz vor SQL-Injektionen beschränkt, und die Passwörter liegen in einer Textdatei.

# 10-mail.conf mail_location = maildir:/var/mail/virtual/%u namespace inbox { type = private inbox = yes } mail_uid = vmail mail_gid = vmail mail_privileged_group = mail auth_socket_path = /var/run/dovecot/auth-userdb mailbox_list_index = yes

Dovecot soll Nachrichten im Maildir-Format speichern, die Inbox jeder Nutzerin als privaten Bereich betrachten und stellvertretend für alle virtuellen Nutzerinnen als Systemnutzerin vmail agieren. Der Socket für den Authentifizierungsdienst wird verwirrenderweise hier und nicht in 10-auth.conf oder in 10-master.conf definiert.

# 10-master.conf default_internal_user = dovecot service imap-login { inet_listener imap { port = 143 } inet_listener imaps { port = 993 ssl = yes } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 group = postfix user = postfix } } service auth { unix_listener auth-userdb { mode = 0660 user = vmail group = vmail } unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } }

Dovecot lauscht auf zwei IMAP-Ports (wobei auch Anfragen auf Port 143 durch die entsprechenden Parameter in 10-auth.conf (s.o.) und 10-ssl.conf (s.u.) zur Verschlüsselung gezwungen werden). Über Unix-Sockets stellt Dovecot einen LMTP-Server und den Authentifizierungsservice für IMAP-Logins (Typ: userdb) und für Postfix (Typ: client) zur Verfügung.

# 10-ssl.conf ssl = required ssl_cert = </etc/ssl/certs/mycert.pem ssl_key = </etc/ssl/private/mykey.key ssl_client_ca_dir = /etc/ssl/certs

Jede Verbindung wird verschlüsselt, und zwar mit Hilfe der SSL-Zertifikate für meine Domain.

# 15-lda.conf postmaster_address = postmaster@eden.one hostname = mail.eden.one

Auch bei der internen LMTP-Kommunikation mit Postfix soll Dovecot sich als mail.eden.one vorstellen –

Received: from mail.eden.one by mail.eden.one with LMTP id AXunOntwEWKkcA0Ap6K1+g (envelope-from <jane.doe@gmail.com>) for <user@eden.one>; Sat, 12 Feb 2022 22:34:35 +0000

– obwohl diese Angabe keinen Menschen außer mir interessiert und auch mich nicht unbedingt interessieren müsste. Relevanter sind die entsprechenden MUA/MTA-Einstellungen, die immerhin sichtbar werden, wenn eine exzentrische Empfängerin die E-Mail-Header einblendet.

# 15-mailboxes.conf namespace inbox { mailbox Drafts { special_use = \Drafts auto = subscribe } mailbox Junk { special_use = \Junk auto = subscribe } mailbox Trash { special_use = \Trash auto = subscribe } mailbox Archive { special_use = \Archive auto = subscribe } mailbox Sent { special_use = \Sent auto = subscribe } mailbox virtual/Flagged { special_use = \Flagged comment = All my flagged messages } }

Die genannten Standardpostfächer sollen automatisch angelegt und abonniert werden.

# auth-passwdfile.conf.ext passdb { driver = passwd-file args = scheme=SHA256-CRYPT username_format=%u /etc/dovecot/users } userdb { driver = passwd-file args = username_format=%u /etc/dovecot/users override_fields = home=/home/virtual/%u }

Als Passwort- und Nutzerdatei dient eine schlanke Textdatei ohne UID/GID (vgl. mail_uid und mail_gid in 10-mail.conf) und ohne individuelles Homeverzeichnis.

Nach dem Abschluss der Dovecot-Konfiguration muss ein Passwort-Hash generiert (doveadm pw -s SHA256-CRYPT) und mit dem zugehörigen Benutzernamen in /etc/dovecot/users geschrieben werden (alle übrigen Felder bleiben leer):

user@eden.one:{SHA256-CRYPT}$5$lpskns12qTM5P2Zm$TMTAV6IYrvMUG8sT16sK6LZBiDMa3LWHXebtKrSEhr1::::::

Postfix muss instruiert werden, auf den von Dovecot bereitgestellten Socket (statt auf saslauthd) zu lauschen:

# /etc/postfix/main.cf smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth

Um das Postfach der Nutzerin user@eden.one in /var/mail/virtual/user@eden.one zu befüllen, wird eine der virtual_alias_domains zur virtuellen Mailbox-Domäne befördert, um eingehende E-Mails lokal über den oben definierten LMTP-Socket auszuliefern:

# /etc/postfix/main.cf virtual_mailbox_domains = eden.one virtual_mailbox_maps = hash:/etc/postfix/mailbox_users virtual_transport = lmtp:unix:private/dovecot-lmtp

Mit virtual_mailbox_maps kann Postfix die Verbindung zwischen einer Adresse und einem Dateipfad zur Ablage von Nachrichten herstellen. In meiner Konfiguration enthält mailbox_users dagegen lediglich die von Dovecot bereitgestellten Nutzerinnen/Postfächer:

user@eden.one OK

Praktischerweise funktionieren die Weiterleitungen in virtual_alias_maps auch nach der Umstellung für die Mailbox-Domäne. Es können nicht nur Nachrichten an externe Empfängerinnen geschickt werden, sondern auch eine Kombination lokaler Postfächer und externer Empfängerinnen ist möglich (sales_marketing@eden.one user@eden.one, jane.doe@gmail.com). Mit

service dovecot restart postmap /etc/postfix/mailbox_users service postfix restart

wird der vollständige Mailstack in Betrieb genommen, und nach der Freischaltung der IMAP-Ports 143 und 993 in der Firewall reduziert sich meine Abhängigkeit theoretisch um einen Anbieter. Praktisch wäre es ausgesprochen leichtsinnig, sämtliche Dienste von nur einem – wenn auch sehr professionellen – Unternehmen zu beziehen, und so stütze ich mich weiterhin auf Pairdomains, IONOS, Posteo und Apple.