SPF, DKIM und DMARC in Postfix einrichten¶
| Stand: 11/2025 |
|---|
| Verwendete Software - Ubuntu 24.04 LTS - SPF-Python 3.0.4 - OpenDKIM 2.11.0 - OpenDMARC 1.4.2 |
| Weitere Dokumentationen: - Postfix als Relayhost (Smarthost) - SpamAssassin in Postfix einrichten |
Vorwort¶
Diese Dokumentation beschreibt den Installationsvorgang von SPF, DKIM und DMARC zur Erweiterung von Postfix.
Ziel dieser Dokumentation soll sein, einen Mailserver zu betreiben, der über Mechanismen verfügt, die zuverlässig zur Spam-Abwehr und zum Mißbrauch Ihrer Domain-Namen und E-Mail-Adressen beitragen. Gleichzeitig soll die Vertrauensstellung Ihres Mailservers durch deren Einsatz erhöht werden.
Es sind Grundkenntnisse im Umgang mit Linux erforderlich, da die Vorgehensweise, wie sie hier beschrieben ist, in manchen Teilen abweichen kann. Kein System ist wie das Andere. Die Dokumentation wurde sorgfältig von mir geprüft. Dennoch kann ich keinerlei Haftung für Schäden an Ihrem System oder eine Gewährleistung übernehmen. Bitte verwenden Sie diese Dokumentation auf eigene Gefahr.
Warum SPF?¶
SPF beschreibt, welcher Mailserver eine E-Mails versenden darf.
Durch den Einstz von SPF geben Sie einem empfangenden Mailserver Informationen darüber, welche Mailserver zum Versand von E-Mails mit, zu Ihrer Mail-Domain gehörenden Absender-Adressen, berechtigt sind. Ohne SPF, kann der Empfänger nicht überprüfen, ob eine E-Mail über einen von Ihnen autorisierten Mailserver versendet wurde. Diese Informationen werden über einen DNS-TXT-Eintrag auf dem, zu Ihrer Domain gehörenden, DNS-Server veröffentlicht.
Die Dokumenatation beschreibt:
- Wie der SPF-Mechanismus in Postfix implementiert wird
- Wie ein SPF-Eintrag auf dem DNS-Server erstellt wird
Warum DKIM?¶
DKIM beschreibt, dass eine E-Mail unverändert vom tatsächlichen Absender stammt.(Spoofing)
DKIM ist ein weiterer Schritt, die Authentizität Ihrer E-Mails gegenüber des Empfängers nachzuweisen. Bei DKIM wird der Kopfzeile Ihrer E-Mail eine digitale Signatur hinzugefügt, die von einem empfangenden Mailserver anhand eines öffentlichen Schlüssels verifiziert werden kann. Der öffentliche Schlüssel wird über einen DNS-TXT-Eintrag auf dem, zu Ihrer Domain gehörenden, DNS-Server veröffentlicht. Durch den Einsatz von DKIM kann vom emfangenden Mailserver kryptografisch festgestellt werden, ob die Absender-Adresse der E-Mail korrekt ist und ob die E-Mail auf dem Weg der Zustellung inhaltlich verändert wurde.
Die Dokumenatation beschreibt:
- Wie der DKIM-Mechanismus in Postfix implementiert wird
- Wie ein DKIM-Eintrag auf dem DNS-Server erstellt wird
Warum DMARC?¶
DMARC vervollständigt den Einsatz von SPF und DKIM, indem es festlegt, wie ein empfangender Mailserver mit einer E-Mail umgeht, bei der die SPF- und/oder DKIM-Prüfung fehlgeschlagen ist. Es legt fest, ob die E-Mail dennoch angenommen, als Spam deklariert oder verworfen werden soll. Diese Informationen werden über einen DNS-TXT-Eintrag auf dem, zu Ihrer Domain gehörenden, DNS-Server veröffentlicht.
Die Dokumenatation beschreibt:
- Wie der DMARC-Mechanismus in Postfix implementiert wird
- Wie ein DMARC-Eintrag auf dem DNS-Server erstellt wird
Was muss ich in der Konfiguration anpassen?¶
Einige Parameter müssen auf Ihre Umgebung angepasst werden. Im Verlauf dieser Dokumentation müssen Sie nur die Parameter anpassen, die in der nachfolgenden Tabelle aufgelistet sind. Sie können also ganz einfach durch die Funktion "Suchen und Ersetzen" (STRG + H), die Konfigurationsdateien auf Ihre Umgebung anpassen. Das Gleiche gilt für auszuführende Kommandos.
Folgende Parameter werden verwendet:
| Wert | Hinweis | |
|---|---|---|
| Allgemein | ||
| Domain | example.com | Ersetzen Sie diesen Wert durch die Domain, die Sie für den E-Mail-Verkehr verwenden. |
| Hostname | relayhost.example.com | Ersetzen Sie diesen Wert durch den FQDN Ihres Servers. |
| DKIM | ||
| Selector | 20210509 | Geben Sie eine Zeichenkette an, mit der das DKIM-Schlüsselpaar identifiziert werden kann. Sinnvoll ist z. B. das Erstellungsdatum wie 20210509 = 2021-05-09 |
| DMARC | ||
| E-Mail-Adresse (Absender) | [email protected] | Ersetzen Sie diesen Wert durch eine E-Mail-Adresse, die als Absender für DMARC-Berichte verwendet werden soll. |
| E-Mail-Adresse (Empfänger) | [email protected] | Ersetzen Sie diesen Wert durch eine E-Mail-Adresse, die als Empfänger für DMARC-Berichte verwendet werden soll. |
Konfigurations-Dateien werden immer nach dem gleichen Muster erstellt. Unter jeder Datei, die eine Anpassung erfordert, finden Sie die nötigen Hinweise.
Dateien, die zwar Parameter aber keine eigentliche Konfiguration enthalten, werden nach dem vorgegebenen Syntax erstellt.
Beispiel:
Im folgenden Beispiel ist die Datei /home/beispiel.conf zu erstellen und der Parameter domain anzupassen.
Erstellen Sie eine neue Datei /home/beispiel.conf mit folgendem Inhalt:
nano /home/beispiel.conf
content = Dokumentationen
domain = example.com
owner = root
[...]
domain = example.com
[...]
Im folgenden Beispiel ist die Datei
/home/beispiel.map mit einer Liste Ihrer E-Mail-Adressen zu erstellen.
Erstellen Sie eine neue Datei
/home/beispiel.map nach folgendem Syntax:
nano /home/beispiel.map
[email protected]
[email protected]
[email protected]
Server vorbereiten¶
Root-Rechte einräumen¶
Während der gesamten Dokumentation werden Root-Rechte benötigt. Um auf das Voranstellen von sudo zu verzichten, verschaffen Sie sich für die gesamte Sitzung erhöhte Rechte mit:
sudo -i
Update durchführen¶
Bringen Sie den Server auf den aktuellen Patchstand:
apt update && apt upgrade
Software herunterladen und installieren¶
Laden Sie SPF-Python, OpenDKIM und OpenDMARC aus dem offiziellen Ubuntu-Repository herunter:
apt-get install postfix-policyd-spf-python opendkim opendkim-tools opendmarc
SPF in Postfix implementieren¶
SPF konfigurieren¶
Info
Policy-SPF wird in der Datei /etc/postfix-policyd-spf-python/policyd-spf.conf konfiguriert.
In unserem Setup wollen wir anhand der DMARC-Richtlinie des sendenden Mailservers über die Annahme oder Ablehnung einer E-Mail entscheiden. Wir sorgen also dafür, dass eine eingehende E-Mail, auch bei fehlgeschlagener SPF-Prüfung, angenommen wird. Das Ergebnis der SPF-Prüfung wird aber im Header der E-Mail vermerkt und kann von nachfolgenden Instanzen, wie z.B. DMARC oder auch Spamassassin ausgewertet werden.
Editieren Sie die Datei /etc/postfix-policyd-spf-python/policyd-spf.conf und ändern Sie folgende Parameter:
nano /etc/postfix-policyd-spf-python/policyd-spf.conf
[...]
HELO_reject = False
Mail_From_reject = False
[...]
SPF in Postfix aktivieren¶
Info
Da die SPF-Prüfung kein eigener Postfix-Prozess ist, muss der Prozess über den spawn-daemon in Postfix aufgerufen werden.
Der spawn-daemon erstellt bei Bedarf Nicht-Postfix-Prozesse. Er läuft auf einem Unix-Domain-Socket und wird, als untergeordneter Prozess des Postfix-Master-Prozesses, in der Datei /etc/postfix/master.cf konfiguriert. In unserem Setup läuft er als Dienst policy-spf.
Bei eingehendem E-Mail-Empfang wird der Dienst im Rahmen der SMTPD Restrictions aufgerufen.
Fügen Sie der Datei /etc/postfix/master.cf folgendes hinzu:
[...]
policy-spf unix - n n - - spawn
user=nobody argv=/usr/bin/policyd-spf
[...]
Suchen Sie in der Datei
/etc/postfix/main.cf den Parameter smtpd_recipient_restrictions.Fügen Sie
check_policy_service unix:privpolicy-spf ein:
[...]
smtpd_recipient_restrictions =
[...]
check_policy_service unix:private/policy-spf
[...]
[...]
Info
Durch falsches Setzen des Parameters kann Ihr Server zu einem offenen Relay werden.
Ihre /etc/postfix/main.cf muss entweder die folgende Option enthalten,
smtpd_relay_restrictions =
[...]
reject_unauth_destination
oder Sie müssen den Parameter nach
reject_unauth_destination setzen:
smtpd_recipient_restrictions =
[...]
reject_unauth_destination
check_policy_service unix:private/policy-spf
[...]
Setzen Sie in der Datei /etc/postfix/main.cf das Timeout-Limit für SPF:
#Milter - DKIM, DMARC, SPF
#########################################################################
policy-spf_time_limit = 3600s
[...]
Starten Sie Postfix neu, damit die Konfiguration angewendet wird:
service postfix restart
DNS-Eintrag für SPF einrichten¶
Info
Damit ein Empfänger Ihrer E-Mails überprüfen kann, ob der sendende Mailserver zum Versand berechtigt ist, muss diese Information, in Form eines SPF-DNS-Eintrags, veröffentlicht werden. Der SPF-Eintrag wird von links nach rechts abgearbeitet. Der erste Teil enthält immer die verwendete SPF-Version und der zweite Teil die berechtigten und die nichtberechtigten Hosts.
Beispiel:
Das folgende Beispiel sagt aus, dass SPF-Version 1 (v=spf1) verwendet wird, alle Mailserver, die in Ihrem DNS-Server als MX eingetragen sind (mx), zum Mailversand berechtigt sind und alle Anderen nicht berechtigt sind (-all).
Der HELO-Hostname wird ebenfalls überprüft. Für diese Überprüfung ist ein weiterer SPF-Eintrag erforderlich, da nur die Domäne nicht ausreicht. Der SPF-Mechanismus erwartet den FQDN des Mailservers.
Die zwei folgenden Beispiele können Sie verwenden. Andere Varianten sind nur komplexeren Mail-Systemen notwendig.
| Hostname | Typ | Priorität | Ziel | Text |
|---|---|---|---|---|
| example.com | TXT | v=spf1 mx -all |
Für die HELO-Überprüfung:
| Hostname | Typ | Priorität | Ziel | Text |
|---|---|---|---|---|
| relayhost.example.com | TXT | v=spf1 a -all |
Weitere Beispiele:
Das folgende Beispiel sagt aus, dass SPF-Version 1 (v=spf1) verwendet wird, der Mailserver, der die IPv4-Adresse 2.234.54.2 enthält und alle Mailserver, die in Ihrem DNS-Server als MX eingetragen sind (mx), zum Mailversand berechtigt sind. Alle Anderen sind nicht berechtigt (-all).
| Hostname | Typ | Priorität | Ziel | Text |
|---|---|---|---|---|
| example.com | TXT | v=spf1 ip4:2.234.54.2 mx -all |
Das folgende Beispiel sagt aus, dass SPF-Version 1 (v=spf1) verwendet wird, der Mailserver, der die IPv4-Adresse 2.234.54.2 enthält und alle Mailserver, die in Ihrem DNS-Server als MX eingetragen sind (mx), zum Mailversand berechtigt sind. Alle Anderen sollen dennoch akzeptiert werden (~all).
| Hostname | Typ | Priorität | Ziel | Text |
|---|---|---|---|---|
| example.com | TXT | v=spf1 ip4:2.234.54.2 mx ~all |
Erstellen Sie auf dem DNS-Server, der für Ihre Mail-Domain zuständig ist, jeweils einen DNS-TXT-Eintrag für den MX-Eintrag und einen für die HELO-Überprüfung nach folgendem Syntax:
Hostname– für einen SPF-Eintrag ist kein Hostname erforderlich.Typ– hier geben Sie den Typ des DNS-Eintrags an. In unserem Fall muss es ein TXT-Eintrag seinText– hier geben Sie die SPF-Information ein.
SPF-Eintrag für die Domain example.com:
| Hostname | Typ | Priorität | Ziel | Text |
|---|---|---|---|---|
| example.com | TXT | v=spf1 mx -all |
SPF-Eintrag für den HELO-Hostname relayhost.example.com:
| Hostname | Typ | Priorität | Ziel | Text |
|---|---|---|---|---|
| relayhost.example.com | TXT | v=spf1 a -all |
Übersicht der verschiedenen Qualifikatoren und Mechanismen¶
| Qualifikator | Resultat | Bedeutung |
|---|---|---|
| + | Pass | Der Host ist berechtigt (Das + muss nicht explizit angegeben werden. +mx ist äquivalent zu mx) |
| - | Fail | Der Host ist nicht berechtigt |
| ~ | SoftFail | Der Host ist nicht berechtigt, soll aber dennoch akzeptiert werden (z. B. Testumgebung) |
| ? | Neutral | Keine Angabe zur Berechtigung. Host soll akzeptiert werden |
| Mechanismus | Host ist berechtigt wenn... |
|---|---|
a[:] |
der Host-A/AAAA (oder der Angegebene) Record die IP-Adresse des sendenden Mailservers enthält. |
mx[:] |
der MX-Record der Domain (oder der Angegebenen) die IP-Adresse des sendenden Mailservers enthält |
ip4: |
die angegebene IPv4-Adresse (oder IPv4-Subnetz) die des sendenden Mailservers ist. |
ip6: |
die angegebene IPv6-Adresse (oder IPv6-Subnetz) die des sendenden Mailservers ist. |
include: |
die zusätzliche SPF-Überprüfung der überprüften Domain die, im Include-Statement enthaltene, IP-Adresse des Mailservers enthält. |
ptr[:] |
der Host-A/AAAA (oder der Angegebene) Record eines Reverse-DNS-Lookups der überprüften Domain die IP-Adresse enthält. |
exists: |
wenn der sendende Mailserver einen Host-A-Record hat (gilt auch für IPv6). |
all |
immer. |
DNS-Eintrag für SPF prüfen¶
Prüfen Sie, ob der DNS-TXT-Eintrag bereits aktiv ist. Je nach Hoster bzw. DNS-Server kann es mehrere Stunden dauern, bis DNS-Änderungen verfügbar sind. Verwenden Sie hierzu folgendes Kommando:
host -t txt example.com
Wenn Sie folgende Ausgabe erhalten, ist Ihr DNS-TXT-Eintrag aktiv:
host -t txt example.com
example.com descriptive text "v=spf1 mx -all"
Wenn Sie folgende Ausgabe erhalten, ist Ihr DNS-TXT-Eintrag noch nicht aktiv:
host -t txt example.com
Host example.com not found: 3(NXDOMAIN)
DKIM in Postfix implementieren¶
Unix-Socket einrichten¶
Info
Der OpenDKIM-Dienst kommuniziert mit Postfix über einen sogenannten Unix-Domain-Socket. Im Gegensatz zu TCP/IP-Sockets sind Unix-Sockets schneller und sicherer, da sie ausschließlich auf dem lokalen Dateisystem operieren und keinen offenen Port benötigen.
Damit Postfix überhaupt auf diesen Socket zugreifen kann, muss sich der Socket innerhalb von Postfix chroot-Umgebung befinden – standardmäßig ist das /var/spool/postfix. Wenn der Socket außerhalb dieses Verzeichnisses liegt, sieht Postfix ihn schlicht nicht.
Aus diesem Grund erstellen wir das Verzeichnis /var/spool/postfix/opendkim und sorgen mit entsprechenden Zugriffsrechten sowie durch Hinzufügen des postfix-Benutzers zur Gruppe opendkim dafür, dass die Kommunikation problemlos funktioniert.
Erstellen Sie zunächst den Ordner /var/spool/postfix/opendkim und vergeben Sie die entsprechenden Zugriffsrechte:
mkdir /var/spool/postfix/opendkim
chown -R opendkim:opendkim /var/spool/postfix/opendkim
chmod -R 750 /var/spool/postfix/opendkim
Fügen Sie den Benutzer
postfix zur Gruppe opendkim hinzu:
usermod -aG opendkim postfix
DKIM konfigurieren¶
Info
OpenDKIM wird in der Datei /etc/opendkim.conf konfiguriert.
In unserem Setup wartet der Dienst als Unix-Domain-Socket auf eingehende Verbindungen.
Die Konfigurations-Parameter für OpenDKIM sind sehr überschaubar und werden im weiteren Verlauf noch genauer erwähnt.
Den Parameter Canonicalization möchte ich aber schon jetzt etwas beleuchten:
Der Kanonisierungs-Algorithmus (Canonicalization) legt fest, ob der empfangende Mailserver den Header bzw. den Body der E-Mail normalisieren soll, um geringfügige Abweichungen, wie z.B. Leerzeichen oder Zeilenumbrüche, zu berücksichtigen, durch die die Signatur ansonsten ungültig werden würde.
Es können verschiedene Algorithmen, durch Schrägstrich ("/") getrennt, verwendet werden. Der Erste wird auf den Header und der Zweite auf den Body der E-Mail angewendet.
Gemäß RFC 4871 stehen zwei Algorithmen zu Verfügung:
-
simple
Der Header/Body wird nicht normalisiert. -
relaxed
Der Header/Body wird normalisiert. Es werden alle Leerzeichen und Zeilenumbrüche entfernt. Beim Header werden zusätzlich alle Buchstaben in Kleinbuchstaben geändert.
Die empfohlene Einstellung ist relaxed/relaxed.
Alle weiteren Konfigurations-Parameter finden Sie auf der Seite von OpenDKIM.
Benennen Sie zunächst die /etc/opendkim.conf um, damit Sie eine Sicherheitskopie der Original-Datei haben:
mv /etc/opendkim.conf /etc/opendkim.conf.bak
Erstellen Sie eine neue Datei
/etc/opendkim.conf mit folgendem Inhalt:
nano /etc/opendkim.conf
UserID opendkim:opendkim
UMask 002
PidFile /var/run/opendkim/opendkim.pid
SOCKET local:/var/spool/postfix/opendkim/opendkim.sock
Mode sv
Domain *
#Selector mail
Canonicalization relaxed/relaxed
SignatureAlgorithm rsa-sha256
OversignHeaders From
AutoRestart yes
AutoRestartRate 10/1h
SigningTable refile:/etc/opendkim/signing.table
KeyTable /etc/opendkim/key.table
ExternalIgnoreList refile:/etc/opendkim/trusted.hosts
InternalHosts refile:/etc/opendkim/trusted.hosts
Syslog yes
SyslogSuccess yes
LogWhy yes
Ignore-Hosts definieren¶
Info
Wenn für bestimmte Mailserver keine DKIM-Prüfung gewünscht ist, können diese in der Datei /etc/opendkim/trusted.hosts definiert werden. Die Datei kann Hostnamen, einzelne IP-Adressen und/oder ganze Adressräume (CIDR-Angaben) enthalten.
Der eigene Host (localhost) sollte immer ignoriert werden.
Erstellen Sie einen neuen Ordner /etc/opendkim:
mkdir /etc/opendkim
Erstellen Sie die Datei
/etc/opendkim/trusted.hosts und definieren Sie die Hosts, für die kein DMARC-Test durchgeführt werden soll.Normalerweise gilt dies nur für
localhost:
nano /etc/opendkim/trusted.hosts
127.0.0.1
::1
localhost
Schlüssel erstellen¶
Info
DKIM basiert auf dem Public-Key-Verfahren das ein Schlüsselpaar, bestehend aus einem öffentlichen und einem geheimen Schlüssel, voraussetzt.
Mit dem geheimen Schlüssel wird die digitale Signatur für den E-Mail-Header erzeugt, die vom empfangenden Mailserver anhand des öffentlichen Schlüssels verifiziert werden kann.
Für die Erzeugung des benötigten Hashwertes stehen SHA-1 und SHA-256 zur Verfügung. Der Hashwert wird anschließend mit dem RSA-Verfahren signiert.
In unserem Setup erzeugen wir natürlich den empfohlenen, grösseren Hashwert mit SHA-256.
Die entsprechenden Parameter finden Sie in der Datei /etc/opendkim.conf:
[...]
SignatureAlgorithm rsa-sha256
[...]
Das Schlüsselpaar wird mit dem Tool
opendkim-genkey anhand der folgenden Parametrisierung generiert:
-d example.comDie Mail-Domain, für die der Schlüssel gelten soll. (-d= Domain)-b 2048Die Schlüssellänge beträgt 2048 Bits. Standardmäßig verwendet opendkim-genkey eine Schlüssellänge von 1024 Bits. Das ist aber nicht mehr ausreichend. (-b= bit)-rDer Schlüssel darf nur zum Signieren von E-Mails verwendet werden. (-r= restricted)-s 20210509Die Zeichenkette, mit der das Schlüsselpaar identifiziert werden kann. Es ist sinnvoll, das Erstellungsjahr und den Monat zu verwenden. So kann das Erstellungsdatum des Schlüsselpaares nachvollzogen werden. '20210509' steht also für '2021 Mai 09 '. (-s= selector)
Der öffentliche Schlüssel wird in der Dateiexample.com.txtund der geheime Schlüssel in der Dateiexample.com.privatehinterlegt.
Erstellen Sie ein Verzeichnis für die DKIM-Schlüssel und passen Sie die Berechtigungen an:
mkdir /etc/opendkim/keys
chown -R opendkim:opendkim /etc/opendkim
Wechseln Sie in den Ordner
/etc/opendkim und erstellen Sie mit dem Kommando opendkim-genkey das Schlüsselpaar für Ihre Mail-Domain:
cd /etc/opendkim
opendkim-genkey -d example.com -b 2048 -r -s 20210509
Benennen Sie die Dateien, entsprechend Ihrer Mail-Domain um und verschieben Sie diese in den Ordner
/etc/opendkim/keys:
mv 20210509.private keys/example.com.private
mv 20210509.txt keys/example.com.txt
Passen Sie die Berechtigungen an:
chmod -R 700 /etc/opendkim/keys
Schlüssel einer Domain zuweisen¶
Info
OpenDKIM kann nicht nur für eine einzelne Domain verwendet werden. Die Zuordnung von Domain und Schlüssel erfolgt daher in separaten Dateien, die auch mehrere Domain- und Schlüsselzuordnungen beeinhalten können. Der Dienst entscheidet anhand der hinterlegten Informationen, welchen Schlüssel er für welche Domain verwendet.
Die entsprechenden Parameter finden Sie in der Datei /etc/opendkim.conf:
[...]
SigningTable refile:/etc/opendkim/signing.table
KeyTable /etc/opendkim/key.table
[...]
Als ersten Schritt geben Sie an, für welche Absender-Adressen (*@example.com) welcher Schlüssel (example.com) verwendet werden soll.
Erstellen Sie dazu Datei /etc/opendkim/signing.table nach folgendem Syntax:
nano /etc/opendkim/signing.table
*@example.com example.com
Als zweiten Schritt geben Sie den Ort des Private-Keys für
example.com an.Erstellen Sie dazu die Datei
/etc/opendkim/key.table nach folgendem Syntax:
nano /etc/opendkim/key.table
example.com example.com:20210509:/etc/opendkim/keys/example.com.private
Passen Sie abschliessend die Berechtigungen an:
chown -R opendkim:opendkim /etc/opendkim
Starten Sie OpenDKIM neu, damit die Konfiguration angewendet wird:
service opendkim restart
OpenDKIM-Milter in Postfix einrichten¶
Info
OpenDKIM ist ein sogenanntes Milter-Programm.
Das Kofferwort Milter setzt sich aus den Worten Mail und Filter zusammen.
Milter-Programme erhalten von Postfix Voll-Zugriff auf eine E-Mail und dürfen diese auswerten und sogar inhaltlich verändern.
Eine E-Mail wird hierfür zuerst an das entsprechende Milter-Programm übergeben, bevor sie in die Warteschlange eingereiht wird.
Da OpenDKIM dem E-Mail-Header einer ausgehenden E-Mail die DKIM-Signatur hinzufügt (inhaltliche Veränderung) und die Signatur einer eingehenden E-Mail auswertet, muss in Postfix ein entsprechender smtpd-milter definiert werden.
Die Kommunikation zwischen Postfix und OpenDKIM findet über den, anfangs eingerichteten, Unix-Domain-Socket statt.
Fügen Sie der Datei /etc/postfix/main.cf folgendes hinzu:
[...]
#Milter - DKIM, DMARC, SPF
######################################################################
milter_default_action = accept
milter_protocol = 6
smtpd_milters =
local:opendkim/opendkim.sock
non_smtpd_milters =
${smtpd_milters}
[...]
Starten Sie Postfix und OpenDKIM neu, damit die Konfiguration angewendet wird:
service postfix restart
service opendkim restart
DNS-Eintrag für DKIM einrichten¶
Der öffentliche Schlüssel muss in Form eines DNS-TXT-Eintrags veröffentlicht werden. Erstellen Sie auf dem DNS-Server, der für Ihre Mail-Domain zuständig ist, einen DNS-TXT-Eintnach folgendem Syntax:
Hostnamehier geben Sie die Zeichenfolge (selector) gefolgt von._domainkey.und Ihrer Mail-Domain anTyphier geben Sie den Typ des DNS-Eintrags an. In unserem Fall muss es ein TXT-Eintrag seinTexthier geben Sie die verwendete DKIM-Version und das Hashverfahren anv=DKIM1; k=rsa;als öffentlichen Schlüssel verwenden Sie den Inhalt der Datei/etc/opendkim/kexample.com.txt. (p=MIIBIjANB.......)
| Hostname | Typ | Ziel | Text |
|---|---|---|---|
| 20210509._domainkey.example.com | TXT | v=DKIM1; k=rsa; p=MIIBIjANB[...]htp1L5D51a9lhhSG |
Hinweis!
Je nach Hoster bzw. verwendetem DNS-Server werden die Anführungsstriche entweder nicht akzeptiert oder so interpretiert, als wenn sie Teil des öffentlichen Schlüssels wären. Das führt zwangsläuft zu Fehlern. Kopieren Sie daher den öffentlichen Schlüssel aus der Datei /etc/opendkim/keys/example.com.txt in einen Text-Editor und entfernen Sie die Anführungsstriche. Achten Sie darauf, dass sich keine Leerzeichen oder Absätze im öffentlichem Schlüssel befinden.
Beispiel:
# Vorher
20210509._domainkey IN TXT ( "v=DKIM1; k=rsa; s=email; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCA[...]qxNhoHkVBlgywUlK5D51a9lhhSG"
"1B1mnNcsmfgoP177XqAsWsRdu2zVuwe[...]lLPYmg3qe9bpZxtwWZHtwIDAQAB" )
; ----- DKIM key 20210509 for ihredomain.de
# Nachher
p=MIIBIjANBgkqhkiG9w0B[...]lK5D51a9lhhSG1B1mnNcsmfgoP1[...]e9bpZxtwWZHtwIDAQAB
DNS-Eintrag für DKIM prüfen¶
Prüfen Sie zunächst, ob der DNS-TXT-Eintrag bereits aktiv ist. Je nach Hoster bzw. DNS-Server kann es mehrere Stunden dauern, bis DNS-Änderungen verfügbar sind.
Verwenden Sie hierzu folgendes Kommando:
host -t txt 20210509._domainkey.example.com._domainkey
Wenn Sie folgende Ausgabe erhalten, ist Ihr DNS-TXT-Eintrag aktiv:
host -t txt 20210509._domainkey.example.com._domainkey
20210509._domainkey.example.com descriptive text "v=DKIM1; k=rsa;\013\010p=MIIBIjANBgkqhk
OCA.......gywUlK5D51a9lhhSG1B1mnNcsmfgoP177XqAsWsRdu2zVuwe.......lbpZxtwWZHtwIDAQA"
Wenn Sie folgende Ausgabe erhalten, ist Ihr DNS-TXT-Eintrag noch nicht aktiv:
host -t txt 20210509._domainkey.example.com._domainkey
OpenDKIM prüfen¶
Info
Testen Sie mit dem Kommando opendkim-testkey, ob der OpenDKIM-Dienst ordnungsgemäß funktioniert und der DNS-Eintrag korrekt ist.
Der Syntax für das Kommando opendkim-testkey lautet:
-d hier geben Sie die Mail-Domain an, die getestet werden soll (Ihre Mail-Domain)
-s hier geben Sie den zu testenden Selector an (z.B. 20210509)
*-vvv dieser Parameter bewirkt, dass das Kommando Debugging-Informationen anzeigt
Wichtig ist die letzte Zeile opendkim-testkey: key OK. Das bedeutet, dass alles wie gewünscht funktioniert.
Die Zeile opendkim-testkey: key not secure bedeutet lediglich, dass Ihr DNS-Server kein DNSSEC verwendet. Das kann ignoriert werden.
opendkim-testkey -d example.com -s 20210509 -vvv
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key '20210509._domainkey.example.com'
opendkim-testkey: key not secure
opendkim-testkey: key OK
DMARC in Postfix implementieren¶
Unix-Socket einrichten¶
Info
Auch bei OpenDMARC muss der Unix-Socket innerhalb der chroot-Umgebung von Postfix liegen, also unterhalb von /var/spool/postfix/. Andernfalls kann Postfix nicht auf den Socket zugreifen.
Eine ausführlichere Erklärung zu den Hintergründen finden Sie im Abschnitt über OpenDKIM weiter oben in dieser Dokumentation.
Erstellen Sie zunächst den Ordner /var/spool/postfix/opendmarc und vergeben Sie die entsprechenden Zugriffsrechte:
mkdir /var/spool/postfix/opendmarc
chown -R opendmarc:opendmarc /var/spool/postfix/opendmarc
chmod -R 750 /var/spool/postfix/opendmarc
Fügen Sie den Benutzer
postfix zur Gruppe opendmarc hinzu:
usermod -aG opendmarc postfix
OpenDMARC konfigurieren¶
Info
OpenDMARC wird in der Datei /etc/opendmarc.conf.
Wie auch OpenDKIM, läuft der Dienst als Unix-Domain-Socket.
Die Konfiguration ist recht überschaubar und nicht sehr kompliziert.
Auf die wichtigsten Parameter gehen wir ein:
RejectFailures
Der Parameter legt fest, dass eine eingehende E-Mail, entsprechend der veröffentlichten DMARC-Policy der Absender-Domain behandelt wird. Legt die Absender-Domain keine DMARC-Policy fest (p=none), wird die E-Mail auch dann angenommen, wenn SPF und/oder DKIM fehlschlugen.
Wird der Parameter auffalsegesetzt, werden keine Nachrichten abgewiesen. Allerdings macht DMARC dann auch wenig Sinn.
Ausführliche Informationen zur DMARC-Policy erhalten Sie später im Kapitel Bedeutung der DNS-Parameter.SoftwareHeader
Der Parameter fügt dem Header einer eingehenden E-Mail das Ergebnis der DMARC-Prüfung und die verwendete Version von OpenDMARC hinzu. Diese Information kann zu Diagnosezwecken hilfreich sein, sollte aber grundsätzlich deaktiviert werden, da wir keinerlei Infomationen über verwendete Software(-Versionen) preisgeben möchten. Der Parameter wird mitfalsedeaktiviert.DMARC-Filter: OpenDMARC Filter v1.4.2 mailserver.example.com 2345A5432 Authentication-Results: mailserver.example.com; dmarc=pass header.from=example.comFailureReports
Der Parameter legt fest, ob ein "Aggregated Report" versendet werden soll. MitFailureReportsSentBywird die verwendete Absender-Adresse definiert. Grundsätzlich ist das Versenden eines solchen Reports nicht notwendig, aber die Informationen über Nutzung bzw. Mißbrauch einer Domain sind wichtig. Ihre Gegenstellen werden es Ihnen danken.
Auch dieses Thema wird im weiteren Verlauf der Dokumentation unter DMARC-Reporting ausführlich behandelt.
Der Parameter kann auch deaktiviert werdenfalse.
Alle weiteren Konfigurations-Parameter finden Sie auf der Seite von OpenDMARC.
Benennen Sie zunächst die /etc/opendmarc.conf um, damit Sie eine Sicherheitskopie der Original-Datei haben:
mv /etc/opendmarc.conf /etc/opendmarc.conf.bak
Erstellen Sie eine neue Datei
/etc/opendmarc.conf mit folgendem Inhalt:
nano /etc/opendmarc.conf
AuthservID mailserver.example.com
TrustedAuthservIDs mailserver.example.com
UMask 0002
UserID opendmarc
AutoRestart true
Socket local:/var/spool/postfix/opendmarc/opendmarc.sock
RejectFailures true
IgnoreMailFrom example.com
IgnoreHosts /etc/opendmarc/ignore.hosts
PublicSuffixList /etc/opendmarc/public_suffix_list.dat
SoftwareHeader false
FailureReports true
FailureReportsSentBy [email protected]
#FailureReportsBcc
BaseDirectory /var/run/opendmarc
PidFile /var/run/opendmarc/opendmarc.pid
HistoryFile /var/run/opendmarc/opendmarc.dat
Syslog true
SyslogFacility mail
AuthservID mailserver.example.com
TrustedAuthservIDs mailserver.example.com
[...]
IgnoreMailFrom example.com
[...]
FailureReportsSentBy [email protected]
[...]
Ignore-Hosts definieren¶
Info
Wenn für bestimmte Mailserver keine DMARC-Prüfung gewünscht ist, können diese in der Datei /etc/opendmarc/ignore.hosts definiert werden. Die Datei kann Hostnamen, einzelne IP-Adressen und/oder ganze Adressräume (CIDR-Angaben) enthalten.
Der eigene Host (localhost) sollte immer ignoriert werden.
Erstellen Sie einen neuen Ordner /etc/opendmarc:
mkdir /etc/opendmarc
Erstellen Sie die Datei
/etc/opendmarc/ignore.hosts und definieren Sie die Hosts, für die kein DMARC-Test durchgeführt werden soll. Normalerweise gilt dies nur für localhost:
nano /etc/opendmarc/ignore.hosts
127.0.0.1
::1
localhost
Public Suffix Liste erstellen¶
Info
Die Public-Suffix-Liste enthält alle bekannten Domainendungen, unter denen eigene Domains registriert werden können. Hierzu zählen nicht nur Top-Level-Domains (z.B: *.de), sondern auch Domains auf zweiter oder dritter Ebende, wenn diese zur Registrierung von Domainnamen offenstehen (z.B. *.co.uk, *.myfritz.net). Die Liste wird von der Mozilla Foundation gepflegt und mehrmals pro Woche aktualisiert. Daher sollte regelmäßig die jeweils aktuelle Version heruntergeladen werden.
Ähnlich wie bei HTTP-Cookies verwendet DMARC diese Liste, um den Geltungsbereich für DMARC-Einträge einzuschränken, wenn die Absender-E-Mail-Adresse eine Sub-Domain enthält. Anhand der Liste kann die sogenannte "Organizational Domain" berechnet werden. (Siehe auch RFC 7489)
Wird z.B. sub.example.com als Mail-Domain verwendet, sucht DMARC in der Liste nach einer registrierbaren Domainendung und legt diese, zusammen mit der ersten weiteren Ebene, als "Organizational Domain" fest. Auf diese Art und Weise kann festgestellt werden, dass sub eine Sub-Domain von der "Organizational Domain" example.com ist.
Beispiel:
| E-Mail-Adresse | Eintrag in Public-Suffix-Liste | Organizational Domain |
|---|---|---|
| [email protected].de | // Confirmed by registry ([email protected]) de |
example.de |
| [email protected].co.uk | // Submitted by registry ([email protected]) co.uk |
example.co.uk |
| [email protected].myfritz.net | // Submitted by Andreas Weise ([email protected]) myfritz.net |
example.myfritz.net |
Laden Sie die Datei /etc/opendmarc/public_suffix_list.dat herunter:
wget --no-check-certificate -q -N -P /etc/opendmarc https://publicsuffix.org/list/public_suffix_list.dat
Setzen Sie die Zugriffsrechte:
chown -R opendmarc:opendmarc /etc/opendmarc
Cron-Job einrichten¶
Erstellen Sie die Datei /etc/cron.daily/opendmarc-download-tdl-suffix mit folgendem Inhalt:
nano /etc/cron.daily/opendmarc-download-tdl-suffix
#!/bin/sh
#
# ___________ .__.__ .__ .__ __
# \__ ___/_ _ _|__| | |__| ____ | |___/ |_
# | | \ \/ \/ / | | | |/ ___\| | \ __\
# | | \ /| | |_| / /_/ > Y \ |
# |____| \/\_/ |__|____/__\___ /|___| /__|
# /_____/ \/
#
# Twilight-Networks ∙ est. 2k1 ∙ fxp ∙ h4x ∙ nfo ∙ scene ∙ legacy lives
# Keep it lean, keep it silent. Code like it's 2002.
#
#########################################################################
# Script Name : opendmarc-download-tdl-suffix
# Description : Updates the Mozilla Public-Suffix-List
# Creates a Backup of the existing File
# Logs to SYSLOG
# Runs automatically by a Cron-Job
#
# Version : 1.01
# Last Update : 31.03.2025
# Author : Twilight
# Contact : [email protected]
# Web: : https://www.twilight-networks.com
#
# Tested with : Ubuntu 24.04 LTS
# OpenDMARC 1.4.2
#########################################################################
# Config
# OpenDmarc-Dir
DIR='/etc/opendmarc'
# Download-URL
URL='https://publicsuffix.org/list/public_suffix_list.dat'
# Below this line: scene code. You break it, you bought it.
#########################################################################
(
cd ${DIR}
# Download Suffix-List
wget --no-check-certificate ${URL} -q -N -O public_suffix_list.dat.new
case `cat public_suffix_list.dat.new` in
*"BEGIN ICANN DOMAINS"*)
:;;
*)
# Download failed
echo "opendmarc: error downloading public_suffix_list"
mv public_suffix_list.dat.new public_suffix_list.dat.err
exit 1
;;
esac
# Create Backup (if exists)
if [ -f public_suffix_list.dat ];
then
mv public_suffix_list.dat public_suffix_list.dat.bak
fi
# remove error-file (if exists)
if [ -f public_suffix_list.dat.err ];
then
rm public_suffix_list.dat.err
fi
mv public_suffix_list.dat.new public_suffix_list.dat
# Set permissions
chown opendmarc:opendmarc public_suffix_list.dat
echo "opendmarc: downloading public_suffix_list successful"
) 2>&1 | logger
exit 0
#end
Vergeben Sie die benötigte Berechtigung, damit die Datei ausgeführt werden kann:
chmod +x /etc/cron.daily/opendmarc-download-tdl-suffix
OpenDMARC-Milter in Postfix einrichten¶
Info
Genau wie OpenDKIM ist auch OpenDMARC ein Milter-Programm, da es E-Mails auswerten und verändern dürfen muss.
Die entsprechende Milter-Konfiguration in Postfix haben wir bereits im Abschnit OpenDKIM-Milter in Postfix einrichten durchgeführt und müssen jetzt nur noch den OpenDMARC-Milter hinzufügen.
Achten Sie dabei auf die Reihenfolge. Postfix arbeitet Milter der Reihe nach ab. Für unser Setup ist es wichtig, dass der OpenDMARC-Milter die letzte Instanz ist.
Fügen Sie der Datei /etc/postfix/main.cf folgendes hinzu:
[...]
smtpd_milters =
local:opendkim/opendkim.sock
local:opendmarc/opendmarc.sock
[...]
Starten Sie Postfix und OpenDMARC neu, damit die Konfiguration angewendet wird:
service postfix restart
service opendmarc restart
DNS-Eintrag für DMARC einrichten¶
Damit ein Empfänger Ihrer E-Mails weiss, wie er mit E-Mails umgehen soll, bei der die SPF- oder die DKIM-Auswertung fehlschlägt, muss diese Information, in Form eiDMARC-DNS-Eintrags, veröffentlicht werd Erstellen Sie auf dem DNS-Server, der für Ihre Mail-Domain zuständig ist, einen DNS-TXT-Eintrag nach folgendem Syntax:
Hostnamehier geben Sie_dmarcan.Typhier geben Sie den Typ des DNS-Eintrags an. In unserem Fall muss es ein TXT-Eintrag seinTexthier geben Sie die DMARC-Informationen, gemäß dem folgenden Beispiel
| Hostname | Typ | Ziel | Text |
|---|---|---|---|
| _dmarc.example.com | TXT | v=DMARC1; p=reject; sp=reject; adkim=r; aspf=r; pct=100; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1; |
Bedeutung der DNS-Parameter¶
| Parameter | Bedeutung |
|---|---|
v= |
Version (Aktuell ist Version 1 gültig) Mögliche Werte: DMARC1 |
p= |
Policy – Hier wird definiert, wie der Empfänger mit E-Mails umgehen soll, bei der die SPF- und/oder DKIM-Auswertung fehlgeschlagen ist. Mögliche Werte: none: E-Mail trotzdem annehmen quarantine: E-Mail annehmen, aber in Quarantäne legen reject: E-Mail verwerfen (empfohlen) |
sp= |
Subdomain-Policy – Gilt wie p=, aber für Subdomains.Mögliche Werte: none quarantine reject |
adkim= |
Auswertung DKIM – Wie streng DKIM bewertet wird. Mögliche Werte: s (strict): Domain muss exakt übereinstimmen (z. B. nur [email protected]) r (relaxed): Subdomains erlaubt (z. B. auch [email protected]) |
aspf= |
Auswertung SPF – Wie streng SPF bewertet wird. Mögliche Werte: s (strict): Domain muss exakt übereinstimmen r (relaxed): Subdomains erlaubt |
pct= |
Prozentualer Anteil der betroffenen Mails. Mögliche Werte: 1–100: Bei korrekter Konfiguration sollte hier 100 stehen. |
rua= |
Aggregated Report – Zieladresse für aggregierte Berichte (i.d.R. alle 24h). Beispiel: mailto:[email protected] |
ruf= |
Forensic Report – Zieladresse für forensische Berichte (i.d.R. bei Verstoß). Gibt Details über Absender, die gefälschte Mails senden wollten. ⚠ DSGVO beachten! Gutachten zur Vereinbarkeit mit DSGVO |
fo= |
Optionen für Forensic Reports (optional). Mögliche Werte: 0: nur wenn SPF und DKIM fehlschlagen 1: wenn SPF oder DKIM oder beides fehlschlägt (empfohlen) d: nur wenn DKIM fehlschlägt s: nur wenn SPF fehlschlägt |
DMARC und Sub-Domains¶
Info
Wie funktioniert die Suche nach DMARC-Einträgen?
Die Suche nach dem passenden DMARC-Eintrag basiert auf der Domäne, die in der Absender-E-Mail-Adresse gefunden wird. Es werden maximal zwei DNS-Anfragen gestellt. Wenn die Absender-E-Mail-Adresse eine Sub-Domain enthält, gilt der, für die übergeordnete Domäne eingerichtete DMARC-Eintrag nur dann, wenn die übergeordnete Domäne die Organizational Domain ist UND wenn für die Sub-Domain kein DMARC-Eintrag definiert wurde. DMARC-Einträge, die für weitere Sub-Domains existieren, werden ignoriert.
Beispiel:
| E-Mail Adresse | Organizational Domain | DMARC-Eintrag |
|---|---|---|
| [email protected] | example.com | _dmarc.example.com |
In diesem Fall ist die Suche beim ersten Durchgang abgeschlossen, da die enthaltene Mail-Domain der E-Mail-Adresse mit der Organizational Domain übereinstimmt.
| E-Mail Adresse | Organizational Domain | DMARC-Eintrag |
|---|---|---|
| [email protected] | example.com | _dmarc.sub.example.com |
Auch in diesem Fall ist die Suche beim ersten Durchgang abgeschlossen, da ein DMARC-Eintrag für die Sub-Domain existiert und die übergeordnete Domain example.com mit der Organizational Domain übereinstimmt.
| E-Mail Adresse | Organizational Domain | DMARC-Eintrag |
|---|---|---|
| [email protected] | example.com | _dmarc.example.com |
NUR wenn für die Mail-Domain sub.example.com kein DMARC-Eintrag _dmarc.sub.example.com existiert, wird eine zweite Suche auf die Organizational Domain durchgeführt.
| E-Mail Adresse | Organizational Domain | DMARC-Eintrag |
|---|---|---|
| [email protected] | example.com | _dmarc.example.com |
| [email protected] | example.com | _dmarc.sub1.maildomain.de |
Dieser Fall ist sehr speziell und kommt nur selten vor.
Hier ist zwar sub2 eine Sub-Domain von der übergeordneten Domain sub1.example.com aber diese stimmt NICHT mit der Organizational Domain überein. Selbst wenn ein DMARC-Eintrag für sub1.example.com existiert, gilt er nicht für diese E-Mail-Adresse!
DNS-Eintrag für DMARC prüfen¶
Prüfen Sie, ob der DNS-TXT-Eintrag bereits aktiv ist. Je nach Hoster bzw. DNS-Server kann es mehrere Stunden dauern, bis DNS-Änderungen verfügbar sind. Verwenden Sie hierzu folgendes Kommando:
host -t txt _dmarc.example.com
Wenn Sie folgende Ausgabe erhalten, ist Ihr DNS-TXT-Eintrag aktiv:
host -t txt _dmarc.example.com
_dmarc.example.com descriptive text "v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s; pct=100;
rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1;"
Wenn Sie folgende Ausgabe erhalten, ist Ihr DNS-TXT-Eintrag noch nicht aktiv:
host -t txt _dmarc.example.com
Host _dmarc.example.com not found: 3(NXDOMAIN)
DMARC-Reporting¶
Was ist das?¶
Info
Wie im Abschnitt DNS-Eintrag für DMARC einrichten beschrieben, kann über die DMARC-Richtlinie ein aggregierter und/oder ein forensischer Report vom empfangenden Mailserver angefordert werden.
Der aggregierte Report enthält Informationen zur Nutzung der Mail-Domain. Er gibt Auskunft darüber, welche Mailserver E-Mails über die Mail-Domain versendet haben.
Beispiel:
| From: Domain | IP-Adresse | PTR | E-Mail Anzahl | DMARC-Policy | Grund | SPF (Ergebnis) | DKIM (Ergebnis) | Reporter |
|---|---|---|---|---|---|---|---|---|
| example.com | 88.88.88.88 | mailserver.example.com | 5 | none | none | pass | pass | example.com |
| example.com | 99.99.99.99 | spam.host.de | 2 | reject | spf/dkim fail | fail | none | example.com |
Dieser Report sagt aus, dass insgesamt 7 Nachrichten mit der Domain example.com an die Domain example.com versendet wurden.
Legitim waren aber nur 5 dieser E-Mails. Nämlich die, die tatsächlich von dem Mailserver mailserver.example.com versendet wurden. Ein weitere Mailserver spam.host.de hat 2 E-Mails mit der Domain example.com versendet.
Allerdings schlug sowohl die SPF-Prüfung, als auch die DKIM-Prüfung fehl, da dieser Mailserver nicht als authorisierter Mailserver im SPF-Eintrag hinterlegt ist und keine (gültige) DKIM-Signatur gefunden werden konnte.
Der forensische Report geht deutlich weiter in die Tiefe. Er gibt inhaltliche Auskunft über die E-Mail, die fehlerhaft oder mißbräuchlich versendet wurde.
Beispiel:
| From | To | Sender-IP | Return-Path | AuthservID | Subject | SPF (Ergebnis) | DKIM (Ergebnis) | Datum |
|---|---|---|---|---|---|---|---|---|
| [email protected] | [email protected] | 192.168.0.1 | [email protected] | spammail.de | Sie haben gewonnen!! | fail | none | 01.01.1970 |
DMARC-Reporting und Datenschutz¶
Info
Der forensische Report ist, zumindest nach deutschem Recht, datenschutztechnisch bedenklich, da er personenbezogene Daten des Absenders und des Empfängers enthalten kann.
Als Firma sollten Sie daher auf das Reporting der forensischen Daten verzichten, da Sie ansonsten Gefahr laufen, gegen die DSGVO zu verstossen. Sie würden, ohne Zustimmung, personenbezogene Daten an Dritte (den Domain-Inhaber) weitergeben.
Zwar können durch Redacting (Schwärzen) die erfassten sensiblen Daten im forensischen Report unkenntlich gemacht werden, dies ist aber mit einem zusätzlichen Aufwand verbunden.
(Siehe auch Gutachten DMARC und DSGVO)
In dieser Dokumentation wird nur der aggregierte Report behandelt, da das Versenden forensischer Reports von OpenDMARC nicht unterstützt wird.
Aggregated Reports versenden¶
Info
Damit unser Mailserver ebenfalls Report-Anforderungen der Gegenstellen bedienen kann, muss zunächst der Inhalt der Datei, in der OpenDMARC die Informationen über den E-Mail-Verkehr speichert, regelmäßig in eine Datenbank überführt werden. Dieser Import und das anschließende Versenden des aggregierten Reports wird über einen Cron-Job durchgeführt. Der Cron-Job sorgt auch dafür, dass unsere Datenbank nicht überläuft und löscht automatisch Einträge, die älter als 90 Tage sind.
Das Versenden des aggregierten Reports ist optional und für die eigentliche Funktion von DMARC nicht erforderlich. Es ist aber empfohlen, da die Daten zur Nutzung bzw. zum Mißbrauch einer Mail-Domain für den Domain-Inhaber hilfreich sind.
Forensische Reporte werden aktuell nicht von OpenDMARC unterstützt!
MySQL-Datenbank einrichten¶
Stellen Sie eine Verbindung zum MySQL-Server her:
mysql -u root -p
Erstellen Sie eine Datenbank
opendmarc und einen Benutzer opendmarc. Räumen Sie dem Benutzer die benötigten Rechte ein.Ersetzen Sie
SicheresPasswortVerwenden! durch ein eigenes Passwort.
CREATE DATABASE opendmarc;
CREATE USER 'opendmarc'@'localhost' IDENTIFIED BY 'StarkesPasswortVerwenden';
GRANT ALL PRIVILEGES ON opendmarc.* TO 'opendmarc'@'localhost' IDENTIFIED BY 'StarkesPasswortVerwenden';
FLUSH PRIVILEGES;
QUIT;
Importieren Sie das OpenDMARC-MySQL-Schema in die Datenbank
opendmarc:
mysql -u root -p opendmarc < /usr/share/doc/opendmarc/schema.mysql
Cron-Job einrichten¶
Erstellen Sie die Datei/etc/cron.hourly/opendmarc-reporting mit folgendem Inhalt:
nano /etc/cron.hourly/opendmarc-reporting
#!/bin/sh
#
# ___________ .__.__ .__ .__ __
# \__ ___/_ _ _|__| | |__| ____ | |___/ |_
# | | \ \/ \/ / | | | |/ ___\| | \ __\
# | | \ /| | |_| / /_/ > Y \ |
# |____| \/\_/ |__|____/__\___ /|___| /__|
# /_____/ \/
#
# Twilight-Networks ∙ est. 2k1 ∙ fxp ∙ h4x ∙ nfo ∙ scene ∙ legacy lives
# Keep it lean, keep it silent. Code like it's 2002.
#
#########################################################################
# Script Name : opendmarc-reporting
# Description : Imports data from OpenDMARC's opendmarc.dat file into
# a MySQL Database and sends DMARC failure reports to
# domain owners.
# -based on a script from Hamzah Khan
#
# Version : 1.01
# Last Update : 05.04.2025
# Author : Twilight
# Contact : [email protected]
# Web: : https://www.twilight-networks.com
#
# Tested with : Ubuntu 24.04 LTS
# OpenDmarc 1.4.2
#########################################################################
set -e
# Config
# Database Connection
DBHOST='localhost'
DBUSER='opendmarc'
DBPASS='StarkesPasswortVerwenden'
DBNAME='opendmarc'
# History-File
HISTDIR='/var/run/opendmarc'
HISTFILE='opendmarc'
# Report-Settings
REPORT_INTERVAL='86400'
REPORT_SENDER='[email protected]'
REPORT_ORG='example.com'
REPORT_EXPIRE='90'
# Below this line: scene code. You break it, you bought it.
#########################################################################
# Check history file exists
touch ${HISTDIR}/${HISTFILE}.dat
# Move history file to Temp-Dir for processing
mv ${HISTDIR}/${HISTFILE}.dat /tmp/${HISTFILE}.$$
# Import Temp history file data to MySQL DB and send reports
/usr/sbin/opendmarc-import -dbhost=${DBHOST} -dbuser=${DBUSER} -dbpasswd=${DBPASS} -dbname=${DBNAME} < /tmp/${HISTFILE}.$$
/usr/sbin/opendmarc-reports -dbhost=${DBHOST} -dbuser=${DBUSER} -dbpasswd=${DBPASS} -dbname=${DBNAME} --interval=$REPORT_INTERVAL --report-email=$REPORT_SENDER --report-org=$REPORT_ORG
/usr/sbin/opendmarc-expire -dbhost=${DBHOST} -dbuser=${DBUSER} -dbpasswd=${DBPASS} -dbname=${DBNAME} --expire=$REPORT_EXPIRE
# Delete temp history file
rm -rf *.$$
#end
# opendmarc-reporting
[...]
DBPASS='StarkesPasswortVerwenden'
[...]
REPORT_SENDER='[email protected]'
REPORT_ORG='example.com'
[...]
Vergeben Sie die benötigte Berechtigung, damit die Datei ausgeführt werden kann:
chmod +x /etc/cron.hourly/opendmarc-reporting
Reports empfangen¶
DMARC-Reports werden normalerweise alle 24 Studen an die, in Ihrem DMARC-Eintrag hinterlegten, E-Mail Adressen versendet (rua= / ruf =).
Der Report wird im XML-Format bereitgestellt und ist daher nur sehr umständlich auszuwerten.
Allerdings gibt es zahlreiche, zum Teil kostenlose, Anbieter, die die Auswertung der Reports übernehmen und grafisch darstellen. In Ihrem DMARC-Eintrag muss dann die E-Mail Adresse entsprechenden Anbieters hinterlegt werden. Diese E-Mail Adresse wird automatisch geniert, sobald Sie bei dem entsprechenden Anbieter ein Konto angelegt haben.
Folgende Anbieter kann ich empfehlen:
Beispiel dmarcian:
Inbetriebnahme und Test¶
Dienste neustarten¶
Starten Sie die neuen Dienste neu und kontrollieren Sie, ob die Dienste ohne Fehlermedlungen starten:
service postfix restart
service postfix status
[...]
service opendkim restart
service opendkim status
[...]
service opendmarc restart
service opendmarc status
[...]
Test-E-Mail empfangen¶
Verwenden Sie das Kommando tail um den E-Mail-Empfang in Echtzeit zu testen:
tail -f /var/log/syslog
Senden Sie eine E-Mail in Richtung Ihres Mailservers (von extern)
Die Ausgabe sollte in etwa so aussehen:
[...]
Jan 01 12:00:01 mailserver policyd-spf[23322]: Pass; identity=mailfrom; ...
[...]
Jan 01 12:00:01 mailserver opendkim[978]: 52C5FA0288: sender.example.com [192.168.0.1] not internal
Jan 01 12:00:01 mailserver opendkim[978]: 52C5FA0288: not authenticated
Jan 01 12:00:02 mailserver opendkim[978]: 52C5FA0288: DKIM verification successful
Jan 01 12:00:02 mailserver opendkim[978]: 52C5FA0288: s=20161025 d=example.com SSL
[...]
Jan 01 12:00:02 mailserver opendmarc[15484]: implicit authentication service: mailserver.example.com
Jan 01 12:00:03 mailserver opendmarc[15484]: 52C5FA0288: example.com pass
[...]
Test-E-Mail versenden¶
Info
Auf der Seite Mail-Tester.com können Sie Ihren Mailserver bewerten lassen. Die Seite sieht zwar auf den ersten Blick etwas verspielt aus, erfüllt aber absolut Ihren Zweck.
Senden Sie eine E-Mail an die, auf der Seite angegebene, E-Mail Adresse und prüfen Sie das Ergebnis. Wenn alles korrekt ist, sollten Sie folgende Bewertung erhalten:
Verwenden Sie das Kommando tail um den E-Mail-Empfang in Echtzeit zu testen:
tail -f /var/log/syslog
Versenden Sie eine E-Mail zu einem externen Empfänger
Die Ausgabe sollte in etwa so aussehen:
[...]
Feb 11 10:11:41 mailserver opendkim[978]: C07F8A0050: DKIM-Signature field added (s=20210509, d=example.com)
[...]
Feb 11 10:11:41 mailserver opendmarc[15484]: implicit authentication service: mailserver.example.com
Feb 11 10:11:41 mailserver opendmarc[15484]: C07F8A0050: ignoring mail from example.com
[...]
Abschluss¶
Wenn alle Tests erfolgreich verliefen, können Sie Ihren Mailserver ab sofort mit SPF, DKIM und DMARC nutzen.


