Zum Inhalt

OpenDMARC

Inhalt

  • OpenDMARC 1.4.2
  • DMARC-Milter für Postfix
  • SPF-Unterstützung über libspf2
  • FailureReports
  • IgnoreHosts und PublicSuffixList

Einleitung

Dieses HowTo beschreibt die Installation und Konfiguration von OpenDMARC auf FreeBSD 15+.

OpenDMARC wird in diesem Setup als Milter für Postfix verwendet. Der aktuelle FreeBSD-Port mail/opendmarc steht bei 1.4.2, installiert ein rc.d-Skript opendmarc und liefert die Beispielkonfiguration etc/mail/opendmarc.conf.sample mit. OpenDMARC ist ein DMARC-Filter für milter-fähige MTAs und verarbeitet eingehende Nachrichten anhand von DMARC, DKIM- und SPF-Ergebnissen.

Wichtig ist dabei: OpenDMARC gehört im Mailfluss hinter Filter, die DKIM- und SPF-Ergebnisse bereitstellen. Die Upstream-Dokumentation nennt das für Postfix ausdrücklich so. Wenn du Unix-Sockets statt TCP verwendest, muss der Socket für den Postfix-Prozess sichtbar sein.


Voraussetzungen

Zu den Voraussetzungen für dieses HowTo siehe bitte: Hosting System

Zusätzlich gilt für dieses HowTo:

  • Postfix ist bereits installiert und für Milter vorbereitet.
  • OpenDKIM und SPF-Prüfung sind bereits eingerichtet oder werden an anderer Stelle im Mailfluss bereitgestellt.
  • Für Unix-Sockets muss der Socket-Pfad für Postfix erreichbar sein.
  • Für dieses HowTo wird example.com als Beispiel verwendet und muss entsprechend ersetzt werden.

Vorbereitungen

DNS Records

Für dieses HowTo sind keine zusätzlichen DNS-Records zwingend erforderlich.

Wenn du für deine eigene Domain zusätzlich eine DMARC-Policy veröffentlichen willst, geschieht das separat über einen TXT-Record unter _dmarc.example.com. Dieses HowTo richtet aber zunächst nur den Prüfdienst auf dem empfangenden Server ein.

Gruppen / Benutzer / Passwörter

Für dieses HowTo müssen keine zusätzlichen Systemgruppen, Systembenutzer oder Passwörter angelegt werden.

Bash
pw groupshow opendmarc >/dev/null 2>&1 || pw groupadd -n opendmarc -g 5119
id -u opendmarc >/dev/null 2>&1 || \
  pw useradd -n opendmarc -u 5119 -i 5119 -g opendkim -c 'OpenDMARC User' -d /nonexistent -s /usr/sbin/nologin -w no
pw groupmod opendmarc -m postfix

Das FreeBSD-rc-Skript verwendet standardmäßig den Benutzer und die Gruppe mailnull. (GitHub)

Verzeichnisse / Dateien

Für diese HowTos müssen zuvor folgende Verzeichnisse angelegt werden, sofern sie noch nicht existieren, oder entsprechend geändert werden, sofern sie bereits existieren.

Bash
mkdir /var/spool/postfix/opendmarc
chown opendmarc:opendmarc /var/spool/postfix/opendmarc
chmod 770 /var/spool/postfix/opendmarc

Für diese HowTos müssen zuvor folgende Dateien angelegt werden, sofern sie noch nicht existieren, oder entsprechend geändert werden, sofern sie bereits existieren.

Bash


Installation

Wir installieren mail/opendmarc und dessen Abhängigkeiten.

Bash
mkdir -p /var/db/ports/databases_p5-DBI
cat <<'EOF' > /var/db/ports/databases_p5-DBI/options
_OPTIONS_READ=p5-DBI-1.647
_FILE_COMPLETE_OPTIONS_LIST=PROXY
OPTIONS_FILE_SET+=PROXY

EOF

mkdir -p /var/db/ports/mail_opendmarc
cat <<'EOF' > /var/db/ports/mail_opendmarc/options
_OPTIONS_READ=opendmarc-1.4.2
_FILE_COMPLETE_OPTIONS_LIST=DOCS SPF
OPTIONS_FILE_UNSET+=DOCS
OPTIONS_FILE_SET+=SPF

EOF

portmaster -w -B -g -U --force-config mail/opendmarc -n

Der Port hat aktuell keine Flavors. Relevante Portoptionen sind vor allem DOCS und SPF; mit aktivierter SPF-Option wird Unterstützung über libspf2 eingebaut. Zusätzlich hängt der Port inzwischen an public_suffix_list, was für die Berechnung der Organizational Domain wichtig ist. (FreshPorts)

Dienst in rc.conf eintragen

Der Dienst wird mittels sysrc in der rc.conf eingetragen und dadurch beim Systemstart automatisch gestartet.

Bash
sysrc opendmarc_enable="YES"
sysrc opendmarc_runas="opendmarc:opendmarc"
sysrc opendmarc_socketspec="unix:/var/spool/postfix/opendmarc/opendmarc.sock"
sysrc opendmarc_socketperms="0700"

Konfiguration

Konfigurationsdatei

Die Beispielkonfiguration wird vom Port unter etc/mail/opendmarc.conf.sample installiert. Für dieses Setup verwenden wir die produktive Datei unter /usr/local/etc/mail/opendmarc.conf. Außerdem sollte in der Konfiguration ein gültiger PublicSuffixList-Pfad gesetzt sein, weil OpenDMARC sonst die Organizational Domain nicht korrekt bestimmen kann. (FreshPorts)

Bash
cat <<'EOF' > /usr/local/etc/mail/opendmarc.conf
AuthservID              mail.example.com
AutoRestart             Yes
AutoRestartRate         10/1h
BaseDirectory           /var/run/opendmarc
FailureReports          true
FailureReportsBcc       dmarc@example.com
FailureReportsOnNone    true
FailureReportsSentBy    postmaster@example.com
IgnoreAuthenticatedClients true
PidFile                 /var/run/opendmarc/opendmarc.pid
PublicSuffixList        /usr/local/share/public_suffix_list/public_suffix_list.dat
RejectFailures          false
RequiredHeaders         true
Socket                  local:/var/spool/postfix/opendmarc/opendmarc.sock
SPFIgnoreResults        true
SPFSelfValidate         true
Syslog                  true
SyslogFacility          mail
TrustedAuthservIDs      localhost,mail.example.com
UMask                   002
UserID                  opendmarc
HistoryFile             /usr/local/etc/mail/opendmarc.dat
IgnoreHosts             /usr/local/etc/mail/ignorehosts
EOF

IgnoreHosts anlegen

IgnoreHosts ist in OpenDMARC der richtige Mechanismus, um lokale oder vertrauenswürdige Quellhosts von der DMARC-Prüfung auszunehmen. Laut opendmarc.conf(5) akzeptiert die Datei Hostnamen, IP-Adressen und CIDR-Ausdrücke. Wenn nichts gesetzt ist, wird standardmäßig nur 127.0.0.1 ignoriert. (FreeBSD Manual Pages)

Bash
cat <<'EOF' > /usr/local/etc/mail/ignorehosts
::1
127.0.0.1
fe80::/10
10.0.0.0/8
__IPADDR4__/32
__IPADDR6__/64
localhost
example.com
*.example.com
EOF

# 1. Get Default Interface
DEF_IF="$(route -n get -inet default | awk '/interface:/ {print $2}')"

# 2. Get IPv4 IP
IP4="$(ifconfig "$DEF_IF" inet | awk '/inet / && $2 !~ /^127\./ {print $2}' | head -n 1)"
[ -n "$IP4" ] && sed -e "s|__IPADDR4__|$IP4|g" -i '' /usr/local/etc/mail/ignorehosts

# 3. Get IPv6 IP
IP6="$(ifconfig "$DEF_IF" inet6 | awk '/inet6 / && $2 !~ /^fe80:/ && $2 !~ /^::1/ {print $2}' | head -n 1)"
[ -n "$IP6" ] && sed -e "s|__IPADDR6__|$IP6|g" -i '' /usr/local/etc/mail/ignorehosts

Konfiguration prüfen

Vor dem ersten Start sollte die Konfiguration immer geprüft werden. opendmarc -n parst Konfigurationsdatei und Kommandozeilenoptionen, meldet Fehler und beendet sich danach wieder. Das ist der saubere Vorab-Check. Zusätzlich kann OpenDMARC im Testmodus mit -t komplette Nachrichten aus Dateien prüfen, ohne den Dienst zu starten. (FreeBSD Manual Pages)

Bash
opendmarc -n -c /usr/local/etc/mail/opendmarc.conf
service opendmarc start
sockstat -4 -6 -l | egrep 'opendmarc|milter'

Datenbanken

Für dieses HowTo sind keine Datenbanken erforderlich.

OpenDMARC bringt zwar Werkzeuge und ein Schema für Reporting mit, dieses Basis-HowTo richtet aber nur den laufenden DMARC-Milter ein und noch keine Reporting-Datenbank. (FreshPorts)


Zusatzsoftware

Mögliche Zusatzsoftware wird hier installiert und konfiguriert.

Für dieses HowTo ist keine zusätzliche Software erforderlich.

Die Features FailureReports und SPF-Selbstvalidierung werden über die Konfiguration von OpenDMARC selbst gesteuert. FailureReports ist die aktuelle Option für RFC6591-konforme Failure Reports; SPFSelfValidate aktiviert einen SPF-Fallback, wenn im Header keine SPF-Ergebnisse vorhanden sind. (FreeBSD Manual Pages)


Aufräumen

Überflüssige oder temporäre Verzeichnisse und Dateien entsorgen.

Zusatzsoftware Installation

Nicht erforderlich.

Zusatzsoftware Konfiguration

Nicht erforderlich.


Abschluss

OpenDMARC kann nun gestartet werden.

Bash
service opendmarc start

Für spätere Änderungen:

Bash
service opendmarc restart

Wenn nur die Konfigurationsdatei neu eingelesen werden soll, unterstützt OpenDMARC dafür laut Handbuch auch ein Konfigurations-Reload per SIGUSR1. In der Praxis ist für dieses Setup ein sauberer restart aber der robustere Standardweg. (FreeBSD Manual Pages)


Referenzen