Alle Beiträge von Don Matteo

lebt in der Schweiz, ist System Engineer MCP bei A-Enterprise GmbH. Mitglied des UNBLOG Network. Author und Blogger zu den Themen, Linux und Open Source. Tutorials für Windows, VMware, Synology, Fortinet.

Sender Policy Framework

Sender Policy Framework und Postfix

Mailserver (MTA) benötigen neben einem A Record, dem MX und dem PTR Eintrag, zusätzlich auch einen SPF-Datensatz im DNS.

Was sind SPF-Records

SPF (Sender Policy Framework) ist ein Verfahren zur Sender-Authentifizierung. SPF ist wie DKIM ein Datensatz vom Typ TXT des DNS, die dazu beitragen sollen, E-Mail-Spoofing zu verhindern und bei der Zustellung der eigenen E-Mails diese als legitim zu identifizieren. Auch soll verhindert werden das E-Mails beim Empfänger nicht im Junk-Mail-Ordner landen. Wenn eine Domain durch E-Mail-Spoofing missbraucht wird, landen die E-Mails wahrscheinlich im Spam-Ordner des Empfängers.

Der SPF-Record gibt an, welche Hosts oder IP-Adressen E-Mails im Namen einer Domain senden dürfen. Sie sollten nur dem eigenen Mailserver oder dem Server des Internetdienstanbieters erlauben, E-Mails für diese Domain zu senden.

SPF-Datensatz im DNS Erstellen

Ein SPF-Record ist ein DNS-Eintrag der zur DNS-Zone einer Domain hinzugefügt wird. Der SPF-Eintrag in einer DNS-Zone kann wie folgt aussehen:

@   IN   TXT   "v=spf1 a mx ~all"

Bei der Domain-Verwaltung eines Internet-Webhosting Anbieter kann dies dann etwa wie folgt aussehen.

  • TXT zeigt an, dass dies ein TXT-Datensatz ist.
  • v=spf1 gibt an, dass dies ein SPF-Datensatz ist und die SPF-Datensatzversion SPF1 ist.
  • mx bedeutet, dass alle in den MX-Datensätzen aufgeführten Hosts E-Mails für die Domain senden dürfen, alle anderen Hosts sind nicht zugelassen.
  • -all Fail – Server die nicht im SPF-Datensatz aufgeführt sind, sind nicht autorisiert E-Mails zu senden (nicht konforme E-Mails werden abgelehnt).
  • ~all Softfail – gibt an, dass E-Mails dieser Domain nur von Hosts stammen sollen, die im SPF-Datensatz angegeben sind. Von anderen Hosts gesendete E-Mails werden als gefälscht gekennzeichnet. Mögliche Alternativen sind +all, ?all, diese jedoch selten verwendet werden.
  • +all – Es wird dringend empfehlen, diese Option nicht zu verwenden. Der Tag ermöglicht es, E-Mails von dieser Domain zu senden.
  • include – Eine zusätzliche SPF-Anfrage zur im Include-Statement angegebenen Domain die die IP-Adresse des Senders enthält.

Um zu überprüfen das der SPF-Record im öffentlichen Internet aufgelöst wird, ist das Dienstprogramm dig auf dem Linux Host wie folgt zur Abfrage anzuwenden:

$ dig domain.com TXT +short
"v=spf1 a mx ~all"

An einem Windows Computer kann nslookup in einer Eingabeaufforderung (cmd) ausgeführt werden, die Änderung kann je nach TTL eine Verzögerung haben:

C:\> nslookup -type=txt domain.com

In der PowerShell dient Resolve-DnsName mit folgendem Befehl:

PS C:\> Resolve-DnsName -Name domain.com -type TXT | ft -a

Name       Type TTL  Section Strings
----       ---- ---  ------- -------
domain.com TXT  3485 Answer  {v=spf1 a mx ~all}

Es können auch Online SPF-Validator wie mxtoolbox verwendet werden, um zu überprüfen welche Hosts die E-Mails der eigenen Domain senden dürfen.

Postfix SPF Policy Agent pypolicyd-spf

Wir benötigen für unseren Postfix SMTP-Server noch die Anweisung, den SPF-Datensatz eingehender E-Mails zu überprüfen, um gefälschte E-Mails zu erkennen. Installiere hierzu als root das Paket pypolicyd-spf aus dem EPEL-Repository:

yum install epel-release
yum install pypolicyd-spf

Füge dann einen Benutzer für Policyd-SPF hinzu:

adduser -U -M -s /bin/false policyd-spf

Bearbeite nun die Postfix-Master-Konfigurationsdatei master.cf:

vi /etc/postfix/master.cf

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

Füge die Zeilen am Ende der Datei master.cf hinzu, hierdurch wird Postfix angewiesen den SPF-Richtliniendämon zu starten. Policyd-SPF wird als Benutzer policyd-spf ausgeführt.

  Policyd-SPF sollte nicht in einer chroot-Umgebung ausgeführt werden.

Speichere und schliesse nun die Datei. Bearbeite als Nächstes die Postfix-Hauptkonfigurationsdatei main.cf:

vi /etc/postfix/main.cf

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

Die Zeile mit policyd-spf sollte nach reject_unauth_destination zu stehen kommen. Speichere anschlissend die Datei und starte dann Postfix neu:

systemctl restart postfix

Wenn jetzt eine E-Mail von deiner Domain mit einem SPF-Record empfangen wird, werden die SPF-Prüfergebnisse im RAW E-Mail-Header angezeigt. Der folgende Header gibt an, dass der Absender der E-Mail von einem autorisierten Host gesendet wurde.

Received-SPF: Pass (mailfrom) identity=mailfrom;

Postfix protokolliert mit syslog die SPF-Prüfergebnisse in maillog in etwa wie folgt.

Jul 19 07:10:38 mailhub policyd-spf[24382]: Pass; identity=helo; client-ip=12.34.56.78; helo=mail77-192.srv2.com; envelope-from=return@news.domain.com; receiver=max.muster@domain.com

Mails ohne eigenen Mail-Server versenden mit SSMTP

SSMTP Client zum Senden von E-Mails mit SMTP und SMTPS

Unixoide Systeme verwenden in der Regel ein Mail Transfer Agent (MTA) wie Postfix oder Exim für den Versand von E-Mails. Diese vollwertigen MTAs haben einen mächtigen Funktionsumfang, was sich auch in einer komplexen Konfiguration wieder findet.

In Situationen bei diesen ein Linux Host E-Mails versenden soll, beispielsweise von Cron-Task, dieser im Fall von Fehler den Status per Mail versendet, oder ein Webserver mit einem Ticket oder einem Shop System, dieses mittels PHP Mails zustellt. Dafür aber extra ein kompletten MTA mit Postfix aufzubauen zu komplex wäre. Auch sind kleine Netzwerke ohne eigenen MTA, ohne gültiges CA-Zertifikat und ohne fixe IP-Adresse ohnehin nicht in der Lage, E-Mails direkt versenden zu können, die meisten Mailserver werden den Empfang von diesen Servern ablehnen. Für solche Szenarien ist daher die weiterleitung von E-Mails an einen SMTP-Smarthost die probate Lösung, hierzu diesen Prozess das Tool ssmtp übernehmen kann.

sSMTP Mail Submission STARTTLS

ssmtp ist kein vollwertiger MTA (Mail-Transfer-Agent) wie Postfix oder Exim, viel mehr ist es ein einfaches Tool das E-Mails zu einem autorisierten MTA Smarthost weiterleitet. sSMTP unterstützt die Mail Submission Authentifizierung und STARTTLS. Dabei installiert man ssmtp hier auf CentOS als root wie folgt:

yum install ssmtp -y

Die Installation auf einer Debian basierten Distribution ist:

apt-get -y install ssmtp

Mails über Office 365 aus CLI versenden

Nach der Installation gibt es die zwei Konfigurationsdateien /etc/ssmtp/ssmtp.conf und /etc/ssmtp/revaliases, diese an die eigene Anforderung angepasst werden. Hier wird die Konfiguration erstellt, um E-Mails über ein Office 365 Konto zu verschicken.

vi /etc/ssmtp/ssmtp.conf

root=shop@domain.com
mailhub=smtp.office365.com:587
useSTARTTLS=YES
AuthUSER=shop@domain.com
AuthPass=password
RewriteDomain=domain.com
Hostname=domain.com
UseTLS=YES
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt

  Anstelle des Platzhalter shop@domain.com wird der entsprechende Benutzer verwendet dieser bei Office 365 erstellt wurde, bei password ist das zum Benutzer gehörende Passwort einzutragen, bei domain.com kann die eigene Domain oder outlook.com eingetragen werden. Natürlich funktioniert es auch mit anderen Anbieter, wie Goolge Mail (smtp.gmail.com). Dabei soll nicht unerwähnt sein, das der Zugriff auf das Google-Konto Zugriff durch weniger sichere Apps aktiviert sein muss.

Nun legt man fest welche User den Mailserver nutzen dürfen. Dies wird über die Datei revaliases festgelegt, reverse aliases ist die umgekehrte Version von aliases, dazu editiert man /etc/ssmtp/revaliases.

vi /etc/ssmtp/revaliases

root:shop@domain.com:smtp.office365.com:587
john:shop@domain.com:smtp.office365.com:587

Es darf root und der User john direkt vom Host senden.

Anschliessend wird eine Datei mit Parameter für ssmtp im richtigen Format erstellt, im Editor deiner wahl durch  Copy Past die nachstehenden Zeilen einfügen, inklusive Punkt am Ende:

vi ~/testmail.txt

To:touser@domain.net
From:shop@domain.com
Subject: Test Mail

This is a test mail.
.

  Anstelle To:touser@domain.net die eigentliche Empfänger Email eintragen, und bei From:shop@domain.com die korrekte Absender Email. Sollen weitere Empfänger erreicht werden, können dazu einfach weitere Zeilen To: mit den gewünschten Adressen eingetragen werden.

Jetzt wird getestet, wir senden mit folgendem Command.

ssmtp -vvv -t 

Es wird als der angemeldete Benutzer gesendet, ist john eingeloggt kann dieser Mails versenden weil er in revaliases eingetragen ist.

Die verbose Ausgabe in der Console dann etwa wie folgt:

[<-] 220 GV0P275CC0026.outlook.office365.com Microsoft ESMTP MAIL Service ready at Wed, 15 Jul 2020 05:37:09 +0000
[->] EHLO 12.34.56.78.dynamic.wline.res.cust.isp.net
[<-] 250 SMTPUTF8
[->] STARTTLS
[<-] 220 2.0.0 SMTP server ready
[->] EHLO 12.34.56.78.dynamic.wline.res.cust.isp.net
[<-] 250 SMTPUTF8
[->] AUTH LOGIN
[<-] 334 VCMlbm6hbXU7
[->] c3hvcECtb3VobC6jaA==
[<-] 334 UAFzc3dxcmQ7
[<-] 235 2.7.0 Authentication successful
[->] MAIL FROM:<shop@domain.com>
[<-] 250 2.1.0 Sender OK
[->] RCPT TO:<touser@domain.net>
[<-] 250 2.1.5 Recipient OK
[->] DATA
[<-] 354 Start mail input; end with <CRLF>.<CRLF>
[->] Received: by 12.34.56.78.dynamic.wline.res.cust.isp.net (sSMTP sendmail emulation); Wed, 15 Jul 2020 07:37:10 +0200
[->] Date: Wed, 15 Jul 2020 07:37:10 +0200
[->] To:touser@domain.net
[->] From:shop@domain.com
[->] Subject: Test Mail
[->]
[->] This is a test mail.
[->] .
[<-] 250 2.0.0 OK <DB8PR08MB3323E3B68DF12935DBECFADAB87E0@DC8PR09MB3123.eurprd09.prod.outlook.com> [Hostname=DB8PR08MB3123.eurprd09.prod.outlook.com]
[->] QUIT
[<-] 221 2.0.0 Service closing transmission channel

Im maillog sollte die ausgabe etwa wie diese zu finden sein.

Jul 14 20:51:16 fedora sSMTP[25809]: Creating SSL connection to host
Jul 14 20:51:16 fedora sSMTP[25809]: SSL connection using ECDHE-RSA-AES256-GCM-SHA384
Jul 14 20:51:19 fedora sSMTP[25809]: Sent mail for user@domain.com (221 2.0.0 Service closing transmission channel) uid=0 username=root outbytes=531

Damit nun auch beim Empfänger anstatt root, die eigentliche Absenderadresse erscheint, kann /etc/passwd angepasst werden.

grep "root:x" /etc/passwd
root:x:0:0:root:/root:/bin/bash

Hier kann das Finger Command chfn angewendet werden.

chfn -f 'here I am' root

Der mit Finger chfn geänderte full name in passwd weist danach folgenden Inhalt aus:

grep "root:x" /etc/passwd
root:x:0:0:here I am,,,,:/root:/bin/bash

Sollen E-Mail nur als root versendet werden, kann auf diese Konfiguration verzichtet werden, dabei wird über ssmtp.conf ermöglicht das eine Absenderadresse übergeben werden kann.

vi /etc/ssmtp/ssmtp.conf

# Set this to never rewrite the "From:" line (unless not given) and to
# use that address in the "from line" of the envelope.
FromLineOverride=YES

Zu guter Letzt wollen natürlich nicht nur Testmails versendet werden. Für den produktiven Einsatz könnte beispielsweise mit PHP oder einem Shell Script eine Parameterdatei für ssmtp erzeugt werden, diese dann automatisiert die gewünschten Informationen dynamisch bereitstellt. Eine E-Mail versenden mit ssmtp kann auch mit dem folgenden Einzieler ausgeführt werden.

echo -e "Subject: Hier ist der Betreff\n\nHier ist ein Text.\n\n." | ssmtp touser@domain.net