Schlagwort-Archive: Postfix Mail Transfer Agent

Postfix ist ein Mail Transfer Agent für Unix und Unix-Derivate. Die Software sollte zum Entwicklungszeitpunkt eine kompatible Alternative zu Sendmail sein.

Sender Policy Framework (SPF) auf Debian Server

Sender Policy Framework (SPF) ist ein Dienst, der bereitgestellt wird, um nicht als Spam-Absender identifiziert zu werden.

postfix-policyd-spf ist eine voll funktionsfähige Engine zur SPF-Prüfung unter Postfix. Der Daemon umfasst eine Vielzahl von Whitelist-Mechanismen und Richtlinienoptionen, um die unterschiedlichsten Systemanforderungen zu erfüllen. postfix-policyd-spf-perl wurde auf Perl implementiert, weiter auf Python gibt es postfix-policyd-spf-python, dieses das Python-SPF-Modul (spf) verwendet. Als Postfix Modul wird RFC 7208 des Sender Policy Framework (SPF) unterstützt.

Sender Policy Framework (SPF) auf Debian Server

Hierbei werden im DNS (Domain Name System) zusätzliche Informationen in Form eines SPF-Records gespeichert. Dieser TXT-basierte SPF-Eintrag beinhaltet konkrete Informationen zu autorisierten Mailservern, wie Mail Transfer Agent (MTA).

Installation von Postfix policyd-spf

Die Installation auf Debian 10 und Debian 11 beginnt wie folgt als root:

$ apt install postfix-policyd-spf-python

Wird das Perl Modul bevorzugt, kann der Perl SPF-Milter wie folgt als root installiert werden.

$ apt install postfix-policyd-spf-perl

Nachdem postfix-policyd-spf-python, oder postfix-policyd-spf-perl installiert ist, Bearbeiten wir die Konfigurationsdatei des Postfix-Master-Prozesses.

$ vi /etc/postfix/master.cf

Um die Postfix Anweisung mit der Python SPF-Richtlinienprüfung zu starten, füge am Ende der Datei master.cf die folgenden Zeilen hinzu.

policyd-spf  unix  -       n       n       -       0       spawn
   user=policyd-spf argv=/usr/bin/policyd-spf

Bei der SPF-Richtlinienprüfung auf Perl implementierung wie folgt.

policyd-spf  unix  -       n       n       -       0       spawn
   user=policyd-spf argv=/usr/sbin/postfix-policyd-spf-perl

Speichere und schließe die Datei. Bearbeite als Nächstes die Postfix Hauptkonfigurationsdatei.

$ vi /etc/postfix/main.cf

Die folgenden Zeilen am Ende der Datei main.cf hinzufügen. Die erste Zeile gibt die Timeout-Einstellung für den Postfix-Policy-Agent an. Die folgenden Zeilen schränken eingehende E-Mails ein, indem der SPF-Eintrag überprüft wird und nicht autorisierte E-Mails abgelehnt werden.

policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unauth_destination,
   check_policy_service unix:private/policyd-spf

Hinweis! ist check_policy_service nicht die letzte Zeile unter dem Abschnitt smtpd_recipient_restrictions, dann muss ein Komma (,) am Zeilenende stehen. Kein Komma beim letzten Eintrag.

Speichere und schließe die Datei.

  Sicherstellen das die user id „policyd-spf“ angelegt ist, Überprüfen lässt sich das mit id policyd-spf. Das Systemkonto wird benötigt und kann, falls es fehlt wie folgt angelegt werden.

$ useradd -r -M policyd-spf -s /usr/sbin/nologin

Starte nun Postfix neu.

$ systemctl restart postfix

Wenn die nächste E-Mal von einer Domain mit einem SPF-Record im DNS empfangen wird, kann man die Ergebnisse der SPF-Prüfung im RAW-E-Mail-Header sehen. Der folgende Header gibt an, dass die E-Mail von einem autorisierten Absender Host versendet wurde.

policyd-spf[733750]: prepend Received-SPF: Pass

Die Ausgabe bei Verwendung von Postfix Policy-SPF mit Perl.

postfix/policy-spf[735983]: Policy action=PREPEND Received-SPF: pass

Python und Sender Policy Framework prüfen

Bei der Verwendung von postfix-policyd-spf-python muss Python, sowie das Python-SPF-Modul auf dem Server verhanden sein. Die Überprüfung kann wie folgt vorgenommen werden.

$ python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> help('modules')

Ist Python auf dem System installiert, werden mit dem Befehl help('modules') mehrere Module in Spalten angezeigt. Das Modul spf und spf_engine wird vorausgesetzt. Das Python Modul kann wie folgt hinzugefügt werden.

pip install pypolicyd-spf

SPF Record prüfen

Um ein SPF TXT Record einer Domain zu überprüfen, kann folgender Befehl in einem Linux Terminal ausgeführt werden.

$ dig TXT mydomain.net +short
 "v=spf1 a mx ~all"

Bei der Verwendung von Windows, ist der nslookup Befehl aus einem Command Prompt auszuführen.

C:\> nslookup -type=TXT mydomain.net
 "v=spf1 a mx ~all"

E-Mail in Postfix Queue zu Empfänger umleiten mit postsuper

Postfix E-Mail bleibt in der Warteschlange (queue) hängen, die E-Mail soll nun mit postsuper und postcat an einen anderen Empfänger umgeleitet werden.

E-Mail in Postfix Queue zu Empfänger umleiten mit postsuper

Dieses Szenario kann in Erscheinung treten, wenn zum ursprünglichen Empfänger keine E-Mails zugestellt werden können, zum Beispiel mit Erreichen der Mailbox Speicher Limite, oder der Server mit Fehler antwortet.

Hier kann es hilfreich sein, die E-Mail vorübergehend an einen anderen Empfänger zu senden. Der Beitrag zeigt die Schritte, um eine in der Postfix Queue verbleibende E-Mail an einen alternativen Empfänger zu senden.

E-Mail auf on-hold mit postqueue postsuper

Zuerst sucht man in der Postfix Queue die Queue-ID der betreffenden E-Mail, diese man an eine andere Empfänger Adresse senden möchte.

$ postqueue -p | grep 'john@example.org' -B 2

  Der Parameter -B 2 gibt zusätzlich zwei Zeilen vor gesuchter Parse aus.

Die Ausgabe kann in etwa wie die folgende aussehen.

BCD2C3035D31!   37023 Thu Feb 17 08:59:55  suite102@mailings.daydeal.net
        (connect to 12.34.56.78[12.34.56.78]:25: Connection timed out)
                             john@example.org

Hier wurde eine E-Mail an john@example.org gesendet, die ich nun an eine andere Adresse zustellen möchte. Die Queue-ID ist BCD2C3035D31 die wir im weiteren Verlauf benötigen.

Alternativ lassen sich auch alle E-Mails jeder Postfix Queue auflisten.

$ mailq

Um zu verhindern dass Postfix versucht die E-Mail in der Zwischenzeit auszuliefern, setzen wir diese in Wartestellung mit -h auf on hold.

$ postsuper -h BCD2C3035D31
postsuper: BCD2C3035D31: placed on hold
postsuper: Placed on hold: 1 message

  Die E-Mails werden mit on hold nicht gelöscht. Das Ausrufezeichen (!) gibt an, das die Nachricht in Wartestellung ist.

Nun extrahiert man die E-Mail und speichert sie in eine temporäre Datei.

$ postcat -qbh BCD2C3035D31 > /tmp/email.eml

E-Mail aus Postfix Queue senden

Nachdem die E-Mail nun extrahiert ist, kann man diese aus der queue an einen anderen Empfänger senden, mit Postfix postsuper und sendmail.

$ sendmail -f john@example.org mike@domain.org < /tmp/email.eml

Die E-Mail wird von john@example.org an mike@domain.org gesendet.

Die Postfix Deffered Queue nach aufgeschoben E-Mails durchsuchen.

$ postqueue -vp

Nachdem die Zustellung mit postsuper und sendmail an die neue E-Mail-Adresse bestätigt wurde, kann die E-Mail aus der Postfix queue gelöscht werden.

$ postsuper -d BCD2C3035D31
postsuper: BCD2C3035D31: removed
postsuper: Deleted: 1 message

Die temporäre Datei /tmp/email.eml löschen.

$ rm -f /tmp/email.eml

Hilfreiche Postfix Kommandos

  In die E-Mail schauen mit postcat.

$ postcat -vq BCD2C3035D31

E-Mails freigeben, die in die Warteschleife gelegt wurden.

$ postsuper -H BCD2C3035D31
postsuper: BCD2C3035D31: released from hold
postsuper: Released from hold: 1 message

Warteschlange leeren, es wird versucht alle in der Warteschlange befindlichen E-Mails zuzustellen.

$ postqueue -f

Alle E-Mails in der Postfix deffered queue löschen.

$ postsuper -d ALL deferred

Conclusion

Wie in diesem Beitrag aufgezeigt wird, ist es möglich E-Mails aus der Postfix Warteschlange nach auf Hold setzen, diese temporär an andere Empfänger zu senden. Ebenfalls werden verbleibende E-Mails aus der Postfix Queue zur System Hygiene wieder gelöscht.