Wir kümmern uns hier zunächst um die 📪 Briefkästen.
Vorteile einer getrennten Postfach-Verwaltung:
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
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.
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.
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!
📝 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
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 = fssollte man nur für Neuinstallationen setzen!
📝 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.
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 läuft nun, wir ergänzen noch ein paar Goodies für stressfreie Neustarts:
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=).
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
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! --- 👷👷👷
📝 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.
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
Die 1GB hier gelten nun als Default, LDAP kann die quota_storage_size je nach User überschreiben.
👷👷👷 --- bis hier wird noch gebaut --- 👷👷👷