Zum Inhalt

SPF, DKIM und DMARC in Postfix einrichten

Stand: 11/2025
Postfix-logo
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:


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:


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:


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
beispiel.conf
content = Dokumentationen
domain  = example.com
owner   = root
Anzupassende Parameter:
[...]
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



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
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:

master.cf
[...]
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:
main.cf
[...]
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:

main.cf
#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 sein
  • Text – 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
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
ignore.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:

opendkim.conf
[...]
SignatureAlgorithm      rsa-sha256
[...]

Das Schlüsselpaar wird mit dem Tool opendkim-genkey anhand der folgenden Parametrisierung generiert:

  • -d example.com Die Mail-Domain, für die der Schlüssel gelten soll. (-d = Domain)
  • -b 2048 Die 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)
  • -r Der Schlüssel darf nur zum Signieren von E-Mails verwendet werden. (-r = restricted)
  • -s 20210509 Die 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 Datei example.com.txt und der geheime Schlüssel in der Datei example.com.private hinterlegt.


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:

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
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
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:

main.cf
[...]
#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:

  • Hostname hier geben Sie die Zeichenfolge (selector) gefolgt von ._domainkey. und Ihrer Mail-Domain an
  • Typ hier geben Sie den Typ des DNS-Eintrags an. In unserem Fall muss es ein TXT-Eintrag sein
  • Text hier geben Sie die verwendete DKIM-Version und das Hashverfahren an v=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 auf false gesetzt, 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 mit false deaktiviert.
    DMARC-Filter: OpenDMARC Filter v1.4.2 mailserver.example.com 2345A5432
    Authentication-Results: mailserver.example.com; dmarc=pass header.from=example.com
    

  • FailureReports
    Der Parameter legt fest, ob ein "Aggregated Report" versendet werden soll. Mit FailureReportsSentBy wird 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 werden false.

    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
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

Anzupassende Parameter:
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
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
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:

main.cf
[...]
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:

  • Hostname hier geben Sie _dmarc an.
  • Typ hier geben Sie den Typ des DNS-Eintrags an. In unserem Fall muss es ein TXT-Eintrag sein
  • Text hier 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
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
Anzupassende Parameter:
# 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:

Dmarcian_webinterface


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:

Mail_test_com_example


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.