mailbox.domain.tld
Wussten Sie schon? 📫 Briefkasten und 📯 Briefträger sind 2 verschiedene Dinge. Ihre Post gleichzeitig verschicken, lesen und zustellen macht nur ein 🚔 Gefängnis-Wärter.
Wir kümmern uns hier zunächst um die 📫 Briefkästen.
Vorteile einer getrennten Postfach-Verwaltung:
Für Dovecot nutze ich in diesem Beispiel nur 🐧 Debian. Debian ist mit autoupdates auf Jahre gesichert und läuft so wartungsfrei und auf jeder Hardware und VM. Einmal eingerichtet haben Sie das leidige Thema auf 5-10 Jahre vom Hals und wissen genau wo Sie mit 📯 Postfix Änderungen durchführen müssen und wo mit Dovecot ohne irre zu werden.
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.
Als erstes schalten wir SSL an:
/etc/dovecot/conf.d/10-ssl.conf
- https://doc.dovecot.org/configuration_manual/dovecot_ssl_configuration/
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.domain.tld/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.domain.tld/privkey.pem
# Generate new params with `openssl dhparam -out /etc/dovecot/dh4096.pem 4096`
ssl_dh = </etc/dovecot/dh4096.pem
ssl_min_protocol = TLSv1.3
# ssl_cipher_list non-EC DH setzen
# To disable non-EC DH, use:
ssl_cipher_list = ALL:!DH:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@STRENGTH
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.
DH-Parameter erstellen wir wie in der Konfiguration angegeben mit: openssl dhparam -out /etc/dovecot/dh4096.pem 4096
Nun schalten wir noch Logins per IMAP und POP3 aus und lassen nur IMAPS/POP3S zu:
/etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
port = 993
ssl = yes
}
# Number of connections to handle before starting a new process. Typically
# the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0
# is faster. <doc/wiki/LoginProcess.txt>
service_count = 1
# Number of processes to always keep waiting for more connections.
process_min_avail = 1
}
📝 In dem Atemzug kann man noch service_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_counts benötigen.
Damit das Passwort nur im Klartext akzeptiert wird wenn SSL aktiv ist setzen wir noch
/etc/dovecot/conf.d/10-auth.conf
# Disable LOGIN command and all other plaintext authentications unless
# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP
# matches the local IP (ie. you're connecting from the same computer), the
# connection is considered secure and plaintext authentication is allowed.
# See also ssl=required setting.
disable_plaintext_auth = yes
Das wars schon.
Direkt in /etc/dovecot/conf.d/10-auth.conf
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
An dieser eingebunden auth-ldap.conf.ext
müssen wir noch ändern, dass wir 2 Verbindungen zu LDAP wollen: Eine um Benutzer nachzuschlagen die Postfächer haben dürfen und eine um deren Passwort zu überprüfen. Sie stellt dafür passdb und userdb per LDAP bereit und bindet standardmässig /etc/dovecot/dovecot-ldap.conf.ext
ein. Damit 2 asynchrone Verbindungen möglich sind kann man einfach einen symlink setzen:
ln -s /etc/dovecot/dovecot-ldap.conf.ext /etc/dovecot/dovecot-ldap-userdb.conf.ext
und in auth-ldap.conf.ext
die userdb anpassen und dabei schonmal vmail als uid und gid setzen. Beides kann von LDAP überschrieben werden:
userdb {
driver = ldap
# Connection optimization via symlink:
args = /etc/dovecot/dovecot-ldap-userdb.conf.ext
# Default fields can be used to specify defaults that LDAP may override
#default_fields = home=/home/virtual/%u
# Achtung, das würde für jeden alias extra als domain.tld/alias anlegen
#default_fields = uid=vmail gid=vmail home=/var/vmail/%d/%n
# Das ist besser, weil uid und gid bei Bedarf geholt werden, home setzt entweder 10-master.conf mit mailbox_home oder user_attrs.
default_fields = uid=vmail gid=vmail
}
In /etc/dovecot/dovecot-ldap.conf.ext
muss jetzt unsere LDAP-Datenbank und der BaseDN eingestellt werden:
# LDAPS
uris = ldaps://ldap.domain.tld
# User-DB Lookups mit festem Dienst-DN vornehmen (darf keine Passwörter-Hashes sehen)
# Dieser DN muss alle User auch von anderen Domains die LDAP bereitstellt sehen können.
dn = cn=mail,ou=Dienste,dc=domain,dc=tld
dnpass = MailDienstPasswort
# Eventuell notwendig wenn man wie empfohlen eigene ED25519 Zertifikate nutzt
tls_ca_cert_file = /etc/ssl/certs/ldap.domain.tld.pem
# oder wenn systemweit installiert
tls_ca_cert_dir = /etc/ssl/certs
# wer über tls = no stolpert, das brauchen wir nicht (STARTTLS auf Port 389), wir nutzen TLS direkt mit ldaps:/// mit Port 636
# BaseDN vom Domain-Part des User-Logins. %d = domain.tld %Dd = domain,dc=tld
# Achtung, das kann auch eine Alias-Domain sein. Wenn Sie das nicht wollen setzen Sie die base dn fest!
base = dc=%Dd
# feste Base-DN
# base = dc=domain,dc=tld
# Nutzer und Passwort direkt im LDAP überprüfen (maximal sicher)
auth_bind = yes
# Suchpfad im Baum. Wichtig wenn Mailuser nochmals untergruppiert sind
# oder man den kompletten Baum auf User prüfen will. Gesucht wird standardmässig immer ab der BaseDN
scope = subtree # Das ist der default
# Wir brauchen hier kein auth_bind_userdn, da der DN des Users durch den UserDB-Lookup gegeben wird.
# DN Lookup for Auth Bind:
# https://doc.dovecot.org/2.3/configuration_manual/authentication/ldap_bind/#dn-lookup
# Übersetzt LDAP-Attribute für Dovecots Nutzerverzeichnis, also für feste uid und gid und speichern
# in z.B. /home/user/Maildir/
# user_attrs =
# Mail-Attribut als dovecot-user übernehmen
# Quota aus LDAP holen wenn quota_rule als Attribut vorhanden ist
user_attrs = mail=user,quotaBytes=quota_rule=*:bytes=%$
# Hinweis für Unix-Nutzerverzeichnisse:
# in /etc/dovecot/conf.d/auth-ldap.conf.ext
# default_fields = uid=vmail gid=vmail home=/var/vmail/%d/%n
# ausschalten und von user_attrs holen lassen:
# user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,mail=user,quotaBytes=quota_rule=*:bytes=%$
# Suchfilter beim UserDB-Lookup (über Dienst-DN)
# Dieser Filter ist auch für Aliase, da wir von Postfix / über LMTP Mails an Aliase erhalten
# Testen Sie Ihre user immer mit "doveadm user user@domain.tld" und auch die aliase mit alias@domain.tld
# Wenn 2 User @domain.tld als catch-all mailacceptinggeneralid haben findet Dovecot diese Aliase nicht.
user_filter = (&(objectClass=postfixUser)(|(mail=%u)(mailacceptinggeneralid=%s)(mailacceptinggeneralid=@%d)))
# Übersetzt LDAP-Attribute für Dovecots Passwort-Check.
#
pass_attrs = mail=user
# Mit diesem Filter wird das DN für das Auth-Bind geholt (über Dienst-DN).
# Wichtig, weil wir keinen auth_bind_userdn setzen wollen und so User auch in Unterordner sortiert sein können
# Dieser Filter kommt im Gegensatz zu user_filter OHNE aliase aus, da wir uns immer mit dem mail-Attribut anmelden
pass_filter = (&(objectClass=posixAccount)(mail=%u))
# Macht Sinn wenn am Anfang was nicht klappt :D, auch olcLogLevel = stats ist hilfreich (cn=config)
debug_level = -1
An dieser Stelle macht es 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=).
einmal systemctl daemon-reload
und Dovecot sollte auch bei Neustarts zuverlässig funktionieren.
📝 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 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_location von mbox auf Maildir:
# 📬 Speicherort für Zustelldienst (local delivery agent)
mail_location = Maildir:~/Maildir
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 Unterordner auch als Ordner im Dateisystem ablegt kann man :LAYOUT=fs aktivieren
# 📬 Speicherort und Art für Zustelldienst (local delivery agent)
mail_location = Maildir:~/Maildir:LAYOUT=fs
👷👷👷 Das muss dann allerdings auch Postfix wissen
Dovecot neustarten und der IMAP-Login und die Postfächer sollten funktionieren!
📝 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
}
📝 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:
/etc/dovecot/conf.d/90-quota.conf
quota_rule = *:storage=1G
quota_rule2 = Trash:storage=+100M
quota_rule3 = SPAM:ignore
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.
👷👷👷 --- ab hier wird noch gebaut --- 👷👷👷
Wird /var/vmail genutzt und kein user_attrs kann nicht von LDAP gezogen werden welcher User wieviel speichern darf (LDAP-Attribute quoteBytes)
Damit OpenLDAP dieses Attribut überhaupt kennt brauchen wir ein Schema für Mail. Ich empfehle das Schema von Effinger der sich schon die Arbeit gemacht hat das Postfix-Schema für Dovecot zu erweitern.
Daher passen wir user_attrs in /etc/dovecot/dovecot-ldap.conf.ext
nochmals an:
# können wir weglassen, wird durch Standards zu /var/vmail,5000,5000
#user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid
# Der LDAP-Attribut vor dem Dovecot-Attribut stellt sicher
# dass quote_rule in Dovecot nur gesetzt wird wenn quoteBytes als Attribut in LDAP existiert.
user_attrs = quotaBytes=quota_rule=*:bytes=%$
und aktivieren userdb von LDAP mit default-fields für /var/vmail:
/etc/dovecot/conf.d/auth-ldap.conf.ext
userdb {
driver = ldap
# Connection optimization via symlink: https://doc.dovecot.org/2.3/configuration_manual/authentication/ldap_bind/#authentication-ldap-bind
args = /etc/dovecot/dovecot-ldap-userdb.conf.ext
# Default fields can be used to specify defaults that LDAP may override
default_fields = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
Jetzt kann man für einen einzelnen User in LDAP mit dem Attribut quataBytes das Limit selektiv erhöhen. Als Wert für das Attribute kann man auch 1G oder 10M nutzen, eine Angabe in Bytes ist nicht notwendig. Für unlimitiert: 'none'
👷👷👷 --- bis hier wird noch gebaut --- 👷👷👷