DMARC verbindet SPF und DKIM mit der Adresse, die Ihre Empfänger tatsächlich sehen, und
legt fest, was empfangende Server tun, wenn keine davon passt. Diese Seite ist die
vollständige Referenz auf dem aktuellen Stand: jedes Tag mit seinem echten Default, der
DNS-Tree-Walk an einem echten Namen durchgerechnet, zehn kommentierte Beispiel-Records, ein
Rollout-Plan, das Lesen der Reports — und was sich geändert hat, als RFC 9989 den RFC 7489
abgelöst hat. Domain prüfen → Sie bauen gerade einen Record? Der
DMARC-Generator erzeugt gültige Syntax.
Stand: RFC 9989, RFC 9990 und RFC 9991 (Mai 2026) · zuletzt geprüft am 24. August 2026
Was DMARC leistet — und was ausdrücklich nicht
DMARC verbindet den einen Bezeichner, den ein Leser tatsächlich sieht — die Domain
im From-Headerfeld, RFC5322.From genannt und in DMARC-Terminologie die
Author Domain, also die Domain des scheinbaren Absenders — mit
Authentifizierungsergebnissen, die SPF und DKIM für völlig andere Bezeichner liefern.
RFC 9989 §4.2 benennt offen, warum gerade dieses Feld gewählt wurde: Es war über die
gesamte Geschichte der E-Mail hinweg trivial fälschbar, aber von allen Bezeichnern in
einer Nachricht ist es der einzige, der zwingend vorhanden sein muss. SPF und DKIM
authentifizieren Domains; keines von beiden ist für sich genommen mit der Domain
verbunden, die Ihr Empfänger liest. DMARC ist die Bindung zwischen beidem.
Ein DMARC-Pass ist eine eng gefasste Aussage. Nach RFC 9989 §4.1 und §5.4 besagt
er, dass die Verwendung der Author Domain in dieser Nachricht als vom Domaininhaber
autorisiert bestätigt wurde — mehr nicht. Er enthält keine ausdrückliche oder
implizite Wertaussage über die Nachricht oder über den Domaininhaber, und §4.1 ergänzt,
dass die zugrunde liegenden Mechanismen ausschließlich die Verwendung einer
DNS-Domain prüfen, nie den Local Part einer Adresse in der Nachricht. Eine Nachricht
von ceo@example.com und eine von
attacker-with-your-password@example.com sind für DMARC nicht
unterscheidbar.
Die zweite Hälfte von DMARC ist das Reporting, und in der Praxis ist es die Hälfte,
die die Arbeit erledigt. Aggregate-Reports geben dem Domaininhaber Einblick in alle
Mail-Ströme, die die Author Domain verwenden (RFC 9989 §5.3.8), und decken nach
RFC 9990 §3.1 sowohl Nachrichten ab, die die Authentifizierung bestanden haben, als
auch solche, die daran gescheitert sind — gezählt über alle empfangenen Nachrichten,
selbst wenn deren Zustellung am Ende durch andere Filterung unterbunden wurde. So
finden Sie den Weiterleiter, das Ticketsystem und die Marketing-Plattform, von denen
Ihnen niemand erzählt hat, bevor Sie auf Enforcement (die durchgesetzte Policy)
umstellen.
DMARC erkennt
Spoofing der exakten Domain. Ein nicht autorisierter Sender,
der Ihre Domain in die From-Adresse schreibt. RFC 9989 §2.2 fasst
den Geltungsbereich genau so: DMARC bekämpft bestimmte Formen des Spoofings der
exakten Domain.
Mail mit Ihrer Domain ohne einen ausgerichteten Bezeichner.
Existiert kein Authenticated Identifier, oder ist keiner davon zur Author Domain
ausgerichtet, scheitert die Nachricht an der DMARC-Prüfung (§5.3.5), und Ihre
veröffentlichte Policy greift.
Ihre eigenen nicht autorisierten oder falsch konfigurierten
Sendewege. Aggregate-Reports zeigen Mail-Ströme mit Ihrer Domain, die
nicht ausgerichtet oder nicht authentifiziert sind; §5.1.6 verlangt, die
legitimen darunter zu reparieren, bevor Sie eine Enforcement-Policy
veröffentlichen.
Jeden Sendeweg, nicht nur die scheiternden. Die Reports
enthalten auch die bestandenen Ströme (RFC 9990 §3.1) — erst das macht eine
Bestandsaufnahme Ihrer legitimen Sender überhaupt möglich.
Welche Policy ein Empfänger tatsächlich angewendet hat.
Weicht ein Empfänger von Ihrer veröffentlichten Policy ab, sollte er diesen
Umstand und seinen Grund über das PolicyOverride-Feature des Aggregate-Reports
melden (§5.4).
DMARC erkennt nicht
Gefälschte Anzeigenamen. Eine Nachricht von
Example Support <billing@unrelated.example.net> bleibt von
DMARC unberührt. RFC 9989 §11.4 benennt diesen Angriff und stellt klar fest,
dass Angriffe über den Anzeigenamen außerhalb des Geltungsbereichs liegen; §2.4
führt sie unter den Themen auf, die aus der Spezifikation ausgeklammert
sind.
Ähnlich aussehende Domains und Cousin-Domains. §2.2 hält
fest, dass DMARC die Verwendung visuell ähnlicher Domainnamen nicht behandelt.
Eine Cousin-Domain ist eine andere Author Domain, die gegen ihren eigenen
Policy-Record bewertet wird, und wer eine solche registriert, kann für sie eine
DMARC-Konfiguration veröffentlichen, die besteht.
Nachrichteninhalte und Schadsoftware. Inhaltsanalyse ist in
§2.4 als außerhalb des Geltungsbereichs aufgeführt. Ein DMARC-Pass ist kein
Sicherheitsurteil — deshalb erlaubt §5.4 einem Empfänger, eine Nachricht auch
dann abzulehnen oder unter Quarantäne zu stellen, wenn sie besteht, und
ermutigt Empfänger, ihre Anti-Missbrauchs-Technik weiter einzusetzen.
Kompromittierte Konten auf Ihrer eigenen Domain. Mail, die
mit gestohlenen Zugangsdaten über Ihre eigene Infrastruktur versendet wird,
erzeugt einen ausgerichteten Pass. DMARC prüft die Domain, nicht den Local Part
(§4.1).
Missbrauch einer delegierten Subdomain. Unter relaxed
kann jeder, der das DNS einer Subdomain Ihrer Organisationsdomain kontrolliert,
dort einen SPF-Record veröffentlichen und einen DMARC-Pass für die übergeordnete
Domain erhalten — das in §11.8 durchgespielte Szenario.
Nachrichten mit null oder mehreren
From-Domains. Solche Nachrichten liegen außerhalb des
Geltungsbereichs der Spezifikation (§5.3.1); §11.5 beschreibt den daraus
entstehenden Angriffsvektor und die empfängerseitigen Grenzen, die ihn
eindämmen.
Eine Konsequenz wird regelmäßig missverstanden, auch von Anbietern, die DMARC als
Schalter verkaufen, der gefälschte Mail stoppt: p=reject ist eine Bitte,
und die Spezifikation untersagt es, allein darauf zu handeln.
RFC 9989 §7.4 ist normativ und unmissverständlich: „Mail Receivers MUST NOT
reject incoming messages solely on the basis of a ‘p=reject’ policy by
the sending domain.“ Und weiter: „In the absence of other knowledge
and analysis, Mail Receivers MUST treat such failing mail as if the policy were
‘p=quarantine’ rather than ‘p=reject’.“ Dieselbe
Anforderung steht in der Konformitätsliste in §8, und §5.4 hält fest, dass
Empfänger nicht allein aufgrund einer veröffentlichten reject-Policy ablehnen
SOLLTEN, sondern weiteres Wissen und weitere Analyse heranziehen sollten. Der Grund
ist Interoperabilität: §7.4 arbeitet Weiterleiter, Rollenadressen und Mailinglisten
durch, bei denen legitime Mail an DMARC scheitert und automatische
Bounce-Verarbeitung unbeteiligte Empfänger abmelden kann.
Das Spiegelbild gilt ebenso. §5.4 verlangt, dass eine ermittelte Policy
p=none bestehende Mail-Verarbeitungsprozesse NICHT verändern darf —
das ist es, was den Monitoring-Modus auf einer Produktivdomain gefahrlos einsetzbar
macht.
Ausrichtung (Alignment) — der Mechanismus, der tatsächlich entscheidet
Die meiste DMARC-Fehlersuche endet in dem Moment, in dem Sie aufhören zu fragen
„ist SPF bestanden?“ und anfangen zu fragen „welche Domain hat bestanden, und ist sie
ausgerichtet?“. Drei Domain-Bezeichner sind im Spiel, und häufig sind es drei
verschiedene Domains in derselben Nachricht.
RFC5322.From — die Author Domain
Die Domain des scheinbaren Verfassers, entnommen aus dem
From-Headerfeld (RFC 9989 §3.2.2). Der Empfänger extrahiert sie als
ersten Schritt der Auswertung und wandelt ein U-Label vor der Verarbeitung in ein
A-Label um; ist keine oder mehr als eine Domain vorhanden, ist eine DMARC-Prüfung
nicht möglich und der Vorgang endet (§5.3.1). Dies ist das einzige Headerfeld, das
DMARC zur Bestimmung der Author Domain auswertet — §2.4 führt die Auswertung von
irgendetwas anderem als dem RFC5322.From-Headerfeld als außerhalb des
Geltungsbereichs auf.
RFC5321.MailFrom — die SPF-Domain
Die Domain im SMTP-Kommando MAIL FROM, auch Envelope-Sender oder
Return-Path genannt. SPF kann sowohl die HELO-Identität als auch die
MAIL-FROM-Identität prüfen, aber §3.2.4 und §4.4.2 sind eindeutig: DMARC stützt sich
ausschließlich auf die SPF-Prüfung der MAIL-FROM-Identität. Ein SPF-Pass, der über
den HELO-Namen erzielt wurde, trägt zu DMARC nichts bei. Für einen leeren
Return-Path verweist §3.2.4 auf die Behandlung in RFC 7208 §2.4, bei der die
Identität zu postmaster an der HELO-Domain wird.
DKIM d= — die DKIM-Signaturdomain
Der Wert des d-Tags in einem DKIM-Signature-Headerfeld, dessen
kryptografische Signatur gültig ist (§3.2.3, §4.4.1). Eine Nachricht kann mehrere
Signaturen tragen; §4.4.1 hält fest, dass sie einen DMARC-Pass erzeugt, wenn
irgendein DKIM-Authenticated Identifier zur Author Domain ausgerichtet
ist.
Die Regel, die das Ergebnis entscheidet, ist kurz. Nach §5.3.5 besteht die
Nachricht, wenn einer oder mehrere der Authenticated Identifiers zur Author Domain
ausgerichtet sind; existiert kein Authenticated Identifier oder ist keiner davon
ausgerichtet, scheitert sie. Ein ausgerichteter Bezeichner genügt — aber ein
Bezeichner, der sich authentifiziert, ohne ausgerichtet zu sein, trägt überhaupt
nichts bei. §4.4.1 und §4.4.2 nennen den Grund: Es gibt keinen anerkannten
Mechanismus, mit dem Sie Dritte benennen könnten, die für Sie signieren oder Ihre
Domain als MAIL FROM verwenden dürfen, und jeder Angreifer kann für eine von ihm
kontrollierte Domain einen SPF-Record veröffentlichen oder eine Nachricht mit seinem
eigenen Schlüssel signieren. Erst die Ausrichtung sorgt dafür, dass ein
Authentifizierungsergebnis etwas über Ihre Domain aussagt.
Die Ausrichtung kennt zwei Modi. Zwei Domains sind relaxed
ausgerichtet, wenn sie dieselbe Organisationsdomain haben (§3.2.10.1), und
strict nur dann, wenn sie identisch sind (§3.2.10.2). Den Modus
wählen Sie, getrennt für jeden Mechanismus, über die Tags aspf und
adkim; §4.7 gibt beiden den Standardwert r, sodass ein
Record, der keines der beiden Tags nennt, auf beiden Seiten relaxed ist. §4.4 merkt
an, dass diese Domain-Vergleiche unabhängig von Groß- und Kleinschreibung sind, und
hält fest, dass nahezu alle Domaininhaber relaxed als ausreichend empfunden
haben.
Die Organisationsdomain stammt aus dem Tree Walk, nicht aus der Public Suffix List
Hier weicht das heutige DMARC von dem ab, was die meisten veröffentlichten
Anleitungen noch schreiben. §3.2.14 definiert die Organisationsdomain als die Domain
an der Spitze der Namensraum-Hierarchie, die sich mit der betrachteten Domain
dieselbe administrative Zuständigkeit teilt, und hält fest, dass sie durch Anwendung
des Algorithmus aus §4.10 bestimmt wird — des DNS Tree Walk. §4.10 hält die
Vorgeschichte ausdrücklich fest: RFC 7489 beschrieb die Verwendung einer Public
Suffix List, schrieb keine bestimmte Liste vor, gab keine Vorgaben zur Aktualisierung,
räumte die daraus entstehenden Interoperabilitätsprobleme ein und legte nahe, dass
ein zuverlässigeres Verfahren an ihre Stelle treten sollte. RFC 9989 ist dieses
Verfahren.
Der Tree Walk fragt einen DMARC-Policy-Record an der Startdomain ab, entfernt dann
wiederholt das linkeste Label und fragt erneut ab — begrenzt auf acht Abfragen, damit
eine Author Domain mit hunderten Labels nicht als Verstärker für einen
Denial-of-Service-Angriff missbraucht werden kann (§4.10). §4.10.2 wählt anschließend
aus den gefundenen Records die Organisationsdomain aus: Ein Record mit
psd=n entscheidet die Sache sofort; ein Record, der nicht der Start-Record
ist und psd=y trägt, macht die Domain ein Label darunter zur
Organisationsdomain; andernfalls gewinnt der Record, der am Namen mit den wenigsten
Labels gefunden wurde. Ergibt der Vorgang nichts, ist die anfängliche Zieldomain ihre
eigene Organisationsdomain.
Zwei Abkürzungen in §4.10.2 sollte man kennen, denn sie erklären, warum manche
Konfigurationen billig auszuwerten sind: Es ist überhaupt keine Auswertung der
Ausrichtung nötig, wenn der Policy-Record strict vorgibt, da ein Zeichenkettenvergleich
genügt, und ebenso wenig, wenn die Author Domain und jeder Authenticated Identifier
dieselbe Domain sind und für sie ein Policy-Record veröffentlicht ist — diese
gemeinsame Domain wird dann als Organisationsdomain behandelt.
Eine Nachricht, vier Fragen zur Ausrichtung
SMTP: MAIL FROM:<bounce@mail.example.com>
Headers:
From: Example News <news@example.com>
DKIM-Signature: v=1; a=rsa-sha256; d=mailer.example.net; s=k1; ...
Nehmen wir an, SPF liefert für mail.example.com ein Pass und die
Signatur von mailer.example.net ist gültig. Beide Mechanismen melden
Erfolg, und beide Bezeichner sind echt. Die Author Domain ist
example.com. Nehmen wir weiter an, dass ein DMARC-Policy-Record unter
_dmarc.example.com existiert und unter keinem Namen darunter, sodass
der Tree Walk von mail.example.com bei example.com
endet.
Modus
Authenticated Identifier
Author Domain
Ausgerichtet?
Warum
aspf=r (Standard)
SPF: mail.example.com
example.com
Ja
Der Tree Walk ergibt für beide Domains dieselbe Organisationsdomain,
example.com — genau das ist die Definition von relaxed
(§3.2.10.1)
aspf=s
SPF: mail.example.com
example.com
Nein
strict verlangt, dass die beiden Namen identisch sind (§3.2.10.2); eine
Subdomain der Author Domain ist nicht die Author Domain
adkim=r (Standard)
DKIM: d=mailer.example.net
example.com
Nein
Ein Tree Walk von mailer.example.net kann nur eine
Organisationsdomain innerhalb von example.net ergeben oder
mailer.example.net selbst, wenn er keinen Record findet — nie
example.com
adkim=s
DKIM: d=mailer.example.net
example.com
Nein
Nicht identisch, und im strict-Modus findet kein Vergleich der
Organisationsdomains statt
Mit den Standardwerten besteht diese Nachricht DMARC: Der SPF-Bezeichner ist
ausgerichtet, und §5.3.5 braucht genau einen. Ändern Sie den Record auf
aspf=s, und dieselbe Nachricht scheitert, weil der DKIM-Bezeichner nie
ausgerichtet war und der SPF-Bezeichner es nicht mehr ist. An der Nachricht hat sich
nichts geändert, nur am Vergleich.
Die DKIM-Zeile ist diejenige, die Leute überrascht. Eine gültige
Signatur von der eigenen Domain Ihres E-Mail-Anbieters ist eine gültige Signatur —
sie authentifiziert den Anbieter, nicht Sie. Was DMARC verwertet, ist die
Ausrichtung, nicht die Gültigkeit.
Weil relaxed über eine Abfrage entschieden wird und nicht über einen
Zeichenkettenvergleich, hängt das Ergebnis davon ab, wo im Baum DMARC-Records
existieren. §11.8 spielt einen Fall durch, in dem ein Empfänger, der die
Organisationsdomain falsch bestimmt, die Mail eines Angreifers durchlässt, und
kommt zu dem Schluss, dass das Problem „entirely avoided by the use of strict
alignment and publishing explicit DMARC Policy Records for all Author Domains used
in an organization's email“ ist. Derselbe Abschnitt warnt davor, die Kontrolle über
Subdomains zu delegieren und sich zugleich auf relaxed zu verlassen.
Warum SPF besteht und DMARC trotzdem scheitert
Das ist die mit Abstand häufigste Fehldeutung eines DMARC-Reports. SPF sagt Pass,
der Authentication-Results-Header sagt spf=pass, und DMARC sagt Fail.
Nichts ist kaputt; die beiden Mechanismen beantworten verschiedene Fragen. SPF
beantwortet: „Durfte dieser Host jene Envelope-Sender-Domain verwenden?“ DMARC
beantwortet: „Stimmt irgendeine authentifizierte Domain mit der Domain im
From-Header überein?“
Fall 1: ein E-Mail-Dienstleister mit eigener Bounce-Domain
Drei Zeilen, drei Domains. Der SPF-Authenticated Identifier ist
esp.example.net, weil §3.2.4 und §4.4.2 ihn als die geprüfte
MAIL-FROM-Identität definieren — nicht als die Domain, die Sie ins
From-Feld geschrieben haben. esp.example.net und
example.com teilen sich keine Organisationsdomain, sind also unter
relaxed nicht ausgerichtet und unter strict erst recht nicht. Der DKIM-Bezeichner
ist aus demselben Grund nicht ausgerichtet. Kein Authenticated Identifier ist
ausgerichtet, also erzeugt §5.3.5 ein Fail, und Ihre veröffentlichte Policy wird auf
Mail angewendet, die Sie selbst versendet haben.
Die Abhilfe liegt auf der Senderseite und ist in §5.1.1 und §5.1.2 ausbuchstabiert:
Versenden Sie Mail, deren MAIL-FROM-Domain einen ausgerichteten SPF-Authenticated
Identifier erzeugt — einen eigenen Return-Path unterhalb von
example.com — und konfigurieren Sie den Anbieter so, dass er mit einer
ausgerichteten DKIM-Signaturdomain signiert, typischerweise indem Sie einen Selector
unter Ihrer eigenen Domain veröffentlichen oder delegieren, sodass die Signatur
d=example.com oder eine Subdomain davon trägt.
Das include: des Anbieters in Ihren SPF-Record
aufzunehmen, hilft hier nicht, weil SPF Ihre Domain in dieser Transaktion gar nicht
auswertet. Ihr Record wird überhaupt nicht herangezogen; der Envelope-Sender gehört
dem Anbieter.
Fall 2: Weiterleitung bricht SPF, DKIM überlebt
example.com --> alumni.example.org --> final mailbox
(relays the message on, From: unchanged)
RFC 9989 §7.4 arbeitet genau dieses Szenario durch. Wenn die weitergeleitete
Nachricht am endgültigen Ziel ankommt, gehört die verbindende IP-Adresse dem
Weiterleiter und nicht einem Host, den die ursprüngliche MAIL-FROM-Domain
autorisiert hat, sodass die Nachricht „will most likely fail SPF checks unless the
RFC5321.MailFrom address is rewritten by the relaying MTA“ — und wird sie
umgeschrieben, gehört das entstehende SPF-Pass der Domain des Weiterleiters und ist
damit nicht ausgerichtet. Derselbe Abschnitt hält die Asymmetrie fest, die die
Nachricht rettet: „DKIM signatures will generally remain valid in these relay
situations.“
Deshalb hält §7.4 als kritische Anforderung fest, dass Domains, die
p=reject veröffentlichen, „MUST NOT rely solely on SPF to secure a
DMARC pass and MUST apply valid DKIM signatures to their messages“ — eine
Anforderung, die in der Konformitätsliste in §8 wiederholt wird. Eine Domain im
Enforcement, deren einziger ausgerichteter Bezeichner SPF ist, verliert an jedem
Weiterleiter im Pfad legitime Mail.
§7.1 ergänzt eine Falle, die die Beweise verschwinden lässt:
Endet ein SPF-Record auf -all, kann ein Empfänger schon früh in der
SMTP-Transaktion ablehnen, vor der DMARC-Verarbeitung und vor der DATA-Phase. Die
From-Domain wird nie offengelegt, ihre Policy nie ermittelt, und die
Nachricht taucht nie in Ihren Aggregate-Reports auf — obwohl eine ausgerichtete
DKIM-Signatur ein DMARC-Pass erzeugt hätte.
Beide Fälle sind messbar statt theoretisch: Schicken Sie eine echte Nachricht über
den Weg, um den es Ihnen geht, und lesen Sie die Bezeichner direkt von der Leitung ab.
Genau das tut der Sende-Test — er fängt eine von Ihnen
gesendete Nachricht ab und meldet den Envelope-Sender, jedes d= in der
Nachricht, die SPF- und DKIM-Ergebnisse und ob jeder Bezeichner zu Ihrer Author Domain
ausgerichtet ist.
Wo der Record liegt und wie er gelesen wird
Eine DMARC-Policy ist ein einzelner DNS-TXT-Record, der unter dem Namen _dmarc vor derjenigen Domain veröffentlicht wird, für die er gilt. Für example.com lautet dieser Name _dmarc.example.com, und ein Empfänger, der die Policy einer Author Domain sucht — also der Domain im From-Headerfeld —, stellt genau für diesen Namen eine TXT-Abfrage (RFC 9989 §4.5). Einen anderen Ort sieht sich ein Empfänger nicht an: nicht den TXT-Record am Apex, nicht ein anders benanntes Label und keinen DMARC-eigenen Resource-Record-Typ. Die Abfrage gilt immer TXT unter _dmarc vor der jeweiligen Domain. Der Knotenname _dmarc ist bei der IANA für den Typ TXT im Registry „Underscored and Globally Scoped DNS Node Names" eingetragen (RFC 9989 §9.5).
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com"
Gar keinen Record zu veröffentlichen, ist eine zulässige Haltung, und RFC 9989 §4.5 sagt das ausdrücklich: Ein Domaininhaber entzieht sich der DMARC-Prüfung durch Empfänger schlicht dadurch, dass er keinen Policy-Record veröffentlicht. Für Sie zählt dabei, dass das Fehlen eines Records und das Vorhandensein eines Records, den Empfänger verwerfen, in der Praxis dasselbe Ergebnis haben — und der zweite Fall tritt weit leichter versehentlich ein. Im Rest dieses Abschnitts geht es um die Wege, auf denen ein korrekt aussehender Record weggeworfen wird.
Ein in mehrere Strings aufgeteilter TXT-Record wird vor dem Parsen zusammengefügt
Ein TXT-Record kann aus mehr als einem Character-String-Objekt bestehen. Wo das der Fall ist, MUSS das Modul, das die DMARC-Auswertung vornimmt, diese Strings zusammenfügen, indem es die Objekte der Reihe nach aneinanderhängt und das Ergebnis als einen einzigen String parst (RFC 9989 §4.5). Das Zusammenfügen ist eine reine Verkettung — an der Nahtstelle wird nichts eingefügt.
Das ist deshalb wichtig, weil DNS-Hosting-Oberflächen einen langen Wert unterschiedlich darstellen. Manche nehmen einen einzigen langen String entgegen und teilen ihn für Sie auf; manche erwarten, dass Sie die Teile selbst eingeben. Endet ein Teil dort, wo der nächste beginnt, parst das Ergebnis sauber. Fügen Sie an einer Grenze „sicherheitshalber" ein Leerzeichen oder ein Semikolon ein, wird dieses Zeichen Teil des Record-Werts, und Sie landen womöglich bei einem Tag-Wert, den Sie nicht beabsichtigt haben.
Veröffentlicht als
Geparst als
Ergebnis
"v=DMARC1; p=reject; rua=mailto:a@" "example.com"
v=DMARC1; p=reject; rua=mailto:a@example.com
Wie beabsichtigt. Die Naht fällt innerhalb eines Werts, und die Verkettung stellt ihn wieder her.
Das versehentliche Leerzeichen steht innerhalb der Report-URI. Die URI ist nicht die Adresse, die Sie gemeint haben.
Prüfen Sie den Record so, wie ein Resolver ihn zurückgibt, nicht so, wie Ihr DNS-Panel ihn anzeigt. Das Panel zeigt die Teile; der Empfänger sieht das Zusammengefügte.
v=DMARC1 muss das erste Tag sein, und beim Wert zählt die Groß- und Kleinschreibung
_dmarc.example.com. IN TXT "v=dmarc1; p=reject"
RFC 9989 §4.7 definiert v als REQUIRED, legt fest, dass es das erste Tag der Liste sein MUSS, und hält fest, dass beim Tag-Wert die Groß- und Kleinschreibung zählt, mit DMARC1 als einzig möglichem Wert. Steht das Tag nicht an erster Stelle, fehlt es oder hat es irgendeinen anderen Wert, MUSS der gesamte Record ignoriert werden. Die formale Grammatik in §4.8 wiederholt das als case-sensitives Literal: dmarc-version = "v" equals %s"DMARC1".
Der Record oben ist keine schwache Policy und kein teilweise gültiger Record. Er ist kein Record. Jeder Empfänger verwirft ihn, die Domain hat keine eigene Policy, und Mail, die vorgibt, von example.com zu stammen, wird genau so behandelt, als existierte der DNS-Name _dmarc.example.com nicht. Nichts im DNS meldet einen Fehler, und der Record sieht in Ihrer Zonendatei noch jahrelang vorhanden aus.
Dasselbe gilt für jeden Record, dessen erstes Tag ein anderes ist. Eine Reihenfolge p=reject; v=DMARC1 wird verworfen, und ebenso ein Record, bei dem der Verifizierungsstring eines Anbieters vor der Policy gelandet ist: RFC 9989 §4.10 Schritt 2 verwirft Records, die nicht mit einem v-Tag beginnen, das die aktuelle DMARC-Version bezeichnet. Das Versions-Tag ist das Tor, und alles dahinter wird nur erreicht, wenn das Tor aufgeht.
Unbekannte Tags werden ignoriert, fehlerhafte Werte fallen auf Vorgabewerte zurück
Nur Tags, die im DMARC-Tag-Registry definiert sind, sind zu verarbeiten; unbekannte Tags MÜSSEN ignoriert werden (RFC 9989 §4.7). Die formale Definition in §4.8 wiederholt die Regel und ergänzt, was mit dem Rest geschieht: Syntaxfehler im übrigen Record MÜSSEN zugunsten von Vorgabewerten verworfen werden, sofern es welche gibt, oder andernfalls schlicht ignoriert werden. §4.8 nennt auch den Grund — weil unbekannte Tags ignoriert werden müssen, lässt sich ein neues Tag registrieren, ohne eine neue DMARC-Version einzuführen und ohne ältere Implementierungen zu brechen.
Die Folge für Sie ist, dass ein falsch geschriebener Tag-Name nirgends einen Fehler erzeugt. Er erzeugt Stille. v=DMARC1; poIicy=reject — mit einem großen I anstelle des l — ist ein syntaktisch gültiger DMARC-Record mit einem unbekannten Tag und ohne Policy-Tag.
Was dann geschieht, legt RFC 9989 §4.10.1 fest. Enthält ein abgerufener Policy-Record kein gültiges p-Tag oder enthält er ein sp- oder np-Tag, das nicht gültig ist, dann gilt: Ist ein rua-Tag mit mindestens einer syntaktisch gültigen Report-URI vorhanden, MUSS der Empfänger so verfahren, als wäre ein Record mit p=none abgerufen worden, und die Verarbeitung fortsetzen; andernfalls wendet der Empfänger überhaupt keine DMARC-Verarbeitung auf die Nachricht an. Ein Tippfehler im Policy-Tag kostet Sie damit entweder Ihr Enforcement — die tatsächliche Durchsetzung der Policy beim Empfänger — oder Ihre DMARC-Auswertung insgesamt, je nachdem, ob Sie zufällig eine Report-Adresse veröffentlicht haben.
Zwei Records unter demselben Namen verwerfen einander — aber der Tree Walk geht weiter
Eine TXT-Abfrage auf _dmarc.example.com liefert eine Menge von Records zurück, und diese Menge darf legitim Records enthalten, die mit DMARC nichts zu tun haben. RFC 9989 §4.10 Schritt 2 behandelt beide Fälle der Reihe nach: Records, die nicht mit einem v-Tag beginnen, das die aktuelle DMARC-Version bezeichnet, werden verworfen; und werden für ein einzelnes Ziel mehrere DMARC-Policy-Records zurückgegeben, werden sie allesamt verworfen. Der Verifizierungsstring eines Anbieters, der neben Ihrer Policy unter demselben Namen liegt, ist harmlos, weil ihn die erste Hälfte der Regel entfernt. Ein zweiter Record, der mit v=DMARC1 beginnt, ist nicht harmlos, weil er die zweite Hälfte auslöst und Ihre echte Policy mitreißt.
Was danach geschieht, ist der Punkt, an dem RFC 9989 von der älteren RFC 7489 abweicht, und der Unterschied wird weithin falsch wiedergegeben. Nach RFC 7489 §6.6.3 Schritt 5 bedeutete eine Menge mit mehreren Records, dass die Policy-Ermittlung endete und DMARC auf die Nachricht nicht angewendet wurde — DMARC war für diese Nachricht aus. Nach RFC 9989 bleibt das Verwerfen auf diesen einen Namen beschränkt. Die Policy-Ermittlung fällt auf den DNS-Tree-Walk durch (§4.10.1): Wird bei der ersten Abfrage kein gültiger Record gefunden, geht der Empfänger nach oben und fragt _dmarc bei jedem nächsthöheren Elternteil ab — bei einer Author Domain mit mehr als acht Labels springt der Walk zuerst zu dem Vorfahren, der sieben Labels hat (§4.10 Schritt 4) — und die Schritte 5 bis 7 von §4.10 wiederholen Abfrage und Verwerfen, bis der Vorgang endet oder keine Labels mehr übrig sind.
Ein doppelter Record auf mail.example.com schaltet DMARC für diese Subdomain also nicht ab. Er nimmt der Subdomain ihre eigene Policy und übergibt die Entscheidung dem nächsten Record, der weiter oben im Baum gefunden wird — typischerweise dem Record der Organisationsdomain, dessen sp- oder np-Tag dann anstelle des p gilt, das Sie auf der Subdomain veröffentlicht haben. Das beobachtbare Ergebnis ist nicht „kein DMARC". Es ist eine andere Policy als die, die Sie geschrieben haben, angewendet aus Gründen, die am Record der Subdomain selbst nicht zu sehen sind.
Der Tree Walk hat zwei Abbruchbedingungen, die man kennen sollte. Er endet, wenn ein einzelner verbleibender Record ein psd=n- oder psd=y-Tag trägt (RFC 9989 §4.10 Schritte 2 und 6), und er ist so begrenzt, dass eine Author Domain mit mehr als acht Labels nie mehr als acht DNS-Abfragen verursacht (§4.10). Die Grenze von acht Abfragen ist ein Schutz gegen Denial of Service, kein Policy-Merkmal: §4.10 hält fest, dass Domains mit bis zu sieben Labels im Einsatz beobachtet wurden und acht gewählt wurde, um Luft zu lassen.
Die vollständige Tag-Referenz (RFC 9989)
RFC 9989 §4.7 definiert elf gültige DMARC-Tags und sonst nichts. Die Tabelle unten gibt Status und Vorgabewert jedes einzelnen so wieder, wie die Spezifikation sie festlegt, denn beides wird regelmäßig falsch zitiert: Genau ein Tag ist REQUIRED, genau ein weiteres ist RECOMMENDED, und die übrigen neun sind OPTIONAL, mit Vorgabewerten, die darüber entscheiden, was ein unvollständiger Record bedeutet.
Tag
Status
Vorgabewert
Zulässige Werte
Was es bewirkt
v
REQUIRED
keiner — muss vorhanden sein
DMARC1 (Groß-/Kleinschreibung zählt)
Weist den Record als DMARC-Policy-Record aus. MUSS das erste Tag der Liste sein. Fehlt es, steht es nicht an erster Stelle oder hat es irgendeinen anderen Wert, MUSS der gesamte Record ignoriert werden.
p
RECOMMENDED, nicht erforderlich
kein Vorgabewert; ein ansonsten gültiger Record ohne p wird behandelt, als enthielte er p=none
none, quarantine, reject
Die Bewertungs-Policy des Domaininhabers für Mail, die die abgefragte Domain verwendet und die DMARC-Prüfung nicht besteht. Gilt für die abgefragte Domain und für deren Subdomains, sofern sp oder np nichts anderes sagt. Nicht anwendbar auf Records für das Reporting an Dritte.
sp
OPTIONAL
fällt auf p zurück
none, quarantine, reject
Policy für existierende Subdomains der maßgeblichen Organisationsdomain, nicht für die Organisationsdomain selbst. Wird bei Records ignoriert, die auf Subdomains von Organisationsdomains und von PSDs veröffentlicht sind — eine Folge davon, wie die Policy-Ermittlung arbeitet.
np
OPTIONAL
fällt auf sp zurück, sofern vorhanden, sonst auf p
none, quarantine, reject
Policy für nicht existierende Subdomains der maßgeblichen Organisationsdomain. Gilt ausschließlich für nicht existierende Subdomains — nicht für existierende Subdomains und nicht für die Domain selbst.
adkim
OPTIONAL
r
r (relaxed), s (strict)
Ob die DKIM-Identifier-Ausrichtung (Alignment) im Modus strict oder relaxed bewertet wird.
aspf
OPTIONAL
r
r (relaxed), s (strict)
Ob die SPF-Identifier-Ausrichtung im Modus strict oder relaxed bewertet wird.
rua
OPTIONAL
kein Vorgabewert; fehlt das Tag, gibt es keine Reports
kommaseparierte Liste von URIs
Wohin Aggregate-Reports gesendet werden. Es kann jede gültige URI angegeben werden, und ein Empfänger, der Aggregate-Reports versendet, MUSS mailto: unterstützen. Ist das Tag nicht vorhanden, DÜRFEN Empfänger für die Domain KEINE Aggregate-Reports erzeugen. URI-Schemata, die ein Empfänger nicht unterstützt, MÜSSEN ignoriert werden.
ruf
OPTIONAL
kein Vorgabewert; fehlt das Tag, gibt es keine Reports
kommaseparierte Liste von URIs
Wohin nachrichtenbezogene Failure-Reports gesendet werden. mailto: MUSS von jedem Empfänger unterstützt werden, der Failure-Reports versendet. Ist das Tag nicht vorhanden, DÜRFEN Empfänger für die Domain KEINE Failure-Reports erzeugen. Nicht unterstützte Schemata MÜSSEN ignoriert werden.
fo
OPTIONAL
0
0, 1, d, s — doppelpunktsepariert; 0 und 1 schließen einander aus; d und s dürfen je höchstens einmal vorkommen
Fordert an, welche Fehlerbedingungen einen Failure-Report erzeugen sollen. 0 meldet, wenn alle zugrunde liegenden Mechanismen keinen ausgerichteten Pass ergeben; 1 meldet, wenn irgendein Mechanismus keinen ausgerichteten Pass ergibt; d fordert einen DKIM-Failure-Report für eine Signatur an, deren Prüfung fehlschlug, unabhängig von der Ausrichtung; s fordert einen SPF-Failure-Report für eine fehlgeschlagene SPF-Auswertung an, ebenfalls unabhängig von der Ausrichtung. Der Inhalt dieses Tags MUSS ignoriert werden, wenn nicht auch ein ruf-Tag angegeben ist.
psd
OPTIONAL
u
y, n, u
Kennzeichnet, ob die Domain eine Public-Suffix-Domain ist. y wird von einer PSO veröffentlicht und dient bei der Policy-Ermittlung dazu, die Organisationsdomain und die DMARC-Policy-Domain zu bestimmen. n sagt aus, dass die Domain keine PSD ist, sondern die Organisationsdomain für sich selbst und ihre Subdomains. u, der Vorgabewert, sagt ebenfalls aus, dass die Domain keine PSD ist, lässt aber offen, ob sie die Organisationsdomain für sich selbst und ihre Subdomains ist — das überlässt er dem Tree Walk.
t
OPTIONAL
n
y, n
Policy-Testmodus. y bittet den Validator darum, die deklarierte Policy nicht anzuwenden, wohl aber etwaige eigene Sonderbehandlungsregeln wie das Umschreiben des From-Headerfelds; der Domaininhaber erwartet, dass fehlschlagende Nachrichten eine Stufe unterhalb der deklarierten Policy erhalten — aus quarantine wird none, aus reject wird quarantine —, unabhängig von jeder solchen Sonderbehandlung. n, der Vorgabewert, bittet darum, die deklarierte Policy so anzuwenden, wie sie geschrieben steht. Das Tag beeinflusst die Report-Erzeugung nicht und hat bei einer Policy von none keine Wirkung.
Vier dieser Zeilen beschreiben ein Verhalten, das eine Tabellenzelle zwar nennt, ein Leser aber gern überspringt. Es sind die, die aus einem Record am häufigsten etwas anderes machen, als er zu sein scheint.
p ist empfohlen, nicht erforderlich
RFC 9989 §4.7 kennzeichnet p für DMARC-Policy-Records als RECOMMENDED und hält fest, dass ein ansonsten syntaktisch gültiger Record ohne dieses Tag behandelt wird, als enthielte er p=none. Ein Record v=DMARC1; rua=mailto:dmarc@example.com ist deshalb gültig, ist kein Syntaxfehler und verhält sich wie Monitoring. §4.7 merkt außerdem an, dass p auf Records für das Reporting an Dritte nicht anwendbar ist — deshalb tragen solche Records legitim überhaupt keine Policy.
fo ohne ruf bewirkt nichts
§4.7 legt fest, dass der Inhalt des fo-Tags ignoriert werden MUSS, wenn nicht auch ein ruf-Tag angegeben ist. v=DMARC1; p=reject; fo=1 ist ein Record, dessen fo-Wert kein konformer Empfänger beachten wird, weil es keinen Ort gibt, an den der Report gehen könnte. Der Vorgabewert ist 0, und der zählt erst, sobald ruf existiert.
sp wirkt nur dort, wo es gelesen wird
§4.7 merkt an, dass sp bei Records ignoriert wird, die auf Subdomains von Organisationsdomains und von PSDs veröffentlicht sind — wegen der Funktionsweise der Policy-Ermittlung in §4.10.1: Ein Record, der bei der Author Domain gefunden wird, liefert seine Policy aus p, und sp wird nur dann herangezogen, wenn der maßgebliche Record weiter oben im Baum gefunden wurde. sp=reject auf mail.example.com zu veröffentlichen, um a.mail.example.com zu regeln, ist eine verbreitete Konstruktion ohne jede Wirkung.
np ist enger, als es aussieht
§4.7 beschränkt np auf nicht existierende Subdomains der abgefragten Organisationsdomain — nicht auf existierende Subdomains und nicht auf die Domain selbst. Es ist das Tag für die Angriffsfläche geparkter Namen, keine strengere Fassung von sp. Fehlt np, gilt für nicht existierende Subdomains die Policy aus sp, sofern sp vorhanden ist, andernfalls die Policy aus p.
Eine weitere Folge aus §4.7, die in keine Tabellenzelle recht hineinpasst: Nur Tags aus dem Registry werden verarbeitet, unbekannte Tags MÜSSEN ignoriert werden. Jedes Tag, das Ihnen in freier Wildbahn begegnet ist und in der Tabelle oben nicht vorkommt — Anbieter-Präfixe, Kommentar-Tags, erfundene Optionen —, wird von konformen Empfängern verworfen, bevor die Policy ausgewertet wird.
Entfernte und historische Tags
Die folgenden Tags sind nicht „veraltet, aber weiterhin beachtet". RFC 9989 §C.5.2 führt sie als aus der Spezifikation entfernt auf, und das IANA-Registry der DMARC-Tags in §9.3 führt sie mit dem Status historic, den §9.3 als veraltet und in keiner aktuellen Implementierung mehr zu erwarten definiert. Sie gehören nicht zu den elf gültigen Tags aus §4.7, weshalb ein Empfänger, der RFC 9989 umsetzt, für sie keine definierte Behandlung hat. Ob sie für Sie noch irgendetwas bewirken, hängt ausschließlich davon ab, wie viele Mailsysteme Ihrer Empfänger noch das ältere Verhalten nach RFC 7489 zeigen — und das können Sie weder beobachten noch steuern noch einplanen.
Tag
Was es bewirkte
Status seit RFC 9989
Was stattdessen zu tun ist
pct
Forderte an, die Policy nur auf einen Prozentsatz der fehlschlagenden Nachrichten anzuwenden. RFC 7489 definierte es als ganze Zahl von 0 bis einschließlich 100, Vorgabewert 100.
Nur für pct=0: t=y verwenden. Für jeden anderen Wert gibt es keinen Nachfolger — siehe unten.
rf
Forderte das Format der Failure-Reports an. RFC 7489 definierte es als doppelpunktseparierte Liste mit dem Vorgabewert afrf und hielt fest, dass afrf das einzige in jener Version unterstützte Format war.
Nichts veröffentlichen. afrf bleibt der einzige Eintrag im Registry der DMARC-Report-Formate, mit Status active (RFC 9989 §9.4), und das Format der Failure-Reports ist in RFC 9991 definiert, das das in RFC 6591 beschriebene Reporting-Format aktualisiert (RFC 9991 §4).
ri
Forderte ein Intervall zwischen Aggregate-Reports in Sekunden an. RFC 7489 definierte es als vorzeichenlose 32-Bit-Ganzzahl mit dem Vorgabewert 86400 und behandelte alles außer einem täglichen Report als Best Effort.
Nichts veröffentlichen. RFC 9990 §3.1 beschreibt Aggregate-Feedback als tägliche oder häufigere Reports und definiert kein Tag, mit dem ein Domaininhaber ein anderes Intervall anfordern könnte.
!size-Suffix an einer Report-URI rua=mailto:d@example.com!10m
Hängte an eine einzelne Report-URI eine maximale Reportgröße an. RFC 7489 §6.2 definierte die Syntax als Ausrufezeichen gefolgt von einer Maximalgrößen-Angabe, und §6.4 definierte die Einheiten als Zweierpotenzen, sodass !10m zehnmal 2^20 Bytes bedeutete.
Obsolete Syntax. Die Grammatik in RFC 9989 §4.8 parst sie weiterhin, als obs-dmarc-uri und obs-dmarc-report-size, doch die begleitende Anmerkung besagt, dass Reporter die Größe ignorieren sollten, wenn sie sie in einem Policy-Record vorfinden.
Das Suffix entfernen. RFC 9990 §3.5.2 verlagert das Größenproblem stattdessen auf den Erzeuger des Reports: Das Aggregate-XML SOLLTE gzip-komprimiert werden, weil ein Verzicht auf Kompression die Nachricht über das SMTP-Größenlimit des empfangenden Servers hinausschieben kann. Beachten Sie, dass ein Ausrufezeichen, das tatsächlich Teil einer URI ist, kodiert werden MUSS (RFC 9989 §4.8).
Was t=y tatsächlich ersetzt hat — und was nicht
Der mit Abstand häufigste Fehler in DMARC-Dokumentation ist die Behauptung, t=y sei der moderne Weg zu einem prozentualen Rollout. Das ist es nicht. RFC 9989 §C.5.1 trägt t mit der Beschreibung „Replacement for some 'pct' tag functionality" ein, und Anhang A.6 legt genau dar, welcher Teil gemeint ist.
Laut Anhang A.6 zeigte die betriebliche Erfahrung, dass pct in der Regel nicht genau angewendet wurde, sofern der Wert nicht 0 oder 100 war, und dass die Ungenauigkeiten bei anderen Werten von Implementierung zu Implementierung stark schwankten. Der Wert 100 war der Vorgabewert und erforderte keine gesonderte Verarbeitung. Der Wert 0 hatte eine unbeabsichtigte zweite Bedeutung angenommen: Manche Vermittler und Mailbox-Provider nutzten ihn als Signal, vom Standardverhalten abzuweichen, meist indem sie das From-Headerfeld umschrieben, um nachgelagerte DMARC-Fehlschläge zu vermeiden. Dieses Verhalten erwies sich als tatsächlich nützlich, weil ein Vergleich der Aggregate-Reports vor und nach der Veröffentlichung von pct=0 einem Domaininhaber erlaubte abzuleiten, wie viel seines Verkehrs über Vermittler läuft, die das From-Headerfeld nicht umschreiben. Anhang A.6 kommt zu dem Schluss, dass es keinen Sinn ergab, ein Tag namens pct beizubehalten, das nur zwei nützliche Werte hatte, und führt t mit den Werten y und n ein, die in ihrer Anwendung den pct-Werten 0 beziehungsweise 100 entsprechen.
Lesen Sie den Umfang davon genau. Die beiden Endpunkte wurden übernommen. Der Bereich dazwischen nicht. Es gibt in RFC 9989 kein Tag, das pct=50 ausdrückt, keine Kombination der elf gültigen Tags, die dem nahekommt, und nirgends in der Spezifikation eine Aussage, dass ein teilweiser Rollout auf anderem Weg möglich bliebe. Ein stufenweiser Rollout bewegt sich unter RFC 9989 durch die Policy-Stufen — none, dann quarantine, dann reject, wahlweise mit t=y, um jede neue Stufe eine Stufe darunter zu halten, während Sie die Reports lesen — nicht durch Bruchteile Ihres Mailstroms.
Wenn Ihr Record noch ein pct-Tag trägt
Es zu entfernen ist richtig, aber die Reihenfolge der Schritte zählt, denn Ihre Empfänger betreiben nicht alle dieselbe DMARC-Version.
Ein Empfänger, der RFC 9989 umsetzt, hat für pct keine definierte Behandlung: Es gehört nicht zu den elf gültigen Tags aus §4.7, und das Registry führt es als historic (§9.3). Für diesen Empfänger liest sich Ihr Record bereits als glattes p=reject, angewendet auf jede fehlschlagende Nachricht. Ein Empfänger, der noch RFC 7489 umsetzt, liest das Tag und wendet Ihre Policy auf den angeforderten Anteil an. Ein Record wie v=DMARC1; p=reject; pct=25 ist also kein 25-Prozent-Rollout. Er ist volles Enforcement bei jedem aktualisierten Empfänger und ein Viertel-Enforcement beim Rest, wobei die Aufteilung von den Aktualisierungsplänen anderer Leute bestimmt wird.
Das Tag zu löschen schließt diese Lücke, indem es die zweite Gruppe auf das Verhalten der ersten bringt: RFC 7489 gab pct den Vorgabewert 100, sodass ein Empfänger nach altem Stand, der das Tag nicht mehr sieht, darauf zurückfällt, Ihre Policy auf die gesamte fehlschlagende Mail anzuwenden. Die Änderung wirkt augenblicklich, und sie ist nicht graduell. War Ihre Rampe echt — schützte pct=25 also einen Mailstrom, dessen Authentifizierung Sie noch nicht abgeschlossen hatten —, dann endet dieser Schutz für den Altbestand Ihrer Empfänger genau in dem Moment, in dem Sie das Tag löschen.
Die Reihenfolge, die eine Überraschung vermeidet, lautet daher: Lesen Sie zuerst Ihre Aggregate-Reports und bestätigen Sie, dass die legitimen Quellen, die Sie kennen, ausgerichtete Passes erzeugen; nehmen Sie die aktualisierten Empfänger als Maßstab, denn sie setzen bereits vollständig durch, und ihre Reports zeigen Ihnen, was volles Enforcement kostet; entfernen Sie dann pct. Zeigen die Reports Quellen, die Sie noch nicht in Ordnung gebracht haben, ist die Antwort, p auf quarantine oder none zurückzunehmen oder t=y zu setzen und die Arbeit der Policy-Stufe zu überlassen. Diese Mechanismen sind definiert, über alle Empfänger hinweg einheitlich und in den Reports sichtbar. Ein Prozentsatz ist nichts davon mehr.
Die eine saubere Übersetzung ist pct=0 → t=y, und sie ist die einzige, die Anhang A.6 erhalten hat — über die beiden Empfängerpopulationen hinweg ist sie aber kein Eins-zu-eins-Tausch. Bei einem RFC-9989-Empfänger geht der Record eine Stufe hinunter: pct ist dort ein unbekanntes Tag, Ihr p galt also voll, und t=y bittet um eine Stufe darunter (§4.7). Bei einem RFC-7489-Empfänger geht er in die andere Richtung, eine Stufe hinauf: Nach §6.6.4 wird nicht ausgewählte Mail bei reject wie quarantine behandelt und bei quarantine der normalen lokalen Einstufung überlassen — nach dem Tausch ist auch dort t ein unbekanntes Tag, pct fällt auf seinen Vorgabewert 100 zurück, und Ihr p gilt voll.
Der DNS Tree Walk: welche Policy tatsächlich gilt
Bevor ein Empfänger irgendeine Policy auf eine Nachricht anwenden kann, muss er entscheiden, welcher DMARC-Record für diese Nachricht maßgeblich ist. RFC 9989 beantwortet das mit einem Algorithmus namens DNS Tree Walk (Abschnitt 4.10). Er ersetzt den Nachschlag in der Public Suffix List aus RFC 7489, und bei Domains, die Records auf mehr als einer Ebene veröffentlichen, kann er zu einem anderen Ergebnis kommen als die Liste.
Derselbe Walk beantwortet zwei verschiedene Fragen. Die Policy-Ermittlung (Abschnitt 4.10.1) fragt, welcher Record für die Author Domain gilt — die Domain im From-Header der Nachricht. Die Bewertung der Identifier-Ausrichtung (Alignment, Abschnitt 4.10.2) fragt, zu welcher Organisationsdomain die Author Domain und jeder authentifizierte Identifier gehören, damit über relaxed Ausrichtung entschieden werden kann. Die Mechanik ist identisch; nur der Startname unterscheidet sich, und Abschnitt 4.10.2 zählt die möglichen Startpunkte auf: die Author Domain, den SPF-authentifizierten Identifier, falls SPF bestanden hat, und jeden DKIM-authentifizierten Identifier, der bestanden hat.
Was der Empfänger tatsächlich abfragt
Abschnitt 4.10 formuliert das Verfahren in sieben Schritten. In der Diktion des RFC, mit den DMARC-spezifischen Teilen ausbuchstabiert:
Das DNS am Startnamen nach einem TXT-Record abfragen, der dem Format eines DMARC-Policy-Records entspricht. Für die Policy-Ermittlung ist dieser Startname die unmittelbare Elterndomain der Author Domain mit vorangestelltem Label _dmarc, sofern die Author Domain acht oder weniger Labels hat, andernfalls der Name, der aus der Verkürzung in Schritt 3 hervorgeht; die Abfrage an der Author Domain selbst erfolgt, bevor der Walk beginnt (Abschnitt 4.10.1). Zurück kommt eine möglicherweise leere Menge von Records.
Jeden Record verwerfen, der nicht mit einem v-Tag beginnt, das die aktuelle DMARC-Version bezeichnet. Wird für einen einzelnen Namen mehr als ein DMARC-Policy-Record zurückgegeben, alle davon verwerfen. Bleibt ein einzelner Record übrig und enthält er psd=n oder psd=y, anhalten.
Den betrachteten Namen in geordnete Labels zerlegen, die Anzahl der Labels x zuweisen und die Labels von rechts nach links durchnummerieren. Für a.mail.example.com ist x gleich 4, com ist Label 1, example ist Label 2, mail ist Label 3.
Ist x < 8, das am weitesten links stehende (höchstnummerierte) Label entfernen. Ist x >= 8, so lange Labels von links entfernen, bis sieben Labels übrig sind. Das Ergebnis ist der nächste abzufragende Name.
Das DNS an diesem Namen nach einem DMARC-Policy-Record abfragen.
Dieselbe Verwerfungs- und Abbruchprüfung anwenden wie in Schritt 2.
Das am weitesten links stehende Label vom vorherigen Ziel entfernen und die Schritte 5 bis 7 wiederholen, bis der Walk anhält oder keine Labels mehr übrig sind.
Nichts an diesem Verfahren hält an einer Registry-Grenze an. Wird kein psd-Tag angetroffen, läuft der Walk oben aus dem Baum heraus: Der zuletzt abgefragte Name ist die einlabelige Top-Level-Domain, zum Beispiel _dmarc.com. Das ist Absicht, denn ein Public-Suffix-Betreiber darf einen Record veröffentlichen, und der Walk muss ihn finden können.
Ein doppelter _dmarc-TXT-Record ist kein Gleichstand, den eine Seite gewinnt. Schritt 2 und Schritt 6 aus Abschnitt 4.10 sagen: Werden für einen einzelnen Namen mehrere DMARC-Policy-Records zurückgegeben, werden sie alle verworfen. Der Empfänger verhält sich dann so, als hätte dieser Name gar keinen Record, und läuft weiter nach oben — ein Überbleibsel aus einer Migration kann Ihre Subdomains also einer Policy überantworten, die oberhalb von Ihnen veröffentlicht ist. Unbeteiligte TXT-Records am selben Namen sind harmlos: Sie werden zuerst verworfen, weil sie nicht mit dem v-Tag beginnen.
Das Limit von acht Abfragen und die Label-Abkürzung
Abschnitt 4.10 erklärt, warum es das Limit gibt. Weil der Walk eine Folge von DNS-Abfragen ist, die von einem Namen gesteuert wird, den der Absender kontrolliert, könnte ein böswilliger Domaininhaber Mail mit Author Domains aus Dutzenden oder Hunderten Labels versenden, um einen Denial-of-Service-Angriff auf den Empfänger zu fahren. Die Abkürzung in Schritt 4 ist der Schutz: Author Domains mit mehr als acht Labels führen nicht zu mehr als acht DNS-Abfragen. Acht wurde gewählt, weil beobachtete Daten zum Zeitpunkt der Veröffentlichung Author Domains mit bis zu sieben Labels im Einsatz zeigten — mit Luft nach oben.
Die genaue Regel ist die aus Schritt 4, und sie ist ein Sprung, kein Herunterzählen. Hat der betrachtete Name acht oder mehr Labels, entfernt der Empfänger nicht ein Label; er entfernt Labels, bis genau sieben übrig sind. Jeder Name zwischen der Author Domain und diesem siebenlabeligen Namen wird übersprungen und nie abgefragt. Abschnitt 4.10.1 formuliert dieselbe Regel von der anderen Seite: Hat die Author Domain acht oder weniger Labels, beginnt der Walk bei ihrer unmittelbaren Elterndomain; andernfalls beginnt er bei dem Namen, der aus der Verkürzung ab Schritt 3 hervorgeht.
Der Record, der nie gesehen wird
Author Domain: mail.a.b.c.d.e.f.g.example.com (10 labels)
Record with psd=n published at: b.c.d.e.f.g.example.com ( 8 labels)
Queries the receiver makes:
_dmarc.mail.a.b.c.d.e.f.g.example.com
_dmarc.c.d.e.f.g.example.com <- jump straight to seven labels
_dmarc.d.e.f.g.example.com
_dmarc.e.f.g.example.com
_dmarc.f.g.example.com
_dmarc.g.example.com
_dmarc.example.com
_dmarc.com
Das ist das Beispiel aus Abschnitt 5.1.8, der genau diese Konfiguration für große Organisationen mit dezentraler DNS-Verwaltung beschreibt: ein Record am Apex example.com, eine Abteilung, die an einem Zonenschnitt mit psd=n ihre eigene Organisationsdomain erklärt, und darunter eine Author Domain. Zwei Namen werden übersprungen, a.b.c.d.e.f.g.example.com und b.c.d.e.f.g.example.com, und der Record der Abteilung ist einer davon.
Der Record am Zonenschnitt wird nie gefunden. Abschnitt 5.1.8 nennt die Abhilfe als MUSS-Vorgabe: Wer möchte, dass ein bestimmter DMARC-Record auf eine Author Domain mit mehr als acht Labels angewendet wird, muss einen Record an dieser Author Domain selbst veröffentlichen, denn dieser Name wird immer abgefragt, bevor der Walk beginnt.
psd=y und psd=n als Abbruchbedingungen
Das psd-Tag ist das Einzige, was einen Walk vorzeitig anhalten kann. Abschnitt 4.7 definiert drei Werte. psd=y wird von einem Public-Suffix-Betreiber veröffentlicht, um zu erklären, dass der Name eine Public-Suffix-Domain ist. psd=n erklärt, dass der Name keine Public-Suffix-Domain ist, wohl aber die Organisationsdomain für sich selbst und seine Subdomains. psd=u ist die Voreinstellung und bedeutet, dass der Walk entscheidet.
Ist der Walk beendet, wählt Abschnitt 4.10.2 die Organisationsdomain unter den Namen aus, die gültige Records geliefert haben, und betrachtet sie vom längsten zum kürzesten:
Ein Record mit psd=n macht diesen Namen zur Organisationsdomain, und die Auswahl endet.
Ein Record mit psd=y an einem anderen Namen als dem, an dem der Walk begonnen hat, macht den Namen ein Label darunter in der DNS-Hierarchie zur Organisationsdomain, und die Auswahl endet. Bei Namen innerhalb des Budgets von acht Abfragen ist das der Name, den der Walk unmittelbar davor abgefragt hat.
Andernfalls gewinnt der Record, der am Namen mit den wenigsten Labels gefunden wurde, und dieser Name ist die Organisationsdomain.
Führt keine der drei Regeln zu einer Antwort, ist die ursprüngliche Zieldomain die Organisationsdomain. Beachten Sie, was Regel 3 für einen Record bedeutet, der zwischen der Author Domain und dem Apex sitzt: Ohne psd-Tag gewinnt er nicht allein dadurch, dass er der Author Domain näher ist. Anhang B.4.1 buchstabiert das mit Records sowohl an signing.example.com als auch an example.com aus, wobei example.com die Organisationsdomain ist, weil es die wenigsten Labels hat.
Nehmen Sie eine Nachricht, deren Author Domain mail.eu.corp.example.co.uk ist. Das sind sechs Labels, die Abkürzung bei acht Abfragen greift also nie, und der Walk entfernt ein Label nach dem anderen. Angenommen, das DNS sieht so aus:
Das ist die erste Abfrage der Policy-Ermittlung (Abschnitt 4.10.1), nicht Teil des Walks. Es wird nichts gefunden, also ist ein Walk nötig. Die Author Domain hat sechs Labels, der Walk beginnt daher bei ihrer unmittelbaren Elterndomain.
2
_dmarc.eu.corp.example.co.uk
Kein DMARC-Record
Leere Menge, nichts zu behalten. Das am weitesten links stehende Label entfernen und erneut abfragen.
3
_dmarc.corp.example.co.uk
v=DMARC1; p=none; rua=...
Ein einzelner gültiger Record, wird als Kandidat behalten. Kein psd-Tag, also gilt die Voreinstellung u, und der Walk hält hier nicht an.
4
_dmarc.example.co.uk
v=DMARC1; p=reject; sp=quarantine; rua=...
Ein zweiter Kandidat, mit weniger Labels als der aus Abfrage 3. Immer noch kein psd-Tag, der Walk läuft also weiter.
5
_dmarc.co.uk
v=DMARC1; p=none; psd=y; rua=...
Ein einzelner gültiger Record mit psd=y. Schritt 6 aus Abschnitt 4.10 hält den Walk hier an. _dmarc.uk wird nie abgefragt. Insgesamt fünf Abfragen.
Welcher Name die Organisationsdomain ist. Abschnitt 4.10.2, angewandt auf die Namen, die Records geliefert haben, vom längsten zum kürzesten: corp.example.co.uk hat kein psd-Tag, example.co.uk hat kein psd-Tag, und co.uk hat psd=y und ist nicht der Name, an dem der Walk begonnen hat. Regel 2 greift, und die Organisationsdomain ist der Name ein Label unterhalb von co.uk auf diesem Pfad: example.co.uk.
Welcher Record maßgeblich ist. Abschnitt 4.10.1 ordnet die Kandidaten nach Vorrang: die Author Domain, dann die Organisationsdomain der Author Domain, dann die PSD der Author Domain. An der Author Domain gibt es keinen Record, also wird der Record an example.co.uk angewendet. Die Author Domain ist eine Subdomain davon und existiert im DNS, die Bewertungs-Policy kommt daher aus dem sp-Tag dieses Records: quarantine. Existierte die Author Domain nicht, würde stattdessen np herangezogen; ist keines der beiden Tags vorhanden, gälte p auch für Subdomains.
Welche Records leer ausgehen. Zwei der drei veröffentlichten Records entscheiden über diese Nachricht nicht. Das p=reject an example.co.uk ist nicht die angewendete Policy, weil sp für Subdomains der Organisationsdomain Vorrang hat. Und der Record an corp.example.co.uk spielt überhaupt keine Rolle: Er liegt weder an der Author Domain noch an der Organisationsdomain, also wird für diese Nachricht weder seine Policy noch seine Reporting-Adresse verwendet. Die DMARC Policy Domain ist hier (Abschnitt 3.2.5) example.co.uk, und genau diesen Namen meldet ein Empfänger im Aggregate-Report zurück.
Dieselbe Nachricht mit psd=n eine Ebene tiefer
Ändern Sie eine einzige Sache: Das Team, das corp.example.co.uk betreibt, ergänzt seinen Record um psd=n. Sonst ändert sich in der Zone nichts.
#
Abgefragter Name
Ergebnis
Konsequenz
1
_dmarc.mail.eu.corp.example.co.uk
Kein DMARC-Record
Der Walk beginnt bei der unmittelbaren Elterndomain.
2
_dmarc.eu.corp.example.co.uk
Kein DMARC-Record
Ein Label entfernen, erneut abfragen.
3
_dmarc.corp.example.co.uk
v=DMARC1; p=none; psd=n; rua=...
Ein einzelner gültiger Record mit psd=n. Der Walk hält an. Regel 1 aus Abschnitt 4.10.2 macht corp.example.co.uk zur Organisationsdomain, dieser Record wird also angewendet, und da kein sp-Tag vorhanden ist, gilt sein p=none für die Author Domain.
Drei Abfragen statt fünf, und das Ergebnis für die Nachricht kippt von quarantine auf none. Der Apex-Record an example.co.uk und der PSD-Record an co.uk werden nie gelesen. Ein Tag an einem Record hat die administrative Grenze eine Ebene im Baum nach unten verschoben — genau der Fall dezentraler Verwaltung, den Abschnitt 5.1.8 beschreibt.
Wenn der maßgebliche Record eine ungültige Policy enthält
Einen Record zu finden ist nicht dasselbe wie eine Policy zu haben. Abschnitt 4.10.1 legt fest, was passiert, wenn der Record, der für die Nachricht maßgeblich wäre, syntaktisch vorhanden ist, seine Policy-Tags aber unbrauchbar sind — und die Regel hat eine harte Kante.
Enthält ein abgerufener DMARC-Policy-Record kein gültiges p-Tag oder enthält er ein sp- oder np-Tag, das nicht gültig ist, dann gilt:
Ist ein rua-Tag vorhanden und enthält es mindestens eine syntaktisch gültige Reporting-URI, MUSS der Empfänger so handeln, als wäre ein Record mit p=none abgerufen worden, und die Verarbeitung fortsetzen.
Andernfalls wendet der Empfänger überhaupt keine DMARC-Verarbeitung auf die Nachricht an.
Ein Tippfehler in sp= ist damit kein lokaler Fehlschlag, der auf p zurückfällt. Auf einem Record, der zugleich keine gültige rua-URI trägt, schaltet er DMARC für diese Nachricht ab: keine Bewertung, keine Policy, kein Report. Praktisch heißt das: rua ist nicht nur eine Reporting-Funktion, sondern die Bedingung dafür, dass Ihnen ein fehlerhafter Record wenigstens noch Monitoring statt Stille einbringt.
Zwei benachbarte Regeln vervollständigen das Bild. Abschnitt 4.7 sagt: Fehlt das p-Tag in einem ansonsten syntaktisch gültigen Record, wird der Record behandelt, als enthielte er p=none, und verweist für die Einzelheiten auf Abschnitt 4.10.1; wer p ausdrücklich veröffentlicht und immer eine gültige rua mitführt, kommt mit dieser Unterscheidung gar nicht erst in Berührung. Und wenn der Walk überhaupt keinen DMARC-Record hervorbringt — also eine eindeutige Antwort statt eines vorübergehenden DNS-Fehlers —, dürfen Empfänger den DMARC-Mechanismus laut Abschnitt 4.10.1 NICHT auf die Nachricht anwenden. Abschnitt 5.3.2 formuliert denselben Schluss von der Empfängerseite: Wird kein Record gefunden, endet die DMARC-Prüfung für diese Nachricht.
Vorübergehende DNS-Fehler überlässt der RFC ausdrücklich dem Empfänger. Abschnitt 4.10.1 stellt beide Möglichkeiten nebeneinander, ohne eine zu bevorzugen: die Nachricht zustellen, um Störungen gering zu halten, oder mit einem SMTP-4yx-Code antworten, damit der sendende MTA es erneut versucht, sobald ein eindeutiges Ergebnis erreichbar ist. Sie können sich auf keines der beiden Verhalten verlassen — ein Argument dafür, die _dmarc-Namen Ihres gesamten Baums auflösbar und schnell zu halten.
PSL gegen Tree Walk: was sich für Sie ändert
Abschnitt 4.10 ist ungewöhnlich deutlich darin, warum die Public Suffix List aufgegeben wurde. RFC 7489 definierte die Organisationsdomain als die bei einem Registrar registrierte Domain und beschrieb, sie über eine PSL zu ermitteln — schrieb den Empfängern aber keine bestimmte Liste vor und gab keine Hinweise, wie oft ein Empfänger seine Kopie auffrischen sollte. Er räumte ein, dass Empfänger mit unterschiedlichen Listen Interoperabilitätsprobleme verursachen können, und regte an, die PSL durch ein zuverlässigeres und sichereres Verfahren zu ersetzen, sofern sich eines schaffen lässt. Anhang A.5 nennt das zweite Motiv: Ein unbegrenztes Hochklettern im Baum lädt zu einem Denial-of-Service-Angriff über Author Domains voller Unsinns-Labels ein — genau dagegen richtet sich die Obergrenze von acht Abfragen.
Ihre Organisationsdomain ist jetzt etwas, das Sie veröffentlichen
Abschnitt 3.2.14 definiert die Organisationsdomain nicht mehr über die Registrierung. Er definiert sie als die Domain an der Spitze der Namensraum-Hierarchie eines Namens, die zugleich derselben administrativen Zuständigkeit unterliegt wie dieser Name, und stellt fest, dass sie durch Anwendung des Algorithmus aus Abschnitt 4.10 bestimmt wird. Die Grenze ergibt sich jetzt daraus, wo DMARC-Records existieren, und nicht aus einem Eintrag in einer Liste, über die Sie keine Kontrolle haben.
Im Normalfall stimmen beide Verfahren überein. Veröffentlicht Ihr Apex einen Record, veröffentlicht nichts zwischen Apex und Ihren sendenden Namen einen, und veröffentlicht keine PSD oberhalb von Ihnen einen, dann landet der Walk auf Ihrem Apex — genau das, was die PSL zurückgegeben hätte. Die Antworten gehen genau dort auseinander, wo Records auf anderen Ebenen existieren, und darum geht es im Rest dieses Abschnitts.
Was der Tree Walk in Ihre Hand legt
Die Organisationsdomain jedes Ihrer Namen ergibt sich aus Records, die Sie veröffentlichen, nicht aus einer Liste Dritter (Abschnitte 3.2.14 und 4.10).
Eine Abteilung kann mit psd=n jeden Knoten in ihrem Teilbaum zur eigenen Organisationsdomain erklären, um andere Policy-Einstellungen oder andere Reporting-URIs zu fahren als der Apex-Record (Abschnitt 5.1.8).
Veröffentlicht eine PSD oberhalb von Ihnen einen Record ohne das zugehörige psd=y-Tag, können Sie einen Empfänger daran hindern, sie für Ihre Organisationsdomain zu halten, indem Sie Ihrem eigenen Record psd=n hinzufügen (Abschnitt 11.8).
Die Ermittlung ist begrenzt und vorhersagbar: höchstens acht Abfragen, gleichgültig was der Absender in die From-Domain schreibt (Abschnitt 4.10).
Was er nicht leistet
Er lässt einen Record weiter unten im Baum nicht allein durch Nähe über den Apex siegen. Ohne psd=n gewinnt der Record mit den wenigsten Labels (Abschnitt 4.10.2, Regel 3; Anhang B.4.1).
Er reicht nicht über das Abfragebudget hinaus. Ein Record an einem Namen, den die Abkürzung überspringt, wird nie gefunden — und Abschnitt 5.1.8 macht das Veröffentlichen an der Author Domain selbst in diesem Fall zur MUSS-Vorgabe.
Er bringt sp nicht dazu, auf einem Subdomain-Record zu wirken. Abschnitt 4.7 sagt, dass sp auf Records ignoriert wird, die auf Subdomains von Organisationsdomains und PSDs veröffentlicht sind.
Er nimmt Empfängern nicht den Ermessensspielraum bei DNS-Fehlern. Vorübergehende Fehler dürfen als fail open oder als fail closed behandelt werden (Abschnitt 4.10.1).
sp gilt an der Organisationsdomain und wird darunter ignoriert
Abschnitt 4.7 definiert sp als die Bewertungs-Policy für existierende Subdomains der jeweiligen Organisationsdomain; sie gilt nur für existierende Subdomains der Organisationsdomain der Nachricht und nicht für die Organisationsdomain selbst. Dieselbe Tag-Definition benennt dann die betriebliche Folge direkt: sp wird bei DMARC-Records ignoriert, die auf Subdomains von Organisationsdomains und PSDs veröffentlicht sind — wegen der Wirkung der Policy-Ermittlung aus Abschnitt 4.10.1.
Zwei Fälle machen das greifbar, unter der Annahme, dass example.com die Organisationsdomain ist und corp.example.com ebenfalls einen Record veröffentlicht:
Author Domain der Nachricht
Angewendeter Record
Policy stammt aus
corp.example.com
Der Record an corp.example.com, gefunden von der ersten Abfrage der Policy-Ermittlung
Seinem p-Tag. Abschnitt 4.10.1: Ist der angewendete Record der der Author Domain, kommt die Policy aus p. Sein eigenes sp wird nicht herangezogen.
mail.corp.example.com
Der Record an example.com, weil das die Organisationsdomain ist
Dem sp-Tag des example.com-Records, oder np, falls die Author Domain nicht existiert, oder p, falls keines von beiden vorhanden ist. Das sp an corp.example.com wird nicht herangezogen.
Ein sp-Tag an corp.example.com bewirkt überhaupt nur dann etwas, wenn corp.example.com selbst die Organisationsdomain ist — was nach Abschnitt 4.10.2 heißt, dass es entweder psd=n trägt oder der kürzeste Name im Walk ist, der einen Record geliefert hat. sp=reject auf einer Subdomain zu veröffentlichen und zu erwarten, dass es die Namen darunter schützt, ist der häufigste Weg zu einer Policy, die nie angewendet wird.
psd=n macht einen Namen zur Organisationsdomain für sich und alles darunter
Abschnitt 4.7 definiert psd=n als Record, der für eine Domain veröffentlicht wird, die keine PSD ist, aber die Organisationsdomain für sich selbst und ihre Subdomains. Er tut zweierlei auf einmal: Er hält den Walk an diesem Namen an (Abschnitt 4.10, Schritte 2 und 6), und er gewinnt die Auswahl der Organisationsdomain unmittelbar als Regel 1 aus Abschnitt 4.10.2 — vor jedem psd=y oberhalb und vor der Regel der wenigsten Labels.
Abschnitt 5.1.8 nennt den vorgesehenen Zweck: In einer Organisation, die Teilbäume ihres Namensraums an lokale Abteilungen delegiert, erlaubt psd=n einer Abteilung, eine eigene Organisationsdomain zu erklären — typischerweise, weil sie andere Policy-Einstellungen oder andere Reporting-URIs möchte als der Apex-Record. Abschnitt 11.8 nennt einen defensiven Zweck: Veröffentlicht eine PSD oberhalb Ihrer Domain einen DMARC-Record ohne das zugehörige psd=y-Tag, kann ein Empfänger daraus schließen, dass die PSD Ihre Organisationsdomain ist — was relaxed Ausrichtung über Ihre administrative Grenze hinaus ausweitet; psd=n in Ihrem eigenen Record nimmt diese Möglichkeit weg. Abschnitt 11.8 empfiehlt außerdem, die DMARC-Records der PSDs oberhalb von Ihnen regelmäßig zu prüfen, da Sie keinen Einfluss darauf haben, wann sie sich ändern.
psd=n schneidet den Teilbaum in beide Richtungen los. Relaxed Ausrichtung ist in Abschnitt 3.2.10.1 dadurch definiert, dass die Author Domain und ein authentifizierter Identifier dieselbe Organisationsdomain haben. Sobald corp.example.com ein psd=n trägt, haben Namen darunter corp.example.com als Organisationsdomain, während Namen unter dem Apex weiterhin example.com haben — eine DKIM-Signatur mit d=mail.example.com ist damit gegenüber einer Author Domain mail.corp.example.com auch relaxed nicht mehr ausgerichtet. Setzen Sie das Tag, wenn Sie diese Trennung wollen, nicht um DNS-Abfragen zu sparen.
Was ein Record auf einer Subdomain beendet — und was nicht
Hier lohnt sich Genauigkeit, denn die Kurzfassung „ein Record auf einer Subdomain beendet den Walk" trifft nur in bestimmten Fällen zu.
An der Author Domain selbst endet die Ermittlung, bevor der Walk beginnt. Abschnitt 4.10.1 startet mit einer Abfrage auf _dmarc vor der Author Domain, und wird dort ein gültiger Record gefunden, ist das der angewendete Record. Sein p-Tag liefert die Policy. Das ist die einzige Platzierung, die garantiert, dass ein bestimmter Record für einen bestimmten sendenden Namen gilt, und Abschnitt 5.1.8 macht sie für Author Domains mit mehr als acht Labels zur MUSS-Vorgabe.
An einem Zwischen-Namen beendet nur psd den Walk. Die Schritte 2 und 6 aus Abschnitt 4.10 halten ausschließlich bei psd=n oder psd=y an. Ein Record ohne psd-Tag wird als Kandidat behalten, und der Walk läuft darüber hinaus weiter.
Ein Zwischen-Record wird nur herangezogen, wenn er die Auswahl gewinnt. Nach Regel 3 aus Abschnitt 4.10.2 heißt das: der Record, der am Namen mit den wenigsten Labels gefunden wurde. Anhang B.4.1 spielt genau das durch: Records existieren sowohl an signing.example.com als auch an example.com, und example.com ist die Organisationsdomain, weil es das höchste Element im Baum mit einem Record ist.
Das Vererbungsbild lautet also nicht „der nächstgelegene Record oberhalb gewinnt". Es lautet: zuerst Ihr eigener Name, dann derjenige Record, den der Walk am höchsten findet — es sei denn, jemand auf dem Weg hat mit psd etwas anderes bestimmt. Wenn eine von Ihnen veröffentlichte Policy nie angewendet wird, liegt der Record meist an einem Namen, der weder die Author Domain noch die Organisationsdomain ist.
Nachmessen: das Feld discovery_method in Aggregate-Reports
Sie müssen nicht raten, welches Verfahren ein Empfänger gefahren hat. RFC 9990 Abschnitt 3.1.1.5 ergänzt den policy_published-Block des Aggregate-Reports um ein optionales Element namens discovery_method, das das Verfahren beschreibt, mit dem der bei der Bewertung verwendete DMARC-Policy-Record ermittelt wurde. Es hat genau zwei erlaubte Werte, festgelegt durch den Simple Type DiscoveryType im XML-Schema in Anhang A von RFC 9990: psl für das Verfahren aus RFC 7489 und treewalk für das Verfahren aus RFC 9989.
Lesen Sie es zusammen mit dem domain-Element im selben Block, das RFC 9990 Abschnitt 3.1.1.5 als DMARC Policy Domain definiert, also als den Namen, an dem der maßgebliche Record gefunden wurde (RFC 9989 Abschnitt 3.2.5). Das Paar sagt Ihnen zwei Dinge, die ein Policy-Record allein nicht sagen kann: welchen Ihrer Records dieser Empfänger tatsächlich angewendet hat und wie er dorthin gelangt ist. Wenn Sie auf mehreren Ebenen veröffentlichen, ist das das Feld, das zeigt, ob Empfänger dort landen, wo Sie es beabsichtigt haben.
Das Element ist optional. Sein Fehlen bedeutet, dass der Empfänger kein Verfahren angegeben hat — nicht, dass er die PSL verwendet hat. Aggregate-Reports von Empfängern, die weiterhin das Verfahren aus RFC 7489 fahren, sind genauso gültige Reports, und policy_published/domain bleibt in diesem Fall das verlässliche Signal, weil es den tatsächlich verwendeten Record benennt, unabhängig davon, wie er gefunden wurde.
Welche Empfänger welcher Version folgen — und was das für Ihren Record bedeutet
Seit Mai 2026 gibt es genau eine gültige DMARC-Spezifikation: RFC 9989, zusammen mit
ihren beiden Begleitdokumenten zum Aggregate-Reporting (RFC 9990) und zum
Failure-Reporting (RFC 9991). RFC 7489 ist obsolet. Der RFC Editor stellt das auf der Informationsseite des Dokuments selbst mit genau diesen Worten fest: „This RFC is now obsolete, see RFC 9989, RFC 9990, RFC 9991.“
Obsolet ist eine Aussage über das Dokument, nicht über die Software im Feld. Jeder
Record, den Sie heute veröffentlichen, wird von zwei Populationen von Empfängern
zugleich gelesen: von denen, die RFC 9989 implementiert haben, und von denen, die noch
eine RFC-7489-Implementierung betreiben. Keine der beiden Populationen gibt sich zu
erkennen. Ein Record, der unter beiden korrekt ist, ist deshalb kein Kompromiss — er ist
die einzige Art von Record, deren Verhalten Sie vorhersagen können.
Was sich im Mai 2026 tatsächlich geändert hat
Ein Detail übersieht man leicht, und es verändert, wie Sie den Übergang lesen sollten:
Es war nie Standard gegen Standard. RFC 7489 war nicht das Ergebnis eines
IETF-Arbeitsprozesses. Es wurde über den Independent Submissions Editor veröffentlicht
und als Informational eingestuft. RFC 9989 sagt das in Appendix C.1 unmissverständlich
und stellt sich selbst dem gegenüber als „an Internet Standards Track document“. Es ist
das erste DMARC-Dokument auf dem Standards Track: RFC 7489 war Informational, und
RFC 9091, das PSD DMARC eingeführt hat, war Experimental (Appendix C.3). In den elf
Jahren zwischen RFC 7489 und RFC 9989 wurde DMARC im großen Maßstab betrieben, ohne dass
eine Standards-Track-Spezifikation dahinterstand.
RFC 9989 macht RFC 7489 und RFC 9091 (das experimentelle PSD-DMARC-Dokument) obsolet.
Die praktischen Folgen für einen veröffentlichten Record liegen an vier Stellen.
Was Ihr Record sagt
Ein RFC-7489-Empfänger
Ein RFC-9989-Empfänger
pct=25
Wendet die Policy auf eine Stichprobe der fehlschlagenden Nachrichten an
Ignoriert das Tag vollständig; die volle Policy gilt für jede fehlschlagende Nachricht
Nichts — die Organisationsdomain wird abgeleitet
Abgeleitet aus einer Public Suffix List
Abgeleitet aus dem DNS-Tree-Walk (§4.10), was eine andere Antwort ergeben kann
np=reject
Unbekanntes Tag, wird ignoriert; nicht existierende Subdomains fallen auf sp oder p zurück
Wendet reject auf nicht existierende Subdomains an (§4.7)
psd=y
Unbekanntes Tag, wird ignoriert
Markiert den Namen als Public Suffix Domain und steuert den Tree Walk (§4.10.2)
t=y
Unbekanntes Tag, wird ignoriert; die volle Policy gilt
Wendet die Policy eine Stufe schwächer an (§4.7); die Ausnahme wird im Report als policy_test_mode festgehalten (RFC 9990 §3.1.6)
Keines der Tags in der rechten Spalte bringt das Parsing eines älteren Empfängers
durcheinander. Beide Spezifikationen verlangen, dass unbekannte Tags ignoriert werden,
und RFC 9989 §9.3 nennt die Entwurfsregel direkt: Tags, die zu DMARC hinzukommen,
„are to avoid changing the semantics of existing records when processed by
implementations conforming to prior specifications“. np, psd
oder t hinzuzufügen ist unbedenklich. Sich für ein Ergebnis, das Sie heute
brauchen, darauf zu verlassen, nicht.
1. pct — von der einen Population gelesen, für die andere unsichtbar
RFC 9989 hat pct entfernt (Appendix C.5.2). Die IANA-DMARC-Tags-Registry
(§9.3) führt es jetzt mit dem Status historic, zusammen mit rf und
ri. Appendix A.6 nennt den Grund, und es lohnt sich, ihn zu lesen, bevor Sie
einem ausgerollten Prozentwert vertrauen: Die Betriebserfahrung zeigte, dass das Tag
„was usually not accurately applied, unless the value specified was either 0 or 100“,
und die Ungenauigkeiten bei anderen Werten „varied widely from one implementation to
another“.
Ein Record, der heute pct=25 trägt, bedeutet also nicht, dass ein Viertel
der fehlschlagenden Mail in Quarantäne kommt. Er bedeutet, dass es bei den Empfängern,
die das Tag noch beachten, ein unbekannter Anteil ist — und bei jedem
RFC-9989-Empfänger alles davon. Die schrittweise Rampe
pct=10 → 25 → 50 ist nicht mehr teilweise
wirksam; bei der neueren Population ist sie wirkungslos. Was an ihre Stelle tritt, steht
im Abschnitt zum Rollout.
Das Tag stehen zu lassen richtet keinen Schaden an: Nach RFC 9989 §4.8 werden unbekannte
Tags ignoriert, und verirrte Syntax wird verworfen, statt den Record ungültig zu machen.
Das Risiko ist kein Defekt, sondern eine falsche Vorstellung davon, was Ihre Policy
derzeit tut.
2. Organisationsdomain — Public Suffix List gegen Tree Walk
Das ist die Abweichung mit der größten Reichweite, denn die Organisationsdomain
entscheidet über zwei getrennte Dinge: welcher Record für eine Subdomain gilt, die keinen
eigenen hat, und ob ein DKIM- oder SPF-Identifier als relaxed ausgerichtet zur
From:-Domain zählt.
RFC 7489 leitete sie aus einer Public Suffix List ab. RFC 9989 §4.10 hat das durch den
DNS-Tree-Walk ersetzt: _dmarc an sukzessive kürzeren Namen abfragen,
höchstens acht Abfragen, und die Organisationsdomain aus den tatsächlich gefundenen
Records bestimmen (§4.10.2). Die Spezifikation benennt die Folge in Appendix C.3 selbst:
„These algorithm changes introduce the possibility of interoperability issues where a
Domain Owner expects a DMARC Policy Record or an Organizational Domain to be identified
by the Tree Walk process, but a Mail Receiver using an implementation of DMARC based on
[RFC7489] and relying on a PSL might arrive at a different answer“.
Zwei Situationen führen in der Praxis zu unterschiedlichen Antworten. Die erste ist ein
Record, der auf einer Zwischenebene veröffentlicht ist: Nach §4.10.2 macht ein Record mit
psd=n genau diesen Namen zur Organisationsdomain, was ein listenbasierter
Empfänger nicht sehen kann. Die zweite ist weniger offensichtlich.
Ein listenbasierter Empfänger reduziert sowohl news.example.com als auch
bulk.example.com auf die Organisationsdomain
example.com, findet sie relaxed ausgerichtet, und die Nachricht kommt
durch.
Ein Tree-Walk-Empfänger führt §4.10.2 zweimal aus. Beginnend bei
news.example.com findet er einen Record, und zwar an genau diesem Namen,
also wird dieser Name zur Organisationsdomain. Beginnend bei
bulk.example.com findet er überhaupt keinen Record, und die Regel für
diesen Fall ist eindeutig: Die anfängliche Zieldomain ist die Organisationsdomain. Die
beiden Organisationsdomains unterscheiden sich, die Signatur ist nicht ausgerichtet,
die Nachricht schlägt fehl, und p=reject gilt für sie.
Dieselbe Nachricht kommt bei der einen Population durch und wird bei der anderen
abgewiesen — und es ist die neuere Population, die sie abweist.
Die Abhilfe ist die, um die RFC 9989 §5.1.4 ohnehin bittet: Veröffentlichen Sie auch
für die Organisationsdomain einen Record, nicht nur für die Author Domain (die Domain
im From:-Header), aus der Sie versenden. Mit einem Record an
_dmarc.example.com enden beide Tree Walks bei example.com,
und die beiden Populationen sind sich wieder einig. Appendix C.3 nennt dieselbe
Abhilfe: Das Problem „is entirely avoided by the use of strict alignment and
publishing explicit DMARC Policy Records for all Author Domains used in an
organization's email“.
3. np und psd — Tags, die die ältere Population nie gelernt hat
np setzt die Policy für nicht existierende Subdomains der
Organisationsdomain (§4.7); „nicht existierend“ hat dabei die genaue Bedeutung aus
§3.2.13, nämlich eine NXDOMAIN-Antwort. psd markiert einen Namen als Public
Suffix Domain, und RFC 9989 §5.2 verlangt, dass ein Public Suffix Operator, der einen
Record veröffentlicht, psd=y aufnimmt.
Ein RFC-7489-Empfänger ignoriert beide. Am schwersten wiegt das bei np,
denn der Rückfall ist in §4.7 ausbuchstabiert: Fehlt np, gilt die Policy aus
sp, sofern vorhanden, sonst die Policy aus p. p=none; np=reject gibt Ihnen also bei der einen Population Schutz für nicht
existierende Subdomains und bei der anderen gar keinen. Wenn Ihnen dieser Schutz wichtig ist, muss er
auch aus p oder sp kommen, nicht aus np allein.
Die Regel, die aus allen dreien folgt. Schreiben Sie einen Record, der
unter beiden Spezifikationen korrekt ist, und verlassen Sie sich für ein Ergebnis, das
Sie brauchen, nie auf ein einzelnes Tag. Konkret: Veröffentlichen Sie einen expliziten
Record für jede Author Domain, aus der Sie tatsächlich versenden, und für die
Organisationsdomain darüber, damit kein Empfänger raten muss, wo Ihr Namensraum beginnt;
tragen Sie die Policy in p und sp, die beide Populationen
lesen, und behandeln Sie np und psd als Ergänzung obendrauf;
und lesen Sie jeden pct-Wert unter 100 als Ausdruck einer Absicht, die nur
noch ein Teil des Feldes beachtet.
Die drei Policy-Stufen: none, quarantine, reject
Das p-Tag trägt, was RFC 9989 die Domain Owner Assessment Policy nennt:
Ihre Präferenz für die Behandlung von Mail, die Ihre Domain im
From:-Header verwendet und die DMARC-Validierung nicht besteht. §4.7
definiert genau drei Werte, und man sollte den Wortlaut wörtlich nehmen, denn jeder
davon sagt etwas anderes darüber aus, wie sicher Sie sind.
p=none — „The Domain Owner offers no expression of preference“
Das ist die vollständige Definition in §4.7. Es ist keine schwache Policy, es ist das
Fehlen einer Policy. RFC 9989 stützt das auf der Empfängerseite in §5.4: Ermittelte
Policies von p=none „MUST NOT modify existing mail handling processes“. Ein
Empfänger, der an der Behandlung Ihrer fehlschlagenden Mail etwas ändert, weil Sie
p=none veröffentlicht haben, verhält sich nicht konform.
Was p=none Ihnen einbringt, sind Daten. §3.2.12 definiert diesen Zustand als
Monitoring Mode — die Policy ist in der gesamten Domain und ihren Subdomains
none, und der Inhaber empfängt Aggregate-Reports und nutzt sie, um seine
Authentifizierung zu korrigieren. Ohne rua-Tag ist p=none eine
Messphase, die nichts misst.
p=quarantine — „considers such mail to be suspicious“
Der vollständige Satz in §4.7 lautet: „The Domain Owner considers such mail to be
suspicious. It is possible the mail is valid, although the failure creates a significant
concern.“ Das Eingeständnis, dass die Mail gültig sein könnte, ist der Sinn dieser Stufe.
Sie bitten darum, die Nachricht mit Misstrauen zu behandeln, nicht sie zu vernichten,
weil Sie noch nicht sicher sind, dass sich alles Legitime authentifiziert.
Was Misstrauen in der Praxis bedeutet, definiert der RFC nicht und kann er nicht
definieren. §5.4 beginnt mit dem Satz, der für alle drei Stufen gilt: „The final handling
of any message is always a matter of local policy and is left to the discretion of the
Mail Receiver.“ Der eine Empfänger legt die Nachricht in einen Junk-Ordner, der nächste
ergänzt eine Warnung, der übernächste stellt sie zurück.
p=reject — „a clear indication that the use of the domain name is not valid“
§4.7: „The Domain Owner considers all such failures to be a clear indication that
the use of the domain name is not valid.“ Beachten Sie den Umfang — alle
solchen Fehlschläge. p=reject zu veröffentlichen ist die Aussage, dass Ihnen
kein legitimer Mailstrom bekannt ist, der DMARC für Ihre Domain nicht besteht. Wenn es
einen gibt, haben Sie ihn für ungültig erklärt.
§7.2 beschreibt, wie Empfänger das umsetzen und warum die Wahl nicht neutral ist. Eine
vollständige Abweisung ist eine 5xy-Antwort auf das DATA-Kommando; die Fehlermeldung zu
erzeugen bleibt dem sendenden Client überlassen. Ein stilles Verwerfen gibt eine
2xy-Antwort zurück und lässt die Nachricht fallen, was Backscatter vermeidet, aber
bedeutet, dass der Server „has to be programmed to give a false result,
which can confound external debugging efforts“. Derselbe Abschnitt schlägt vor, das Wort
DMARC in den Antworttext aufzunehmen, damit der Grund maschinell erkennbar ist, zum
Beispiel 550 5.7.1 Email rejected per DMARC policy for example.com.
Die drei Stufen nebeneinander
p=none
p=quarantine
p=reject
Was der Empfänger tut
Nichts anders — §5.4 verbietet, die bestehende Behandlung zu ändern
Behandelt die Nachricht als verdächtig, auf welche Weise auch immer die lokale Policy das festlegt
Darf in der SMTP-Sitzung abweisen (§7.2), muss aber zuerst andere Anhaltspunkte abwägen (§7.4)
Was Sie riskieren
Betrieblich nichts — und keinen Schutz davor, dass jemand Ihre Domain verwendet
Legitime Mail, die an der Ausrichtung scheitert, landet im Junk-Ordner statt im Posteingang
Legitime Mail geht verloren, und indirekte Wege wie Mailinglisten und Weiterleitungen brechen (§7.4)
Was der Report zeigt
policy_published p=none, Disposition none, wobei die tatsächlichen Ausrichtungsergebnisse weiterhin festgehalten werden
Disposition quarantine, oder none mit einem reason-Element, falls der Empfänger Sie übersteuert hat
Disposition reject, oder eine schwächere Disposition mit einem Übersteuerungsgrund wie mailing_list oder trusted_forwarder
Report-Struktur nach RFC 9990: policy_published trägt den Record, der
gefunden wurde (§3.1.1.5), policy_evaluated trägt die tatsächlich
angewandte Disposition sowie die DMARC-Ausrichtungsergebnisse für DKIM und SPF
(§3.1.1.9), und das reason-Element trägt einen vordefinierten
Übersteuerungstyp aus der Liste in §3.1.6. RFC 9990 §3.1.1.9 ist eindeutig, dass die
berichteten dkim- und spf-Werte „MUST be the evaluated values
as they relate to DMARC, not the values the receiver may have used when overriding the
policy“. Ihr Bild von der Ausrichtung bleibt ehrlich, auch dort, wo die Disposition Ihrer
Policy nicht folgt.
Warum p=reject keine Garantie ist
Das ist das Folgenreichste, was RFC 9989 zur Policy sagt, und der Teil, der am
häufigsten übersprungen wird: Ein konformer Empfänger darf nicht allein auf Ihr Wort hin
abweisen.
Was p=reject bewirkt
Sagt Empfängern, dass Sie jeden DMARC-Fehlschlag auf Ihrer Domain für ungültig halten (§4.7).
Versetzt die Domain in Enforcement — die Durchsetzung, wie §3.2.9 sie definiert —, sofern keine Subdomain-Policy sie abschwächt.
Macht die unauthentifizierte Nutzung Ihrer Domain zu einem gewichtigen negativen Signal für Empfänger, die sie beachten (§3.2.9).
Verlangt im Gegenzug von Ihnen, Ihre ausgehende Mail mit DKIM zu signieren (§7.4, §8).
Was p=reject nicht bewirkt
Eine Abweisung erzwingen. §7.4: Empfänger „MUST NOT reject incoming messages solely on the basis of a ‘p=reject’ policy“, und §8 wiederholt das als Konformitätsanforderung.
Auch nur eine Behandlung auf Quarantäne-Niveau für jeden Fehlschlag garantieren — §5.4 erlaubt einem Empfänger, fehlschlagende Mail unabhängig von Ihrer Policy anzunehmen.
Mail erreichen, die gar nicht so weit kommt: §7.1 weist darauf hin, dass ein SPF-Hard-Fail durch -all eine Abweisung auslösen kann, bevor DMARC überhaupt läuft, und solche Nachrichten tauchen in Aggregate-Reports überhaupt nicht auf.
Display-Name-Spoofing unterbinden. §11.4 sagt es direkt: Solche Angriffe „are out of scope for DMARC“, weil DMARC die Domain der From:-Adresse prüft und nicht den menschenlesbaren Namen davor. Ähnlich aussehende Domains liegen aus demselben Grund außerhalb des Geltungsbereichs.
Die Untergrenze, die RFC 9989 setzt, ist Absicht: „In the absence of other knowledge and
analysis, Mail Receivers MUST treat such failing mail as if the policy were ‘p=quarantine’
rather than ‘p=reject’“ (§7.4). Ein Empfänger ohne weitere Anhaltspunkte muss Sie um eine
Stufe herabstufen. Und §5.4 deckt auch den umgekehrten Fall ab: Ein DMARC-Pass „does not
carry an explicit or implicit value assertion about that message or the Domain Owner“ —
Empfänger dürfen Mail, die besteht, also trotzdem abweisen oder in Quarantäne legen.
Die zwei Wege, auf denen Sie ungefragt bei p=none landen
§4.7 und §4.10.1 beschreiben beide Records, die unabhängig von der Absicht als
p=none behandelt werden:
Ein syntaktisch gültiger Record ohne p-Tag „is treated as if it included
‘p=none’“ (§4.7).
Ein Record, dessen p-Tag ungültig ist oder dessen sp- oder
np-Tag ungültig ist, wird nur dann gerettet, wenn er mindestens eine
syntaktisch gültige rua-URI trägt. In diesem Fall gilt für den Empfänger:
„MUST act as if a record containing ‘p=none’ was retrieved“. Ohne brauchbare
rua wendet der Empfänger überhaupt keine DMARC-Verarbeitung auf die
Nachricht an (§4.10.1).
Ein Tippfehler in p=rejcet fällt deshalb nicht auf Ihre vorherige Policy
zurück und erzeugt an keiner Stelle, die Sie sehen würden, einen Fehler. Er wird still zu
Monitoring — oder schaltet DMARC für Ihre Domain still ab.
Rollout: von p=none zu p=reject
RFC 9989 legt die Reihenfolge in §5.1 dar: SPF für eine ausgerichtete Domain
veröffentlichen (§5.1.1), mit einer ausgerichteten DKIM-Domain signieren (§5.1.2), ein
Report-Postfach einrichten (§5.1.3), den Record veröffentlichen (§5.1.4), die Reports
lesen (§5.1.5), beheben, was sie zeigen (§5.1.6), und erst dann über Enforcement
entscheiden (§5.1.7). Die Reihenfolge ist kein Schmuck: §5.1.6 stellt fest, dass
Authentifizierungsmängel in legitimen Mailströmen „MUST be addressed prior to any attempt
by the Domain Owner to publish a Domain Owner Assessment Policy ... of Enforcement“.
Die Phasen
Phase
Record
Mindestdauer
Wann weitergehen
Wann stoppen
Monitoring
v=DMARC1; p=none; rua=mailto:dmarc@example.com
Ein Monat, nach §7.4
Jeder legitime Strom in den Reports erzeugt einen ausgerichteten Pass, und Sie erkennen jede sendende Quelle
Die Reports zeigen weiterhin legitime Absender, die Sie nicht identifizieren oder nicht in Ordnung bringen können
Nie ganz: Die Probleme mit indirekten Wegen aus §7.4 verschwinden nicht, lesen Sie die Reports also weiter
Zwei Anmerkungen zur Spalte mit der Dauer. Erstens sind die Zahlen eine Untergrenze,
keine Empfehlung. §7.4 nennt sie für Domains, die Nutzer beherbergen, die an
Mailinglisten schreiben, und die ohnehin p=reject veröffentlichen wollen:
Eine solche Domain „SHOULD first take advantage of DMARC aggregate report data for their
domain to determine the possible impact to their users, first by publishing ‘p=none’ for
at least a month, followed by publishing ‘p=quarantine’ for an equally long
period of time, and comparing the message disposition results“. Es ist die einzige
Dauer, die RFC 9989 nennt.
Zweitens macht §5.1.7 klar, dass ein Monat oft bei Weitem nicht reicht:
„Depending on its cadence for sending mail, it may take many months of consuming DMARC
aggregate reports before a Domain Owner reaches the point where it is sure that it is
properly authenticating all of its mail“. Jährliche Mail — eine Verlängerungsmitteilung,
ein Steuerdokument, eine Jahresabrechnung — taucht in einem Monat Reports überhaupt nicht
auf. Die Dauer, auf die es ankommt, ist die, die einen vollen Zyklus Ihres eigenen
Versands abdeckt, nicht eine Zahl im Kalender.
Beachten Sie außerdem: Enforcement im Sinne von §3.2.9 verlangt, dass die Policy für die
Organisationsdomain und alle Subdomains darunter etwas anderes als
none ist. Ein Record mit p=reject; sp=none ist kein
Enforcement, und er lässt jede Subdomain Ihres Namensraums für beliebige Dritte nutzbar.
Die t=y-Leiter ersetzt die pct-Rampe
Die vertraute Rampe pct=10 → 25 → 50
funktioniert nicht mehr, aus den Gründen im pct-Abschnitt oben.
RFC 9989 ersetzt sie durch t=y, und Appendix A.6 erklärt die Überlegung: Die
beiden brauchbaren Werte von pct waren 0 und 100, also wurde das Tag durch
eines mit genau zwei Werten ersetzt, „meant to be analogous in their application by
mailbox providers and intermediaries to the ‘pct’ tag values ‘0’ and ‘100’,
respectively“.
Was t=y tut, ist in §4.7 definiert: Es bittet den prüfenden Empfänger, nicht
die Policy anzuwenden, sondern seine eigenen Sonderregeln, in der Erwartung, dass die auf
fehlschlagende Nachrichten angewandte Policy „will be one level below the specified
policy“ ist. p=quarantine; t=y wird wie none behandelt,
p=reject; t=y wie quarantine. Auf eine Policy von
none hat das Tag keine Wirkung, weshalb es keine Sprosse
p=none; t=y gibt.
Der Grund, warum das als Rollout-Instrument funktioniert und ein Prozentsatz es nie tat,
ist, dass das Reporting nicht zusammen mit der Policy abschwächt. §4.7 stellt fest, dass
das Tag „does not affect the generation of DMARC reports“. Mehr noch: Die Abschwächung
ist in den Daten sichtbar. RFC 9990 §3.1.6 definiert den Übersteuerungstyp
policy_test_mode so: „The message was exempted from application of
policy by the testing mode (‘t’ tag) in the DMARC Policy Record“. Dasselbe Dokument trägt
den Wert des t-Tags als testing in das
policy_published-Element ein (§3.1.1.5). Eine Sprosse im Testmodus liefert
Ihnen also eine beschriftete Zählung genau der Mail, die die nächste Sprosse getroffen
hätte — mehr, als eine Stichproben-Rampe Ihnen je gesagt hat, denn Sie können jede
ausgenommene Nachricht zuordnen.
Wenn Sie während des Übergangs dasselbe Verhalten auch bei RFC-7489-Empfängern brauchen,
ist der entsprechende Wert dort pct=0, und beides zu veröffentlichen ist
unbedenklich: Ein RFC-9989-Empfänger ignoriert pct, ohne den Record ungültig
zu machen (§4.8). Behandeln Sie diese Kombination als vorübergehend und lesen Sie zuerst
Appendix A.6 — dort ist festgehalten, dass pct=0 seine Bedeutung als
unbeabsichtigter Nebeneffekt bekam, dass Implementierungen unterschiedlich darauf
reagierten und dass das ausgelöste Verhalten meist ein Umschreiben des From-Headers war
und keine Herabstufung der Policy. Die beiden sind analog, nicht identisch.
Zwei Bedingungen, die der RFC an p=reject knüpft
RFC 9989 behandelt p=reject nicht als das Ziel für jede Domain. Es knüpft
zwei Anforderungen daran, beide in §7.4, und wiederholt die erste in der
Konformitätsliste in §8.
Sie dürfen sich nicht allein auf SPF verlassen. §7.4 erklärt, warum:
Wenn Mail über eine Alumni-Weiterleitung, eine Rollenadresse oder eine Mailingliste
weitergereicht wird, ist die verbindende IP die des Relays, sodass sie „will most likely
fail SPF checks unless the RFC5321.MailFrom address is rewritten by the relaying MTA“,
während „DKIM signatures will generally remain valid in these relay situations“. Die
Anforderung steht als hervorgehobene Regel: „It is therefore critical that domains that
publish ‘p=reject’ MUST NOT rely solely on SPF to secure a DMARC pass and MUST apply
valid DKIM signatures to their messages.“ §8 führt dasselbe MUST NOT unter den
Konformitätsanforderungen für Domaininhaber auf.
Wenn Ihre Nutzer an öffentliche Mailinglisten schreiben, wägen Sie p=reject sorgfältig ab.
§7.4: „It is therefore critical that domains that host users who might post
messages to mailing lists SHOULD NOT publish Domain Owner Assessment Policies of
‘p=reject’.“ Appendix C.6 hält das als bewusste Änderung gegenüber RFC 7489 fest
— das neue Dokument „makes explicit that domains for general-purpose email SHOULD NOT
deploy a DMARC policy of ‘p=reject’“. Der in §7.4 benannte Fehlerfall ist nicht nur eine
abgewiesene Nachricht: Wenn eine Liste Abweisungen für einen Abonnenten erhält, liest die
Listensoftware die Adresse als tot und trägt sie aus.
§7.4 ist auch offen darüber, wo das in der Praxis gelandet ist. Mailinglisten-Software
hat das Umschreiben des From-Headers als Tatsache hingenommen; ARC (RFC 8617) und andere
Versuche, den ursprünglichen Header zu erhalten, haben keine breite Verwendung gefunden;
und „few Mail Receivers apply any mitigation techniques when receiving indirect mail
flows“. Wenn Ihre Domain nur Transaktions- und Unternehmensmail versendet, betrifft Sie
das Mailinglisten-Problem nicht und p=reject ist das richtige Ziel —
beachten Sie allerdings, dass das durchgerechnete Beispiel in §7.4 selbst eine Bank ist,
deren gezielt versandte Mail die Empfänger trotzdem über Alumni-Weiterleitungen und
Rollenadressen erreicht. Weiterleitung ist kein reines Mailinglisten-Phänomen, und genau
deshalb ist die DKIM-Anforderung oben nicht optional. Wenn Ihre Domain allgemeine
Postfächer beherbergt, rät der RFC dazu, die Auswirkungen vorher aus den
Aggregate-Reports zu ermitteln — wofür die Phasen oben da sind.
Beispiel-Records für reale Situationen
Jeder Record unten steht vollständig da. Nichts ist für die Seite gekürzt — was Sie hier lesen, ist genau das, was Sie veröffentlichen würden, und der DNS-Name vor jedem Record gehört zum Beispiel dazu: Ein DMARC-Record wird unter dem Namen veröffentlicht, für den er gilt, mit dem Label _dmarc davor, und ein Record, der an einer Organisationsdomain veröffentlicht ist, kann auch für Subdomains dieses Namens gelten (RFC 9989 §4.5).
Keiner dieser Records enthält pct, ri oder rf. RFC 9989 hat alle drei Tags entfernt (Appendix C.5.2), und die IANA-Registry der DMARC-Tags führt sie inzwischen als historic (§9.3). Wo ein Record früher pct getragen hätte, um eine strengere Policy schrittweise einzuführen, trägt er stattdessen t=y: RFC 9989 Appendix A.6 führt t ausdrücklich als Ersatz für die einzigen beiden pct-Werte ein, die in der Praxis konsistent umgesetzt wurden, pct=0 und pct=100.
1. Erster Schritt: Beobachten, kein Enforcement
_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com"
Das ist der Record, den Sie veröffentlichen, bevor Sie wissen, woher Ihre Mail überhaupt kommt — noch ohne Enforcement, also ohne dass ein empfangender Server aus der Policy eine Konsequenz zieht; RFC 9989 §5.1.4 nennt ihn den üblichen Ausgangspunkt: p=none plus eine rua-Adresse, die auf ein Postfach zeigt, das Sie zum Empfang der Aggregate-Reports bereits eingerichtet haben. Der Grund, hier anzufangen: In allen außer den trivialsten Setups übersieht ein Domaininhaber einen Server oder weiß nichts von einer Versandvereinbarung mit einem Dritten — und die Aggregate-Reports sind der Weg, genau das zu finden (§5.1.5).
Lässt man das rua-Tag weg, wird dieser Record vollständig wirkungslos: Ohne rua dürfen Empfänger für die Domain keine Aggregate-Reports erzeugen (MUST NOT, §4.7) — Sie bekommen also weder Schutz noch die Daten, für deren Sammlung der Record überhaupt existiert.
2. Testphase vor dem Verschärfen
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; t=y; rua=mailto:dmarc-reports@example.com"
Das t-Tag ist die Bitte an den prüfenden Akteur, die deklarierte Policy nicht anzuwenden, sondern stattdessen seine eigenen Sonderbehandlungsregeln — in der Erwartung, dass durchgefallene Nachrichten eine Stufe unterhalb der angegebenen Policy behandelt werden (§4.7). Bei p=quarantine; t=y heißt das: Durchgefallene Mail wird behandelt, als stünde die Policy auf none, während Ihre Reports weiterhin die veröffentlichte Policy nennen, den t-Wert im Element policy_published führen und die Ausnahme als Override-Grund policy_test_mode festhalten (RFC 9990 §3.1.1.5, §3.1.6); RFC 9989 Appendix B.2.5 verwendet genau diese Konstruktion für eine Subdomain, die gerade in Betrieb genommen wird.
Ein t=y in einem Record, dessen Policy none ist, ändert überhaupt nichts, weil das Tag auf eine Policy none keine Wirkung hat (§4.7) — und beachten Sie: t beeinflusst die Report-Erzeugung nie, lässt sich also nicht dazu verwenden, das Reporting ein- oder auszuschalten.
3. Endzustand für eine versendende Domain
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; np=reject; adkim=s; aspf=s; rua=mailto:dmarc-reports@example.com"
Das ist die strengste Kombination aus Policy und Ausrichtung (Alignment), die die Tags zulassen, und die Tags sp und np sind hier bewusste Wiederholungen statt Ergänzungen: p gilt bereits für die Domain und für ihre Subdomains, solange sp oder np es nicht überschreibt (§4.7); beides auszuschreiben schützt vor allem davor, dass eine spätere Änderung an p klammheimlich alles unterhalb der Domain lockert. Bevor Sie ihn veröffentlichen, sollten Sie wissen: Eine Domain mit p=reject darf sich für ihr DMARC-Pass nicht allein auf SPF verlassen (MUST NOT) und muss ihre Nachrichten mit gültigen DKIM-Signaturen versehen (MUST), denn Weiterleitungen erhalten die DKIM-Signatur in aller Regel und brechen SPF in aller Regel (§7.4).
Was Ihre Mail kippen lässt, sind die Tags für strict: Unter adkim=s und aspf=s muss der authentifizierte Identifier mit der Author Domain — der Domain aus dem From-Header — identisch sein. Eine Nachricht von example.com, die von mail.example.com signiert wurde und unter der Voreinstellung relaxed noch ausgerichtet ist, ist es in dem Moment nicht mehr, in dem Sie diesen Record veröffentlichen (§4.4).
4. Eine Subdomain, die noch nicht so weit ist
_dmarc.newsletter.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com"
Die Policy-Discovery bevorzugt einen Record an der Author Domain selbst gegenüber dem Record an der Organisationsdomain (§4.10.1). Dieser Record auf der Subdomain überschreibt daher einen durchsetzenden Record an example.com für Mail, deren From-Header newsletter.example.com verwendet. So kann der Rest der Organisation auf p=reject bleiben, während ein hinterherhinkender Mailstrom noch in Ordnung gebracht wird — mit eigenen Reports, getrennt von allem anderen.
Setzen Sie in einen solchen Record kein sp-Tag: sp wird in DMARC-Records ignoriert, die auf Subdomains von Organisationsdomains veröffentlicht sind, denn die Policy-Discovery hält an der Author Domain an und behandelt diesen Record nie als Subdomain-Policy von irgendetwas (§4.7).
5. Geparkte Domain, die nie Mail versendet
_dmarc.example.net. IN TXT "v=DMARC1; p=reject; sp=reject; np=reject; rua=mailto:dmarc-reports@example.com"
Eine Domain, die Ihnen gehört, von der Sie aber nie versenden, ist der eine Fall, in dem Sie p=reject sofort veröffentlichen können: Es gibt keinen legitimen Mailstrom, der dabei brechen könnte, und keine Interoperabilitätskosten der Art, die §7.4 beschreibt. sp und np auszuschreiben deckt beide Hälften des Namensraums darunter ab: sp regelt existierende Subdomains, np regelt nicht existierende (§4.7).
Der DMARC-Record äußert einen Behandlungswunsch; er hindert niemanden daran, eine Zustellung an die Domain zu versuchen. Zwei Records vervollständigen das Bild und sind von DMARC unabhängig: ein Null-MX-Record (MX 0 .), der erklärt, dass die Domain keine Mail annimmt, und ein SPF-Record, der auf -all endet und damit überhaupt keinen sendenden Host autorisiert. Die genaue Syntax zeigt der Null-MX-Generator.
Das np-Tag deckt weniger ab, als es klingt, denn DMARC betrachtet einen Namen bereits dann als existierend, wenn für ihn irgendein Resource Record irgendeines Typs existiert (RFC 9989 Appendix A.4) — ein übrig gebliebener A-Record auf www.example.net lässt diesen Namen existieren, er fällt damit unter sp und nicht unter np.
6. Google Workspace als einziger Versandweg
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; np=reject; rua=mailto:dmarc-reports@example.com"
Nichts in einem DMARC-Record benennt einen Mail-Provider, und es gibt kein Tag, in dem sich einer benennen ließe (§4.7) — der Record für eine bei Google Workspace gehostete Domain ist deshalb der ganz gewöhnliche durchsetzende Record. Was erfüllt sein muss, bevor Sie ihn veröffentlichen, liegt vollständig außerhalb dieses Records: Der SPF-Record der Domain muss die sendenden Hosts des Providers autorisieren, damit die RFC5321.MailFrom-Domain einen ausgerichteten SPF-authentifizierten Identifier ergibt (§5.1.1), und der Provider muss mit einem in Ihrem DNS veröffentlichten DKIM-Schlüssel signieren, damit die signierende Domain im d=-Tag zur Author Domain ausgerichtet ist (§5.1.2).
Achten Sie auf die Wege, die den normalen Ausgangsweg des Providers verlassen: Eine Weiterleitungs- oder Relay-Konstruktion, bei der die MAIL-FROM-Domain innerhalb der Provider-eigenen Domain bleibt, erhält weiterhin ein SPF-Pass — der authentifizierte Identifier ist dann aber die Domain des Providers und ist nicht zu Ihrer ausgerichtet (§4.4.2). Genau solche Ströme sollen die Aggregate-Reports sichtbar machen, bevor Sie durchsetzen.
7. Microsoft 365 als einziger Versandweg
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; np=reject; rua=mailto:dmarc-reports@example.com"
Dieser Record ist Zeichen für Zeichen der Record aus dem vorigen Fall, und das ist die ehrliche Antwort und kein Versehen: Der DMARC-Record ist providerneutral, es gibt also keine Microsoft-365-Variante davon und keine Google-Workspace-Variante. Der Unterschied zwischen beiden Setups beschränkt sich auf die Records, auf die DMARC aufsetzt — welcher SPF-Mechanismus die ausgehenden Hosts des Providers autorisiert und welche DKIM-Selektoren unter Ihrer Domain die Schlüssel des Providers tragen. Diese beiden Anforderungen sind in §5.1.1 und §5.1.2 generisch formuliert, weil es DMARC gleichgültig ist, welcher Anbieter sie erfüllt.
Bei einem einzigen Provider ist die Versuchung groß, schon durchzusetzen, sobald SPF besteht, und DKIM auf später zu vertagen — aber eine Domain, die p=reject veröffentlicht, darf sich für ein DMARC-Pass nicht allein auf SPF verlassen (MUST NOT) und muss ihre Nachrichten mit gültigen DKIM-Signaturen versehen (MUST) (§7.4).
8. Newsletter über einen ESP mit eigener Bounce-Domain
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; np=reject; rua=mailto:dmarc-reports@example.com"
Das ist der klassische Ausrichtungsfall, und der Record trägt mit Absicht keine Alignment-Tags: In der Voreinstellung relaxed ergibt eine vom Provider betriebene Return-Path-Subdomain wie bounce.example.com einen SPF-authentifizierten Identifier, der sich die Organisationsdomain example.com mit der Author Domain teilt — genau das verlangt relaxed (§4.4). Versendet der Provider stattdessen mit einer Bounce-Domain im eigenen Namensraum, besteht SPF zwar weiterhin, aber es besteht für die Domain des Providers, und DMARC akzeptiert nur einen SPF-authentifizierten Identifier, der zur Author Domain ausgerichtet ist (§4.4.2).
Eine Subdomain an einen Externen zu geben, hat einen Preis, den man kennen sollte: Wer den SPF-Record für eine Subdomain Ihrer Organisationsdomain kontrolliert, kann unter relaxed Mail erzeugen, die DMARC für die Organisationsdomain selbst besteht (§11.8). Halten Sie diese Delegation so eng, wie es die Vereinbarung erfordert.
Ein aspf=s in diesem Record zerstört genau die Konstruktion, die er tragen soll, denn strict verlangt, dass der authentifizierte Identifier mit der Author Domain identisch ist — und bounce.example.com ist nicht identisch mit example.com (§4.4).
9. Transaktionsmail über einen zweiten Dienst
_dmarc.tx.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc-tx@example.com"
Wenn neben Ihrem Mailbox-Provider ein zweiter Dienst Belege und Passwort-Zurücksetzungen versendet, trennt eine eigene Author Domain mit eigenem Record die Reports dieses Stroms von Ihrer gewöhnlichen Korrespondenz — und Sie können ihn unabhängig von example.com verschärfen oder lockern. Für Mail, deren From-Header tx.example.com verwendet, findet die Discovery zuerst diesen Record; der Record der Organisationsdomain gilt weiterhin für jede Author Domain, die keinen eigenen Record hat (§4.10.1).
Die Trennung funktioniert nur, wenn der Dienst tx.example.com tatsächlich in den From-Header setzt, denn die Author Domain, aus der die Policy ermittelt wird, ist die Domain aus dem Headerfeld RFC5322.From (§3.2.2, §4.10.1) — eine Konfiguration, die tx.example.com nur als Return-Path verwendet, während der From-Header auf example.com stehen bleibt, zieht diesen Record nie heran.
10. Reports an einen externen Auswertungsdienst
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; np=reject; rua=mailto:dmarc@example.com,mailto:example-com@reports.example.net"
Das rua-Tag nimmt eine kommaseparierte Liste, eine Domain kann ihre Aggregate-Reports also gleichzeitig an ihr eigenes Postfach und an einen Report-Auswerter schicken. Die erste Adresse liegt innerhalb der veröffentlichenden Domain und braucht nichts weiter; die zweite nicht — und ein Empfänger, der eine Report-Adresse außerhalb der Organisationsdomain des Records vorfindet, muss prüfen (MUST), dass das Ziel der Vereinbarung zugestimmt hat (RFC 9990 §4).
Den Record, der diese Erlaubnis erteilt, veröffentlicht der Auswertungsdienst in seiner eigenen Zone, nicht Sie — in diesem Beispiel ist es ein TXT-Record an example.com._report._dmarc.reports.example.net, der mindestens v=DMARC1 enthält; ein Anbieter, der Reports für beliebige Domains annehmen will, kann ihn stattdessen als Wildcard veröffentlichen. Wie dieser Name gebildet wird und welche Override-Regel dazugehört, ist unter dem Autorisierungs-Record dargelegt.
Fehlt dieser Autorisierungs-Record, ist er nicht parsebar oder beginnt er nicht mit v=DMARC1, muss der Empfänger, der den Report erzeugt, die externe URI ignorieren (MUST, RFC 9990 §4) — und nirgends sagt Ihnen das jemand: Die Reports an Ihr eigenes Postfach treffen weiter ein, während das Dashboard des Anbieters leer bleibt.
RFC 9989 §11.6 empfiehlt, Reports nach Möglichkeit an eine Adresse zu schicken, die innerhalb Ihrer eigenen Domain Mail empfangen kann, und sie von dort weiterzuleiten — das erspart den externen Autorisierungsschritt vollständig. Für eine Domain, die überhaupt keine Mail empfangen kann, etwa die geparkte Domain oben, ist der Autorisierungs-Record der einzige Weg.
Aggregate-Reports lesen (RFC 9990)
Ein Aggregate-Report ist ein XML-Dokument, das ein Empfänger an die Adressen in Ihrem
rua-Tag schickt. Er enthält gezählte Nachrichtengruppen, keine Nachrichten:
für jede sendende IP-Adresse und jede Kombination von Authentifizierungsergebnissen eine
Zeile mit einer Nachrichtenzahl, der angewendeten DMARC-Disposition und den rohen SPF-
und DKIM-Ergebnissen dahinter. RFC 9990 Abschnitt 7.2 stellt ausdrücklich fest, dass
diese Daten keine personenbezogenen Informationen tragen — keine einzelnen
Mailadressen, keine IP-Adressen von Endnutzern, keine Nachrichteninhalte. Das ist der
Handel: Aggregate-Reports zeigen Ihnen die Form Ihrer Mailströme und nichts über
einzelne Nachrichten.
Abschnittsangaben in diesem Teil der Seite beziehen sich auf RFC 9990, sofern kein
anderes Dokument genannt ist.
Ein Report deckt genau eine DMARC Policy Domain und eine Policy-Konfiguration ab
(Abschnitt 3.1). Haben Ihre Subdomains keinen eigenen DMARC-Record, taucht ihr Verkehr
als zusätzliche record-Elemente im Report der Organisationsdomain auf; eine
Subdomain, die einen eigenen Record veröffentlicht, bekommt einen eigenen Report
(Abschnitt 3.1.2). Ändern Sie Ihre Policy mitten im Zeitraum, kann ein Empfänger Ihnen
einen einzelnen Report mit gemischten Dispositionen unter einem
policy_published-Element schicken oder mehrere Reports für denselben
Zeitraum — beides erlaubt Abschnitt 3.3, eine kurze Inkonsistenz nach einer
Policy-Änderung ist also zu erwarten und kein Fehler.
Zeitraum und Häufigkeit
Das date_range-Element trägt begin und end als
Sekunden seit der Epoche, in UTC. Abschnitt 3.1.1.4 legt fest, dass diese den
Berichtszeitraum bezeichnen und nicht die erste und letzte beobachtete Nachricht, dass
Zeiträume einander nicht überlappen SOLLEN und dass der Zeitraum typischerweise einen
einzelnen UTC-Tag ab 0000 UTC umfasst. Abschnitt 3.1 beschreibt den Takt als täglich
oder häufiger, und RFC 9989 Abschnitt 8 führt „SHOULD send aggregate reports on at
least a daily basis“ unter den Konformitätsanforderungen für Empfänger auf.
Ein anderes Intervall können Sie nicht mehr anfordern. Das ri-Tag, das in
der alten Spezifikation ein Berichtsintervall anforderte, steht in RFC 9989 Anhang C.5.2
unter „Tags Removed“ und trägt in der DMARC-Tags-Registry den Status „historic“
(RFC 9989 Abschnitt 9.3). ri=3600 heute zu veröffentlichen ist wirkungslos:
Es ist ein unbekanntes Tag, kein stündlicher Report.
Wie die Reports zu Ihnen kommen
Per E-Mail. RFC 9989 Abschnitt 8 verlangt von einem konformen Empfänger, die
mailto:-URI für den Versand angeforderter Reports zu unterstützen, und
RFC 9990 Abschnitt 3.5.2 legt die Mechanik fest: Der Report ist eine XML-Datei im Anhang
einer MIME-Nachricht, er SOLLTE GZIP-komprimiert sein und MUSS den Medientyp
application/gzip tragen, wenn er komprimiert ist, und text/xml,
wenn nicht. Der Dateiname folgt einer festen ABNF —
receiver!policy-domain!begin-timestamp!end-timestamp[!unique-id].xml.gz —
und das Subject-Feld ebenfalls, beide sind also auswertbar, ohne den Anhang zu öffnen.
Zwei Konsequenzen sind wissenswert. Erstens MUSS der Mailstrom, der die Reports trägt,
selbst DMARC mit Ausrichtung (Alignment) bestehen (Abschnitt 3.5.2); einem Report, der
unauthentifiziert ankommt, sollten Sie nicht trauen. Zweitens wertet ein Empfänger die
URIs in Ihrem rua-Tag in der angegebenen Reihenfolge aus, ignoriert
fehlerhafte und versucht die Zustellung an jede verbleibende URI bis zu seinem eigenen
Limit an unterstützten URIs (Abschnitt 3.5). Wo die URI nichts anderes sagt, SOLLTE er
einen Kanal mit TLS verwenden (SMTP mit STARTTLS).
Und was ist mit https:? RFC 9989 Abschnitt 4.7 erlaubt
jede gültige URI in rua, stellt aber zugleich fest, dass URIs mit
Schemata, die ein Empfänger nicht unterstützt, ignoriert werden MÜSSEN und dass nur
mailto: implementiert sein muss. RFC 9990 Abschnitt 3.5.3 behandelt
andere Verfahren in einem einzigen Satz: Die Spezifikation lässt zu, dass in späteren
Versionen weitere registrierte URI-Schemata unterstützt werden. Ein
HTTPS-Einreichungsverfahren ist in RFC 9990 nicht definiert. Eine
https:-URI in Ihrem Record ist syntaktisch zulässig und betrieblich stumm.
Ein vollständiger Report, kommentiert
Der Namensraum ist urn:ietf:params:xml:ns:dmarc-2.0, von der IANA in
RFC 9990 Abschnitt 6.1 registriert. Das Dokument unten ist ein UTC-Tag für example.com
mit zwei Records: Mail von der eigenen Plattform der Domain und Mail, die den Empfänger
über eine Mailingliste erreicht hat.
<feedback xmlns="urn:ietf:params:xml:ns:dmarc-2.0">
<version>1.0</version>
<report_metadata>
<org_name>Example Receiver</org_name>
<email>dmarc-reports@receiver.example.net</email>
<extra_contact_info>https://receiver.example.net/postmaster</extra_contact_info>
<!-- Unique among reports to this domain; used to spot duplicates. -->
<report_id>1735689600-example.com@receiver.example.net</report_id>
<date_range>
<begin>1735689600</begin> <!-- 2025-01-01 00:00:00 UTC -->
<end>1735775999</end> <!-- 2025-01-01 23:59:59 UTC -->
</date_range>
<!-- An optional <error> element would sit here, carrying problems
the receiver hit while reading your DMARC record itself. -->
<generator>Example Aggregate Reporter v2.1</generator>
</report_metadata>
<policy_published>
<domain>example.com</domain>
<discovery_method>treewalk</discovery_method> <!-- or "psl" -->
<p>quarantine</p>
<sp>quarantine</sp>
<np>reject</np>
<fo>1</fo>
<adkim>r</adkim>
<aspf>r</aspf>
<testing>n</testing> <!-- value of the "t" tag -->
</policy_published>
<!-- Record 1: the domain's own sending platform. Everything aligned. -->
<record>
<row>
<source_ip>192.0.2.24</source_ip>
<count>4213</count>
<policy_evaluated>
<!-- "pass" means: DMARC passed under an enforcing policy. -->
<disposition>pass</disposition>
<dkim>pass</dkim>
<spf>pass</spf>
</policy_evaluated>
</row>
<identifiers>
<header_from>example.com</header_from>
<envelope_from>bounces.example.com</envelope_from>
</identifiers>
<auth_results>
<dkim>
<domain>example.com</domain>
<selector>mail202601</selector> <!-- REQUIRED since RFC 9990 -->
<result>pass</result>
</dkim>
<spf>
<domain>bounces.example.com</domain>
<scope>mfrom</scope> <!-- the only valid value -->
<result>pass</result>
</spf>
</auth_results>
</record>
<!-- Record 2: your mail relayed by a discussion list on example.org.
Read the two blocks against each other before drawing conclusions. -->
<record>
<row>
<source_ip>2001:db8::a12</source_ip>
<count>17</count>
<policy_evaluated>
<!-- Published policy is quarantine, applied disposition is none,
so a reason element is mandatory here. -->
<disposition>none</disposition>
<dkim>fail</dkim>
<spf>fail</spf>
<reason>
<type>mailing_list</type>
<comment>Message arrived via a known list; failure expected.</comment>
</reason>
</policy_evaluated>
</row>
<identifiers>
<header_from>example.com</header_from>
<!-- The list rewrote the envelope sender to its own domain. -->
<envelope_from>lists.example.org</envelope_from>
</identifiers>
<auth_results>
<!-- Passing signatures first, per the priority list in 3.1.3. -->
<dkim>
<domain>lists.example.org</domain>
<selector>list2026</selector>
<result>pass</result> <!-- valid, but not your domain -->
</dkim>
<dkim>
<domain>example.com</domain>
<selector>mail202601</selector>
<result>fail</result>
<human_result>body hash did not verify</human_result>
</dkim>
<spf>
<domain>lists.example.org</domain>
<scope>mfrom</scope>
<result>pass</result> <!-- SPF passed for the list, not for you -->
</spf>
</auth_results>
</record>
</feedback>
Der zweite Record ist der, über den viele stolpern. Innerhalb von
auth_results sagt SPF pass, und eine DKIM-Signatur sagt
ebenfalls pass. Innerhalb von policy_evaluated sagen beide
fail. Das ist kein Widerspruch: Abschnitt 3.1.1.11 definiert
auth_results als die rohen SPF- und DKIM-Ergebnisse „uninterpreted with
respect to DMARC“, während Abschnitt 3.1.1.9 verlangt, dass die Werte in
policy_evaluated die DMARC-bewerteten sind. Der SPF-Pass der Liste gehört zu
lists.example.org, das nicht zur From-Domain ausgerichtet ist, und die Signatur, die
ausgerichtet gewesen wäre, ist zerbrochen, als die Liste den Body verändert hat. Wann
immer Sie die beiden Blöcke vergleichen: policy_evaluated ist das Urteil,
auth_results ist die Beweislage.
Feld
Was es Ihnen sagt
report_metadata/org_name, email
Welcher Empfänger den Report erzeugt hat und wohin Sie schreiben, wenn er falsch aussieht.
report_metadata/report_id
Eindeutig unter den Reports an dieselbe Domain, damit Duplikate erkennbar sind (Abschnitt 3.5.1). Wo eine Report-ID auch im Subject-Feld auftaucht, MUSS es dieselbe Zeichenfolge sein (Abschnitt 3.1.4).
date_range/begin, end
Berichtszeitraum in Sekunden seit der Epoche, UTC, typischerweise ein Tag ab 0000 UTC. Nicht die erste und letzte gesehene Nachricht (Abschnitt 3.1.1.4).
report_metadata/error
Probleme, auf die der Empfänger mit Ihrem DMARC-Record selbst gestoßen ist: ungültiges rua, ungültiges sp, mehrere DMARC-Records unter einem Namen (Abschnitt 3.1.5). Lesen Sie dieses Feld zuerst.
report_metadata/generator
Name und Version der Reporting-Software, damit Sie wissen, wo Sie einen fehlerhaften Report melden können (Abschnitt 3.1.1.3).
policy_published/domain
Die DMARC Policy Domain, um die es in diesem Report geht — nicht zwangsläufig die From-Domain jedes einzelnen Records (Abschnitt 3.1.2).
policy_published/discovery_method
psl oder treewalk: wie dieser Empfänger Ihren Record gefunden hat (Abschnitt 3.1.1.5).
policy_published/p, sp, np
Die Policy, die der Empfänger tatsächlich angewendet hat, samt der Vorgabewerte, die er ergänzt hat. Vergleichen Sie sie mit dem, was Sie veröffentlicht zu haben glauben.
policy_published/testing
Ob der Empfänger t=y in Ihrem Record gesehen hat (Abschnitt 3.1.1.5).
policy_published/adkim, aspf
Die geltenden Modi der Ausrichtung (Alignment). Ein Record voller DKIM-Passes und DMARC-Fails bedeutet meist adkim=s gegen eine Subdomain-Signatur.
row/source_ip
Die verbindende IP. Ihr einziger Anhaltspunkt dafür, wer die Mail gesendet hat; alles andere im Record beschreibt die Nachricht, nicht den Absender.
row/count
Nachrichten in dieser Gruppe. Die Zählung umfasst alle empfangenen Nachrichten, auch die, die später von anderer Filterung blockiert wurden (Abschnitt 3.1).
policy_evaluated/disposition
Was passiert ist: pass, none, quarantine oder reject.
policy_evaluated/dkim, spf
Die DMARC-Urteile, also authentifiziert und ausgerichtet. Hier kommen nur pass oder fail vor.
policy_evaluated/reason
Warum die Disposition von Ihrer veröffentlichten Policy abweicht. Pflicht, wenn die Ausrichtung fehlgeschlagen ist und die angewendete Policy nicht Ihrer veröffentlichten entspricht (Abschnitt 3.1.1.9); type ist einer von fünf festen Werten, comment ist Freitext.
identifiers/header_from
Die RFC5322.From-Domain — die Identität, die DMARC schützt.
identifiers/envelope_from
Die RFC5321.MailFrom-Domain, auf die SPF angewendet wurde. Kann bei einem leeren Rückweg vorhanden, aber leer sein, etwa bei Bounces (Abschnitt 3.1.1.10).
identifiers/envelope_to
Die Empfängerdomain, wenn der Empfänger sie mitliefert.
auth_results/dkim/domain, selector
Das d= und das s= jeder ausgewerteten Signatur. Mit dem Selector können Sie den Schlüssel benennen und damit die sendende Plattform, die fehlgeschlagen ist.
auth_results/dkim/result
Das DKIM-Ergebnis als solches, aus dem in RFC 8601 definierten Satz: none, pass, fail, policy, neutral, temperror, permerror.
auth_results/*/human_result
Freitext-Details zum Fehlschlag, sofern der Empfänger sie liefert. Das nützlichste Feld im ganzen Dokument und das am seltensten gefüllte.
auth_results/spf/domain, scope
Die von SPF geprüfte Domain und deren Quelle. mfrom ist der einzige gültige Scope, weil DMARC ausschließlich die MAIL-FROM-Identität verwendet (Abschnitt 3.1.1.13, RFC 9989 Abschnitt 4.4.2).
extension
Elemente mit eigenem Namensraum aus einer künftigen Erweiterung, auf Dateiebene oder am Ende eines Records. Ein Verarbeiter, der eines davon nicht versteht, sollte es überspringen (Abschnitte 3.1.1.6, 5).
Zwei strukturelle Details sind wichtig, wenn Sie einen Parser schreiben statt einen
Report zu lesen. Die Elemente der ersten Ebene sowie die Kindelemente von
record, policy_evaluated und auth_results MÜSSEN
in der Reihenfolge stehen, die der RFC auflistet; das Schema in Anhang A modelliert die
übrigen Gruppen als xs:all, die Reihenfolge der Kindelemente von
policy_published, row, identifiers und eines
einzelnen dkim-Blocks ist also nicht festgelegt. Ein Report darf bis zu 100
Signaturen pro Zeile tragen, geordnet nach der Prioritätsliste in Abschnitt 3.1.3:
strikt ausgerichtete bestandene Signaturen zuerst, nicht bestandene zuletzt.
Die neuen Felder in RFC 9990 und was sie verraten
RFC 9990 ersetzt das Report-Format, das innerhalb von RFC 7489 definiert war. Die
meisten Änderungen sind klein, und jede von ihnen beantwortet eine Frage, die Sie vorher
nicht beantworten konnten. Anhang C von RFC 9990 listet die Unterschiede auf; die
Tabelle ergänzt, wofür jeder einzelne gut ist. Durchgestrichene Zeilen sind Werte, die
es nicht mehr gibt — wenn Sie sie noch sehen, haben Sie einen Report aus einem älteren
Generator vor sich.
Element oder Wert
Definiert in RFC 9990
Was es verrät
discovery_method
3.1.1.5
Ob dieser Empfänger Ihren Record mit der PSL-Methode (psl) oder dem DNS Tree Walk (treewalk) gefunden hat — das beste einzelne Signal dafür, wie weit sich die neue Spezifikation unter Ihren Report-Sendern tatsächlich verbreitet hat.
testing
3.1.1.5
Ob der Empfänger Ihr t=y gesehen hat. Zusammen mit dem Override-Typ policy_test_mode zeigt es Ihnen genau, welchen Verkehr der Testmodus derzeit vor dem Enforcement — der tatsächlichen Durchsetzung Ihrer Policy — abschirmt.
np
3.1.1.5
Die Policy, die für nicht existierende Subdomains gilt, zurückgespiegelt. Fehlt sie in den Reports, obwohl sie in Ihrem Record steht, hat dieser Empfänger das Tag nicht geparst.
generator
3.1.1.3
Name und Version der Reporting-Software. Wenn ein Report fehlerhaft ist oder ein Feld systematisch leer bleibt, sagt Ihnen das, wessen Bug es ist und wo Sie ihn melden.
extension und Erweiterungen auf Record-Ebene
3.1.1.6, 5
Zwei definierte Stellen für Elemente mit eigenem Namensraum — eine nach policy_published, eine am Ende eines record. Erweiterungen müssen eine URI zu ihrer Definition tragen, und ein Verarbeiter, der mit einer nicht umgehen kann, sollte sie ignorieren und weitermachen.
version
3.1.1.2
Jetzt OPTIONAL, und wenn vorhanden, MUSS der Wert 1.0 sein. Ein Report ohne version-Element ist nicht defekt; weisen Sie ihn nicht aus diesem Grund zurück.
disposition-Wert pass
Anhang A
Der Typ für die angewendete Disposition hat neben none, quarantine und reject einen vierten Wert bekommen. Er bedeutet, dass die Nachricht DMARC unter einer durchsetzenden Policy bestanden hat, „keine Aktion durchgeführt“ ist also nicht länger zweideutig zwischen „bestanden“ und „durchgefallen, aber p=none“. Die veröffentlichten Policy-Tags p, sp und np behalten den Satz aus drei Werten.
selector in einem DKIM-Ergebnis
3.1.1.12, Anhang C
Jetzt ERFORDERLICH. Da eine Domain in der Regel einen Selector je sendender Plattform betreibt, lässt sich eine fehlschlagende Signatur endlich einem bestimmten Schlüssel und Anbieter zuordnen statt nur einem d=.
Override-Typ policy_test_mode
3.1.6
Neuer Reason-Wert: Die Nachricht wurde durch das t-Tag von der Policy ausgenommen. Er unterscheidet „der Empfänger hat meine Policy ignoriert“ von „mein eigener Testmodus hat sie ausgesetzt“.
Override-Typ sampled_out
—
Mit dem pct-Tag verschwunden, das RFC 9989 Anhang C.5.2 als entfernt auflistet. Es wird nichts mehr herausgesampelt; eine teilweise Einführung drückt man mit t=y aus.
Override-Typ forwarded
—
Nicht mehr in der Liste der fünf zulässigen Werte in Abschnitt 3.1.6. Weiterleitungsfälle erscheinen jetzt als trusted_forwarder, mailing_list, local_policy oder other.
SPF-scope-Wert helo
—
Der einzige gültige Scope ist mfrom (Abschnitt 3.1.1.13). DMARC stützt sich ausschließlich auf die SPF-Prüfung der MAIL-FROM-Identität (RFC 9989 Abschnitt 4.4.2), ein SPF-Ergebnis mit HELO-Scope hatte also nie eine Auswirkung auf das DMARC-Urteil.
Struktur der report_id
3.5.1
Der Bezeichner hat jetzt eine eigene ABNF und MUSS unter den Reports an dieselbe Domain eindeutig sein, was die Duplikaterkennung mechanisch statt heuristisch macht.
lang-Attribut an menschenlesbaren Elementen
3.1.1
extra_contact_info, error, comment und human_result nehmen ein optionales lang-Attribut an, Vorgabe en. Lohnt sich zu berücksichtigen, wenn Sie diese Zeichenfolgen in ein Dashboard einspeisen.
Eine Policy-Domain je Report
3.1, 3.1.2, Anhang C
Normativ festgehalten: Jeder Report MUSS Daten für genau eine DMARC Policy Domain und eine Policy-Konfiguration enthalten. Reports verschiedener Empfänger sind damit vergleichbar, ohne raten zu müssen, wie sie Subdomains gruppiert haben.
Häufige Muster und was sie bedeuten
Vier Situationen machen den größten Teil dessen aus, was Sie in den ersten Monaten beim
Lesen von Reports sehen werden. In jedem Fall sagt Ihnen die Zeile in
policy_evaluated, was passiert ist, und der Block in
auth_results, warum.
Eine unbekannte IP mit SPF-Pass und DKIM-Fail. Die Domain in
auth_results/spf ist zu Ihrer From-Domain ausgerichtet, die Mail kommt also
von etwas, das Ihr SPF-Record autorisiert, aber es existiert keine ausgerichtete
Signatur — meist eine sendende Plattform, die eine Abteilung freigeschaltet hat, die in
ein include: aufgenommen wurde und für die nie ein DKIM-Schlüssel
eingerichtet wurde. Die zweite Möglichkeit ist schlimmer: Ihre
include:-Kette deckt den IP-Bereich eines geteilten Anbieters ab, und ein
anderer Mandant auf dieser Plattform besteht SPF für Ihre Domain. Prüfen Sie, ob die IP
zu einem Anbieter gehört, mit dem Sie einen Vertrag haben, und sorgen Sie dann dafür,
dass diese Plattform signiert. RFC 9989 Abschnitt 8 stellt fest, dass ein Domaininhaber
sich für einen DMARC-Pass NICHT allein auf SPF verlassen darf, wenn die Policy
p=reject lautet; ein reiner SPF-Strom ist damit ein Blocker für das
Enforcement und kein Detail.
DKIM besteht, SPF nicht. Das ist die normale Signatur weitergeleiteter
Mail: Der Weiterleiter hat den Envelope-Absender durch seine eigene Domain ersetzt, SPF
wurde also für diese Domain ausgewertet und kann nicht ausgerichtet sein, während Ihre
Signatur den Sprung überlebt hat. RFC 9989 Abschnitt 4.4.1 stellt klar, dass jeder
ausgerichtete DKIM-authentifizierte Identifier für einen DMARC-Pass genügt; diese
Records sind also kein Fehler, den man beheben müsste. Prüfen Sie das Muster nach, bevor
Sie es abheften: envelope_from sollte die Domain eines anderen sein, das
ausgerichtete DKIM-Ergebnis sollte pass sein und die Disposition
pass. Steht dort stattdessen none mit einem
trusted_forwarder- oder mailing_list-Grund, hat der Empfänger
die Nachricht gerettet, nicht DMARC.
Beides schlägt fehl, bei geringem Volumen. Kleine, verstreute Zählungen
von IPs, die Sie nicht kennen, oft auf einer Subdomain, von der Sie nie senden, sind das
Grundrauschen einer Domain, die existiert: direkte Domainfälschung, Backscatter und
kaputte Weiterleitungswege. Prüfen Sie zuerst, ob die Zahlen über mehrere Tage stabil
sind und ob die IPs sich in einem Netz häufen — ein beständiges Cluster ist ein
vergessener Absender, eine breite Streuung mit ein oder zwei Nachrichten je IP ist
Missbrauch. Denken Sie daran, dass count alle Nachrichten umfasst, die der
Empfänger angenommen hat, auch die, die seine eigenen Filter später blockiert haben
(Abschnitt 3.1); eine Zeile mit einem Wert größer null ist also kein Beleg dafür, dass
irgendetwas zugestellt wurde. Verzögern Sie das Enforcement nicht wegen dieses
Ausläufers; genau dafür ist p=reject da.
Es kommen keine Reports mehr an. Arbeiten Sie sich von der eigenen
Seite nach außen vor. Nimmt das rua-Postfach noch Mail an, und lässt Ihre
Filterung application/gzip-Anhänge noch durch? Erreicht Sie der
Report-Strom überhaupt noch — Reports MÜSSEN aus einem DMARC-ausgerichteten Mailstrom
kommen (Abschnitt 3.5.2), eine Änderung auf der Seite des Reporters kann sie also zum
Bouncen bringen. Prüfen Sie dann Ihren Record: Ein Empfänger ignoriert fehlerhafte
Reporting-URIs (Abschnitt 3.5), und enthält der Record kein gültiges p-Tag
mehr, wird er wie p=none behandelt, solange eine syntaktisch gültige
rua-URI übrig bleibt (RFC 9989 Abschnitt 4.10.1) — Reports können also
weiter eintreffen, während Ihre Policy klammheimlich nicht mehr greift, und sie hören
auf, wenn das rua selbst kaputtgeht. Und wenn Ihre Reports an einen Dritten
gehen, vergewissern Sie sich zuletzt, dass der im nächsten Abschnitt beschriebene
Autorisierungs-Record noch existiert.
Reporting-Adressen müssen nicht in Ihrer eigenen Domain liegen. Das ist Absicht — es
erlaubt einer Domain ohne Mail-Infrastruktur, Reports über einen Dienstleister zu
empfangen — und es ist zugleich ein Angriff: Ohne Prüfung könnte jeder einen Record
veröffentlichen, der rua auf die Adresse eines Opfers zeigt, und dann eine
Flut fehlschlagender Mail senden, damit das Opfer in Reports ertrinkt. RFC 9990
Abschnitt 4 definiert die Verifikation, die das verhindert.
Die Prüfung läuft, wenn sich die Organisationsdomain des Records von der
Organisationsdomain des URI-Hosts unterscheidet. Ein rua, das auf einen
anderen Namen unter Ihrer eigenen Organisationsdomain zeigt, braucht keinen zusätzlichen
Record. Unterscheiden sich die Domains, baut der Empfänger aus dem URI-Host, der
Labelfolge _report._dmarc und der Domain, aus der die Policy stammt, einen
Namen zusammen und sucht dort nach einem TXT-Record:
; DMARC record of the domain that wants reports
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; "
"rua=mailto:dmarc@reports.example.net"
; Authorization published by the report processor
example.com._report._dmarc.reports.example.net. IN TXT "v=DMARC1"
; Or, to accept reports for any domain:
*._report._dmarc.reports.example.net. IN TXT "v=DMARC1"
Der Record wird als Tag-Wert-Paare im selben Format wie ein DMARC-Policy-Record geparst;
v=DMARC1 ist Pflicht und MUSS zuerst stehen, ein abschließendes Semikolon
ist optional, und alles, was diesen Test nicht besteht, wird verworfen. Ein einziger
überlebender Record genügt, um die Konstruktion zu autorisieren. Würde der
zusammengesetzte Name die DNS-Längengrenzen überschreiten, lässt sich keine positive
Feststellung treffen und der Empfänger bricht ab — eine echte Einschränkung bei langen
Domainnamen und der Grund, den Hostnamen des Dienstleisters kurz zu halten.
Der Autorisierungs-Record darf auch ein eigenes rua-Tag enthalten, das das
vom Domaininhaber gewünschte Ziel überschreibt. Diese überschreibende URI MUSS denselben
Zielhost verwenden wie das Original, und benennt sie erneut einen anderen Host, DARF der
Empfänger an keine der beiden URIs einen Report schicken. Genau das erlaubt es einem
Dienstleister, Reports zwischen seinen eigenen Postfächern zu verschieben, ohne dass
jeder Kunde seinen Record ändert, und hält die Konstruktion zugleich davon ab, als
Umleitung missbraucht zu werden. RFC 9991 Abschnitt 5 verlangt für Failure-Reports das
identische Verfahren, mit ruf anstelle von rua.
Was die Prüfung Ihnen gibt
Den Nachweis, dass der Dritte zugestimmt hat, Reports über Ihre Domain zu empfangen, veröffentlicht in seinem eigenen DNS.
Eine Möglichkeit für den Dienstleister, Reports auf ein anderes Postfach am selben Host umzuleiten, ohne dass sich Ihr Record ändert.
Einen Ausschalter auf der Seite des Dienstleisters: Das Entfernen des Records stoppt neue Reports, vorbehaltlich der TTL — RFC 9990 Abschnitt 4 nennt das ausdrücklich für einen Dienstleister, den das Volumen überfordert.
Eine Wildcard-Form für Dienstleister, die Reports für beliebige Kundendomains annehmen.
Was sie Ihnen nicht gibt
Irgendeine Gewähr, dass ein Report echt ist. Aggregate-Report-Daten können gefälscht sein, und ein Angreifer kann falsche Reports in großer Zahl einreichen, um Ihre Entscheidungen zu beeinflussen (RFC 9990 Abschnitt 8.2).
Kontrolle über die Daten, sobald sie angekommen sind. Ein Dritter kann anhand der Metadaten der Empfänger Verkehrsanalyse betreiben — RFC 9990 Abschnitt 7.1 bittet Empfänger, das vor dem Versand abzuwägen.
Überhaupt irgendeine Prüfung, wenn das Ziel innerhalb Ihrer eigenen Organisationsdomain liegt — dort wird das Verfahren nicht angestoßen.
Zustellung. Ist ein Ziel nicht erreichbar, DARF der Empfänger die Daten zwischenspeichern und es erneut versuchen — oder sie verwerfen (RFC 9990 Abschnitt 3.5).
Wenn Sie das Reporting delegieren, ist der Record des Delegierten Teil Ihrer
Konfiguration, auch wenn er in der Zone eines anderen liegt. Hören Reports nach einem
Anbieterwechsel auf, ist der fehlende _report._dmarc-TXT-Record beim neuen
Host das Erste, wonach Sie suchen sollten.
Failure-Reports (RFC 9991) und das fo-Tag
Ein Failure-Report betrifft eine einzelne Nachricht, die die DMARC-Auswertung nicht bestanden hat, und trägt so viel von dieser Nachricht, wie die berichtende Partei preiszugeben bereit ist. RFC 9991 §2 beschreibt sie als nahezu unmittelbar nach dem Erkennen des Fehlschlags durch den empfangenden Server erzeugt und versendet und hält fest, dass sie so viel wie möglich von den Header-Feldern und vom Body der Nachricht enthalten sollen, soweit die Datenschutzrichtlinien der berichtenden Partei das zulassen. Genau darin liegen zugleich der ganze Nutzen und das ganze Problem: Ein Aggregate-Report sagt Ihnen, dass 42 Nachrichten von einer IP-Adresse durchgefallen sind, ein Failure-Report legt Ihnen eine dieser Nachrichten vor, damit Sie sehen können, warum.
Failure-Reports sind für den Empfänger in einer Weise optional, wie es Aggregate-Reports nicht sind. RFC 9989 §5.3.5 definiert, wann eine Nachricht an DMARC scheitert; §5.3.8 formuliert für Aggregate-Reports ein SHOULD — empfangende Server sollen sie mindestens alle 24 Stunden erzeugen und versenden; §5.3.9 formuliert für Failure-Reports nur ein MAY — und ergänzt, dass Empfänger, die zu Recht um den Schutz der Privatsphäre ihrer Nutzer besorgt sind, sich entweder dafür entschieden haben, die Informationen in solchen Reports stark zu schwärzen, was deren Nutzen beeinträchtigen kann, oder sie überhaupt nicht zu versenden.
Zwei Tags in Ihrem DMARC-Record steuern das, und sie wirken nur als Paar. Das ruf-Tag benennt die Ziele; das fo-Tag nennt die Bedingungen, unter denen ein Report erzeugt werden soll (RFC 9989 §4.7). Das Report-Format ist das Abuse Reporting Format aus RFC 6591, erweitert durch RFC 9991 §4.
Die vier fo-Werte
Das fo-Tag hat den Standardwert 0. Die Werte 0 und 1 schließen einander aus; jede andere Kombination wird als doppelpunktgetrennte Liste geschrieben, und die Werte dürfen in beliebiger Reihenfolge stehen — fo=0:d und fo=d:0 bedeuten also dasselbe (RFC 9989 §4.7). Report-Generatoren können sich an die angeforderten Optionen halten — das Tag ist eine Bitte, keine Anweisung.
Wert
Bedingung für die Erzeugung eines Reports (RFC 9989 §4.7)
Report-Typ
Was das in der Praxis bedeutet
0 (Standard)
Erzeuge einen DMARC-Failure-Report, wenn alle zugrunde liegenden Authentifizierungsmechanismen kein Pass-Ergebnis mit passender Ausrichtung (Alignment) liefern.
DMARC-Failure-Report
Die enge Einstellung. Ein Report entsteht nur, wenn nichts funktioniert hat: weder SPF noch DKIM haben ein ausgerichtetes Pass geliefert. Das ist dieselbe Bedingung, unter der DMARC selbst scheitert — Sie erhalten also nur Reports zu Nachrichten, die tatsächlich an DMARC gescheitert sind.
1
Erzeuge einen DMARC-Failure-Report, wenn irgendeiner der zugrunde liegenden Authentifizierungsmechanismen kein ausgerichtetes Pass-Ergebnis liefert.
DMARC-Failure-Report
Die weite Einstellung — und die, die regelmäßig verkehrt herum beschrieben wird. Eine Nachricht mit ausgerichtetem DKIM-Pass, aber ohne ausgerichteten SPF-Pass besteht DMARC, weil einer oder mehrere authentifizierte Identifier zur Author Domain (der Domain im From-Header) ausgerichtet waren (§5.3.5) — und erzeugt unter fo=1 trotzdem einen Report, weil einer der beiden Mechanismen kein ausgerichtetes Pass geliefert hat. Rechnen Sie mit Reports über Mail, die ganz normal zugestellt wurde.
d
Erzeuge einen DKIM-Failure-Report, wenn die Nachricht eine Signatur trug, deren Prüfung fehlgeschlagen ist — unabhängig von deren Ausrichtung.
DKIM-Failure-Report (RFC 6651)
Ein anderer Report-Typ, kein DMARC-Report. Auslöser ist eine kaputte Signatur, und die Ausrichtung ist ausdrücklich unerheblich: Auch eine fehlgeschlagene Signatur einer Domain, die mit Ihrer nichts zu tun hat, zählt.
s
Erzeuge einen SPF-Failure-Report, wenn die Nachricht die SPF-Auswertung nicht bestanden hat — unabhängig von deren Ausrichtung.
SPF-Failure-Report (RFC 6652)
Wieder ein eigener Report-Typ, wieder mit der Ausrichtung ausdrücklich aus der Bedingung herausgenommen. Die Nachricht ist an SPF gescheitert; ob der SPF-Identifier irgendetwas mit Ihrer Author Domain zu tun hatte, spielt dabei keine Rolle.
Die Richtung von 0 und 1 lohnt zweimaliges Lesen, denn kommerzielle Dokumentation vertauscht sie häufig. 0 verlangt, dass alle Mechanismen scheitern, bevor ein Report entsteht; 1 verlangt nur, dass irgendeiner von ihnen scheitert. fo=1 ist damit die Einstellung, die strikt mehr Reports erzeugt als der Standard — einschließlich Reports über Nachrichten, die DMARC bestanden haben.
Für d und s macht RFC 9991 §3 den Zusammenhang ausdrücklich: Ein empfangender Server, der DMARC-Failure-Reports erzeugt, kann sich dafür entscheiden, Failure-Reports speziell zu dem gescheiterten Authentifizierungsmechanismus auszustellen — anstelle des DMARC-Failure-Reports oder zusätzlich dazu — und entscheidet anhand seiner eigenen Policy, des konkreten Fehlschlags und des Inhalts des fo-Tags, welche Typen er versendet. Dieselben Reports lassen sich über die Mechanismen aus RFC 6651 und RFC 6652 auch unabhängig von DMARC anfordern.
Ohne ruf wird fo vollständig ignoriert
Das ist der mit Abstand häufigste Weg, auf dem eine Failure-Report-Konfiguration am Ende gar nichts tut. RFC 9989 §4.7 formuliert es als harte Bedingung: Der Inhalt des fo-Tags MUSS ignoriert werden, wenn nicht zugleich ein ruf-Tag angegeben ist. Und das ruf-Tag selbst trägt die dazu passende Regel — fehlt es, dürfen empfangende Server für die Domain keine Failure-Reports erzeugen (MUST NOT).
Überhaupt keine Failure-Reports. Es gibt kein ruf-Tag, also wird das fo-Tag ignoriert, und Failure-Reports dürfen nicht erzeugt werden (MUST NOT). Der Record sieht nach konfiguriertem Failure-Reporting aus und ist es nicht.
Alle drei Bedingungen werden angefordert: DMARC-Failure-Reports immer dann, wenn irgendein Mechanismus kein ausgerichtetes Pass liefert, dazu DKIM- und SPF-spezifische Reports.
Beachten Sie: fo=0:1 ist nicht gültig — die beiden Werte schließen einander aus (RFC 9989 §4.7).
Warum die meisten großen Empfänger nichts davon versenden
Ein Failure-Report kann die vollständige Nachricht enthalten. RFC 9991 §7.1 hält fest, dass Failure-Reports personenbezogene und nicht-öffentliche Informationen aus Nachrichten enthalten können, die die Authentifizierung nicht bestehen, da diese Reports sowohl Nachrichteninhalte als auch Trace-Header-Felder enthalten können, und dass das Report-Format zwar Schwärzung unterstützt (RFC 6590), die Berichterstattung über fehlgeschlagene Nachrichten aber die gesamte Nachricht gegenüber dem Report-Empfänger offenlegen kann. RFC 9991 §7 folgert daraus, dass viele große Anbieter die Erzeugung von Failure-Reports einschränken oder ganz abschalten und sich lieber auf Aggregate-Reports stützen, die statistische Sichtbarkeit liefern, ohne sensible Inhalte preiszugeben. RFC 9989 §10.2 sagt dasselbe von der anderen Seite: Wegen der Natur der E-Mail-Inhalte, die über Failure-Reports geteilt werden können, verweigern die meisten empfangenden Server deren Versand aus Datenschutzgründen, und es können Absprachen außerhalb des Protokolls zwischen Report-Empfängern und empfangenden Servern nötig sein. ruf zu veröffentlichen und nichts zu erhalten ist der Normalfall, keine Fehlkonfiguration — und die Reports, die Sie doch erhalten, können stark geschwärzt sein, was laut RFC 9989 §5.3.9 ihren Nutzen beeinträchtigen kann.
Die Offenlegung beschränkt sich nicht auf Ihre eigene Mail. RFC 9991 §7.1 nennt zwei Folgen, die die meisten Betreiber überraschen. Erstens erhält ein Domaininhaber, der Reports anfordert, Informationen über Mail, die seine Domain benutzt, deren Versand er aber nicht veranlasst hat — ein wertvoller Einblick in missbräuchliche Inhalte, aber eben auch möglicherweise personenbezogene oder nicht-öffentliche Informationen aus legitimen Nachrichten, die versehentlich an der Authentifizierung gescheitert sind. Zweitens können Informationen über das endgültige Ziel einer Nachricht offengelegt werden, das sonst durch zwischengeschaltete Systeme verdeckt wäre: Das im RFC genannte Beispiel ist die Offenlegung der Mitglieder einer Mailingliste, wenn ein Listenmitglied schreibt und bei der Zustellung dieser Nachricht an die übrigen Mitglieder Failure-Reports erzeugt werden. Weiterleitungen haben denselben Effekt und machen Ziele sichtbar, die dem Domaininhaber vorher unbekannt waren.
RFC 9991 §7 zählt auf, wozu Betreiber, die Failure-Reporting doch einschalten, nachdrücklich angehalten werden: Umfang und Dauer der Nutzung auf gezielte Diagnosevorgänge begrenzen, die Report-URIs sorgfältig kontrollieren und validieren, Minimierungstechniken wie das Schwärzen von Nachrichten-Bodys und Header-Feldern anwenden und Reports stets über sichere Kanäle übertragen. §7.3 ergänzt die Anforderungen an den Umgang auf der Empfangsseite, denn teilweise oder gar nicht geschwärzte Reports können Spam-, Phishing- oder Malware-Inhalte weitertragen: Report-Ströme von anderen Mail-Strömen trennen, Reports in Sandboxes auswerten, Netzsegmentierung einsetzen und den Zugriff auf befugte Personen mit angemessener Sicherheitsschulung beschränken.
Es gibt ein Folgerisiko im DNS selbst. RFC 9989 §11.6 merkt an, dass die Adressen im ruf-Tag mehr Informationen erhalten, die als private Daten gelten können, was diese URIs zu attraktiveren Zielen für Einbruchsversuche macht als die im rua-Tag, und dass ein Angriff auf das DNS der betroffenen Domain, um Failure-Daten auf die Systeme eines Angreifers umzuleiten, eine attraktive Aussicht sein kann; wo das ein Thema ist, empfiehlt sich der Einsatz von DNSSEC.
PSDs dürfen keine Failure-Reports anfordern
Für Public Suffix Domains gelten zwei Regeln, und sie stehen in unterschiedlichen Dokumenten.
RFC 9991 §2, an den Report-Generator gerichtet: Report-Generatoren dürfen ruf-Tags in DMARC-Policy-Records mit einem psd=y-Tag nicht berücksichtigen (MUST NOT), sofern es keine besonderen Vereinbarungen zwischen den Beteiligten gibt. Ein PSD-Record mit ruf ist damit bei jedem regelkonformen Empfänger standardmäßig wirkungslos.
RFC 9989 §10.2, an den Veröffentlichenden gerichtet: DMARC-Policy-Records für organisationsübergreifende PSDs dürfen das ruf-Tag überhaupt nicht enthalten (MUST NOT).
Die Begründung ist dieselbe, die RFC 9989 §10.2 für Failure-Reports allgemein gibt: Sie geben Einblick in E-Mail-Sendemuster bis hinunter zu einzelnen Nutzern, und bevor Failure-Reports überhaupt angefordert werden, müssen solche Risiken des Datenabflusses durch Kontrollen der Datenverwaltung adressiert werden. Die entsprechende Regel für Aggregate-Reports ist schwächer — §10.1 warnt, dass organisationsübergreifende PSDs, die ihren Registranten DMARC nicht vorschreiben, mit einem rua-Tag die Offenlegung privater Registrantendaten riskieren; das ist aber eine Warnung, kein Verbot.
Was der Report selbst enthält
RFC 9991 §4 ergänzt das Report-Format aus RFC 6591 um eine Reihe DMARC-spezifischer Header-Felder des Abuse Reporting Format. Zu wissen, welche davon erforderlich sind, ist das, was einen regelkonformen Report von einem unvollständigen unterscheidbar macht.
ARF-Header-Feld
Anforderungsstufe (RFC 9991 §4)
Inhalt
Identity-Alignment
REQUIRED
Eine kommagetrennte Liste der Namen jener Authentifizierungsmechanismen, die keine ausgerichtete Identität authentifizieren konnten, oder das Schlüsselwort none, wenn alle versuchten Verfahren eine ausgerichtete Identität authentifizieren konnten. Zulässige Verfahrensnamen sind dkim und spf, jeder höchstens einmal.
Delivery-Result
OPTIONAL
Die Behandlung (disposition), die der Empfänger auf die Nachricht angewendet hat.
DKIM-Domain, DKIM-Identity, DKIM-Selector
REQUIRED bei DKIM-Fehlschlägen eines ausgerichteten Identifiers
Welche Signatur fehlgeschlagen ist, identifiziert über signierende Domain, Identität und Selector.
Das kanonisierte Material, das der Verifier tatsächlich gehasht hat — genau das brauchen Sie, um eine unterwegs zerstörte Signatur zu finden.
SPF-DNS
REQUIRED bei SPF-Fehlschlag eines ausgerichteten Identifiers
Die DNS-Daten, auf denen die SPF-Auswertung beruhte.
RFC 9991 §4 definiert außerdem den Authentifizierungs-Fehlschlagstyp dmarc für das ARF-Feld Auth-Failure; er wird verwendet, wenn ein Failure-Report erzeugt wird, weil einige oder alle Authentifizierungsmechanismen keine ausgerichteten Identifier geliefert haben.
Zwei betriebliche Randbedingungen auf der Senderseite. Report-Generatoren müssen ausgehende Reports ratenbegrenzen (MUST), um Report-Empfänger nicht zu überfluten — sonst wäre ein Denial-of-Service-Angriff möglich (RFC 9991 §2 und §8.1): Ein Angreifer, der große Mengen Mail versendet, die sowohl SPF als auch DKIM verfehlt und vorgibt, von Ihrer Domain zu stammen, macht jeden teilnehmenden Empfänger zu einer Verkehrsquelle, die auf Ihre Report-Adresse zielt. RFC 9991 §8.1 empfiehlt, solche Reports über das ARF-Feld Incidents zusammenzufassen, Reports kurzzeitig zu speichern, um gleichartige Vorfälle zu konsolidieren, und zu ratenbegrenzen, wobei der Rest verworfen wird. Davon unabhängig hält RFC 9991 §5.1 fest, dass E-Mail-Ströme mit DMARC-Failure-Reports DMARC-ausgerichtet sein sollen (SHOULD), da nicht ausgerichtete Reports selbst wieder Failure-Reports erzeugen und Mail-Schleifen verursachen können.
Reports an eine andere Domain schicken: die _report._dmarc-Autorisierung
Nichts im DNS hindert Sie daran, rua=mailto:reports@thirdparty.example.net in Ihrem eigenen DMARC-Record zu veröffentlichen. Genau dieses Problem löst RFC 9990 §4. Ohne Prüfung könnte ein Angreifer einen DMARC-Policy-Record veröffentlichen, der Reports an die Adresse eines Opfers anfordert, und anschließend große Mengen Mail, die sowohl DKIM als auch SPF verfehlt, an die unterschiedlichsten Ziele senden; das Opfer würde dann mit unerwünschten Reports überflutet. Die empfangende Domain muss also zustimmen — und sie stimmt in ihrem eigenen DNS zu.
Wann die Prüfung ausgelöst wird
Ausgelöst wird sie durch einen Vergleich von Organisationsdomains, nicht von Hostnamen. RFC 9990 §4: Wenn ein empfangender Server einen DMARC-Policy-Record findet und die Organisationsdomain, unter der dieser Record gefunden wurde, nicht mit der Organisationsdomain des Host-Teils der Authority-Komponente der URI im rua-Tag identisch ist, müssen die Verifikationsschritte durchlaufen werden.
Record unter
rua-Ziel
Autorisierung nötig?
_dmarc.example.com
mailto:dmarc-feedback@example.com
Nein. Gleiche Organisationsdomain.
_dmarc.example.com
mailto:dmarc-feedback@reports.example.com
Nein. Der Host ist ein anderer, seine Organisationsdomain ist aber weiterhin example.com.
_dmarc.example.com
mailto:auth-reports@thirdparty.example.net
Ja. Andere Organisationsdomain.
_dmarc.mail.example.com
mailto:auth-reports@thirdparty.example.net
Ja — und beachten Sie: Das in Schritt 3 unten vorangestellte Label ist die Domain, von der die Policy geholt wurde, und nicht zwingend die Organisationsdomain, die in diesen Vergleich eingeht.
Wie der Name gebildet wird
RFC 9990 §4 gibt die Bildung als geordnetes Verfahren an:
Den Host-Teil der Authority-Komponente der URI extrahieren. Das ist der Ziel-Host, da er auf einen Report-Empfänger verweist.
Die Zeichenfolge _report._dmarc voranstellen.
Den Domainnamen voranstellen, von dem die Policy geholt wurde — nötigenfalls nach Umwandlung in ein A-Label.
Überschreitet die Länge des gebildeten Namens die DNS-Grenzen, lässt sich die externe Report-Beziehung nicht positiv feststellen; Abbruch.
Das DNS nach einem TXT-Record unter dem gebildeten Namen abfragen. Ist das Ergebnis ein vorübergehender DNS-Fehler wie ein Timeout, kann der empfangende Server die Zustellung vorübergehend scheitern lassen, damit die Prüfung später wiederholt werden kann.
Durchgespielt am Beispiel aus RFC 9989 Anhang B.2.3, in dem example.com einen Dritten bittet, seine Failure-Reports entgegenzunehmen:
Die beiden Records vollständig
; published by example.com
_dmarc.example.com. IN TXT ( "v=DMARC1; p=none; "
"rua=mailto:dmarc-feedback@example.com; "
"ruf=mailto:auth-reports@thirdparty.example.net" )
; published by the report consumer, in the zone thirdparty.example.net
example.com._report._dmarc.thirdparty.example.net. IN TXT "v=DMARC1;"
Der Name, den der Empfänger abfragt, setzt sich zusammen aus dem Ziel-Host thirdparty.example.net, den festen Labels _report._dmarc und der Domain, aus der die Policy stammt, example.com. Der autorisierende Record braucht für die Zustimmung nichts weiter als v=DMARC1.
Der autorisierende Record wird vom Empfänger der Reports veröffentlicht, in dessen eigener Zone. Sie können ihn nicht selbst anlegen, und ein Report-Dienstleister, der ihn nicht veröffentlicht hat, erhält Ihre Reports nicht — ganz gleich, was in Ihrem DMARC-Record steht: Bestätigt der Algorithmus die Autorisierung nicht, MUSS der empfangende Server, der den Report erzeugt, die URI ignorieren (RFC 9990 §4).
Was als gültiger Autorisierungs-Record zählt
Die Schritte 6 bis 8 aus RFC 9990 §4 definieren den Annahmetest, und er ist bewusst minimal. Jeder zurückgelieferte TXT-Record wird als Folge von tag=value-Paaren im selben Gesamtformat wie ein DMARC-Policy-Record geparst; das Tag v=DMARC1 ist verpflichtend und MUSS in der Liste an erster Stelle stehen, und jeder Record, der daran scheitert, wird verworfen. Ein abschließendes Semikolon ist optional. Besteht kein zurückgelieferter TXT-Record das grundlegende Parsen, lässt sich nichts positiv feststellen, und das Verfahren bricht ab. Bleibt nach dem Parsen mindestens ein Record übrig, wurde die externe Report-Beziehung vom Report-Empfänger autorisiert.
Ein bestandener Record belegt
dass der Ziel-Host zustimmt, Reports über genau die Domain zu empfangen, die in den Labels ganz links genannt ist.
dass der empfangende Server den Report an die URI in Ihrem DMARC-Record zustellen darf.
optional eine Ersatz-URI, die das Ziel selbst wählt (siehe unten).
Ein bestandener Record belegt nicht
irgendeine Policy für die in den Labels ganz links genannte Domain. Das p-Tag ist auf Records für Reporting durch Dritte nicht anwendbar (RFC 9989 §4.7).
dass die Reports tatsächlich ankommen; die Zustellung an die URI kann trotzdem scheitern, und der Empfänger kann die Daten dann zwischenspeichern und erneut versuchen oder sie verwerfen (RFC 9990 §3.5).
irgendetwas über Failure-Reports, sofern nicht dasselbe Verfahren für ruf wiederholt wird.
Ein Report-Empfänger, der Reports für beliebige Domains annehmen will, kann eine Wildcard verwenden: Ein TXT-Record unter *._report._dmarc.example.net, der mindestens v=DMARC1 enthält, bestätigt, dass example.net bereit ist, DMARC-Reports für jede beliebige Domain zu empfangen (RFC 9990 §4). Wird der Empfänger vom Volumen überrollt, kann er den bestätigenden Record einfach entfernen — wegen des positiven Cachings greift die Änderung allerdings erst, wenn die TTL des Records abgelaufen ist.
Die Längengrenze
Schritt 4 des Verfahrens ist ein echter Fehlerfall und keine Formalie, denn der gebildete Name ist die Aneinanderreihung zweier vollständiger Domainnamen plus zweier fester Labels. RFC 9990 §4 sagt dazu nur, dass sich die externe Report-Beziehung bei Überschreiten der DNS-Längengrenzen nicht positiv feststellen lässt und das Verfahren abbricht — was zusammen mit der Regel, dass eine unbestätigte URI ignoriert werden MUSS, bedeutet: Die Reports werden stillschweigend nicht versendet. Der Rat des RFC für diesen Fall lautet, dass der Domaininhaber möglicherweise einen kürzeren Domainnamen in Betracht ziehen oder sich mit einer anderen Partei abstimmen muss, die ein kürzeres DNS-Label ermöglicht. Wenn ein Report-Dienstleister einen kurzen Reporting-Hostnamen anbietet, hat das seinen Grund.
Wenn der Autorisierungs-Record das Ziel umleitet
Schritt 9 aus RFC 9990 §4 erlaubt es dem Ziel, den Report-Empfang umzuleiten. Findet sich im Autorisierungs-Record ein rua-Tag, ersetzt der empfangende Server den Wert aus Ihrem DMARC-Record durch den aus dem Autorisierungs-Record. Damit kann der Report-Empfänger das Report-Ziel überschreiben — nützlich, wenn der Dienstleister sein Postfach gewechselt hat oder gegen einen Tippfehler im DMARC-Record eines Kunden robust sein will (RFC 9989 Anhang B.2.4).
Zwei Grenzen umgeben das, beide gegen Schleifen und indirekten Missbrauch gerichtet:
Die Umleitung muss auf demselben Host bleiben. RFC 9990 §4: Um Schleifen oder indirekten Missbrauch zu verhindern, MUSS die überschreibende URI denselben Ziel-Host aus dem ersten Schritt verwenden. Ein Dienstleister kann reports@thirdparty.example.net auf aggregate-reports@thirdparty.example.net umleiten; auf eine andere Domain kann er nicht umleiten.
Eine domainübergreifende Umleitung vergiftet beide URIs. Enthält der bestätigende Record eine URI, deren Host wiederum von der Domain abweicht, die diese Umleitung veröffentlicht, darf der empfangende Server weder an die ursprüngliche noch an die überschreibende URI einen Report erzeugen (MUST NOT). Der Umleitungsversuch scheitert nicht bloß — er kostet Sie zusätzlich das ursprüngliche Ziel.
Ein überschreibender Autorisierungs-Record
; zone file for thirdparty.example.net
; accept DMARC reports on behalf of example.com and override the mailboxes
example.com._report._dmarc.thirdparty.example.net. IN TXT (
"v=DMARC1; "
"rua=mailto:aggregate-reports@thirdparty.example.net; "
"ruf=mailto:failure-reports@thirdparty.example.net" )
Beide überschreibenden URIs verwenden denselben Host wie der in Schritt 1 extrahierte Ziel-Host, also sind beide zulässig. Reports, die example.com an irgendein Postfach bei thirdparty.example.net adressiert hat, werden auf diese beiden umgeleitet.
Eine dieser URIs auf einen Host außerhalb von thirdparty.example.net zu ändern, würde die Reports nicht etwa anderswohin umleiten. Es würde dazu führen, dass sie überhaupt nicht mehr erzeugt werden — an keine der beiden Adressen.
Für ruf gilt dasselbe Verfahren
RFC 9991 §5 definiert keinen eigenen Mechanismus. Ein empfangender Server, der Failure-Reports an ein externes Ziel erzeugt, MUSS das Verfahren „Verifying External Destinations“ aus RFC 9990 §4 anwenden und dabei überall dort, wo in diesem Verfahren das rua-Tag steht, das ruf-Tag einsetzen. Der gebildete Name ist identisch — das Label-Paar _report._dmarc trägt beide Report-Typen, und ein einziger Autorisierungs-Record deckt rua und ruf gleichermaßen ab, sofern er nicht eines von beiden überschreibt.
RFC 9991 §5 gibt dieselbe Begründung in beide Richtungen: Die Prüfung verhindert, dass ein Angreifer einen DMARC-Policy-Record veröffentlicht, der Failure-Reports an ein externes Ziel anfordert, und diese Reports dann absichtlich als Form des Missbrauchs erzeugen lässt; und sie verhindert, dass ein Domaininhaber einem externen Ziel einseitig unerwünschte Nachrichten und mögliche Datenschutzprobleme aufzwingt. Angesichts dessen, was §7.1 über den Inhalt eines Failure-Reports sagt, wiegt die zweite Hälfte dieses Satzes genauso schwer wie die erste.
RFC 9989 §11.6 ergänzt einen betrieblichen Hinweis, dessen Umsetzung sich lohnt: Nach Möglichkeit setzt man externes Reporting am besten so um, dass der Report an eine Domain adressiert wird, die Mail empfangen kann, und von dort automatisch an das gewünschte externe Ziel weitergeleitet wird. Das umgeht den Autorisierungs-Record, die Längengrenze und die zusätzliche DNS-Last, die die Verifikation dem angeblichen externen Empfänger aufbürdet.
Unser Scanner führt dieses Verfahren für die mailto:-Ziele Ihrer rua- und ruf-Tags aus — für die ersten acht verschiedenen Ziel-Hosts, gezählt noch vor der Entscheidung extern/intern. Eine Report-URI mit anderem Schema wird hier nicht aufgelöst: mailto: ist das einzige Schema, das ein Report-Erzeuger unterstützen muss, und RFC 9990 §3.5.3 überlässt weitere Schemata späteren Fassungen. Für jeden dieser Hosts bestimmt er die Organisationsdomain, bildet für die als extern erkannten den _report._dmarc-Namen, prüft den Namen gegen die DNS-Längengrenze, schlägt den Autorisierungs-Record nach und wendet die Regel aus Schritt 9 an, nach der eine auf einen anderen Host zeigende Umleitung die Reports vollständig unterbindet. Siehe die Prüfung dmarc-rua-ext.
Fehlersuche: ein Entscheidungsbaum
Fast jedes DMARC-Problem, das in der Praxis gemeldet wird, geht auf eine kleine Zahl von Ursachen zurück, und der schnellste Weg zur richtigen führt über das Symptom statt über den Record. Wählen Sie unten das Symptom und arbeiten Sie sich durch die Zweige: Jeder endet damit, wie der Fehler aussieht, wie Sie ihn bestätigen und was Sie ändern müssen. Die einschlägigen Abschnitte aus RFC 9989, RFC 9990 und RFC 9991 sind dort genannt, wo das Verhalten normativ ist — so können Sie die Begründung nachlesen, statt sie glauben zu müssen.
Zwei Dinge sollten Sie dabei offen haben. Der Domain-Scan zeigt, welcher Record für den gefragten Namen tatsächlich gilt — auch ein weiter oben im Tree Walk geerbter —, und der Sende-Test zeigt, was ein Empfänger bei einer wirklich versendeten Nachricht sieht: welcher Identifier bestanden hat, gegen welche Domain er ausgerichtet war und welcher Record die Entscheidung bestimmt hat.
1. Legitime Mail wird abgelehnt oder als Spam einsortiert
SPF besteht, DMARC scheitert trotzdem
Die Nachricht zeigt spf=pass im Authentication-Results-Header-Feld des Empfängers und direkt daneben dmarc=fail. Das ist eine der häufigsten DMARC-Überraschungen und kein Widerspruch: DMARC stützt sich allein auf die SPF-Prüfung der MAIL-FROM-Identität, und die Domain, die SPF besteht, muss anschließend auch in Ausrichtung (Alignment) zur Domain im From:-Header-Feld stehen (RFC 9989 §4.4.2). Eine Mail-Plattform, die ihre eigene Bounce-Domain setzt — ein Return-Path: von bounces.example.net unter einem From: von example.com —, erzeugt genau dieses Ergebnis.
Schicken Sie eine Nachricht über den betroffenen Weg an den Sende-Test. Er benennt den authentifizierten Identifier, die Author Domain (die Domain im From:-Header-Feld) und ob die beiden ausgerichtet waren; dieselbe Gegenüberstellung lässt sich auch aus einer zugestellten Nachricht ablesen, indem Sie Return-Path: und From: nebeneinanderlegen, oder aus einem Aggregate-Report, indem Sie die SPF-Domain einer Zeile mit der Header-From-Domain des Reports vergleichen.
Sorgen Sie entweder dafür, dass die Envelope-Domain ausgerichtet ist — die meisten Plattformen bieten einen eigenen Return Path unter Ihrer eigenen Domain —, oder bringen Sie eine ausgerichtete DKIM-Signatur auf den Stream, was die dauerhaftere Lösung ist. Nur ein ausgerichteter Identifier muss bestehen: Eine Nachricht ist ein DMARC-Pass, wenn irgendein DKIM-authentifizierter Identifier zur Author Domain ausgerichtet ist (§4.4.1), unabhängig davon, was SPF ergeben hat.
Die Mail wurde weitergeleitet oder lief über eine Mailingliste
Die Fehlschläge häufen sich bei bestimmten Empfängerdomains statt bei einem Ihrer Sendesysteme, und die Quelladressen in den Aggregate-Reports gehören zu einem Weiterleiter oder einem Listenserver. RFC 9989 §7.4 beschreibt den Mechanismus: Wenn ein Alumni-Weiterleiter oder eine Rollenadresse Ihre Nachricht weiterreicht, ist die verbindende IP-Adresse die des Relays — SPF scheitert also, sofern das Relay die MAIL-FROM-Adresse nicht umgeschrieben hat, während DKIM-Signaturen die Weitergabe in der Regel unangetastet überstehen.
Prüfen Sie, ob auf diesem Stream überhaupt eine ausgerichtete DKIM-Signatur existiert — der Sende-Test verifiziert jede Signatur einer von Ihnen versendeten Nachricht und nennt zu jeder die signierende Domain. Wenn den Stream allein SPF getragen hat, zerbricht ihn jede Weiterleitung.
Signieren Sie Ihre Mail. RFC 9989 §7.4 sagt ausdrücklich, dass Domains, die p=reject veröffentlichen, sich für einen DMARC-Pass NICHT allein auf SPF verlassen DÜRFEN und ihre Nachrichten mit gültigen DKIM-Signaturen versehen MÜSSEN. Wenn auf der betroffenen Domain allgemeine Nutzer liegen, die in Internet-Mailinglisten schreiben, rät derselbe Abschnitt, dass solche Domains p=reject gar nicht erst veröffentlichen SOLLTEN; der Mailinglisten-Abschnitt weiter unten behandelt, was die Liste mit der Nachricht macht und was ARC reparieren kann und was nicht.
Ein SPF-Hard-Fail lehnt die Nachricht ab, bevor DMARC überhaupt ausgewertet wird
Die Ablehnung erfolgt früh in der SMTP-Transaktion, und der Antworttext erwähnt SPF, nicht DMARC. Schlimmer noch: Die betroffene Mail fehlt in Ihren Aggregate-Reports vollständig, das Volumen sieht also kleiner aus, als es ist.
Sehen Sie sich den SPF-Record der sendenden Domain an: Endet er auf -all, darf ein Empfänger eine nicht davon abgedeckte Nachricht ablehnen, bevor irgendeine DMARC-Verarbeitung stattfindet. RFC 9989 §7.1 benennt beide Folgen — eine Nachricht, die über eine ausgerichtete DKIM-Signatur sonst DMARC bestanden hätte, kann allein wegen des SPF-Fails abgelehnt werden, und weil die Transaktion nie die DATA-Phase erreicht, wird die From:-Domain nie sichtbar und der Fehlschlag taucht in keinem Aggregate-Report auf.
Finden Sie die sendende Quelle, die im SPF-Record fehlt, und tragen Sie sie nach — oder wechseln Sie für die Dauer der Bereinigung auf einen Soft Fail. Eine ausgerichtete DKIM-Signatur rettet keine Nachricht, die schon vor DATA abgewiesen wurde; mit -all muss also jede legitime Quelle gelistet sein. Der Domain-Scan wertet den SPF-Record samt seiner Lookup-Zahl aus.
DMARC besteht, und die Mail wird trotzdem gefiltert
Das Authentication-Results-Header-Feld des Empfängers sagt dmarc=pass, und die Nachricht liegt trotzdem im Spam-Ordner. Es ist nichts kaputt.
Bestätigen Sie den Pass in dem Sende-Test und hören Sie dann auf, auf DMARC zu schauen. RFC 9989 §5.4 hält fest, dass ein DMARC-Pass nur besagt, dass die Nutzung der Author Domain als vom Domaininhaber autorisiert validiert wurde; er enthält weder ausdrücklich noch implizit eine Wertaussage über die Nachricht oder den Domaininhaber, und Empfänger DÜRFEN eine Nachricht auch dann ablehnen oder in Quarantäne stellen, wenn sie besteht.
Es gibt kein Tag, mit dem Sie dieses Ergebnis ändern könnten. Übrig bleibt alles, was DMARC nicht misst: Inhalt, Versand-Reputation, Listenhygiene und die technische Hygiene der übrigen Domain. Der Domain-Scan deckt Letzteres ab.
2. Es kommen keine Reports an
Der Record hat kein rua-Tag
Der Record enthält eine Policy und sonst nichts — oft der Fall, wenn er aus einem Beispiel kopiert oder von einem Control Panel erzeugt wurde, das Reporting als optional behandelt.
Fragen Sie den TXT-Record unter _dmarc.example.com mit dem DNS-Lookup ab und lesen Sie die Tag-Liste. Erscheint kein rua, ist die Sache entschieden: Fehlt das Tag, DÜRFEN Empfänger für die Domain keine Aggregate-Feedback-Reports erzeugen (RFC 9989 §4.7).
Ergänzen Sie eine rua=mailto:-Adresse, die auf ein Postfach zeigt, das maschinell erzeugte Reports verarbeiten kann (§5.1.3, §5.1.4). Der DMARC-Generator erzeugt den vollständigen Record.
Reports gehen an eine andere Domain, die das nie autorisiert hat
Die rua-Adresse liegt bei einem Report-Dienstleister oder bei einer zweiten Domain von Ihnen — rua=mailto:dmarc@example.net im Record von example.com — und es kommen nie Reports an. Es gibt nirgends einen Bounce und keine Fehlermeldung, weil die Prüfung des Empfängers im DNS stattfindet, bevor überhaupt ein Report erzeugt wird.
Wenn die Organisationsdomain des Records nicht mit der Organisationsdomain im Reporting-URI übereinstimmt, MUSS der Empfänger die Absprache überprüfen, indem er einen TXT-Record am Zielhost abfragt, dem _report._dmarc und die Policy-Domain vorangestellt sind (RFC 9990 §4). Für dieses Beispiel lautet der Name example.com._report._dmarc.example.net, und er muss einen Record zurückgeben, der mit v=DMARC1 beginnt. Fragen Sie genau diesen Namen mit dem DNS-Lookup ab. Ein Dienstleister, der Reports für beliebige Domains annimmt, kann stattdessen einen Wildcard-Eintrag unter *._report._dmarc.example.net veröffentlichen.
Lassen Sie die Zieldomain den Autorisierungs-Record veröffentlichen; kann der Algorithmus die Absprache nicht bestätigen, MUSS der Empfänger den URI ignorieren (RFC 9990 §4). Beachten Sie, dass der bestätigende Record das Ziel auch überschreiben kann — allerdings nur auf einen URI mit demselben Zielhost. Der Domain-Scan führt diese Prüfung für jede externe mailto:-Reporting-Adresse in Ihrem Record durch. Der DMARC-Generator beantwortet dieselbe Frage für einen dort geladenen Record: Er sagt je Ziel, ob der Freigabe-Record gefunden wurde, fehlt oder nicht prüfbar war, und zeigt den Record, den die Empfängerseite veröffentlichen muss.
Die Reports werden verschickt, tauchen aber in Ihrem Postfach nie auf
Die Reporting-Adresse liegt innerhalb Ihrer eigenen Domain, es ist also keine externe Autorisierung nötig — und das Postfach ist trotzdem leer, oder voll mit Dingen, die Sie nicht als Reports erkannt haben.
Durchsuchen Sie dieses Postfach nach der Form, die der RFC vorschreibt, statt nach dem Wort DMARC. Die Betreffzeile folgt einem festen Muster — Report Domain: example.com Submitter: mail.receiver.example Report-ID: … —, und der Report selbst ist ein Anhang mit dem Namen receiver!policy-domain!begin-timestamp!end-timestamp.xml.gz, üblicherweise GZIP-komprimiert (RFC 9990 §3.5.2). Wenn ein Gateway komprimierte Anhänge entfernt oder das Postfach eine kleine Größenbeschränkung durchsetzt, sind die Reports weg, bevor Sie sie sehen; derselbe Abschnitt weist darauf hin, dass ein Report das SMTP-Größenlimit des Empfängers auch schlicht überschreiten kann.
Stellen Sie diese Adresse in ein Postfach zu, das .gz-Anhänge und großzügige Nachrichtengrößen akzeptiert, und halten Sie es aus aggressiver Filterung heraus. Ist die Zustellung nicht möglich, weil der angekündigte Dienst die Reports nicht annehmen kann, DARF ein Empfänger die Daten verwerfen, statt es erneut zu versuchen (RFC 9990 §3.5) — ein kaputtes Report-Postfach kostet Sie die Daten also dauerhaft.
Sie warten auf Failure-Reports statt auf Aggregate-Reports
Aggregate-Reports kommen an, das ruf-Postfach bleibt leer, und nichts erklärt, warum.
Die beiden Report-Arten haben eine unterschiedliche Ökonomie. Aggregate-Reports kommen als tägliche oder häufigere Rückmeldung der Empfänger (RFC 9990 §3.1). Failure-Reports werden fast unmittelbar nach dem Erkennen eines Fehlschlags erzeugt, aber nur dort, wo der Empfänger bereit ist, sie bereitzustellen (RFC 9991 §2) — und RFC 9991 §7 hält fest, dass viele große Anbieter die Erzeugung von Failure-Reports einschränken oder ganz abschalten, weil ein solcher Report die Header-Felder oder den gesamten Inhalt einer Nachricht offenlegen kann und damit personenbezogene Daten. Ein externes ruf-Ziel braucht zusätzlich dieselbe _report._dmarc-Autorisierung wie rua, mit dem Tag ruf an dessen Stelle im Verfahren (RFC 9991 §5).
Bauen Sie Ihr Monitoring auf Aggregate-Reports auf und behandeln Sie Failure-Reports als gelegentliche diagnostische Zugabe. Eine andere Report-Frequenz lässt sich ohnehin nicht mehr anfordern: Das Tag ri, mit dem ein Intervall zwischen Aggregate-Reports erbeten wurde, ist aus dem Standard entfernt worden (RFC 9989 Appendix C.5.2).
3. Der Record wird nicht gefunden oder scheint ignoriert zu werden
v=DMARC1 ist nicht exakt so geschrieben oder steht nicht an erster Stelle
Der Record ist im DNS sichtbar vorhanden, die meisten Checker sagen, die Domain habe keinen DMARC-Record, und kein Empfänger handelt danach.
Lesen Sie das Versions-Tag Zeichen für Zeichen — oder lassen Sie es den Domain-Scan tun: Scheitert ein TXT-Record unter _dmarc nur an der Schreibweise von DMARC1, sagt er das ausdrücklich und zeigt den Record — auch dann, wenn weiter oben im Baum noch eine Policy gilt. Sein Wert ist case-sensitiv, der einzig mögliche Wert ist DMARC1, und das Tag MUSS das erste in der Liste sein; fehlt das Tag, steht es nicht an erster Stelle oder trägt es einen anderen Wert, MUSS der gesamte Record ignoriert werden (RFC 9989 §4.7). Ein Record, der mit v=dmarc1 beginnt, oder einer, der mit p=reject; v=DMARC1 anfängt, wird komplett verworfen — nicht teilweise angewendet. Dieselbe Regel gilt im Tree Walk: Records, die nicht mit einem v-Tag der aktuellen Version beginnen, werden bei jedem Schritt verworfen (§4.10).
Veröffentlichen Sie den Record neu mit v=DMARC1 als erstem Tag, in genau dieser Schreibweise. Der DMARC-Generator gibt die Tags in gültiger Reihenfolge aus.
Unter dem Namen liegt mehr als ein DMARC-Record
Zwei TXT-Records unter _dmarc.example.com beginnen beide mit v=DMARC1. Das passiert nach einer Migration oder wenn eine Mail-Plattform einen Record neben den bereits veröffentlichten setzt. Dieser Name verhält sich nun so, als trüge er keinen eigenen DMARC-Record — und das ist schlechter als jeder der beiden Records für sich. Auf einer Subdomain ist es nicht „kein DMARC“: Der Tree Walk läuft nach oben weiter und übergibt die Entscheidung an den Record, den er darüber findet, in der Regel sp oder np der Organisationsdomain. An der Organisationsdomain selbst heißt es meist wirklich „keine Policy“ — nur ein PSD-Record darüber könnte dann noch eine liefern.
Fragen Sie TXT unter _dmarc.example.com mit dem DNS-Lookup ab; er zeigt jede Antwort mehrerer unabhängiger Resolver, sodass auch ein Record sichtbar wird, den nur manche Sichten zurückgeben — und, sofern die Nameserver der Zone ermittelbar sind, in einem zweiten Panel deren Antworten einzeln, samt AA-Flag und SOA-Serial je Server. Dieses zweite Panel klärt ein nach einer Migration übrig gebliebenes Duplikat, weil Resolver aus einer zwischengespeicherten Sicht antworten und einig sein können, während ein einzelner Ihrer eigenen Nameserver den zusätzlichen Record noch ausliefert. Die Regel kennt keine Nachsicht: Werden für ein einzelnes Ziel mehrere DMARC-Policy-Records zurückgegeben, werden sie alle verworfen (RFC 9989 §4.10, Schritte 2 und 6).
Löschen Sie alle Records bis auf einen und führen Sie die benötigten Tags im verbleibenden zusammen. In dem Domain-Scan deckelt dieser Zustand das E-Mail-Modul auf Note C — unabhängig davon, ob weiter oben im Baum noch ein Record den Namen regelt: Die Policy, die Sie unter diesem Namen veröffentlicht haben, ist so oder so weg, und welche sie ersetzt, haben Sie nicht gewählt.
Der Record ist unter dem falschen Namen veröffentlicht
Der Inhalt des Records ist korrekt, er liegt aber unter example.com selbst oder unter _dmarc.example.com.example.com, weil die DNS-Oberfläche den Zonennamen an einen Wert angehängt hat, der ihn bereits enthielt.
DMARC-Policy-Records werden als TXT-Records unter Namen abgelegt, die mit dem Label _dmarc beginnen; der Record für example.com liegt also unter _dmarc.example.com und wird über eine TXT-Abfrage dieses Namens gefunden (RFC 9989 §4.5). Fragen Sie mit dem DNS-Lookup sowohl den beabsichtigten als auch den verdoppelten Namen ab; erscheint die Antwort unter dem verdoppelten Namen, ist die Ursache sofort klar.
Veröffentlichen Sie den Record unter dem _dmarc-Label der Domain, die im From:-Header-Feld steht. Hängt Ihre DNS-Oberfläche die Zone automatisch an, tragen Sie nur das _dmarc-Label ein; tut sie es nicht, tragen Sie den voll qualifizierten Namen ein.
Der Record ist syntaktisch in Ordnung, trägt aber kein brauchbares Policy-Tag
Der Record sieht vollständig aus, und Empfänger behandeln die Domain, als wäre sie im Monitoring-Modus — oder ignorieren sie ganz. Ein falsch geschriebener Tag-Name ist die übliche Ursache, denn verarbeitet werden nur Tags aus der IANA-Registry, und unbekannte Tags MÜSSEN ignoriert werden (RFC 9989 §4.7) — policy=reject ist kein Fehler, es ist unsichtbar.
Vergleichen Sie jeden Tag-Namen mit der Registry-Liste und achten Sie auf die Rückfallregel, die bestimmt, was dann passiert: Enthält ein abgerufener Record kein gültiges p-Tag oder ein ungültiges sp- oder np-Tag, verfährt der Empfänger so, als wäre p=none abgerufen worden — sofern in rua ein syntaktisch gültiger Reporting-URI vorhanden ist — und wendet andernfalls überhaupt keine DMARC-Verarbeitung auf die Nachricht an (§4.10.1).
Korrigieren Sie Tag-Namen und -Werte so, dass die beabsichtigte Policy von einem gültigen p-Tag getragen wird. Wenn Sie den Record in dem DMARC-Generator bauen, entfällt die ganze Fehlerklasse, weil er nur registrierte Tags ausgeben kann.
4. Nur Mail von einer Subdomain scheitert
Die Policy der Organisationsdomain gilt für die Subdomain
Sie haben p=reject unter example.com veröffentlicht, und Mail von newsletter.example.com wird seither abgelehnt, obwohl Sie für die Subdomain nie etwas veröffentlicht haben.
Das ist das definierte Verhalten: Die Policy gilt für die abgefragte Domain und für Subdomains, sofern die Subdomain-Policy nicht ausdrücklich über die Tags sp oder np beschrieben ist (RFC 9989 §4.7). Existiert unter der Author Domain kein Record, läuft die Policy-Discovery den Baum hinauf, und die Policy wird dem sp-Tag entnommen, wenn die Author Domain existiert, bzw. dem np-Tag, wenn sie es nicht tut; ist keines von beiden vorhanden, gilt p (§4.10.1). Lassen Sie den Domain-Scan gegen die Subdomain selbst laufen, um zu sehen, welcher Record gefunden wurde und welche Policy daraus folgte.
Entscheiden Sie, wo die Ausnahme hingehört. Ergänzen Sie entweder sp= im Record der Organisationsdomain, um für alle Subdomains eine andere Policy zu setzen, oder veröffentlichen Sie einen Record unter _dmarc.newsletter.example.com, den die Policy-Discovery dem Record der Organisationsdomain vorzieht (§4.10.1) — die zweite Variante hält die Ausnahme auf diesen einen Stream begrenzt und gibt ihr eigene Reports.
Der eigene Record der Subdomain trägt sp= und es wird ignoriert
Sie haben v=DMARC1; p=none; sp=reject unter _dmarc.newsletter.example.com veröffentlicht, und der sp-Teil bleibt wirkungslos.
Das sp-Tag wird bei DMARC-Policy-Records, die auf Subdomains von Organisationsdomains und PSDs veröffentlicht sind, ignoriert — als Folge der Policy-Discovery (RFC 9989 §4.7): Die Discovery findet den Record unter der Author Domain selbst und entnimmt die Policy deren p-Tag (§4.10.1), sodass dieser Record nie als Subdomain-Policy von irgendetwas behandelt wird.
Schreiben Sie die für diesen Namen gewünschte Policy in dessen p-Tag und überlassen Sie sp und np dem Record der Organisationsdomain — dem einzigen Ort, an dem sie wirken.
np= erfasst nicht die Namen, die Sie erwartet haben
Sie haben np=reject gesetzt, um nie genutzte Namen zu schützen, und Mail von einem davon wird trotzdem nach einer schwächeren Policy behandelt — oder umgekehrt: Ein Name, den Sie für stillgelegt halten, wird als existierend behandelt.
Das np-Tag gilt nur für nicht existierende Subdomains der abgefragten Organisationsdomain, nicht für existierende Subdomains und nicht für die Domain selbst (RFC 9989 §4.7). Existenz ist hier weiter gefasst, als man es in der Mailwelt erwartet: DMARC verlangt keinen bestimmten Record-Typ — existiert irgendein Resource Record für einen Namen, existiert die Domain; nur eine NXDOMAIN-Antwort bedeutet, dass sie es nicht tut (Appendix A.4, §3.2.13). Ein vergessener A-Record oder ein übrig gebliebener CNAME auf old.example.com genügt, um diesen Namen aus np heraus und unter sp zu schieben. Fragen Sie den Namen mit dem DNS-Lookup für mehrere Record-Typen ab, um zu sehen, welcher der beiden Fälle vorliegt.
Entfernen Sie die übrig gebliebenen Records, wenn der Name wirklich ungenutzt ist, oder setzen Sie sp auf die Policy, die Sie für ihn vorgesehen hatten. Weil eine NXDOMAIN-Antwort bedeutet, dass auch jeder Name darunter nicht existiert (Appendix A.4), kann das Aufräumen eines einzigen Labels einen ganzen Zweig auf einmal klären.
strict bricht die Subdomain, die relaxed noch zugelassen hat
Mail von news.example.com scheitert, während Mail von example.com besteht, und der Unterschied trat auf, als adkim=s oder aspf=s hinzukam.
Unter relaxed muss der authentifizierte Identifier nur dieselbe Organisationsdomain wie die Author Domain haben; unter strict müssen die beiden identisch sein (RFC 9989 §4.4). Die Tabelle in diesem Abschnitt macht den Fall konkret: foo.example.com und news.example.com sind unter relaxed ausgerichtet und unter strict nicht. Schicken Sie eine Nachricht von einer Adresse der betroffenen Subdomain durch den Sende-Test, um zu sehen, welche Domain tatsächlich signiert hat und wogegen verglichen wurde.
Signieren Sie entweder mit einem DKIM-Schlüssel, dessen d= exakt der Author Domain entspricht, und setzen Sie die Envelope-Domain passend dazu — oder gehen Sie zurück auf relaxed, das laut RFC nahezu allen Domaininhabern genügt hat (§4.4).
Mailinglisten, Weiterleitung und ARC
DMARC hat eine strukturelle Schwäche, und sie ist nicht kryptografisch: Das Protokoll wurde für Mail entworfen, die vom System des Autors zum System des Empfängers läuft — und ein großer Teil der legitimen Mail tut das nicht. RFC 9989 §7.4 benennt die betroffenen Wege — Alumni-Weiterleiter, rollenbasierte Aliase und Mailinglisten — und stellt unmissverständlich fest, dass p=reject mit ihnen unvereinbar sein und Interoperabilitätsprobleme verursachen kann.
Warum eine Liste die Authentifizierung bricht
Die beiden Mechanismen scheitern auf einem indirekten Weg unterschiedlich. SPF scheitert am ersten Hop, der nicht Ihrer ist: Die verbindende IP-Adresse gehört dem Weiterleiter, und sofern dieses Relay die MAIL-FROM-Adresse nicht umschreibt, wird die SPF-Prüfung für Ihre Domain aus dem Netz eines anderen heraus durchgeführt (§7.4). DKIM übersteht einfache Weiterleitung meist — RFC 9989 hält fest, dass DKIM-Signaturen in solchen Relay-Situationen in der Regel gültig bleiben —, und genau deshalb verlangt derselbe Abschnitt, dass Domains mit p=reject sich NICHT allein auf SPF verlassen DÜRFEN und ihre Nachrichten mit gültigen DKIM-Signaturen versehen MÜSSEN.
Eine Mailingliste ist aber keine einfache Weiterleitung. Listensoftware verändert die Nachricht routinemäßig: ein Tag vor dem Subject:-Feld, eine Fußzeile am Ende des Nachrichtenkörpers, mitunter ein geändertes Content-Transfer-Encoding oder ein Header, den die Liste für ihre eigene Buchführung ergänzt. Jeder dieser Eingriffe berührt Material, das die DKIM-Signatur abdeckt; die Signatur, die den Weiterleiter überstanden hat, übersteht die Liste also nicht, und damit sind beide Identifier weg. Ob eine bestimmte Signatur bricht, hängt davon ab, welche Header-Felder der Signierer abgedeckt hat und ob der Nachrichtenkörper vollständig signiert wurde — deshalb kann eine Liste Ihre Mail brechen und eine andere sie unversehrt lassen.
Die Folge trifft nicht nur den Absender. RFC 9989 §7.4 beschreibt, was passiert, wenn ein Empfänger p=reject bei Listenverkehr ohne weitere Analyse befolgt: Für die Listensoftware sieht die Ablehnung wie eine tote Adresse aus, und der Abonnent wird automatisch ausgetragen. Deshalb verlangt derselbe Abschnitt, dass Empfänger eingehende Nachrichten NICHT allein auf Grundlage einer p=reject-Policy ablehnen DÜRFEN und dass sie solche fehlschlagende Mail mangels anderer Kenntnisse und Analysen so behandeln MÜSSEN, als wäre die Policy p=quarantine.
RFC 9989 §7.4 hält auch fest, was in der Praxis tatsächlich geschieht: Nur wenige Empfänger wenden überhaupt eine Abmilderung für indirekte Wege an, nur wenige Organisationen bedenken die Wirkung ihrer Policy auf die indirekte Mail ihrer Nutzer, und über Mailinglisten weitergeleitete Mail mit unverändertem From:-Header-Feld wird unter p=reject häufig abgelehnt. Planen Sie nicht damit, dass die Abmilderung angewendet wird.
Deshalb hat sich die Listensoftware angepasst, statt zu warten. RFC 9989 §7.4 beschreibt die Behelfslösungen als fest etabliert und von Listenbetreibern als gegeben hingenommen: In den zehn Jahren, seit große Consumer-Mailsysteme p=reject veröffentlichen, hat Listensoftware das Umschreiben des From:-Header-Felds übernommen, sodass es DMARC-ausgerichtet ist — die einen mit der Adresse der Liste selbst, die anderen mit einer umkehrbaren Form je Adresse wie bob=example.com@user.somelist.example. Ihre Domain erscheint dann nicht mehr als Autor der Nachricht; das ist der Preis, den die Liste für die Zustellung zahlt, und ein Grund, warum RFC 9989 §7.4 rät, dass Domains mit Nutzern, die in Mailinglisten schreiben, p=reject NICHT veröffentlichen SOLLTEN und dass diejenigen, die es doch tun, ihren Nutzern sagen sollten, dass ihre Listenteilnahme beeinträchtigt sein kann.
ARC: das frühere Urteil weitertragen
Die Authenticated Received Chain (ARC, RFC 8617) geht das Problem von der anderen Seite an. Statt zu versuchen, die ursprüngliche Signatur intakt zu halten, hält ein Vermittler die Authentifizierungsergebnisse fest, die er beim Empfang der Nachricht gesehen hat, versiegelt diesen Vermerk kryptografisch und gibt ihn weiter. Ein nachgelagerter Empfänger, der eine Kette vorfindet, in der das Siegel jedes Hops gültig ist, kann sehen, was SPF, DKIM und DMARC ergeben haben, bevor die Nachricht verändert wurde, und kann sich entscheiden, eine Nachricht anzunehmen, deren eigene DMARC-Auswertung inzwischen scheitert.
Die Grenze liegt dort, wo die ganze Idee aufsitzt: Eine ARC-Kette ist eine Behauptung des Vermittlers, kein Beweis über die Nachricht in ihrem jetzigen Zustand. Eine gültige Kette sagt, dass eine bestimmte siegelnde Domain behauptet, ein bestimmtes Urteil gesehen zu haben — sie sagt nicht, dass diese Domain ehrlich ist. Ein Empfänger profitiert von ARC also nur, wenn er den siegelnden Domains in der Kette vertraut, und dieses Vertrauen aufzubauen ist Sache der lokalen Policy des Empfängers, nichts, was der Absender veröffentlichen könnte. Die makellose Kette eines unbekannten Vermittlers bringt Ihnen bei einem Empfänger, der keinen Grund hat, ihm zu vertrauen, nichts.
Seien Sie ebenso vorsichtig damit, wie weit ARC verbreitet ist. RFC 9989 §7.4 stellt fest, dass Mail-Entwickler seit einem Jahrzehnt versuchen, technische Verfahren zu erfinden, mit denen Mailinglisten ohne Veränderung des From:-Header-Felds funktionieren — ARC als prominentes Beispiel —, und dass zum Zeitpunkt der Veröffentlichung keines dieser Verfahren breite Verwendung gefunden hat; das Dokument fügt hinzu, dass es aktualisiert werden kann, falls das doch geschieht. Behandeln Sie ARC als etwas, das dort hilft, wo der Empfänger bereits mitmacht, nicht als Grund, eine strengere Policy zu veröffentlichen, als Ihre indirekten Mailwege tragen können.
Wenn Sie eine echte Kette sehen wollen, statt über eine nachzudenken: Der Sende-Test prüft ARC-Ketten der von Ihnen gesendeten Nachricht. Er listet jeden Hop mit seiner siegelnden Domain auf und meldet getrennt, ob Siegel und Nachrichtensignatur dieses Hops kryptografisch gültig sind. Diese Unterscheidung zählt, wenn Sie selbst einen weiterleitenden Hop betreiben, denn sie trennt eine Kette, die Sie gebrochen haben, von einer, die schon gebrochen ankam.
DMARC und BIMI
BIMI — Brand Indicators for Message Identification — erlaubt einem Domaininhaber, einen Indikator zu veröffentlichen, den teilnehmende Mail-Clients neben authentifizierten Nachrichten anzeigen dürfen. Es ist nicht Teil von DMARC und wird separat spezifiziert, im Internet-Draft draft-brand-indicators-for-message-identification (Revision 14, 1. Mai 2026; er hat den früheren draft-blank-ietf-bimi abgelöst), der weiterhin ein Entwurf ist und weiterhin auf die ältere DMARC-Spezifikation RFC 7489 statt auf RFC 9989 verweist. Relevant ist es hier, weil BIMI keine eigene Authentifizierung mitbringt: Es leiht sich die von DMARC — und zwar nur dort, wo die Policy auch wirklich durchgesetzt wird (Enforcement, also p=quarantine oder p=reject statt p=none).
Der Draft nennt die Voraussetzung in seiner Einleitung: Um an BIMI teilzunehmen, müssen Domaininhaber eine starke DMARC-Policy — quarantine oder reject — sowohl auf der Organisationsdomain als auch auf der From:-Domain der Nachricht haben. Seine empfängerseitigen Anforderungen in §7.1 machen daraus konkrete Bedingungen, die eine Nachricht erfüllen muss, bevor überhaupt eine BIMI-Verarbeitung stattfinden darf:
Das DMARC-Ergebnis für die Author Domain muss pass sein; ist es das nicht und rettet es auch kein zusätzliches Authentifizierungsverfahren, DARF keine BIMI-Verarbeitung stattfinden.
Lautet die Policy für die Author Domain oder deren Organisationsdomain p=none, DARF keine BIMI-Verarbeitung stattfinden.
Enthält der Record eine Subdomain-Policy und lautet diese sp=none, DARF keine BIMI-Verarbeitung stattfinden.
Lautet die Policy p=quarantine und definiert der Record ein Prozent-Tag, MUSS dieses pct=100 sein, sonst DARF keine BIMI-Verarbeitung stattfinden.
Lesen Sie die letzte Bedingung genau, denn sie wird regelmäßig in einer falschen Form weitergegeben. Die Anforderung ist bedingt: Falls ein solches Tag vorhanden ist, muss sein Wert 100 sein. Nichts in der Spezifikation verlangt, dass Sie ein pct-Tag ergänzen, und es gibt keinen Grund, eines zu haben. RFC 9989 hat pct ganz aus dem Standard entfernt (Appendix C.5.2), die IANA-Registry der DMARC-Tags führt es inzwischen als historisch (§9.3), und unbekannte Tags MÜSSEN von Empfängern ignoriert werden, die der aktuellen Spezifikation folgen (§4.7). Trägt Ihr Record aus einer älteren Installation noch pct=100, erfüllt er die BIMI-Bedingung und kostet nichts; der sauberere Record ist der ohne.
Eine Abweichung ist es wert, bekannt zu sein, denn sie entscheidet darüber, was Werkzeuge Ihnen melden. Die Bedingung des Entwurfs ist konditional und auf p=quarantine beschränkt; der Implementierungsleitfaden der BIMI Group ist das nicht und hält schlicht fest, „None“-Policies oder ein „pct“ unter 100 Prozent werden nicht akzeptiert. Ein Record mit p=reject; pct=25 erfüllt also die Spezifikation und scheitert an der Branchen-Leitlinie. Unser eigener Scanner folgt bewusst der strengeren Lesart und meldet einen solchen Record als nicht BIMI-tauglich. Das ist eine Abwägung, keine Aussage über das Protokoll, und sie beruht auf der ungleichen Kostenlage: Ein pct-Tag zu löschen ist billig, aber nicht gratis — konforme Empfänger ignorieren es zwar, Empfänger auf RFC-7489-Stand nicht, das Löschen hebt sie also auf volle Durchsetzung, weshalb vorher jeder Versandweg ausgerichtet sein muss — ein Logo, das nie erscheint, hat dagegen bereits ein Mark-Zertifikat gekostet. Von außerhalb eines Mailanbieters lässt sich nicht beobachten, welche Regel ein Postfach tatsächlich anwendet; behandeln Sie jede selbstbewusste Aussage in die eine oder andere Richtung — unsere eingeschlossen — daher als Positionsbezug und nicht als Messung.
Ein Tag verdient eine eigene Warnung, und es ist eines, das der BIMI-Draft überhaupt nicht erwähnt: t=y. RFC 9989 §4.7 definiert t=y als Bitte an den prüfenden Akteur, die deklarierte Policy nicht anzuwenden, sondern fehlschlagende Nachrichten eine Stufe darunter zu behandeln — reject wird als quarantine angewendet und quarantine als none. Ein Record mit p=quarantine; t=y bittet Empfänger also um genau die Behandlung, die BIMIs eigener §7.1 ausschließt. Da der Draft gegen RFC 7489 geschrieben wurde, das kein t-Tag kannte — und Revision 14 vom 1. Mai 2026 ist das durchgehend noch immer —, sagt er nichts darüber, wie ein Empfänger diese Kombination lesen soll, und unsere eigenen Werkzeuge lassen sie nicht offen. t=y gilt im Domain-Scan und im Record Studio als „DMARC nicht durchgesetzt“, selbst p=reject; t=y wird also als nicht BIMI-tauglich gemeldet. Anders als bei der pct-Regel oben wählen wir hier nicht zwischen zwei veröffentlichten Quellen; es ist unser eigenes Urteil in einer Lücke des Entwurfs, und es beruht auf einem Gedanken: Eine Sprosse einer Rollout-Leiter ist keine Policy, an der ein Logo hängen sollte. Der Ausweg ist, den Rollout abzuschließen, nicht die Sprosse zu entfernen.
Ein tragfähiger BIMI-tauglicher DMARC-Record hat demnach ein durchsetzendes p, kein t=y, ein sp, das entweder fehlt oder nicht none ist, und gar kein pct-Tag:
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; rua=mailto:dmarc-reports@example.com"
Die DMARC-Seite ist die Voraussetzung, nicht die ganze Arbeit — der Indikator selbst, sein SVG-Profil und das Verified Mark Certificate, das manche Mailbox-Anbieter verlangen, sind eigene Themen. Der BIMI-Check bewertet einen veröffentlichten BIMI-Record zusammen mit der DMARC-Policy, die ihn tragen muss, und der BIMI-Generator baut den Record.
Wie DMARC zum Rest des Mail-Stacks passt
DMARC beantwortet eine Frage: Darf dieser Absender diese Domain im From:-Header-Feld verwenden? Es sagt nichts darüber, wie die Nachricht gereist ist, und die Transportprotokolle sagen nichts darüber, wer sie geschrieben hat. Beides auseinanderzuhalten ist der Unterschied zwischen einer Diagnose und einer Vermutung: MTA-STS und DANE können keinen gefälschten Absender aufhalten, und DMARC kann keine abgefangene Verbindung aufhalten.
SPF
Autorisiert die Hosts, die Ihre Domain in der Envelope-Adresse MAIL FROM verwenden dürfen; DMARC stützt sich allein auf die SPF-Prüfung dieser MAIL-FROM-Identität (RFC 9989 §4.4.2). Seine Auswertung ist auf zehn DNS-abfragende Mechanismen pro Prüfung begrenzt (RFC 7208), und ein Record, der das Limit überschreitet, erzeugt einen PermError — also keinen SPF-Pass und damit auch keinen SPF-Beitrag zu DMARC.
DKIM
Signiert die Nachricht, sodass eine signierende Domain kryptografisch authentifiziert werden kann; eine Nachricht ist ein DMARC-Pass, wenn irgendein DKIM-authentifizierter Identifier zur Author Domain ausgerichtet ist (RFC 9989 §4.4.1). Wegen dieses „irgendein“ zählt Selektor-Hygiene: Jeder veröffentlichte Selektor ist ein vollwertiger Weg zu einem Pass, ein schwacher oder vergessener Schlüssel unter Ihrer Domain ist also eine Schwachstelle für die ganze Domain — und es ist der Mechanismus, der Weiterleitungen übersteht, wenn SPF es nicht tut (§7.4).
MTA-STS und TLS-RPT
MTA-STS erlaubt Ihrer Domain zu erklären, dass eingehende Mail über authentifiziertes TLS an die von Ihnen benannten MX-Hosts zugestellt werden muss; das schützt die Verbindung gegen Downgrade und Abhören — ein anderer Angriff als der, den DMARC adressiert. TLS-RPT ist das zugehörige Reporting und liefert Ihnen tägliche Berichte über die TLS-Verbindungen, die andere Absender zu Ihnen hergestellt oder nicht hergestellt haben.
DANE
Bindet die TLS-Zertifikate Ihrer MX-Hosts an TLSA-Records im DNS, abgesichert durch DNSSEC, sodass ein sendender Server das Zertifikat prüfen kann, ohne sich auf das öffentliche CA-System zu verlassen. Wie MTA-STS schützt es den Transportweg zu Ihren Mailservern; anders als MTA-STS bezieht es sein Vertrauen aus DNSSEC statt aus einer über HTTPS abgerufenen Policy-Datei.
Nein. p=none bittet Empfänger um gar nichts — es schaltet nur das Reporting ein. Als erster Schritt ist es richtig, weil es Ihnen zeigt, welche Absender überhaupt existieren, bevor Sie einen davon blockieren. Als Dauerzustand bietet es keinerlei Schutz vor Spoofing.
Was ist der Unterschied zwischen quarantine und reject?
Mit quarantine bitten Sie Empfänger, eine nicht bestandene Nachricht als verdächtig zu behandeln — in der Praxis meist der Spam-Ordner. Mit reject bitten Sie darum, sie ganz abzuweisen. Reject ist das stärkere Signal, aber eine Bitte und keine Garantie: RFC 9989 untersagt Empfängern ausdrücklich, allein aufgrund Ihrer Policy abzuweisen.
Warum besteht SPF, DMARC aber trotzdem nicht?
Weil DMARC nicht fragt, ob SPF bestanden hat, sondern ob die von SPF geprüfte Domain zu der Domain in Ihrem From-Header gehört. Ein Dienstleister, der mit eigener Bounce-Domain versendet, erzeugt ein SPF-pass für sich, nicht für Sie. Abhilfe: entweder eine eigene Bounce-Domain unter Ihrem Namen oder eine DKIM-Signatur mit Ihrer Domain in d=.
Ist das pct-Tag noch gültig?
RFC 9989 hat es entfernt. Empfänger auf aktuellem Stand ignorieren es vollständig, ältere werten es weiterhin aus. Genau diese Spaltung ist das Problem: Ein pct unter 100 bedeutet heute, dass Ihre Policy bei den einen für alles gilt und bei den anderen nur für einen Teil. Entfernen Sie das Tag — aber wissen Sie dabei, dass ältere Empfänger dann auf ihren Standardwert 100 zurückfallen und die Policy schlagartig Ihre gesamte Mail erfasst.
Gilt RFC 7489 noch?
Nein. Der RFC Editor führt RFC 7489 als obsolet, ersetzt durch RFC 9989, RFC 9990 und RFC 9991. Bemerkenswert dabei: RFC 7489 war Informational und eine Independent Submission, während RFC 9989 das erste DMARC-Dokument auf dem IETF-Standards-Track ist. In der Praxis ist die Empfängerlandschaft allerdings gemischt, ein Record sollte also unter beiden korrekt wirken.
Brauche ich DMARC auf einer Domain, die nie Mail sendet?
Ja, und es ist der einfachste Fall. Eine Domain, von der niemand sendet, hat keine legitimen Absender, die kaputtgehen könnten — Sie können sofort p=reject mit sp=reject und np=reject veröffentlichen. Ergänzen Sie es um einen Null-MX-Record und ein SPF-Record mit v=spf1 -all.
Was ändert sich für mich durch DMARCbis?
Praktisch drei Dinge. Die Organisationsdomain wird jetzt über einen DNS-Tree-Walk statt über die Public Suffix List bestimmt, was verändert, welcher Record für eine Subdomain gilt. Das pct-Tag ist weg, ein prozentualer Rollout läuft stattdessen über das Test-Flag t=y. Und np= erlaubt eine eigene Policy für Subdomains, die es gar nicht gibt — dort beginnt ein großer Teil des Spoofings.
Warum bekomme ich keine Reports?
Die häufigste Ursache ist der Autorisierungs-Record. Liegt Ihre rua-Adresse auf einer anderen Organisationsdomain, muss diese Domain per TXT-Record bestätigen, dass sie Reports für Sie annimmt. Ohne ihn senden Empfänger nichts und sagen Ihnen nichts. Zweithäufigste Ursache ist ein Tippfehler in der mailto:-URI, die dann still ignoriert wird.
Verhindert DMARC, dass mich jemand von einer anderen Domain aus imitiert?
Nein, und das ist die am häufigsten missverstandene Grenze. DMARC schützt die Domain in Ihrem From-Header. Wer eine ähnlich aussehende Domain registriert oder Ihren Firmennamen in den Anzeigenamen schreibt und von seiner eigenen Adresse sendet, besteht DMARC auf seiner eigenen Domain. RFC 9989 nennt Angriffe über den Anzeigenamen ausdrücklich außerhalb des Geltungsbereichs.
Zerschießt p=reject meine Mailinglisten?
Das kann passieren. Viele Listen schreiben den From-Header um oder verändern die Nachricht, was Ihre DKIM-Signatur ungültig macht — eine legitime Nachricht scheitert dann beim Abonnenten an DMARC. RFC 9989 §7.4 wird dabei deutlich: Es sei „critical“, dass Domains, deren Nutzer möglicherweise auf Mailinglisten posten, p=reject NICHT veröffentlichen sollten; wer es dennoch tut, soll zuvor p=none und p=quarantine durchlaufen und seine Nutzer warnen, dass ihre Teilnahme an Listen beeinträchtigt sein kann. ARC hilft dort, wo Empfänger der siegelnden Zwischenstation vertrauen, ist aber nicht flächendeckend.