13. References
13.1. Normative References
[ABNF] Crocker, D., Ed., and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", STD 68, RFC 5234, January 2008, <http://www.rfc-editor.org/info/rfc5234>. [AFRF] Fontana, H., "Authentication Failure Reporting Using the Abuse Reporting Format", RFC 6591, April 2012, <http://www.rfc-editor.org/info/rfc6591>. [AFRF-DKIM] Kucherawy, M., "Extensions to DomainKeys Identified Mail (DKIM) for Failure Reporting", RFC 6651, June 2012, <http://www.rfc-editor.org/info/rfc6651>. [AFRF-SPF] Kitterman, S., "Sender Policy Framework (SPF) Authentication Failure Reporting Using the Abuse Reporting Format", RFC 6652, June 2012, <http://www.rfc-editor.org/info/rfc6652>. [DKIM] Crocker, D., Ed., Hansen, T., Ed., and M. Kucherawy, Ed., "DomainKeys Identified Mail (DKIM) Signatures", STD 76, RFC 6376, September 2011, <http://www.rfc-editor.org/ info/rfc6376>. [DNS] Mockapetris, P., "Domain names - implementation and specification", STD 13, RFC 1035, November 1987, <http://www.rfc-editor.org/info/rfc1035>. [DNS-CASE] Eastlake 3rd, D., "Domain Name System (DNS) Case Insensitivity Clarification", RFC 4343, January 2006, <http://www.rfc-editor.org/info/rfc4343>. [GZIP] Levine, J., "The 'application/zlib' and 'application/gzip' Media Types", RFC 6713, August 2012, <http://www.rfc-editor.org/info/rfc6713>. [IDNA] Klensin, J., "Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework", RFC 5890, August 2010, <http://www.rfc-editor.org/info/rfc5890>.
[KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997, <http://www.rfc-editor.org/info/rfc2119>. [MAIL] Resnick, P., Ed., "Internet Message Format", RFC 5322, October 2008, <http://www.rfc-editor.org/info/rfc5322>. [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies", RFC 2045, November 1996, <http://www.rfc-editor.org/info/rfc2045>. [SEC-TERMS] Shirey, R., "Internet Security Glossary, Version 2", FYI 36, RFC 4949, August 2007, <http://www.rfc-editor.org/info/rfc4949>. [SMTP] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, October 2008, <http://www.rfc-editor.org/info/rfc5321>. [SPF] Kitterman, S., "Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1", RFC 7208, April 2014, <http://www.rfc-editor.org/info/rfc7208>. [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986, January 2005, <http://www.rfc-editor.org/info/rfc3986>.13.2. Informative References
[ADSP] Allman, E., Fenton, J., Delany, M., and J. Levine, "DomainKeys Identified Mail (DKIM) Author Domain Signing Practices (ADSP)", RFC 5617, August 2009, <http://www.rfc-editor.org/info/rfc5617>. [ARF] Shafranovich, Y., Levine, J., and M. Kucherawy, "An Extensible Format for Email Feedback Reports", RFC 5965, August 2010, <http://www.rfc-editor.org/info/rfc5965>. [AUTH-RESULTS] Kucherawy, M., "Message Header Field for Indicating Message Authentication Status", RFC 7001, September 2013, <http://www.rfc-editor.org/info/rfc7001>.
[Best-Guess-SPF] Kitterman, S., "Sender Policy Framework: Best guess record (FAQ entry)", May 2010, <http://www.openspf.org/FAQ/Best_guess_record>. [DKIM-DEPLOYMENT] Hansen, T., Siegel, E., Hallam-Baker, P., and D. Crocker, "DomainKeys Identified Mail (DKIM) Development, Deployment, and Operations", RFC 5863, May 2010, <http://www.rfc-editor.org/info/rfc5863>. [DKIM-LISTS] Kucherawy, M., "DomainKeys Identified Mail (DKIM) and Mailing Lists", BCP 167, RFC 6377, September 2011, <http://www.rfc-editor.org/info/rfc6377>. [DKIM-OVERVIEW] Hansen, T., Crocker, D., and P. Hallam-Baker, "DomainKeys Identified Mail (DKIM) Service Overview", RFC 5585, July 2009, <http://www.rfc-editor.org/info/rfc5585>. [DKIM-THREATS] Fenton, J., "Analysis of Threats Motivating DomainKeys Identified Mail (DKIM)", RFC 4686, September 2006, <http://www.rfc-editor.org/info/rfc4686>. [DNSSEC] Arends, R., Austein, R., Larson, M., Massey, D., and S. Rose, "DNS Security Introduction and Requirements", RFC 4033, March 2005, <http://www.rfc-editor.org/info/rfc4033>. [DSN] Moore, K. and G. Vaudreuil, "An Extensible Message Format for Delivery Status Notifications", RFC 3464, January 2003, <http://www.rfc-editor.org/info/rfc3464>. [EMAIL-ARCH] Crocker, D., "Internet Mail Architecture", RFC 5598, July 2009, <http://www.rfc-editor.org/info/rfc5598>. [IANA-CONSIDERATIONS] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 5226, May 2008, <http://www.rfc-editor.org/info/rfc5226>. [ROLES] Crocker, D., "Mailbox Names for Common Services, Roles and Functions", RFC 2142, May 1997, <http://www.rfc-editor.org/info/rfc2142>.
Appendix A. Technology Considerations
This section documents some design decisions that were made in the development of DMARC. Specifically, addressed here are some suggestions that were considered but not included in the design. This text is included to explain why they were considered and not included in this version.A.1. S/MIME
S/MIME, or Secure Multipurpose Internet Mail Extensions, is a standard for encryption and signing of MIME data in a message. This was suggested and considered as a third security protocol for authenticating the source of a message. DMARC is focused on authentication at the domain level (i.e., the Domain Owner taking responsibility for the message), while S/MIME is really intended for user-to-user authentication and encryption. This alone appears to make it a bad fit for DMARC's goals. S/MIME also suffers from the heavyweight problem of Public Key Infrastructure, which means that distribution of keys used to verify signatures needs to be incorporated. In many instances, this alone is a showstopper. There have been consistent promises that PKI usability and deployment will improve, but these have yet to materialize. DMARC can revisit this choice after those barriers are addressed. S/MIME has extensive deployment in specific market segments (government, for example) but does not enjoy similar widespread deployment over the general Internet, and this shows no signs of changing. DKIM and SPF both are deployed widely over the general Internet, and their adoption rates continue to be positive. Finally, experiments have shown that including S/MIME support in the initial version of DMARC would neither cause nor enable a substantial increase in the accuracy of the overall mechanism.
A.2. Method Exclusion
It was suggested that DMARC include a mechanism by which a Domain Owner could tell Message Receivers not to attempt validation by one of the supported methods (e.g., "check DKIM, but not SPF"). Specifically, consider a Domain Owner that has deployed one of the technologies, and that technology fails for some messages, but such failures don't cause enforcement action. Deploying DMARC would cause enforcement action for policies other than "none", which would appear to exclude participation by that Domain Owner. The DMARC development team evaluated the idea of policy exception mechanisms on several occasions and invariably concluded that there was not a strong enough use case to include them. The specific target audience for DMARC does not appear to have concerns about the failure modes of one or the other being a barrier to DMARC's adoption. In the scenario described above, the Domain Owner has a few options: 1. Tighten up its infrastructure to minimize the failure modes of the single deployed technology. 2. Deploy the other supported authentication mechanism, to offset the failure modes of the first. 3. Deploy DMARC in a reporting-only mode.A.3. Sender Header Field
It has been suggested in several message authentication efforts that the Sender header field be checked for an identifier of interest, as the standards indicate this as the proper way to indicate a re-mailing of content such as through a mailing list. Most recently, it was a protocol-level option for DomainKeys, but on evolution to DKIM, this property was removed. The DMARC development team considered this and decided not to include support for doing so, for the following reasons: 1. The main user protection approach is to be concerned with what the user sees when a message is rendered. There is no consistent behavior among MUAs regarding what to do with the content of the Sender field, if present. Accordingly, supporting checking of the Sender identifier would mean applying policy to an identifier
the end user might never actually see, which can create a vector for attack against end users by simply forging a Sender field containing some identifier that DMARC will like. 2. Although it is certainly true that this is what the Sender field is for, its use in this way is also unreliable, making it a poor candidate for inclusion in the DMARC evaluation algorithm. 3. Allowing multiple ways to discover policy introduces unacceptable ambiguity into the DMARC evaluation algorithm in terms of which policy is to be applied and when.A.4. Domain Existence Test
A common practice among MTA operators, and indeed one documented in [ADSP], is a test to determine domain existence prior to any more expensive processing. This is typically done by querying the DNS for MX, A, or AAAA resource records for the name being evaluated and assuming that the domain is nonexistent if it could be determined that no such records were published for that domain name. The original pre-standardization version of this protocol included a mandatory check of this nature. It was ultimately removed, as the method's error rate was too high without substantial manual tuning and heuristic work. There are indeed use cases this work needs to address where such a method would return a negative result about a domain for which reporting is desired, such as a registered domain name that never sends legitimate mail and thus has none of these records present in the DNS.A.5. Issues with ADSP in Operation
DMARC has been characterized as a "super-ADSP" of sorts. Contributors to DMARC have compiled a list of issues associated with ADSP, gained from operational experience, that have influenced the direction of DMARC: 1. ADSP has no support for subdomains, i.e., the ADSP record for example.com does not explicitly or implicitly apply to subdomain.example.com. If wildcarding is not applied, then spammers can trivially bypass ADSP by sending from a subdomain with no ADSP record.
2. Nonexistent subdomains are explicitly out of scope in ADSP. There is nothing in ADSP that states receivers should simply reject mail from NXDOMAINs regardless of ADSP policy (which of course allows spammers to trivially bypass ADSP by sending email from nonexistent subdomains). 3. ADSP has no operational advice on when to look up the ADSP record. 4. ADSP has no support for using SPF as an auxiliary mechanism to DKIM. 5. ADSP has no support for a slow rollout, i.e., no way to configure a percentage of email on which the receiver should apply the policy. This is important for large-volume senders. 6. ADSP has no explicit support for an intermediate phase where the receiver quarantines (e.g., sends to the recipient's "spam" folder) rather than rejects the email. 7. The binding between the "From" header domain and DKIM is too tight for ADSP; they must match exactly.A.6. Organizational Domain Discovery Issues
Although protocols like ADSP are useful for "protecting" a specific domain name, they are not helpful at protecting subdomains. If one wished to protect "example.com" by requiring via ADSP that all mail bearing an RFC5322.From domain of "example.com" be signed, this would "protect" that domain; however, one could then craft an email whose RFC5322.From domain is "security.example.com", and ADSP would not provide any protection. One could use a DNS wildcard, but this can undesirably interfere with other DNS activity; one could add ADSP records as fraudulent domains are discovered, but this solution does not scale and is a purely reactive measure against abuse. The DNS does not provide a method by which the "domain of record", or the domain that was actually registered with a domain registrar, can be determined given an arbitrary domain name. Suggestions have been made that attempt to glean such information from SOA or NS resource records, but these too are not fully reliable, as the partitioning of the DNS is not always done at administrative boundaries. When seeking domain-specific policy based on an arbitrary domain name, one could "climb the tree", dropping labels off the left end of the name until the root is reached or a policy is discovered, but then one could craft a name that has a large number of nonsense
labels; this would cause a Mail Receiver to attempt a large number of queries in search of a policy record. Sending many such messages constitutes an amplified denial-of-service attack. The Organizational Domain mechanism is a necessary component to the goals of DMARC. The method described in Section 3.2 is far from perfect but serves this purpose reasonably well without adding undue burden or semantics to the DNS. If a method is created to do so that is more reliable and secure than the use of a public suffix list, DMARC should be amended to use that method as soon as it is generally available.A.6.1. Public Suffix Lists
A public suffix list for the purposes of determining the Organizational Domain can be obtained from various sources. The most common one is maintained by the Mozilla Foundation and made public at <http://publicsuffix.org>. License terms governing the use of that list are available at that URI. Note that if operators use a variety of public suffix lists, interoperability will be difficult or impossible to guarantee.Appendix B. Examples
This section illustrates both the Domain Owner side and the Mail Receiver side of a DMARC exchange.B.1. Identifier Alignment Examples
The following examples illustrate the DMARC mechanism's use of Identifier Alignment. For brevity's sake, only message headers are shown, as message bodies are not considered when conducting DMARC checks.B.1.1. SPF
The following SPF examples assume that SPF produces a passing result. Example 1: SPF in alignment: MAIL FROM: <sender@example.com> From: sender@example.com Date: Fri, Feb 15 2002 16:54:30 -0800 To: receiver@example.org Subject: here's a sample
In this case, the RFC5321.MailFrom parameter and the RFC5322.From field have identical DNS domains. Thus, the identifiers are in alignment. Example 2: SPF in alignment (parent): MAIL FROM: <sender@child.example.com> From: sender@example.com Date: Fri, Feb 15 2002 16:54:30 -0800 To: receiver@example.org Subject: here's a sample In this case, the RFC5322.From parameter includes a DNS domain that is a parent of the RFC5321.MailFrom domain. Thus, the identifiers are in alignment if relaxed SPF mode is requested by the Domain Owner, and not in alignment if strict SPF mode is requested. Example 3: SPF not in alignment: MAIL FROM: <sender@example.net> From: sender@child.example.com Date: Fri, Feb 15 2002 16:54:30 -0800 To: receiver@example.org Subject: here's a sample In this case, the RFC5321.MailFrom parameter includes a DNS domain that is neither the same as nor a parent of the RFC5322.From domain. Thus, the identifiers are not in alignment.B.1.2. DKIM
The examples below assume that the DKIM signatures pass verification. Alignment cannot exist with a DKIM signature that does not verify. Example 1: DKIM in alignment: DKIM-Signature: v=1; ...; d=example.com; ... From: sender@example.com Date: Fri, Feb 15 2002 16:54:30 -0800 To: receiver@example.org Subject: here's a sample In this case, the DKIM "d=" parameter and the RFC5322.From field have identical DNS domains. Thus, the identifiers are in alignment.
Example 2: DKIM in alignment (parent): DKIM-Signature: v=1; ...; d=example.com; ... From: sender@child.example.com Date: Fri, Feb 15 2002 16:54:30 -0800 To: receiver@example.org Subject: here's a sample In this case, the DKIM signature's "d=" parameter includes a DNS domain that is a parent of the RFC5322.From domain. Thus, the identifiers are in alignment for relaxed mode, but not for strict mode. Example 3: DKIM not in alignment: DKIM-Signature: v=1; ...; d=sample.net; ... From: sender@child.example.com Date: Fri, Feb 15 2002 16:54:30 -0800 To: receiver@example.org Subject: here's a sample In this case, the DKIM signature's "d=" parameter includes a DNS domain that is neither the same as nor a parent of the RFC5322.From domain. Thus, the identifiers are not in alignment.B.2. Domain Owner Example
A Domain Owner that wants to use DMARC should have already deployed and tested SPF and DKIM. The next step is to publish a DNS record that advertises a DMARC policy for the Domain Owner's Organizational Domain.B.2.1. Entire Domain, Monitoring Only
The owner of the domain "example.com" has deployed SPF and DKIM on its messaging infrastructure. The owner wishes to begin using DMARC with a policy that will solicit aggregate feedback from receivers without affecting how the messages are processed, in order to: o Confirm that its legitimate messages are authenticating correctly o Verify that all authorized message sources have implemented authentication measures o Determine how many messages from other sources would be affected by a blocking policy
The Domain Owner accomplishes this by constructing a policy record indicating that: o The version of DMARC being used is "DMARC1" ("v=DMARC1") o Receivers should not alter how they treat these messages because of this DMARC policy record ("p=none") o Aggregate feedback reports should be sent via email to the address "dmarc-feedback@example.com" ("rua=mailto:dmarc-feedback@example.com") o All messages from this Organizational Domain are subject to this policy (no "pct" tag present, so the default of 100% applies) The DMARC policy record might look like this when retrieved using a common command-line tool: % dig +short TXT _dmarc.example.com. "v=DMARC1; p=none; rua=mailto:dmarc-feedback@example.com" To publish such a record, the DNS administrator for the Domain Owner creates an entry like the following in the appropriate zone file (following the conventional zone file format): ; DMARC record for the domain example.com _dmarc IN TXT ( "v=DMARC1; p=none; " "rua=mailto:dmarc-feedback@example.com" )B.2.2. Entire Domain, Monitoring Only, Per-Message Reports
The Domain Owner from the previous example has used the aggregate reporting to discover some messaging systems that had not yet implemented DKIM correctly, but they are still seeing periodic authentication failures. In order to diagnose these intermittent problems, they wish to request per-message failure reports when authentication failures occur. Not all Receivers will honor such a request, but the Domain Owner feels that any reports it does receive will be helpful enough to justify publishing this record. The default per-message report format ([AFRF]) meets the Domain Owner's needs in this scenario.
The Domain Owner accomplishes this by adding the following to its policy record from Appendix B.2: o Per-message failure reports should be sent via email to the address "auth-reports@example.com" ("ruf=mailto:auth-reports@example.com") The DMARC policy record might look like this when retrieved using a common command-line tool (the output shown would appear on a single line but is wrapped here for publication): % dig +short TXT _dmarc.example.com. "v=DMARC1; p=none; rua=mailto:dmarc-feedback@example.com; ruf=mailto:auth-reports@example.com" To publish such a record, the DNS administrator for the Domain Owner might create an entry like the following in the appropriate zone file (following the conventional zone file format): ; DMARC record for the domain example.com _dmarc IN TXT ( "v=DMARC1; p=none; " "rua=mailto:dmarc-feedback@example.com; " "ruf=mailto:auth-reports@example.com" )B.2.3. Per-Message Failure Reports Directed to Third Party
The Domain Owner from the previous example is maintaining the same policy but now wishes to have a third party receive and process the per-message failure reports. Again, not all Receivers will honor this request, but those that do may implement additional checks to validate that the third party wishes to receive the failure reports for this domain. The Domain Owner needs to alter its policy record from Appendix B.2.2 as follows: o Per-message failure reports should be sent via email to the address "auth-reports@thirdparty.example.net" ("ruf=mailto:auth-reports@thirdparty.example.net") The DMARC policy record might look like this when retrieved using a common command-line tool (the output shown would appear on a single line but is wrapped here for publication): % dig +short TXT _dmarc.example.com. "v=DMARC1; p=none; rua=mailto:dmarc-feedback@example.com; ruf=mailto:auth-reports@thirdparty.example.net"
To publish such a record, the DNS administrator for the Domain Owner might create an entry like the following in the appropriate zone file (following the conventional zone file format): ; DMARC record for the domain example.com _dmarc IN TXT ( "v=DMARC1; p=none; " "rua=mailto:dmarc-feedback@example.com; " "ruf=mailto:auth-reports@thirdparty.example.net" ) Because the address used in the "ruf" tag is outside the Organizational Domain in which this record is published, conforming Receivers will implement additional checks as described in Section 7.1 of this document. In order to pass these additional checks, the third party will need to publish an additional DNS record as follows: o Given the DMARC record published by the Domain Owner at "_dmarc.example.com", the DNS administrator for the third party will need to publish a TXT resource record at "example.com._report._dmarc.thirdparty.example.net" with the value "v=DMARC1". The resulting DNS record might look like this when retrieved using a common command-line tool (the output shown would appear on a single line but is wrapped here for publication): % dig +short TXT example.com._report._dmarc.thirdparty.example.net "v=DMARC1" To publish such a record, the DNS administrator for example.net might create an entry like the following in the appropriate zone file (following the conventional zone file format): ; zone file for thirdparty.example.net ; Accept DMARC failure reports on behalf of example.com example.com._report._dmarc IN TXT "v=DMARC1" Intermediaries and other third parties should refer to Section 7.1 for the full details of this mechanism.B.2.4. Subdomain, Sampling, and Multiple Aggregate Report URIs
The Domain Owner has implemented SPF and DKIM in a subdomain used for pre-production testing of messaging services. It now wishes to request that participating receivers act to reject messages from this subdomain that fail to authenticate.
As a first step, it will ask that a portion (1/4 in this example) of failing messages be quarantined, enabling examination of messages sent to mailboxes hosted by participating receivers. Aggregate feedback reports will be sent to a mailbox within the Organizational Domain, and to a mailbox at a third party selected and authorized to receive same by the Domain Owner. Aggregate reports sent to the third party are limited to a maximum size of ten megabytes. The Domain Owner will accomplish this by constructing a policy record indicating that: o The version of DMARC being used is "DMARC1" ("v=DMARC1") o It is applied only to this subdomain (record is published at "_dmarc.test.example.com" and not "_dmarc.example.com") o Receivers should quarantine messages from this Organizational Domain that fail to authenticate ("p=quarantine") o Aggregate feedback reports should be sent via email to the addresses "dmarc-feedback@example.com" and "example-tld-test@thirdparty.example.net", with the latter subjected to a maximum size limit ("rua=mailto:dmarc-feedback@ example.com,mailto:tld-test@thirdparty.example.net!10m") o 25% of messages from this Organizational Domain are subject to action based on this policy ("pct=25") The DMARC policy record might look like this when retrieved using a common command-line tool (the output shown would appear on a single line but is wrapped here for publication): % dig +short TXT _dmarc.test.example.com "v=DMARC1; p=quarantine; rua=mailto:dmarc-feedback@example.com, mailto:tld-test@thirdparty.example.net!10m; pct=25" To publish such a record, the DNS administrator for the Domain Owner might create an entry like the following in the appropriate zone file: ; DMARC record for the domain example.com _dmarc IN TXT ( "v=DMARC1; p=quarantine; " "rua=mailto:dmarc-feedback@example.com," "mailto:tld-test@thirdparty.example.net!10m; " "pct=25" )
B.3. Mail Receiver Example
A Mail Receiver that wants to use DMARC should already be checking SPF and DKIM, and possess the ability to collect relevant information from various email-processing stages to provide feedback to Domain Owners (possibly via Report Receivers).B.3.1. Processing of SMTP Time
An optimal DMARC-enabled Mail Receiver performs authentication and Identifier Alignment checking during the [SMTP] conversation. Prior to returning a final reply to the DATA command, the Mail Receiver's MTA has performed: 1. An SPF check to determine an SPF-authenticated Identifier. 2. DKIM checks that yield one or more DKIM-authenticated Identifiers. 3. A DMARC policy lookup. The presence of an Author Domain DMARC record indicates that the Mail Receiver should continue with DMARC-specific processing before returning a reply to the DATA command. Given a DMARC record and the set of Authenticated Identifiers, the Mail Receiver checks to see if the Authenticated Identifiers align with the Author Domain (taking into consideration any strict versus relaxed options found in the DMARC record). For example, the following sample data is considered to be from a piece of email originating from the Domain Owner of "example.com": Author Domain: example.com SPF-authenticated Identifier: mail.example.com DKIM-authenticated Identifier: example.com DMARC record: "v=DMARC1; p=reject; aspf=r; rua=mailto:dmarc-feedback@example.com" In the above sample, both the SPF-authenticated Identifier and the DKIM-authenticated Identifier align with the Author Domain. The Mail Receiver considers the above email to pass the DMARC check, avoiding the "reject" policy that is to be applied to email that fails to pass the DMARC check.
If no Authenticated Identifiers align with the Author Domain, then the Mail Receiver applies the DMARC-record-specified policy. However, before this action is taken, the Mail Receiver can consult external information to override the Domain Owner's policy. For example, if the Mail Receiver knows that this particular email came from a known and trusted forwarder (that happens to break both SPF and DKIM), then the Mail Receiver may choose to ignore the Domain Owner's policy. The Mail Receiver is now ready to reply to the DATA command. If the DMARC check yields that the message is to be rejected, then the Mail Receiver replies with a 5xy code to inform the sender of failure. If the DMARC check cannot be resolved due to transient network errors, then the Mail Receiver replies with a 4xy code to inform the sender as to the need to reattempt delivery later. If the DMARC check yields a passing message, then the Mail Receiver continues on with email processing, perhaps using the result of the DMARC check as an input to additional processing modules such as a domain reputation query. Before exiting DMARC-specific processing, the Mail Receiver checks to see if the Author Domain DMARC record requests AFRF-based reporting. If so, then the Mail Receiver can emit an AFRF to the reporting address supplied in the DMARC record. At the exit of DMARC-specific processing, the Mail Receiver captures (through logging or direct insertion into a data store) the result of DMARC processing. Captured information is used to build feedback for Domain Owner consumption. This is not necessary if the Domain Owner has not requested aggregate reports, i.e., no "rua" tag was found in the policy record.B.4. Utilization of Aggregate Feedback: Example
Aggregate feedback is consumed by Domain Owners to verify a Domain Owner's understanding of how the Domain Owner's domain is being processed by the Mail Receiver. Aggregate reporting data on emails that pass all DMARC-supporting authentication checks is used by Domain Owners to verify that authentication practices remain accurate. For example, if a third party is sending on behalf of a Domain Owner, the Domain Owner can use aggregate report data to verify ongoing authentication practices of the third party.
Data on email that only partially passes underlying authentication checks provides visibility into problems that need to be addressed by the Domain Owner. For example, if either SPF or DKIM fails to pass, the Domain Owner is provided with enough information to either directly correct the problem or understand where authentication- breaking changes are being introduced in the email transmission path. If authentication-breaking changes due to email transmission path cannot be directly corrected, then the Domain Owner at least maintains an understanding of the effect of DMARC-based policies upon the Domain Owner's email. Data on email that fails all underlying authentication checks provides baseline visibility on how the Domain Owner's domain is being received at the Mail Receiver. Based on this visibility, the Domain Owner can begin deployment of authentication technologies across uncovered email sources. Additionally, the Domain Owner may come to an understanding of how its domain is being misused.B.5. mailto Transport Example
A DMARC record can contain a "mailto" reporting address, such as: mailto:dmarc-feedback@example.com A sample aggregate report from the Mail Receiver at mail.receiver.example follows: DKIM-Signature: v=1; ...; d=mail.receiver.example; ... From: dmarc-reporting@mail.receiver.example Date: Fri, Feb 15 2002 16:54:30 -0800 To: dmarc-feedback@example.com Subject: Report Domain: example.com Submitter: mail.receiver.example Report-ID: <2002.02.15.1> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_024E_01CC9B0A.AFE54C00" Content-Language: en-us This is a multipart message in MIME format. ------=_NextPart_000_024E_01CC9B0A.AFE54C00 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit
This is an aggregate report from mail.receiver.example. ------=_NextPart_000_024E_01CC9B0A.AFE54C00 Content-Type: application/gzip Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="mail.receiver.example!example.com! 1013662812!1013749130.gz" <gzipped content of report> ------=_NextPart_000_024E_01CC9B0A.AFE54C00-- Not shown in the above example is that the Mail Receiver's feedback should be authenticated using SPF. Also, the value of the "filename" MIME parameter is wrapped for printing in this specification but would normally appear as one continuous string.Appendix C. DMARC XML Schema
The following is the proposed initial schema for producing XML-formatted aggregate reports as described in this document. NOTE: Per the definition of XML, unless otherwise specified in the schema below, the minOccurs and maxOccurs values for each element are set to 1. <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://dmarc.org/dmarc-xml/0.1"> <!-- The time range in UTC covered by messages in this report, specified in seconds since epoch. --> <xs:complexType name="DateRangeType"> <xs:all> <xs:element name="begin" type="xs:integer"/> <xs:element name="end" type="xs:integer"/> </xs:all> </xs:complexType> <!-- Report generator metadata. --> <xs:complexType name="ReportMetadataType"> <xs:sequence> <xs:element name="org_name" type="xs:string"/> <xs:element name="email" type="xs:string"/> <xs:element name="extra_contact_info" type="xs:string" minOccurs="0"/> <xs:element name="report_id" type="xs:string"/>
<xs:element name="date_range" type="DateRangeType"/> <xs:element name="error" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <!-- Alignment mode (relaxed or strict) for DKIM and SPF. --> <xs:simpleType name="AlignmentType"> <xs:restriction base="xs:string"> <xs:enumeration value="r"/> <xs:enumeration value="s"/> </xs:restriction> </xs:simpleType> <!-- The policy actions specified by p and sp in the DMARC record. --> <xs:simpleType name="DispositionType"> <xs:restriction base="xs:string"> <xs:enumeration value="none"/> <xs:enumeration value="quarantine"/> <xs:enumeration value="reject"/> </xs:restriction> </xs:simpleType> <!-- The DMARC policy that applied to the messages in this report. --> <xs:complexType name="PolicyPublishedType"> <xs:all> <!-- The domain at which the DMARC record was found. --> <xs:element name="domain" type="xs:string"/> <!-- The DKIM alignment mode. --> <xs:element name="adkim" type="AlignmentType" minOccurs="0"/> <!-- The SPF alignment mode. --> <xs:element name="aspf" type="AlignmentType" minOccurs="0"/> <!-- The policy to apply to messages from the domain. --> <xs:element name="p" type="DispositionType"/> <!-- The policy to apply to messages from subdomains. --> <xs:element name="sp" type="DispositionType"/> <!-- The percent of messages to which policy applies. --> <xs:element name="pct" type="xs:integer"/> <!-- Failure reporting options in effect. --> <xs:element name="fo" type="xs:string"/> </xs:all> </xs:complexType>
<!-- The DMARC-aligned authentication result. --> <xs:simpleType name="DMARCResultType"> <xs:restriction base="xs:string"> <xs:enumeration value="pass"/> <xs:enumeration value="fail"/> </xs:restriction> </xs:simpleType> <!-- Reasons that may affect DMARC disposition or execution thereof. --> <xs:simpleType name="PolicyOverrideType"> <xs:restriction base="xs:string"> <xs:enumeration value="forwarded"/> <xs:enumeration value="sampled_out"/> <xs:enumeration value="trusted_forwarder"/> <xs:enumeration value="mailing_list"/> <xs:enumeration value="local_policy"/> <xs:enumeration value="other"/> </xs:restriction> </xs:simpleType> <!-- How do we allow report generators to include new classes of override reasons if they want to be more specific than "other"? --> <xs:complexType name="PolicyOverrideReason"> <xs:all> <xs:element name="type" type="PolicyOverrideType"/> <xs:element name="comment" type="xs:string" minOccurs="0"/> </xs:all> </xs:complexType> <!-- Taking into account everything else in the record, the results of applying DMARC. --> <xs:complexType name="PolicyEvaluatedType"> <xs:sequence> <xs:element name="disposition" type="DispositionType"/> <xs:element name="dkim" type="DMARCResultType"/> <xs:element name="spf" type="DMARCResultType"/> <xs:element name="reason" type="PolicyOverrideReason" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType>
<!-- Credit to Roger L. Costello for IPv4 regex http://mailman.ic.ac.uk/pipermail/xml-dev/1999-December/ 018018.html --> <!-- Credit to java2s.com for IPv6 regex http://www.java2s.com/Code/XML/XML-Schema/ IPv6addressesareeasiertodescribeusingasimpleregex.htm --> <xs:simpleType name="IPAddress"> <xs:restriction base="xs:string"> <xs:pattern value="((1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).){3} (1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])| ([A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}"/> </xs:restriction> </xs:simpleType> <xs:complexType name="RowType"> <xs:all> <!-- The connecting IP. --> <xs:element name="source_ip" type="IPAddress"/> <!-- The number of matching messages. --> <xs:element name="count" type="xs:integer"/> <!-- The DMARC disposition applying to matching messages. --> <xs:element name="policy_evaluated" type="PolicyEvaluatedType" minOccurs="1"/> </xs:all> </xs:complexType> <xs:complexType name="IdentifierType"> <xs:all> <!-- The envelope recipient domain. --> <xs:element name="envelope_to" type="xs:string" minOccurs="0"/> <!-- The RFC5321.MailFrom domain. --> <xs:element name="envelope_from" type="xs:string" minOccurs="1"/> <!-- The RFC5322.From domain. --> <xs:element name="header_from" type="xs:string" minOccurs="1"/> </xs:all> </xs:complexType> <!-- DKIM verification result, according to RFC 7001 Section 2.6.1. --> <xs:simpleType name="DKIMResultType"> <xs:restriction base="xs:string"> <xs:enumeration value="none"/> <xs:enumeration value="pass"/>
<xs:enumeration value="fail"/> <xs:enumeration value="policy"/> <xs:enumeration value="neutral"/> <xs:enumeration value="temperror"/> <xs:enumeration value="permerror"/> </xs:restriction> </xs:simpleType> <xs:complexType name="DKIMAuthResultType"> <xs:all> <!-- The "d=" parameter in the signature. --> <xs:element name="domain" type="xs:string" minOccurs="1"/> <!-- The "s=" parameter in the signature. --> <xs:element name="selector" type="xs:string" minOccurs="0"/> <!-- The DKIM verification result. --> <xs:element name="result" type="DKIMResultType" minOccurs="1"/> <!-- Any extra information (e.g., from Authentication-Results). --> <xs:element name="human_result" type="xs:string" minOccurs="0"/> </xs:all> </xs:complexType> <!-- SPF domain scope. --> <xs:simpleType name="SPFDomainScope"> <xs:restriction base="xs:string"> <xs:enumeration value="helo"/> <xs:enumeration value="mfrom"/> </xs:restriction> </xs:simpleType> <!-- SPF result. --> <xs:simpleType name="SPFResultType"> <xs:restriction base="xs:string"> <xs:enumeration value="none"/> <xs:enumeration value="neutral"/> <xs:enumeration value="pass"/> <xs:enumeration value="fail"/> <xs:enumeration value="softfail"/> <!-- "TempError" commonly implemented as "unknown". --> <xs:enumeration value="temperror"/> <!-- "PermError" commonly implemented as "error". --> <xs:enumeration value="permerror"/> </xs:restriction> </xs:simpleType>
<xs:complexType name="SPFAuthResultType"> <xs:all> <!-- The checked domain. --> <xs:element name="domain" type="xs:string" minOccurs="1"/> <!-- The scope of the checked domain. --> <xs:element name="scope" type="SPFDomainScope" minOccurs="1"/> <!-- The SPF verification result. --> <xs:element name="result" type="SPFResultType" minOccurs="1"/> </xs:all> </xs:complexType> <!-- This element contains DKIM and SPF results, uninterpreted with respect to DMARC. --> <xs:complexType name="AuthResultType"> <xs:sequence> <!-- There may be no DKIM signatures, or multiple DKIM signatures. --> <xs:element name="dkim" type="DKIMAuthResultType" minOccurs="0" maxOccurs="unbounded"/> <!-- There will always be at least one SPF result. --> <xs:element name="spf" type="SPFAuthResultType" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <!-- This element contains all the authentication results that were evaluated by the receiving system for the given set of messages. --> <xs:complexType name="RecordType"> <xs:sequence> <xs:element name="row" type="RowType"/> <xs:element name="identifiers" type="IdentifierType"/> <xs:element name="auth_results" type="AuthResultType"/> </xs:sequence> </xs:complexType> <!-- Parent --> <xs:element name="feedback"> <xs:complexType> <xs:sequence> <xs:element name="version" type="xs:decimal"/> <xs:element name="report_metadata" type="ReportMetadataType"/> <xs:element name="policy_published" type="PolicyPublishedType"/>
<xs:element name="record" type="RecordType" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> Descriptions of the PolicyOverrideTypes: forwarded: The message was relayed via a known forwarder, or local heuristics identified the message as likely having been forwarded. There is no expectation that authentication would pass. local_policy: The Mail Receiver's local policy exempted the message from being subjected to the Domain Owner's requested policy action. mailing_list: Local heuristics determined that the message arrived via a mailing list, and thus authentication of the original message was not expected to succeed. other: Some policy exception not covered by the other entries in this list occurred. Additional detail can be found in the PolicyOverrideReason's "comment" field. sampled_out: The message was exempted from application of policy by the "pct" setting in the DMARC policy record. trusted_forwarder: Message authentication failure was anticipated by other evidence linking the message to a locally maintained list of known and trusted forwarders. The "version" for reports generated per this specification MUST be the value 1.0.
Acknowledgements
DMARC and the draft version of this document submitted to the Independent Submission Editor were the result of lengthy efforts by an informal industry consortium: DMARC.org (see <http://dmarc.org>). Participating companies included Agari, American Greetings, AOL, Bank of America, Cloudmark, Comcast, Facebook, Fidelity Investments, Google, JPMorgan Chase & Company, LinkedIn, Microsoft, Netease, PayPal, ReturnPath, The Trusted Domain Project, and Yahoo!. Although the contributors and supporters are too numerous to mention, notable individual contributions were made by J. Trent Adams, Michael Adkins, Monica Chew, Dave Crocker, Tim Draegen, Steve Jones, Franck Martin, Brett McDowell, and Paul Midgen. The contributors would also like to recognize the invaluable input and guidance that was provided early on by J.D. Falk. Additional contributions within the IETF context were made by Kurt Anderson, Michael Jack Assels, Les Barstow, Anne Bennett, Jim Fenton, J. Gomez, Mike Jones, Scott Kitterman, Eliot Lear, John Levine, S. Moonesamy, Rolf Sonneveld, Henry Timmes, and Stephen J. Turnbull.Authors' Addresses
Murray S. Kucherawy (editor) EMail: superuser@gmail.com Elizabeth Zwicky (editor) Yahoo! EMail: zwicky@yahoo-inc.com