Ubuntu 16.04 - SPF, DKIM und DMARC in Postfix einrichten

Aus Twilight-Networks Wiki
Wechseln zu:Navigation, Suche


Outdated.png


Diese Dokumentation ist nicht mehr aktuell und wurde ersetzt.

Verwenden Sie die Dokumentation nur noch bei gerechtfertigten Anwendungsfällen.

Neue Version: Ubuntu 20.04 - SPF, DKIM und DMARC in Postfix einrichten




Vorwort

Diese Dokumentation beschreibt den Installationsvorgang von SPF, DKIM und DMARC zur Erweiterung von Postfix.

Bitte vergewissern Sie sich, dass Ihr System über die nötigen Voraussetzungen verfügt, wie in der Infobox beschrieben. Weiterhin 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.


Ubuntu 16.04 - SPF, DKIM und DMARC in Postfix einrichten
Stand: 05/2021



Verwendete Software:


Voraussetzungen:


Weitere, empfohlene Dokumentationen:




Was soll erreicht werden?

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.


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 201901 Geben Sie eine Zeichenkette an, mit der das DKIM-Schlüsselpaar identifiziert werden kann.
Es ist sinnvoll, das Erstellungsjahr und den Monat zu verwenden. So kann das Erstellungsdatum
des Schlüsselpaares nachvollzogen werden. '201901' steht also für '2019 Januar '.
DMARC:
E-Mail-Adresse

(Absender)

no-reply.dmarc.reports@example.com Ersetzen Sie diesen Wert durch eine E-Mail-Adresse, die als Absender für DMARC-Berichte verwendet werden soll.
E-Mail-Adresse

(Empfänger)

dmarc@example.com 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
url		= www.twlnet.com
content	= Dokumentationen

domain	= example.com
owner	= root
Anzupassende Parameter:
# beispiel.conf
[...]
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
# beispiel.map
benutzer1@example.com
benutzer2@example.com
benutzer3@example.com










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

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

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:private/policy-spf ein:

main.cf
[...]
smtpd_recipient_restrictions =
     [...]
     check_policy_service unix:private/policy-spf
     [...]
[...]
Wichtig!

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

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 sind (-all).

Hostname Typ Priorität Ziel Text
example.com TXT v=spf1 ipv4: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 ipv4: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.
ipv6: 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 sendenden Mailservers enthält.
ptr[:] der Host-A/AAAA (oder der Angegebene) Record eines Reverse-DNS-Lookups der überprüften Domain die IP-Adresse des sendenden Mailservers 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

DKIM konfigurieren

OpenDKIM wird in der Datei /etc/opendkim.conf konfiguriert.
In unserem Setup wartet der Dienst als Inet-Socket auf dem TCP/IP-Port 8891 auf eingehende Verbindungen.

Hinweis:
Unter Ubuntu (und Debian) wird auch die Datei /etc/default/opendkim ausgewertet. Einstellungen in dieser Datei haben Vorrang gegenüber der /etc/opendkim.conf.
Setzen Sie daher in dieser Datei nur den Inet-Socket und konfigurieren Sie alles Weitere in der opendkim.conf.


/etc/default/opendkim

Kommentieren Sie in der Datei /etc/default/opendkim die Zeile SOCKET="local:/var/run/opendkim/opendkim.sock" aus und die Zeile SOCKET="inet:8891@localhost" ein:

# nano /etc/default/opendkim
opendkim
[...]
#SOCKET="local:/var/run/opendkim/opendkim.sock"
[...]
SOCKET="inet:8891@localhost"
[...]



/etc/opendkim.conf

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

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

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

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 anschliessend 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 201901 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. '201901' steht also für 'Januar 2019'. (-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 201901


Benennen Sie die Dateien, entsprechend Ihrer Mail-Domain um und verschieben Sie diese in den Ordner /etc/opendkim/keys:

# mv 201901.private keys/example.com.private
# mv 201901.txt     keys/example.com.txt


Passen Sie die Berechtigungen an:

# chmod -R 700 /etc/opendkim/keys



Schlüssel einer Domain zuweisen

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 die 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:201901:/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 prüfen

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. 201901)
  • -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 201901 -vvv
	opendkim-testkey: using default configfile /etc/opendkim.conf
	opendkim-testkey: checking key '201901._domainkey.example.com'
	opendkim-testkey: key not secure
	opendkim-testkey: key OK



OpenDKIM-Milter in Postfix einrichten

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, Inet-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 =
	inet:127.0.0.1:8891

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-Eintrag nach 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/keys/example.com.txt. (p=MIIBIjANB........)


Hostname Typ Priorität Ziel Text
201901._domainkey.example.com TXT v=DKIM1;

k=rsa;
p=MIIBIjANBgkqhkiG9w0BAQEjbAc[...]twv2j7gJj46Dhtp1Lk3wIDAQAB


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
201901._domainkey	IN	TXT	( "v=DKIM1; k=rsa; s=email; "
	"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCA[...]qxNhoHkVBlgywUlK5D51a9lhhSG"
	"1B1mnNcsmfgoP177XqAsWsRdu2zVuwe[...]lLPYmg3qe9bpZxtwWZHtwIDAQAB" )  
	; ----- DKIM key 201901 for ihredomain.de
# Nachher
p=MIIBIjANBgkqhkiG9w0BAQEFAAOCA[...]HkVBlgywUlK5D51a9lhhSG1B1mnNcsmfgoP177XqAsWsRdu2zVu[...]lLPYmg3qe9bpZxtwWZHtwIDAQAB



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 201901._domainkey.example.com._domainkey


Wenn Sie folgende Ausgabe erhalten, ist Ihr DNS-TXT-Eintrag aktiv:

# host -t txt 201901._domainkey.example.com._domainkey
	201901._domainkey.example.com descriptive text "v=DKIM1; k=rsa;\013\010p=MIIBIjANBgkqhkiG9w0BAQEFAA
	OCA.......qxNhoHkVBlgywUlK5D51a9lhhSG1B1mnNcsmfgoP177XqAsWsRdu2zVuwe.......lLPYmg3qe9bpZxtwWZHtwIDAQA"


Wenn Sie folgende Ausgabe erhalten, ist Ihr DNS-TXT-Eintrag noch nicht aktiv:

# host -t txt 201901._domainkey.example.com._domainkey
	Host 201901._domainkey.example.com not found: 3(NXDOMAIN)



DMARC in Postfix implementieren

OpenDMARC konfigurieren

OpenDMARC wird in der Datei /etc/opendmarc.conf.

Wie auch OpenDKIM, läuft der Dienst als Inet-Socket. Er wartet auf dem TCP/IP-Port 8893 auf eingehende Verbindungen.
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.3.1 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 Aggregate Reporting einrichten 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 					postfix
AutoRestart 			true
Socket 					inet:8893@127.0.0.1

RejectFailures 			true
IgnoreMailFrom	 		example.com
IgnoreHosts 			/etc/opendmarc/ignore.hosts
PublicSuffixList 		/etc/opendmarc/public_suffix_list.dat
SoftwareHeader	 		false

FailureReports			true
FailureReportsSentBy	no-reply.dmarc.reports@example.com
#FailureReportsBcc

BaseDirectory 			/var/run/opendmarc
PidFile 				/var/run/opendmarc/opendmarc.pid
HistoryFile 			/var/run/opendmarc/opendmarc.dat

Syslog 					true
SyslogFacility 			mail


Anzupassende Parameter:
# opendmarc.conf
AuthservID				mailserver.example.com
TrustedAuthservIDs		mailserver.example.com
[...]
IgnoreMailFrom			example.com	 
[...]
FailureReportsSentBy	no-reply.dmarc.reports@example.com
[...]



Ignore-Hosts definieren

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

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
beispiel@sub.example.de // Confirmed by registry <ops@denic.de>

de

example.de
beispiel@sub.example.co.uk // Submitted by registry <Michael.Daly@nominet.org.uk>

co.uk

example.co.uk
beispiel@sub.example.myfritz.net // Submitted by Andreas Weise <a.weise@avm.de>

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/bash
#
#########################################################################
# 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.                     #
# Args          :                                                       #
#                                                                       #
# Version       : 1.00                                                  #
# Last Update   : 07.02.2019                                            #
# Author        : Twilight                                              #
# Email         : twilight@twlnet.com                                   #
# Web:          : https://www.twilight-networks.com                     #
#########################################################################
# Tested with   : Ubuntu 16.04 LTS                                      #
#                 OpenDMARC 1.3.1                                       #
#########################################################################

# OpenDmarc-Dir
DIR='/etc/opendmarc'

# Download-URL
URL='https://publicsuffix.org/list/public_suffix_list.dat'



# Normaly there is no need to change anything below this comment line!
#########################################################################
(
	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 755 /etc/cron.daily/opendmarc-download-tdl-suffix



OpenDMARC-Milter in Postfix einrichten

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 =
        inet:127.0.0.1:8891
        inet:127.0.0.1:8893
[...]


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 eines DMARC-DNS-Eintrags, veröffentlicht werden.

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


Hostname Typ Priorität Ziel Text
_dmarc.example.com TXT v=DMARC1;

p=reject;

sp=reject;

adkim=s;

aspf=s;

pct=100;

rua=mailto:dmarc@example.com;

ruf=mailto:dmarc@example.com;

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 gibt an, dass der Empfänger die E-Mail trotzdem annehmen soll.
  • quarantine gibt an, dass der Empfänger die E-Mails zwar annehmen, aber in Quarantäne legen soll.
  • reject gibt an, dass der Empfänger die E-Mails verwerfen soll. (Empfohlen!)


sp= Subdomain-Policy

Hier wird definiert, wie der Empfänger mit E-Mails umgehen soll, bei der die SPF- und/oder DKIM-Überprüfung fehlgeschlagen ist.


Mögliche Werte:

  • none gibt an, dass der Empfänger die E-Mail trotzdem annehmen soll.
  • quarantine gibt an, dass der Empfänger die E-Mails zwar annehmen, aber in Quarantäne legen soll.
  • reject gibt an, dass der Empfänger die E-Mails verwerfen soll. (Empfohlen!)
adkim= Auswertung DKIM

Hier wird definiert, wie streng die DKIM-Auswertung ausfallen soll.


Mögliche Werte:

  • s (strict) gibt an, dass die Mail-Domain exakt übereinstimmen muss. Beispiel: Nur info@example.com ist gültig.
  • r (relaxed) gibt an, dass die Mail-Domain auch eine Sub-Domain sein kann. Beispiel: Auch info@sub.example.com ist gültig.
aspf= Auswertung SPF

Hier wird definiert, wie streng die SPF-Auswertung ausfallen soll.


Mögliche Werte:

  • s (strict) gibt an, dass die Mail-Domain exakt übereinstimmen muss. Beispiel: Nur info@example.com ist gültig.
  • r (relaxed) gibt an, dass die Mail-Domain auch eine Sub-Domain sein kann. Beispiel: Auch info@sub.example.com ist gültig.
pct= Percent

Hier wird definiert, wie hoch der prozentuale Anteil der zu filternden E-Mails sein soll.


Mögliche Werte:

  • "1-100" Bei korrekt konfiguriertem SPF und DKIM sollte hier der Wert "100" angegeben werden.
rua= Aggregated Report

Hier wird definiert, wohin der Empfänger den aggregierten Report versenden soll (i.d.R. einmal in 24 Stunden)


Mögliche Werte:

  • "E-Mail-Adresse"
ruf= Forensic Report

Hier wird definiert, wohin der Empfänger den forensischen Report versenden soll (i.d.R. einmal in 24 Stunden)

Der forensische Report gibt Auskunft darüber, welche Absender versucht haben, E-Mails im Namen Ihrer Mail-Domain zu versenden.

(Beachten Sie hier die DSGVO! Gutachten zur Vereinbarkeit von DMARC mit der EU-DSGVO)


Mögliche Werte:

  • "E-Mail-Adresse"
fo= Forensic Report Optionen (optional)

Hier wird definiert, welche Informationen bezüglich SPF- und/oder DKIM-Fehler angefordert werden.


Mögliche Werte:

  • 0 gibt an, dass der forensische Report für den Fall angefordert wird, dass entweder die SPF UND die DKIM-Prüfung fehlschlägt.
  • 1 gibt an, dass der forensische Report für den Fall angefordert wird, dass entweder die SPF ODER die DKIM-Prüfung ODER Beides fehlschlägt. (Empfohlen!)
  • d gibt an, dass der forensische Report für den Fall angefordert wird, dass NUR die DKIM-Prüfung fehlschlägt.
  • s gibt an, dass der forensische Report für den Fall angefordert wird, dass NUR die SPF-Prüfung fehlschlägt.



DMARC und Sub-Domains

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
beispiel@example.com 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
beispiel@sub.example.com 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
beispiel@sub.example.com 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
beispiel@sub2.sub1.example.com example.com _dmarc.example.com
beispiel@sub2.sub1.example.com 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:dmarc@example.com; ruf=mailto:dmarc@example.com; 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?

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
spam@spam.host.de user@example.com 192.168.0.1 spam@spam.host.de spammail.de Sie haben gewonnen!! fail none 01.01.1970



DMARC-Reporting und Datenschutz

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

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 anschliessende 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/bash
#
#########################################################################
# 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                   #
# Args          :                                                       #
#                                                                       #
# Version       : 1.00                                                  #
# Last Update   : 05.02.2019                                            #
# Author        : Twilight                                              #
# Email         : twilight@twlnet.com                                   #
# Web:          : https://www.twilight-networks.com                     #
#########################################################################
# Tested with   : Ubuntu 16.04 LTS                                      #
#                 OpenDmarc 1.3.1                                       #
#########################################################################

set -e

# 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='no-reply.dmarc.reports@example.com'
REPORT_ORG='example.com'
REPORT_EXPIRE='90'



# Normaly there is no need to change anything below this comment line!
#########################################################################

# 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='no-reply.dmarc.reports@example.com'
REPORT_ORG='example.com'
[...]


Vergeben Sie die benötigte Berechtigung, damit die Datei ausgeführt werden kann:

# chmod 755 /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 des 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.png



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

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


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=201901, 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.