Ich habe jetzt eine Lösung gefunden, die zu funktionieren scheint. Intensivere Tests folgen noch:
Kurze Zusammenfassung:
Bei einer Authentifizierten SMTP-Sitzung wird die Absenderadresse nicht mehr geprüft. TomL hat das mit verschiedenen großen und bekannten Email-Providern auch getestet.
Ich kann mich also bei einem SMTP-Server authentifizieren und dann jede x-beliebige Absenderadresse im Envelope-From-Header eintragen. Das ist zwar kein Sicherheitsproblem, aber es kann schön missbraucht werden um Emails in anderer Namen zu versenden.
Ich habe ein Mailserver-Setup, welches von mehreren Email-Konten bei verschiedenen ISP die Emails einsammelt und pro User in eine Mailbox liefert. Dort sortiert ein Dovecot-IMAP-Server mittels Sievefilter die Emails auf Userwunsch in verschiedene IMAP-Unterordner des einzelnen Users.
Umgekehrt soll es mein Setup ermöglichen, zentral eine Datenbank zu haben, wo verschiedenen Absenderadressen zugehörige SMTP-Server mit entsprechenden Authentifizierungs-Credentials hinterlegt sind. Zusätzlich soll es für jede mögliche Absenderadresse erlaubte smtp-user geben, die diese Email-Adresse verwenden dürfen.
Wenn ein anderer SMTP-User eine dieser Adressen als Envelope-From verwendet, soll die Annahme des Emails verweigert werden. Es soll also nicht wie bei gmx möglich sein, nachdem sich ein SMTP-User authentifiziert hat, dass dieser einen x-beliebigen Absender im Envelope-From-Header verwendet, sondern nur klar definierte "ihm gehörende".
Die Auswahl des Smarthosts samt credentials zur Absenderadresse funktionierte bereits. Das Problem war "nur" Emails abzuweisen die ein authentifizierter SMTP-User mit einer "falschen" Absenderadresse "MAIL FROM:..." geschickt hat.
Dazu ein paar Voraussetzungen:
exim lauscht auf localhost:25 und nimmt Emails auch ohne Authentifizierung entgegen. Sonst können Daemons keine Benachrichtigungen mehr versenden.
exim lauscht auf localhost und an den Netzwerkinterfaces auf Port 587.
Auf diesem Port wird eine TLS-gesicherte Verbindung und SMTP-AUTH zwingend verlangt.
Port 25 nach "außen" wird nicht belauscht.
Der veraltete Port 465 wird nicht bedient.
TLS wird aktiviert:
Die entsprechenden Zertifikate müssen lt. Anleitungen natürlich dazu auch erstellt werden. Ist nicht Thema jetzt.
Die Lösung hier zeigt nur auf, wie die ACL gestaltet werden muss:
Ich habe dazu eine Config-Datei /etc/exim4/conf.d/main/002_localmacros_multiaccount mit folgendem Inhalt angelegt:
Code: Alles auswählen
# Use Multiaccount-Routers and transports, set MULTIACCOUNT
MULTIACCOUNT = true
.ifdef MULTIACCOUNT
# If MULTIACCOUNT is definded, set MAIN_ACL_CHECK_MAIL to use a special ACL for
# Connections on ports other than 25
MAIN_ACL_CHECK_MAIL = ${if ={25}{$interface_port} \
{acl_check_mail} {acl_check_mail_multiaccount} }
.endif
Diese besagt: Wenn eine Connection auf Port 25 eingeht, dann verwende die standardmäßig vorhandene ACL "acl_check_mail". Auf allen anderen Ports verwende "acl_check_mail_multiaccount", die so aussieht und manuell erstellt wird:
Code: Alles auswählen
# conf.d/acl/30_exim-config_check_mail_multiaccount
########################################################################
## ACL for use with Multiaccounts on Multiple Smarthosts ##
## ACL reject Emails with not allowed from for $authenticated_id ##
########################################################################
acl_check_mail_multiaccount:
deny
condition = ${if eq {$interface_port}{587}{true}}
!encrypted = *
message = Encrypted Connection required on $interface_port
deny
!authenticated = *
message = Authentication requires before MAIL command on port $interface_port
deny
message = User $authenticated_id is not in allowed to send with $sender_address as from-envelope
!condition = ${if forany{<, ${extract{1}{:}{${lookup{$sender_address}wildlsearch{CONFDIR/client.multismarthost_multiaccount.passwd}{$value}fail}}}}\
{match{$item}{$authenticated_id}}{yes}{no}}
accept
Die Datei CONFDIR/client.multismarthost_multiaccount.passwd hat folgendes Format:
Code: Alles auswählen
from.sender@email.tld:commaseparated,list,of,loginusers:smtp.server:portnumber(integer):user.name:verysecretpassword
Separator ist der ":"
Im zweiten Feld kommt dann eine kommaseparierte Liste aller Usernamen (SMTP-AUTH-Usernamen), welche die From-Adresse aus dem ersten Feld verwenden dürfen.
Das 3. Feld ist der SMTP-Server(Smarthost), und das 4. Feld der zu verwendende Port (momentan noch nicht in Verwendung) über den dieses Email mit dieser Absendeadresse versendet wird.
Nun zur ACL:
das erste "deny" prüft ob die Verbindung auf Port 587 stattfindet und ob die Verbindung verschlüsselt ist. Wenn nein, wird das Email abgewiesen und eine Fehlermeldung dass eine verschlüsselte Verbindung notwendig ist ausgegeben.
Das zweite "deny" prüft, ob sich der User authentifiziert hat. Wenn nein, wird das Email abgewiesen und eine passende Fehlermeldung ausgegeben.
Das dritte deny prüft, ob der angemeldete User ($authenticated_id) die verwendete Absenderadresse verwenden darf.
Schlägt diese Prüfung fehl, gibts eine Fehlermeldung und das Email wird zurückgewiesen.
Wenn diese Prüfung ergibt, dass der User darf, geht das deny zum nächsten "acl-word" weiter.
accept wird erreicht, wenn keine der vorderen deny "anschlägt".
Das Email wird akzeptiert und in die Queue eingereiht.
Bei der Prüfung bekomme ich allerdings bei Openssl nach der Eingabe von RCPT TO:empfä
nger@isp.example folgende Fehlermeldung:
Code: Alles auswählen
RENEGOTIATING
139637096363200:error:140940F5:SSL routines:ssl3_read_bytes:unexpected record:../ssl/record/rec_layer_s3.c:1490:
Ich bin noch am weiterforschen. Denn ein paar Emails konnte ich so schon korrekt verschicken. Und bei unpassendem Usernamen oder nicht verschlüsselter Verbindung auf Port 587 oder ohne Authentifikation kommen die konfigurierten (in der ACL) Fehlermeldungen, so wie es sein soll.
Passen Absender und User zusammen, kommt nach dem "MAIL FROM:..." auch ein OK zurück.
lg scientific
PS: Die jeweils aktuelle Konfiguration ist unter
https://github.com/xundeenergie/exim4-multiaccount zu finden.