Dovecot als Proxy mit Unterwerfung

Dovecot als Proxy mit Unterwerfung

In meiner Infrastruktur habe ich mehrere Mailserver (Mailcow), die pro Instanz verschiedene Domänen bedienen. Ich möchte einen Mail-Proxy davor bauen, um die Anzahl der verwendeten IPs pro Dienst zu reduzieren und es Kunden zu ermöglichen, trotzdem ihre eigenen Domänennamen in ihren Client-Voreinstellungen zu haben.

SMTP als MTA wird anders gehandhabt. Eingehende Nachrichten über Postfix werden von einem zentralen Server verarbeitet (da MX-Einträge für den Kunden nicht sichtbar sind). Das ist also nicht mein Problem.

Also habe ich einen Mailproxy basierend auf Dovecot auf Debian Buster mit der folgenden Konfiguration konfiguriert:

ssl_cert = </etc/dovecot/ssl/default.pem
ssl_key = </etc/dovecot/ssl/default.key

# just an example for different domains via SNI
local_name mail.domain1.tld {
  ssl_cert = </etc/dovecot/ssl/mail.domain1.tld.pem
  ssl_key = </etc/dovecot/ssl/mail.domain1.tld.key
}

# just an example for different domains via SNI
local_name mail.domain2.tld {
  ssl_cert = </etc/dovecot/ssl/mail.domain2.tld.pem
  ssl_key = </etc/dovecot/ssl/mail.domain2.tld.key
}

auth_cache_size = 4 k
disable_plaintext_auth = no

passdb {
  args = /etc/dovecot/sql.conf
  driver = sql
}
protocols = "imap pop3 submission"
service auth {
  user = root
}
userdb {
  args = static uid=5000 gid=5000 home=/dev/null
  driver = static
}

Und die sql.conf ist

## SQL passdb configuration
driver = mysql

# Database options
connect = host=localhost dbname=dovecot user=dovecot password=dovecot

# Query
password_query = SELECT NULL AS password, NULL AS destuser, host, 'Y' AS nologin, 'Y' AS nodelay, 'Y' AS nopassword, 'Y' AS proxy, 'any-cert' AS `ssl` FROM proxy_domain WHERE domain = '%d'
# eof

Die Datenbank enthält:

CREATE TABLE `proxy_domain` (
  `domain` varchar(255) NOT NULL,
  `host` varchar(255) NOT NULL,
  PRIMARY KEY (`domain`)
);

insert into proxy_domain (domain, host) values ('domain1.tld','mailhost1');
insert into proxy_domain (domain, host) values ('domain2.tld','mailhost2');

Dies ist mehr oder weniger das Beispiel von

Die IMAP- und POP3-Dienste sind aktiv und

openssl s_client -connect ac-hcn0002.acoby.net:993

Ich kann mich anmelden und auch SNI funktioniert einwandfrei. Das Backend ist über SSL erreichbar. Bei starttls (110, 143, 587) wird nur das erste Zertifikat angezeigt. Das ist ok und akzeptabel, denn das würde ich dem Kunden nicht empfehlen.

Nun aber Unterwerfung (und später Sieb).

Frage 1:

Dovecot kann 587 zur Übermittlung öffnen. Das ist nur über STARTTLS möglich. Aber der Proxy versucht dann, zur Übermittlung direkt mit SSL auf Port 587 mit dem Backend-System zu kommunizieren (was nicht korrekt ist, glaube ich – es sollte einfach beginnen und STARTTLS machen). Ich glaube, das passiert, weil die Passdb global SSL=any-cert zurückgibt. Ist das ein Fehler? Kann ich dieses Verhalten für 587 überschreiben? Und gibt es vielleicht eine Möglichkeit, das richtige Zertifikat mit STARTTLS zu senden (anstelle des Standard-/ersten)?

Frage 2:

Dann Port 465. Dovecot könnte in meinem Fall auch den Übermittlungsport 465/SSL öffnen, um alle authentifizierten Nachrichten an den Übermittlungsport 465 im Backend weiterzuleiten. Aber wie kann ich das konfigurieren? Ich konnte kein Beispiel finden.

ich weiss BescheidMail-Infrastruktur mit Dovecot-Proxyund die Lösung mit Postfix – aber ich bin nicht wirklich sicher, ob die Antwort mit dem Dovecot-Socket in diesem Szenario funktioniert, und ich möchte kein Postfix nur für die Übermittlung installieren, wenn Dovecot das sofort bewältigen kann.

Antwort1

Durch die Rückgabe 'any-cert' AS 'ssl'in Ihrer Passdb zwingen Sie Dovecot, TLS für Downstream-Verbindungen zu verwenden. Leider gibt es keine mir bekannte Möglichkeit, den Verbindungstyp zwischen starttlsoder tlsbasierend auf etwas, das von Passdb zurückgegeben wird, zu ändern (https://dovecot.org/pipermail/dovecot/2018-September/112928.html)

Mein Workaround besteht darin, STARTTLS-Verbindungen downstream zu erzwingen und diese immer zu verwenden.

password_query = SELECT NULL as password, 'y' as nopassword, 'y' as proxy, NULL as destuser, 'y' as proxy_nopipelining, host, 'y' as nodelay, 'y' as nologin, 'any-cert' as 'starttls';

Die „richtige“ Abfrage würde etwa so lauten:

password_query = SELECT NULL as password, 'y' as nopassword, 'y' as proxy, NULL as destuser, 'y' as proxy_nopipelining, host, 'y' as nodelay, 'y' as nologin, IF(%{real_lport}=587, 'any-cert', 'no') as 'starttls', IF(%{real_lport}<>587, 'any-cert', 'no') as 'ssl';

Dadurch werden StartTLS/TLS basierend auf dem Port gewechselt, über den die Verbindung hergestellt wurde. Leider wird dies derzeit von Dovecot nicht unterstützt.

verwandte Informationen