27.
September
2010
Vor einem knappen Monat habe ich die Installation und Konfiguration von Postfix für das Versenden von E-Mails über einen Smarthost beschrieben. Wer mehrere E-Mailadressen hat und diese ebenfalls über seinen eigenen Mailserver nutzen möchte, muss Postfix dafür entsprechend konfigurieren.
Mailserver erkennen inzwischen in der Regel keine E-Mails mehr an wenn die E-Mailadresse des Absenders nicht in die Liste der zulässigen Domains des Mailservers passt. Daher muss man sich beim Versand der E-Mails beim jeweilig zuständigen Mailserver authentifizieren.
In der offiziellen Dokumentation ist dies unter dem Punkt Configuring Sender-Dependent SASL authentication auf Englisch zu finden.
Basierend auf dem bereits ganz oben verlinkten Informationen muss der bereits bestehende Mailserver nun noch entsprechend konfiguriert werden. Die bestehende Konfiguration sendet bereits E-Mails über einen als Smarthost angegebenen Server weiter, lokale Benutzernamen werden über die /etc/postfix/sender_canonical
in real existierende E-Mailadressen umgeschrieben.
In der Konfigurationsdatei /etc/postfix/main.cf
müssen ein paar Einträge hinzugefügt werden. Einige Zeilen sind bereits bei der bestehenden Konfiguration vorhanden gewesen. Ich habe sie dennoch mit aufgeführt, da sie für den Betrieb notwendig sind.
smtp_sender_dependent_authentication = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_connection_cache_on_demand = no
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_dependent
sender_canonical_maps = hash:/etc/postfix/sender_canonical
smtp_sender_dependent_authentication = yes
aktiviert die senderabhängige Authentifizierung.
smtp_sasl_auth_enable = yes
aktiviert die SASL-Authentifikation mit den externen Mailservern.
smtp_sasl_security_options = noanonymous
erzwingt die Anmeldung, es werden keine anonyme Anfragen abgeschickt.
smtp_connection_cache_on_demand = no
da bei SSL/TLS-Verbindungen ohnehin nicht das »connection cashing« funktioniert, wird es von vorneherein deaktivert.
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
gibt an, wo sich die für die Authentifizierung benötigten Informationen als »lookup table« befinden.
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_dependent
gibt an, wo sich die Informationen über die Zuweisung der Absenderadressen zum (externen) Mailserver befinden.
sender_canonical_maps = hash:/etc/postfix/sender_canonical
gibt an, wie lokale Benutzernamen in real existierende E-Mailadressen umgeschrieben werden sollen.
Neben dem Aktivieren der senderabhängigen Authentifizierung müssen somit noch zwei weitere Dateien erstellt beziehungsweise mit Informationen gefüllt werden. Der Verweis auf die sender_canonical_maps
ist bei diversen Anleitungen nicht zu finden. Ich habe sie dennoch mit aufgeführt, da beim Umschreiben lokaler Benutzer Fehler auftreten können.
In der Datei /etc/postfix/sender_canonical
wird angegeben, in welche real existierende E-Mailadresse die Mail lokaler Benutzer umgeschrieben werden soll. Als Beispiel:
amy foo@bar.tld
root foo@bar.tld
Mails der lokalen Benutzer amy
und root
werden somit durch Postfix umgeschrieben und als foo@bar.tld
an den externen Mailserver oder als Default angegebenen Smarthost weitergeleitet.
Die E-Mailadresse muss somit entweder über den Smarthost verschickt werden können oder ein entsprechender Eintrag in der Konfiguration für das senderabhängige Authentifizieren existieren. Ansonsten bleiben die E-Mails in der Queue liegen da sie nicht vom externen Mailserver angenommen werden.
Dies sei nur am Rande zur Vermeidung von Fehlern erwähnt und hat mit der eigentlichen Konfiguration für das senderabhängige Authentifizieren nichts zu tun.
In der Konfigurationsdatei /etc/postfix/sasl_password
werden die Zugangsdaten für die externen Mailserver abgelegt. Die Passwörter werden dabei im Klartext gespeichert, daher ist nach dem Anlegen der Dateien auf die entsprechenden Rechte zu achten, damit nicht jeder Benutzer die Datei einfach auslesen kann.
Der Aufbau einer Zeile in der Datei kann unterschiedlich ausfallen.
# Authentifizierung anhand der E-Mailadresse des Absenders
# (bezogen auf sender_dependent_relayhost_maps)
foo1@bar.tld login1:pass1
foo2@bar.tld login2:pass2
# Authentifizierung anhand der Domain des Absenders
#(bezogen auf sender_dependent_relayhost_maps)
smtp.foo.tld login2:pass3
# Authentifizierung für den default relayhost
smtp.bar.tld login:pass
In der Regel werden bei Anleitungen für smtp_sender_dependent_authentication
mal die eine, mal die andere Variante für den Eintrag in der /etc/postfix/sasl_password
behandelt. Die unterschiedlichen Varianten sind oben eigentlich schon erklärt, dennoch ein paar Zeilen zu den beiden Schreibweisen.
Soll explizit eine bestimmte E-Mailadresse mit einem bestimmten Login verwendet werden, so ist das oberste Beispiel zutreffend. Dies ist bei manchen Mailservern auch zwingend notwendig, bei anderen können alle E-Mails mit gültiger Domain über einen beliebigen Login verschickt werden.
Dafür wäre das zweite Beispiel zutreffen. Alle E-Mails von einer bestimmten Domain werden über die gegebenen Zugangsdaten verschickt. Jedoch ist hier ein Missbrauch möglich. Jede beliebige an den lokalen Postfix gerichtete E-Mail mit der passenden Domain wird über diese Authentifizierung verschickt. Wer die Konfiguration kennt, kann so mit beliebigiem [NAME]@foo.tld
E-Mails versenden.
Wobei diese Gefahr natürlich auch beim standardmäßig als Relay angegebenen Mailserver vorhanden ist – sofern der lokale Postfix nicht auf eine Authentifizierung besteht.
Bei meiner Konfiguration befinden sich die Informationen welche Absenderadressen mit einem Mailserver verbinden in der /etc/postfix/sender_dependent
. Je nachdem was in der /etc/postfix/main.cf
als Wert für sender_dependent_relayhost_maps
angegeben wurde, kann es auch eine andere Datei sein. Daher die entsprechend angegebene Datei für die folgenden Zeilen auswählen:
# Nach Absenderadresse aufgelöst (bezogen auf /etc/postfix/sasl_passwd)
foo1@bar.tld [smtp.bar.tld]
foo2@bar1.tld [smtp.bar1.tld]:587
# Nach Absenderdomain aufgelöst (bezogen auf /etc/postfix/sasl_passwd)
@foo.tld [mail.foo.tld]:465
Wird der Standardport für SMTP (25) verwendet, wird keine zusätzliche Angabe hinter dem Namen des Mailservers benötigt. Ansonsten wird sie einfach durch einen Doppelpunkt abgetrennt hinzugefügt.
Nicht dokumentiert aber zumindest bei meiner Version (Postfix 2.5.5) problemlos funktionierend: Nach der Domain der E-Mail aufgelöste Verbindung mit einem SMTP-Server.
Nachdem alle Daten in die Konfigurationsdateien eingegeben wurden, muss mit postmap
noch der Hash für die jeweiligen Dateien erzeugt werden:
sudo postmap /etc/postfix/sender_dependent
sudo postmap /etc/postfix/sasl_password
sudo postmap /etc/postfix/sender_canonical
Danach Postfix neu starten damit die Konfiguration übernommen wird:
sudo /etc/init.d/postfix restart
Nun sollte eigentlich alles funktionieren. Wer einen MUA wie Thunderbird oder Roundcube verwendet, kann nun zusätzliche Identitäten bei dem bestehenden Benutzerprofil erstellen. Eingehende E-Mails werden zumindest von diesen beiden MUAs nach einem Klick auf den Beantworten-Button mit der korrekten Identität für den Absender versehen.
Ebenso sollte nun der Versand mit einer solchen zusätzlichen Identität möglich sein. Falls es nicht klappt hilft der nächste Abschnitt eventuell weiter
Sollte Postfix bei den ersten Versuchen nicht wie gewünscht funktionieren hilft ein Blick in /var/log/mail.log
. Dort teilt Postfix mit wenn etwas mit der Authentifizierung am externen Mailserver nicht funktioniert oder ein anderes Problem aufgetreten ist.
sudo tail /var/log/mail.log
Mit tail
lässt man sich einfach die letzten Zeilen der Logdatei anzeigen. Viel bequemer als sie mit einem Editor zu öffnen oder vollständig mit cat
ausgeben zu lassen.
Die vorhandenen Logdaten sollten eine Fehlerdiagnose ermögliche, welche schnell zur Problemlösung führt.
Googlemail beziehungsweise gmail wollte zunächst keine Verbindung von meinem Postfix annehmen. Erst der Eintrag folgende Eintrag in der /etc/postfix/main.cf
ließ die Verbindung zustandekommen:
smtp_tls_security_level = encrypt
Die Verbindung wurde vermutlich deshalb abgelehnt, da keine TLS-Anfrage an den Server gesendet wurde.
Hintergrund: Die Datenübertragung inklusive der Authentifizierung zwischen meinem lokalen Postfix und dem externen SMTP-Server erfolgt standardmäßig unverschlüsselt. Daher besteht die Gefahr das die Übermittlung der Daten von unbefugten Personen durch einen sogenannten »man in the middle«-Angriff mitgelesen werden.
Damit diese Sicherheitslücke geschlossen wird, kann Postfix angewiesen werden in jedem Fall eine SSL- beziehungsweise TLS-Verbindung (transport layer security) zum externen Server aufzubauen. Die Übermittlung der Daten erfolgt dann verschlüsselt.
Achtung: Nicht die Anmeldung am Server mit einer Verschlüsselung verwechseln. Die Anmeldung am Server ist lediglich der Nachweis dafür, dass man berechtigt ist auf den Server zuzugreifen. Die Datenübertragung selbst ist unverschlüsselt. Erst wenn man eine verschlüsselte Übertragung verlangt, wird das Senden von Passwörtern und dem Inhalt der E-Mail selbst geschützt.
Voraussetzung für eine verschlüsselte Übertragung ist natürlich, dass der externe SMTP-Server auch TLS unterstützt.
Da ich weiß das alle von mir verwendeten externen Mailserver TLS unterstützen, habe ich den Wert auf encrpyt
gesetzt. Sollten sich in der Liste der verwendeten externen SMTP-Server auch welche befinden welche kein TLS unterstützen, ist folgender Eintrag vorzunehmen:
smtp_tls_security_level = may
Durch die Angabe von may
wird TLS dann aktiviert, wenn der externe SMTP-Server TLS anbietet. Sollte dies nicht der Fall sein, wird eine unverschlüsselte Verbindung aufgebaut.
Googlemail beziehungsweise gmail scheint auf die verschlüsselte Übertragung zu bestehen. Daher war die Angabe dieser Option bei Postfix notwendig.
X_FISH