📱 Erkannter Endgerättyp ⛱️ Tag und Nacht. Verbraucht keinen oder einen 🍪.
🧬 0 Ihre DNS in den Krei.se-DNS-Servern, führt zum Bio-Labor 🍪 0 Anzahl Ihrer gespeicherten Kekse, führt zur Keksdose       
 

📪 Postfach-Server (MDA) mit 🕊️ Dovecot 2.4 und 🌳 OpenLDAP

Wir kümmern uns hier zunächst um die 📪 Briefkästen.

Vorteile einer getrennten Postfach-Verwaltung:

  • einzelne und geteilte Postfächer für Nutzer oder Abteilungen
  • kein Zugriff auf Nutzerdaten bei Kompromittierung des Postfach-Servers
  • getrennte Speicherplatzgrenzen für Mails und Nutzerdaten

Aufbau

  • SSL
  • Auth -> LDAP
  • Speicherort für Mails
  • Postfix -> Dovecot Mail Annahme (LMTP)
  • SystemD Autostart
  • 👷👷👷 Speicherplatzbegrenzung (Quotas)

🧑‍🔧 Installation

apt install dovecot-ldap dovecot-imapd dovecot-lmtpd dovecot-managesieved dovecot-antispam dovecot-sieve

📝 LMTP ist ein Protokoll ähnlich SMTP und wird für die Vermittlung von Mails zwischen 📯 Postfix und 📪 Dovecot genutzt - die restlichen Programm-Pakete sind für das automatische Einsortieren von Mails und SPAM-Filtern notwendig. Wir filtern SPAM auch mit Postfix direkt, aber es macht Sinn den SPAM-Filter in Postfix relativ entspannt einzustellen, denn schlechter als eine SPAM-Mail zu viel ist eine gute Mail zu wenig.

Wie bei allen Konfigurationen auf Krei.se gilt - Kommentare nur wo sinnvoll. Ursprungsdateien findet man für Dovecot in /usr/share/dovecot

🔐 SSL aktivieren

Als erstes schalten wir SSL an:

/etc/dovecot/conf.d/10-ssl.conf - https://doc.dovecot.org/main/core/config/ssl.html

ssl = required
ssl_server_cert_file = /etc/letsencrypt/live/mail.domain.tld/fullchain.pem
ssl_server_key_file = /etc/letsencrypt/live/mail.domain.tld/privkey.pem

ssl_min_protocol = TLSv1.3

# ssl_cipher_list is ignored by min TLS 1.3. If you want to force a suite you can use:
# ssl_cipher_suites = TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
# If you want to know which ciphers are used, try: openssl ciphers -v | grep TLSv1.3

Hier genügt bei Nutzung von letsencrypt oder bei eigenen Zertifikaten der direkte Verweis auf die Schlüssel auch wenn nur root diese lesen kann, da dovecot als root startet und erst später Rechte reduziert. Ich empfehle dennoch Schlüssel extra für mail.domain.tld zu erstellen.

IMAPS

Nun schalten wir noch Logins per IMAP und POP3 aus und lassen nur IMAPS zu:

/etc/dovecot/conf.d/10-master.conf - https://doc.dovecot.org/main/core/config/imap.html

service imap-login {
  # hier muss port = 0 eingestellt werden, da Dovecot normales IMAP anbietet sobald service imap-login aktiv ist
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }

  # Warning Dovecot 2.4: Renamed to service_restart_request_count. The default value is set to unlimited. Value 0 is now a configuration error.
  # Number of connections to handle before starting a new process. Typically
  # the only useful values are unlimited or 1. 1 is more secure, but unlimited
  # is faster. https://doc.dovecot.org/2.4.1/core/config/login_processes.html#login-processes
  # service_count = 1
  service_restart_request_count = 1

  # Number of processes to always keep waiting for more connections.
  process_min_avail = 1

}

📝 In dem Atemzug kann man noch service_restart_request_count und process_min_avail auf 1 setzen. Diese bedeuten, dass immer 1 Prozess auf neue Verbindungen wartet (reagiert schneller) aber dieser nur einen Clienten gleichzeitig bedient (sicherer). Es ist für unter 1000 lokale User sehr unwahrscheinlich, dass Sie mehrere service_restart_request_count benötigen.

Damit das Passwort nur im Klartext akzeptiert wird wenn SSL aktiv ist setzen wir noch

/etc/dovecot/conf.d/10-auth.conf

# SSL erzwingen
auth_allow_cleartext = no
# plain ist default
auth_mechanisms = plain

Wer sich hier denkt: Das kann unmöglich sinnig sein?? - hat gut aufgepasst, auth_allow_cleartext = no heisst aber nur, dass ein Passwort im Klartext nur über verschlüsselte Verbindungen erlaubt ist.

🌳 Authentifizierung gegen LDAP

Direkt in /etc/dovecot/conf.d/10-auth.conf auth-system abschalten und prüfen ob LDAP included wird, das sollte das Debian-Paket eigentlich selbst machen - tut es aber nicht.

# etwa Zeile 122
# auth-system abschalten, sonst versucht dovecot per PAM den User zu authentifizieren (brauchen wir nie)
#!include auth-system.conf.ext

# etwa Zeile 124
!include auth-ldap.conf.ext

(Ihre 10-auth.conf.ext kann insgesamt nur diese 3 Zeilen enthalten).

In auth-ldap.conf.ext die userdb anpassen und dabei schonmal vmail als uid und gid setzen. uid und gid kann von LDAP überschrieben werden:

# Authentication for LDAP users. Included from auth.conf.
#
# <https://doc.dovecot.org/latest/core/config/auth/databases/ldap.html>

## See <https://doc.dovecot.org/latest/core/config/dict.html#ldap>

ldap_uris = ldaps://ldap.domain.tld
ldap_base = %{user | domain | base_dn}
ldap_auth_dn = cn=mail,ou=Dienste,dc=domain,dc=tld
ldap_auth_dn_password = lookuppass

passdb ldap {
#ldap_filter = (&(objectClass=posixAccount)(uid=%{user}))
ldap_filter = (&(objectClass=posixAccount)(mail=%{user}))
bind = yes
use_worker = yes

fields {
    user=%{ldap:mail}
    # password=%{ldap:userPassword}
    # userdb_home=%{ldap:homeDirectory}
    # userdb_uid=%{ldap:uidNumber}
    # userdb_gid=%{ldap:gidNumber}
}
}

# "prefetch" user database means that the passdb already provided the
# needed information and there's no need to do a separate userdb lookup.
# <https://doc.dovecot.org/latest/core/config/auth/databases/prefetch.html>
# userdb prefetch {
#   driver = prefetch
# }

# 1. Filter für exakte Übereinstimmung Empfänger = mail / mailacceptinggeneralid
userdb ldap_first_exactmatch {
# Do not use catch-alls here as dovecot only matches exactly 1 user in LDAP
ldap_filter = (&(objectClass=postfixUser)(|(mail=%{original_user})(mailacceptinggeneralid=%{original_user})))
driver = ldap
# Default fields can be used to specify defaults that LDAP may override
fields {
    user=%{ldap:mail}
    #quota_storage_size = %{ldap:quotaBytes}B
    home=/var/vmail/%{ldap:mail | domain}/%{ldap:mail | username}
    uid = vmail
    gid = vmail
}
}

# 2. Filter für @domain.tld catchall
userdb ldap_second_catchall {
ldap_filter = (&(objectClass=postfixUser)(mailacceptinggeneralid=@%{original_user | domain}))
driver = ldap
# Default fields can be used to specify defaults that LDAP may override
fields {
    user=%{ldap:mail}
    #quota_storage_size = %{ldap:quotaBytes}B
    home=/var/vmail/%{ldap:mail | domain}/%{ldap:mail | username}
    uid = vmail
    gid = vmail
}
}

# If you don't have any user-specific settings, you can avoid the userdb LDAP
# lookup by using userdb static instead of userdb ldap, for example:
# <https://doc.dovecot.org/latest/core/config/auth/databases/static.html>
#userdb static {
#fields {
#  uid = vmail
#  gid = vmail
#  home = /var/vmail/%{user}
#}
#}

Die /etc/dovecot/dovecot-ldap.conf.ext fällt in 2.4 weg!

📪 Speicherort und -art des Postfachs für Benutzer

📝 Dovecot speichert entweder in /var/vmail oder in festen Unix-Heim-Verzeichnissen, aber derzeit nicht per User variabel mal so oder so.

Mit unseren Einstellungen landen Mails die per Dovecot-LMTP ankommen immer in /var/vmail/domain.tld/user.

Für diesen Zweck erstellen wir eine Linux-Gruppe vmail und einen Linux-Nutzer vmail mit GID und UID jeweils 5000. Den normalen mail-Nutzer kann man i.d.R. nicht nutzen weil seine UID zu klein ist (bei Debian uid 8):

groupadd -g 5000 vmail
useradd -m -d /var/vmail -s /bin/false -u 5000 -g vmail vmail

/var/vmail wird nun automatisch erstellt und bei erfolgreicher Anmeldung auch automatisch die Unterverzeichnisse für Domains und User.

Man kann noch fix prüfen ob /var/vmail die korrekten Berechtigungen hat, sollte mit useradd aber geschehen sein (chown -R vmail:vmail / var/vmail)

Allerdings macht noch Sinn /var/vmail auf 750 zu setzen:

chmod -R 750 /var/vmail

Dovecot-Homeverzeichnis

Das Home-Verzeichnis für Dovecot KANN dasselbe sein wie das Homeverzeichnis des Nutzers für alle Nutzerdaten - muss es aber nicht. Wichtig ist nur in Dovecot trotzdem ein Dovecot-Homeverzeichnis zu nutzen, damit Sieve-Filter und dovecot selbst Dateien ablegen können. Hier zeigen sich auch wieder Vorteile abgetrennter Authentifizierung, denn wenn der Mail-Server kompromittiert wird sind trotzdem keine Nutzerverzeichnisse offen.

Das Dovecot-Homeverzeichnis wird von LDAP als "home" geholt und kann daher ein Unix-Heimverzeichnis sein oder default unter /var/mail/domain.tld/user liegen.

In /etc/dovecot/conf.d/10-mail.conf setzen wir nun noch mail_driver, etc. von mbox auf Maildir:

# 📬 Speicherort und -art für Zustelldienst (local delivery agent)
mail_driver = maildir
mail_path = ~/Maildir
mail_home = /var/vmail/%{user | domain}/%{user | username}
#mailbox_list_layout = fs

📝 maildir_list_layout Standardmäßig nutzt Dovecot . als Unterordner-Trennung was a) nicht besonders hübsch im Dateiexplorer ist und b) bei mir noch kein Mail-Client geschafft hat problemfrei zu nutzen.

Damit Dovecot Mail-Unterordner auch als Unterordner im Dateisystem ablegt kann man mailbox_list_layout = fs aktivieren:

/etc/dovecot/conf.d/10-mail.conf

# 📬 Mail-Unterordner als Dateisystem-Unterordner anlegen
mailbox_list_layout = fs

Achtung mailbox_list_layout = fs sollte man nur für Neuinstallationen setzen!

📥 Ankommende Mails 📬 speichern / LMTP-Service aktivieren

📝 Mails die vom 📯 lokalen Postboten an 📪 Dovecot gehen nehmen wir über 📬 LMTP an und suchen das richtige Postfach raus. Es gibt mehrere Zustelldienste (📬 local delivery agents) für den 📯 lokalen Postboten, aber LMTP macht für uns die Sache am einfachsten und mit dem vmail-User auch sicher, denn der LMTP-Dienst braucht so keine root-Rechte und kann trotzdem im Netzwerk lauschen. Das ermöglicht eine Trennung der Dienste.

Tutorial angepasst von https://doc.dovecot.org/2.3/configuration_manual/protocols/lmtp_server/#lmtp-server

An dieser Stelle kann man kurz prüfen ob Dovecot alle benötigten (und nur diese) Protokolle lädt:

# doveconf -a | grep protocols
protocols = " imap lmtp sieve"

/etc/dovecot/conf.d/10-master.conf

service lmtp {
  # dovecot erstellt immer einen listener unter $base_dir(/var/run/dovecot)/lmtp mit root:root 666
  #unix_listener lmtp {
  #mode = 0666
  #}

  # Unix-Listener für Postfix auf derselben Maschine nutzen:
  #unix_listener /var/spool/postfix/private/dovecot-lmtp {
  #  mode = 660
  #  user = postfix
  #  group = postfix
  #}

  # Create inet listener only if you can't use the above UNIX socket
  inet_listener lmtp {
  # Avoid making LMTP visible for the entire internet
    address = 127.0.0.1 ::1 # VPN- oder lokale Subnetze hier hinzufügen wenn Postfix woanders läuft
    port = 24
  }
}

Dort unter address sicherstellen, dass LMTP nicht dem ganzen Internet zugänglich ist, es ist lokal nur notwendig Postfix Zugang zu gewähren, was auf derselben Maschine laufen kann oder im lokalen Netzwerk oder im VPN.

Der unix-listener /var/run/lmtp ist immer aktiv wenn lmtp in protocols mit aufgeführt wird, aber nur root:root zugänglich.

🦥 Für die Faulen: Authentifizierungs-Dienst für den 📯 lokalen Postboten durch Dovecot anbieten

Wer sich nicht mit Cyrus-SASL in Postfix rumschlagen will kann hier noch den Auth-Service für Postfix anbieten, er erfolgt ebenso per socket oder inet:

/etc/dovecot/conf.d/10-master.conf

service auth {
unix_listener auth-userdb {
  #mode = 0666
  #user = 
  #group = 
}

# Postfix smtp-auth unix-listener
unix_listener /var/spool/postfix/private/auth {
  mode = 0660
  user = postfix
  group = postfix
}

# Postfix smtp-auth inet-listener
inet_listener auth {
    # WARNING - always unencrypted, use only localhost or VPN!!!
    # if you read on the internet you could add "ssl = yes" here - NO! this will be ignored without an error
    # AVOID making auth-listener visible for the entire internet
    address = 127.0.0.1 ::1 # VPN hier hinzufügen wenn Postfix woanders läuft
    port = 26
}

# Auth process is run as this user.
#user = $default_internal_user

}

🏁 Dovecot 🕊️ fertig

Dovecot läuft nun, wir ergänzen noch ein paar Goodies für stressfreie Neustarts:

SystemD-Startup ergänzen

Es macht Sinn Dovecot erst nach OpenLDAP starten zu lassen, bzw. auf dessen Verfügbarkeit zu warten:

root@server:~# systemctl edit dovecot

erstellt eine Datei /etc/systemd/system/dovecot.service.d/override.conf, wir tragen ein:

[Unit]
Requires=slapd.service
After=slapd.service

Kleiner Hinweis, hier sowohl After= als auch Requires= zu nutzen sorgt dafür, dass zwingend auf den erfolgreichen Start von OpenLDAP gewartet wird und nicht nur die Startreihenfolge (After=) bzw. die Abhängigkeit (Requires=).

Warten auf OpenVPN-Server/Interface

Wer einen VPN-Server/Client betreibt und dovecot diesen als interface nutzt sollte noch auf diesen warten:

[Unit]
Requires=openvpn-server@vpn.domain.tld.service slapd.service
After=openvpn-server@vpn.domain.tld.service slapd.service network-online.target
BindsTo=network-online.target

Service Auto-Restart

Dovecot ist sehr essentiell für unser Setup, wer noch sicherer gehen will, dass es startet ergänzt einen Auto-Restart:

[Service]
Restart=on-failure
RestartSec=5s
StartLimitBurst=5
StartLimitIntervalSec=60

einmal systemctl daemon-reload und Dovecot sollte auch bei Neustarts zuverlässig funktionieren.

Dovecot neustarten und der IMAP-Login und die Postfächer sollten funktionieren!

👷👷👷 --- ab hier wird noch gebaut, bei den Preisen braucht derzeit keiner Quotas, sorry! --- 👷👷👷

Optional: Quota

📝 Eine Speicherplatz-Begrenzung sollte man hier mit überlegen, da es mit Heimverzeichnissen für Nutzer komplizierter wird die Speicherplatz-Begrenzung für Dokumente, Desktop, etc. von den Mails zu trennen und mit /var/vmail nur über kleine Hacks machbar ist einem Nutzer/Postfach ausnahmsweise mehr Speicherplatz einzuräumen.

Speicherplatz-Begrenzung für alle Nutzer

In jedem Fall lohnt sich eine grobe Begrenzung für alle Nutzer:

(Achtung, plugin {} ungültig in 2.4)

/etc/dovecot/conf.d/90-quota.conf

quota "User quota" {
    storage_size = 1G
}

# in 15-mailboxes.conf
# namespace inbox {
#    mailbox Trash {
#        quota_ignore = yes
#    }
#    mailbox SPAM {
#        quota_ignore = yes
#    }
# }

Was heisst, dass 1GB Speicher gesetzt wird, der Papierkorb kann nochmal 100MB extra nutzen (im schlimmsten Fall werden also 1,1GB belegt) und der SPAM-Ordner wird gar nicht mitgezählt.

doveadm quota get -u user@domain.tld

/var/vmail und dynamische Speicherplatz-Begrenzung via LDAP

Die 1GB hier gelten nun als Default, LDAP kann die quota_storage_size je nach User überschreiben.

👷👷👷 --- bis hier wird noch gebaut --- 👷👷👷

Werkzeugleiste: