Mailsystem Changes 3: Dovecot, LMTP und Adress-Verifizierung
Wie ich ja schon schrieb hatte ich in den vergangenen zwei Wochen einige Änderungen an meinem privaten Mailsystem vorgenommen - allen voran den Umstieg von amavisd-new zu rspamd mit den dazugehörigen Vereinfachungen.
Ein Teil der noch blieb war, dass die Datenbank dahinter viel zu komplex war, weil ich ja geplant hatte, das alles irgendwann einmal via Weboberfläche konfigurierbar zu machen. Nachdem das nichts wurde und ich die Möglichkeiten eigentlich nie auch nur ansatzweise genutzt habe, habe ich das DB-Schema auf drei Werte (und eine ID natürlich) eingestampft: Username, Email-Adresse, Quota und Passwort.
Damit war das Datenbank-Schema deutlich einfacher, was ich allerdings schon
immer als sehr unschön empfunden habe war, dass ich Postfix direkt Zugriff auf
die PostgreSQL-Datenbank gewähren musste. Und eigentlich ist das nicht nötig.
Ja, man benötigt keine weitere Konfiguration, aber dafür muss man die
pgsql
-Maps irgendwie raus rendern (mit Passwörtern drin), und das Schema
dahinter wollte ich also in der Komplexität nicht mehr pflegen.
Also habe ich mich dazu entschieden, in Postfix nur noch eine Liste mit
virtual_mailbox_domains
zu pflegen und die vorhandenen Empfänger via Address
Verification zu
ermitteln. Die Liste der Domains pflege ich dabei in einem Text-File, welches
ich später als Hash-Map einbinde:
|
|
Für diese Domains möchte ich die Verifikation von Sendern und Empfängern
aktivieren, aber dafür braucht man zusätzliche Steuer-Maps. Nachdem ich nun
sowieso alle Postfix-Maps via make
generiere war das relativ einfach:
|
|
(NB: Das ist so nicht 100%ig sicher vor race conditions: Wenn die Maps gerade neu aufgebaut werden während Postfix sie braucht, dann fliegt eventuell ein Fehler).
Das Einbinden ist dann relativ einfach:
|
|
Den Parameter address_verify_map
setze ich hier übrigens einfach nur, um eine
irreführende, harmlose aber nervige Fehlermeldung loszuwerden - das funktioniert
mit hinreichend modernem Postfix auch so, siehe die oben verlinkte Dokumentation
dazu.
Wie findet nun die Verifikation statt? Via LMTP, und somit muss man Postfix auf beibringen, dass es Dovecot via LMTP kontaktieren soll:
|
|
Das korrespondiert mit der Konfiguration des lmtp
-Listeners in der
Dovecot-Konfiguration:
|
|
Wie man sieht gehe ich davon aus, dass der lmtp(8)
-Client von Postfix in
einer chroot-Umgebung läuft (nämlich unterhalb von /var/spool/postfix
, welches
auch das $queue_directory
ist).
Alles was noch übrig ist war, Dovecot zu sagen, wo seine Nutzerinformationen herkommen. Hier gibt’s eine kleine Besonderheit: Meine Puppet-Module sind so eingestellt, dass bestimmte Hosts einen eigenen SASL-User bekommen, damit sie Mails verschicken können (realisiert via Exported Resources). Diese User sind in einer einfachen Text-Datenbank gespeichert. Glücklicherweise bietet Dovecot die Möglichkeit, mehr als eine Password Database zu verwalten. Konkret sieht das ganze dann so aus:
|
|
Wie man sieht ist neben dem Passwort die einzige pro User veränderliche Größe das Quota :-)
Da wir eine statische User Database
verwenden, muss das SQL-Query natürlich alle Variablen Informationen liefern.
Dementsprechend sieht das dann in /etc/dovecot/dovecot-sql.conf.ext
folgendermaßen aus:
|
|
Wenn der Username nicht die Email-Adresse ist muss man hier, wie gezeigt, mit
einem OR
arbeiten.
Tja, und mehr ist es nicht, das ganze funktioniert dann auf Anhieb:
|
|
(NB: Hier sieht man übrigens auch, wie ich Adressen umschreibe: da
root@astarte.incertum.net
im Fall dess Falles nicht zustellbar ist, schreibe
ich mittels RegExp-Tabelle in smtp_generic_maps
den Absender um zu
cite+astarte-root@incertum.net
.)
Wir sehen hier, dass der smtpd(8)
mit der PID 29580 eine Verbindung annimmt.
Sobald der Empfänger übermittelt generiert Postfix eine Address Verification
Probe mit Absender double-bounce@mail.incertum.net
(Queue-ID 082E5585
) und
stellt fest, dass man an die genannte Adresse zustellen kann. Die neue Mail
erhält die Queue-ID 1C3C3585
und wird erfolgreich via LMTP an Dovecot
übermittelt.
Die drei Sekunden Verzögerung sind wahrscheinlich der rspamd-Milter. Falls das immer so lange dauern sollte werde ich mir das noch einmal ansehen und dann hier berichten :-)