draft-ietf-spfbis-4408bis-08.txt | draft-ietf-spfbis-4408bis-09.txt | |||
---|---|---|---|---|
Network Working Group S. Kitterman | Network Working Group S. Kitterman | |||
Internet-Draft Kitterman Technical Services | Internet-Draft Kitterman Technical Services | |||
Obsoletes: 4408 (if approved) October 22, 2012 | Obsoletes: 4408 (if approved) January 10, 2013 | |||
Intended status: Standards Track | Intended status: Standards Track | |||
Expires: April 25, 2013 | Expires: July 14, 2013 | |||
Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, | Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, | |||
Version 1 | Version 1 | |||
draft-ietf-spfbis-4408bis-08.txt | draft-ietf-spfbis-4408bis-09.txt | |||
Abstract | Abstract | |||
Email on the Internet can be forged in a number of ways. In | Email on the Internet can be forged in a number of ways. In | |||
particular, existing protocols place no restriction on what a sending | particular, existing protocols place no restriction on what a sending | |||
host can use as the "MAIL FROM" of a message or the domain given on | host can use as the "MAIL FROM" of a message or the domain given on | |||
the SMTP HELO/EHLO commands. This document describes version 1 of | the SMTP HELO/EHLO commands. This document describes version 1 of | |||
the Sender Policy Framework (SPF) protocol, whereby an ADMD can | the Sender Policy Framework (SPF) protocol, whereby an ADMD can | |||
explicitly authorize the hosts that are allowed to use its domain | explicitly authorize the hosts that are allowed to use its domain | |||
names, and a receiving host can check such authorization. | names, and a receiving host can check such authorization. | |||
skipping to change at page 1, line 40 | skipping to change at page 1, line 40 | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on April 25, 2013. | This Internet-Draft will expire on July 14, 2013. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2012 IETF Trust and the persons identified as the | Copyright (c) 2013 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
skipping to change at page 3, line 8 | skipping to change at page 3, line 8 | |||
Without obtaining an adequate license from the person(s) controlling | Without obtaining an adequate license from the person(s) controlling | |||
the copyright in such materials, this document may not be modified | the copyright in such materials, this document may not be modified | |||
outside the IETF Standards Process, and derivative works of it may | outside the IETF Standards Process, and derivative works of it may | |||
not be created outside the IETF Standards Process, except to format | not be created outside the IETF Standards Process, except to format | |||
it for publication as an RFC or to translate it into languages other | it for publication as an RFC or to translate it into languages other | |||
than English. | than English. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
1.1. Protocol Status . . . . . . . . . . . . . . . . . . . . . 6 | 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
1.2. Experimental History . . . . . . . . . . . . . . . . . . . 7 | 1.1.1. Keywords . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
1.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 7 | 1.1.2. Imported Definitions . . . . . . . . . . . . . . . . . 6 | |||
1.3.1. Keywords . . . . . . . . . . . . . . . . . . . . . . . 7 | 1.1.3. MAIL FROM Definition . . . . . . . . . . . . . . . . . 7 | |||
1.3.2. Imported Definitions . . . . . . . . . . . . . . . . . 7 | 1.1.4. HELO Definition . . . . . . . . . . . . . . . . . . . 7 | |||
1.3.3. Mail From Definition . . . . . . . . . . . . . . . . . 7 | 1.1.5. Deprecated . . . . . . . . . . . . . . . . . . . . . . 7 | |||
1.3.4. HELO Definition . . . . . . . . . . . . . . . . . . . 8 | 2. Operational Overview . . . . . . . . . . . . . . . . . . . . . 8 | |||
1.3.5. Deprecated . . . . . . . . . . . . . . . . . . . . . . 8 | 2.1. The "HELO" Identity . . . . . . . . . . . . . . . . . . . 8 | |||
2. Operation . . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 2.2. The "MAIL FROM" Identity . . . . . . . . . . . . . . . . . 8 | |||
2.1. The "HELO" Identity . . . . . . . . . . . . . . . . . . . 9 | 2.3. Publishing Authorization . . . . . . . . . . . . . . . . . 8 | |||
2.2. The "MAIL FROM" Identity . . . . . . . . . . . . . . . . . 9 | 2.4. Checking Authorization . . . . . . . . . . . . . . . . . . 9 | |||
2.3. Publishing Authorization . . . . . . . . . . . . . . . . . 9 | 2.5. Location of Checks . . . . . . . . . . . . . . . . . . . . 10 | |||
2.4. Checking Authorization . . . . . . . . . . . . . . . . . . 10 | 2.6. Results of Evaluation . . . . . . . . . . . . . . . . . . 10 | |||
2.5. Interpreting the Result . . . . . . . . . . . . . . . . . 11 | 2.6.1. None . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
2.5.1. None . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 2.6.2. Neutral . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
2.5.2. Neutral . . . . . . . . . . . . . . . . . . . . . . . 12 | 2.6.3. Pass . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
2.5.3. Pass . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 2.6.4. Fail . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
2.5.4. Fail . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 2.6.5. Softfail . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
2.5.5. Softfail . . . . . . . . . . . . . . . . . . . . . . . 13 | 2.6.6. Temperror . . . . . . . . . . . . . . . . . . . . . . 11 | |||
2.5.6. Temperror . . . . . . . . . . . . . . . . . . . . . . 13 | 2.6.7. Permerror . . . . . . . . . . . . . . . . . . . . . . 11 | |||
2.5.7. Permerror . . . . . . . . . . . . . . . . . . . . . . 13 | 3. SPF Records . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
3. SPF Records . . . . . . . . . . . . . . . . . . . . . . . . . 14 | 3.1. DNS Resource Records . . . . . . . . . . . . . . . . . . . 12 | |||
3.1. DNS Resource Records . . . . . . . . . . . . . . . . . . . 14 | 3.2. Multiple DNS Records . . . . . . . . . . . . . . . . . . . 13 | |||
3.2. Multiple DNS Records . . . . . . . . . . . . . . . . . . . 15 | 3.3. Multiple Strings in a Single DNS record . . . . . . . . . 13 | |||
3.3. Multiple Strings in a Single DNS record . . . . . . . . . 15 | 3.4. Record Size . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
3.4. Record Size . . . . . . . . . . . . . . . . . . . . . . . 15 | 3.5. Wildcard Records . . . . . . . . . . . . . . . . . . . . . 13 | |||
3.5. Wildcard Records . . . . . . . . . . . . . . . . . . . . . 15 | 4. The check_host() Function . . . . . . . . . . . . . . . . . . 15 | |||
4. The check_host() Function . . . . . . . . . . . . . . . . . . 17 | 4.1. Arguments . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
4.1. Arguments . . . . . . . . . . . . . . . . . . . . . . . . 17 | 4.2. Results . . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
4.2. Results . . . . . . . . . . . . . . . . . . . . . . . . . 17 | 4.3. Initial Processing . . . . . . . . . . . . . . . . . . . . 16 | |||
4.3. Initial Processing . . . . . . . . . . . . . . . . . . . . 17 | 4.4. Record Lookup . . . . . . . . . . . . . . . . . . . . . . 16 | |||
4.4. Record Lookup . . . . . . . . . . . . . . . . . . . . . . 18 | 4.5. Selecting Records . . . . . . . . . . . . . . . . . . . . 16 | |||
4.5. Selecting Records . . . . . . . . . . . . . . . . . . . . 18 | 4.6. Record Evaluation . . . . . . . . . . . . . . . . . . . . 17 | |||
4.6. Record Evaluation . . . . . . . . . . . . . . . . . . . . 18 | 4.6.1. Term Evaluation . . . . . . . . . . . . . . . . . . . 17 | |||
4.6.1. Term Evaluation . . . . . . . . . . . . . . . . . . . 19 | 4.6.2. Mechanisms . . . . . . . . . . . . . . . . . . . . . . 17 | |||
4.6.2. Mechanisms . . . . . . . . . . . . . . . . . . . . . . 19 | 4.6.3. Modifiers . . . . . . . . . . . . . . . . . . . . . . 18 | |||
4.6.3. Modifiers . . . . . . . . . . . . . . . . . . . . . . 20 | 4.6.4. DNS Lookup Limits . . . . . . . . . . . . . . . . . . 18 | |||
4.6.4. DNS Lookup Limits . . . . . . . . . . . . . . . . . . 20 | 4.7. Default Result . . . . . . . . . . . . . . . . . . . . . . 19 | |||
4.7. Default Result . . . . . . . . . . . . . . . . . . . . . . 21 | 4.8. Domain Specification . . . . . . . . . . . . . . . . . . . 19 | |||
4.8. Domain Specification . . . . . . . . . . . . . . . . . . . 21 | 5. Mechanism Definitions . . . . . . . . . . . . . . . . . . . . 21 | |||
5. Mechanism Definitions . . . . . . . . . . . . . . . . . . . . 22 | 5.1. "all" . . . . . . . . . . . . . . . . . . . . . . . . . . 22 | |||
5.1. "all" . . . . . . . . . . . . . . . . . . . . . . . . . . 23 | 5.2. "include" . . . . . . . . . . . . . . . . . . . . . . . . 22 | |||
5.2. "include" . . . . . . . . . . . . . . . . . . . . . . . . 23 | 5.3. "a" . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
5.3. "a" . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 | 5.4. "mx" . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
5.4. "mx" . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 | 5.5. "ptr" (deprecated) . . . . . . . . . . . . . . . . . . . . 24 | |||
5.5. "ptr" (deprecated) . . . . . . . . . . . . . . . . . . . . 25 | 5.6. "ip4" and "ip6" . . . . . . . . . . . . . . . . . . . . . 26 | |||
5.6. "ip4" and "ip6" . . . . . . . . . . . . . . . . . . . . . 27 | 5.7. "exists" . . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
5.7. "exists" . . . . . . . . . . . . . . . . . . . . . . . . . 27 | 6. Modifier Definitions . . . . . . . . . . . . . . . . . . . . . 28 | |||
6. Modifier Definitions . . . . . . . . . . . . . . . . . . . . . 29 | 6.1. redirect: Redirected Query . . . . . . . . . . . . . . . . 28 | |||
6.1. redirect: Redirected Query . . . . . . . . . . . . . . . . 29 | 6.2. exp: Explanation . . . . . . . . . . . . . . . . . . . . . 29 | |||
6.2. exp: Explanation . . . . . . . . . . . . . . . . . . . . . 30 | 7. Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
7. Recording The Result . . . . . . . . . . . . . . . . . . . . . 32 | 7.1. Macro Definitions . . . . . . . . . . . . . . . . . . . . 31 | |||
7.1. The Received-SPF Header Field . . . . . . . . . . . . . . 32 | 7.2. Expansion Examples . . . . . . . . . . . . . . . . . . . . 34 | |||
7.2. SPF Results in the Authentication-Results Header Field . . 34 | 8. Result Handling . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
8. Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | 8.1. None . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
8.1. Macro Definitions . . . . . . . . . . . . . . . . . . . . 36 | 8.2. Neutral . . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
8.2. Expansion Examples . . . . . . . . . . . . . . . . . . . . 39 | 8.3. Pass . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
9. Implications . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 8.4. Fail . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
9.1. Sending Domains . . . . . . . . . . . . . . . . . . . . . 41 | 8.5. Softfail . . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
9.1.1. DNS Resource Considerations . . . . . . . . . . . . . 41 | 8.6. Temperror . . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
9.1.2. Administrator's Considerations . . . . . . . . . . . . 42 | 8.7. Permerror . . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
9.1.3. Bounces . . . . . . . . . . . . . . . . . . . . . . . 43 | 9. Recording The Result . . . . . . . . . . . . . . . . . . . . . 39 | |||
9.2. Mediators . . . . . . . . . . . . . . . . . . . . . . . . 43 | 9.1. The Received-SPF Header Field . . . . . . . . . . . . . . 39 | |||
9.2.1. Mailing Lists . . . . . . . . . . . . . . . . . . . . 43 | 9.2. SPF Results in the Authentication-Results Header Field . . 41 | |||
9.2.2. Forwarding Services and Aliases . . . . . . . . . . . 44 | 10. Effects on Infrastructure . . . . . . . . . . . . . . . . . . 43 | |||
9.2.3. Mail Services . . . . . . . . . . . . . . . . . . . . 46 | 10.1. Sending Domains . . . . . . . . . . . . . . . . . . . . . 43 | |||
9.2.4. MTA Relays . . . . . . . . . . . . . . . . . . . . . . 46 | 10.1.1. DNS Resource Considerations . . . . . . . . . . . . . 43 | |||
9.3. Receivers . . . . . . . . . . . . . . . . . . . . . . . . 47 | 10.1.2. Administrator's Considerations . . . . . . . . . . . . 44 | |||
9.3.1. Policy For SPF Pass . . . . . . . . . . . . . . . . . 47 | 10.1.3. Bounces . . . . . . . . . . . . . . . . . . . . . . . 45 | |||
9.3.2. Policy For SPF Fail . . . . . . . . . . . . . . . . . 47 | 10.2. Receivers . . . . . . . . . . . . . . . . . . . . . . . . 45 | |||
9.3.3. Policy For SPF Permerror . . . . . . . . . . . . . . . 48 | 10.3. Mediators . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
10. Security Considerations . . . . . . . . . . . . . . . . . . . 49 | 10.3.1. Mailing Lists . . . . . . . . . . . . . . . . . . . . 46 | |||
10.1. Processing Limits . . . . . . . . . . . . . . . . . . . . 49 | 10.3.2. Forwarding Services and Aliases . . . . . . . . . . . 46 | |||
10.2. SPF-Authorized Email May Contain Other False Identities . 49 | 11. Security Considerations . . . . . . . . . . . . . . . . . . . 47 | |||
10.3. Spoofed DNS and IP Data . . . . . . . . . . . . . . . . . 50 | 11.1. Processing Limits . . . . . . . . . . . . . . . . . . . . 47 | |||
10.4. Cross-User Forgery . . . . . . . . . . . . . . . . . . . . 50 | 11.2. SPF-Authorized Email May Contain Other False Identities . 47 | |||
10.5. Untrusted Information Sources . . . . . . . . . . . . . . 50 | 11.3. Spoofed DNS and IP Data . . . . . . . . . . . . . . . . . 48 | |||
10.5.1. Recorded Results . . . . . . . . . . . . . . . . . . . 50 | 11.4. Cross-User Forgery . . . . . . . . . . . . . . . . . . . . 48 | |||
10.5.2. External Explanations . . . . . . . . . . . . . . . . 51 | 11.5. Untrusted Information Sources . . . . . . . . . . . . . . 48 | |||
10.5.3. Macro Expansion . . . . . . . . . . . . . . . . . . . 51 | 11.5.1. Recorded Results . . . . . . . . . . . . . . . . . . . 48 | |||
10.6. Privacy Exposure . . . . . . . . . . . . . . . . . . . . . 51 | 11.5.2. External Explanations . . . . . . . . . . . . . . . . 49 | |||
11. Contributors and Acknowledgements . . . . . . . . . . . . . . 52 | 11.5.3. Macro Expansion . . . . . . . . . . . . . . . . . . . 49 | |||
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 53 | 11.6. Privacy Exposure . . . . . . . . . . . . . . . . . . . . . 49 | |||
12.1. The SPF DNS Record Type . . . . . . . . . . . . . . . . . 53 | 12. Contributors and Acknowledgements . . . . . . . . . . . . . . 50 | |||
12.2. The Received-SPF Mail Header Field . . . . . . . . . . . . 53 | 13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 51 | |||
12.3. SPF Modifier Registration . . . . . . . . . . . . . . . . 53 | 13.1. The SPF DNS Record Type . . . . . . . . . . . . . . . . . 51 | |||
13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 54 | 13.2. The Received-SPF Mail Header Field . . . . . . . . . . . . 51 | |||
13.1. Normative References . . . . . . . . . . . . . . . . . . . 54 | 13.3. SPF Modifier Registration . . . . . . . . . . . . . . . . 51 | |||
13.2. Informative References . . . . . . . . . . . . . . . . . . 55 | 14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 52 | |||
Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 57 | 14.1. Normative References . . . . . . . . . . . . . . . . . . . 52 | |||
Appendix B. Extended Examples . . . . . . . . . . . . . . . . . . 60 | 14.2. Informative References . . . . . . . . . . . . . . . . . . 53 | |||
B.1. Simple Examples . . . . . . . . . . . . . . . . . . . . . 60 | Appendix A. Collected ABNF . . . . . . . . . . . . . . . . . . . 55 | |||
B.2. Multiple Domain Example . . . . . . . . . . . . . . . . . 61 | Appendix B. Extended Examples . . . . . . . . . . . . . . . . . . 58 | |||
B.3. DNSBL Style Example . . . . . . . . . . . . . . . . . . . 62 | B.1. Simple Examples . . . . . . . . . . . . . . . . . . . . . 58 | |||
B.4. Multiple Requirements Example . . . . . . . . . . . . . . 62 | B.2. Multiple Domain Example . . . . . . . . . . . . . . . . . 59 | |||
Appendix C. Change History . . . . . . . . . . . . . . . . . . . 63 | B.3. DNSBL Style Example . . . . . . . . . . . . . . . . . . . 60 | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 66 | B.4. Multiple Requirements Example . . . . . . . . . . . . . . 60 | |||
Appendix C. Further Testing Advice . . . . . . . . . . . . . . . 61 | ||||
Appendix D. Updating Mail Forwarders . . . . . . . . . . . . . . 62 | ||||
Appendix E. Mail Services . . . . . . . . . . . . . . . . . . . . 64 | ||||
Appendix F. MTA Relays . . . . . . . . . . . . . . . . . . . . . 65 | ||||
Appendix G. Local Policy Considerations . . . . . . . . . . . . . 66 | ||||
G.1. Policy For SPF Pass . . . . . . . . . . . . . . . . . . . 66 | ||||
G.2. Policy For SPF Fail . . . . . . . . . . . . . . . . . . . 66 | ||||
G.3. Policy For SPF Permerror . . . . . . . . . . . . . . . . . 67 | ||||
Appendix H. Protocol Status . . . . . . . . . . . . . . . . . . . 68 | ||||
Appendix I. Experimental History . . . . . . . . . . . . . . . . 69 | ||||
Appendix J. Change History . . . . . . . . . . . . . . . . . . . 70 | ||||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 73 | ||||
1. Introduction | 1. Introduction | |||
The current email infrastructure has the property that any host | The current email infrastructure has the property that any host | |||
injecting mail into the system can use any DNS domain name it wants | injecting mail into the system can use any DNS domain name it wants | |||
in each of the various identifiers specified by [RFC5321] and | in each of the various identifiers specified by [RFC5321] and | |||
[RFC5322]. Although this feature is desirable in some circumstances, | [RFC5322]. Although this feature is desirable in some circumstances, | |||
it is a major obstacle to reducing Unsolicited Bulk Email (UBE, aka | it is a major obstacle to reducing Unsolicited Bulk Email (UBE, aka | |||
spam). Furthermore, many domain owning ADMDs (ADministrative | spam). Furthermore, many domain owning ADMDs (ADministrative | |||
Management Domains, see [RFC5598]) are understandably concerned about | Management Domains, see [RFC5598]) are understandably concerned about | |||
skipping to change at page 6, line 33 | skipping to change at page 6, line 33 | |||
"HELO" or "MAIL FROM" identity during a mail transaction. | "HELO" or "MAIL FROM" identity during a mail transaction. | |||
An additional benefit to mail receivers is that after the use of an | An additional benefit to mail receivers is that after the use of an | |||
identity is verified, local policy decisions about the mail can be | identity is verified, local policy decisions about the mail can be | |||
made based on the sender's domain, rather than the host's IP address. | made based on the sender's domain, rather than the host's IP address. | |||
This is advantageous because reputation of domain names is likely to | This is advantageous because reputation of domain names is likely to | |||
be more accurate than reputation of host IP addresses. Furthermore, | be more accurate than reputation of host IP addresses. Furthermore, | |||
if a claimed identity fails verification, local policy can take | if a claimed identity fails verification, local policy can take | |||
stronger action against such email, such as rejecting it. | stronger action against such email, such as rejecting it. | |||
1.1. Protocol Status | 1.1. Terminology | |||
SPF has been in development since the summer of 2003 and has seen | ||||
deployment beyond the developers beginning in December 2003. The | ||||
design of SPF slowly evolved until the spring of 2004 and has since | ||||
stabilized. There have been quite a number of forms of SPF, some | ||||
written up as documents, some submitted as Internet Drafts, and many | ||||
discussed and debated in development forums. The protocol was | ||||
originally defined in [RFC4408], which this document replaces. | ||||
[RFC4408] was designed to clearly document the protocol defined by | ||||
earlier draft specifications of SPF as used in existing | ||||
implementations. This updated specification is intended to clarify | ||||
identified ambiguities in [RFC4408], resolve techincal issues | ||||
identified in post-RFC 4408 deplyment experience, and document widely | ||||
deployed extensions to SPF that have been developed since [RFC4408] | ||||
was published. | ||||
1.2. Experimental History | ||||
This document updates and replaces RFC 4408 that was part of a group | ||||
of simultaneously published Experimental RFCs (RFC 4405, RFC 4406, | ||||
RFC 4407, and RFC 4408) in 2006. At that time the IESG requested the | ||||
community observe the success or failure of the two approaches | ||||
documented in these RFCs during the two years following publication, | ||||
in order that a community consensus could be reached in the future. | ||||
SPF is widely deployed by large and small email providers alike. | ||||
There are multiple, interoperable implementations. | ||||
For SPF (as documented in RFC 4408) a careful effort was made to | ||||
collect and document lessons learned and errata during the two year | ||||
period. The errata list has been stable (no new submissions) and | ||||
only minor protocol lessons learned were identified. Resolution of | ||||
the IESG's experiment is documented in [RFC6686]. | ||||
1.3. Terminology | ||||
1.3.1. Keywords | 1.1.1. Keywords | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
[RFC2119]. | [RFC2119]. | |||
1.3.2. Imported Definitions | 1.1.2. Imported Definitions | |||
The ABNF tokens "ALPHA", "DIGIT", and "SP" are defined in [RFC5234]. | The ABNF tokens "ALPHA", "DIGIT", and "SP" are defined in [RFC5234]. | |||
The token "local-part" is defined in [RFC5321]. | The token "local-part" is defined in [RFC5321]. | |||
"dot-atom", "quoted-string", "comment", "CFWS", "FWS", and "CRLF" are | "dot-atom", "quoted-string", "comment", "CFWS", "FWS", and "CRLF" are | |||
defined in [RFC5322]. | defined in [RFC5322]. | |||
1.3.3. Mail From Definition | 1.1.3. MAIL FROM Definition | |||
This document is concerned with the portion of a mail message | This document is concerned with the portion of a mail message | |||
commonly called "envelope sender", "return path", "reverse path", | commonly called "envelope sender", "return path", "reverse path", | |||
"bounce address", "5321 FROM", "MAIL FROM", or RFC5321.MailFrom. | "bounce address", "5321 FROM", "MAIL FROM", or RFC5321.MailFrom. | |||
Since these terms are either not well defined or often used casually, | Since these terms are either not well defined or often used casually, | |||
this document uses "MAIL FROM" for consistency. This means the | this document uses "MAIL FROM" for consistency. This means the | |||
RFC5321.MailFrom as defined in [RFC5598]. Note that other terms that | RFC5321.MailFrom as defined in [RFC5598]. Note that other terms that | |||
might superficially look like the common terms, such as "reverse- | might superficially look like the common terms, such as "reverse- | |||
path", are used only with the defined meanings from normative | path", are used only with the defined meanings from normative | |||
documents. | documents. | |||
1.3.4. HELO Definition | 1.1.4. HELO Definition | |||
This document also makes use of the HELO/EHLO identity. The "HELO" | This document also makes use of the HELO/EHLO identity. The "HELO" | |||
identity derives from either the SMTP HELO or EHLO command (see | identity derives from either the SMTP HELO or EHLO command (see | |||
[RFC5321]). Since HELO and EHLO can, in many cases, be used | [RFC5321]). Since HELO and EHLO can, in many cases, be used | |||
interchangeably, they are identified commonly as "HELO" in this | interchangeably, they are identified commonly as "HELO" in this | |||
document. This means RFC5321.HELO/.EHLO as defined in [RFC5598]. | document. This means RFC5321.HELO/.EHLO as defined in [RFC5598]. | |||
These commands supply the identity of the SMTP client (sending host) | These commands supply the identity of the SMTP client (sending host) | |||
for the SMTP session. | for the SMTP session. | |||
1.3.5. Deprecated | 1.1.5. Deprecated | |||
There are [RFC4408] features that are marked "deprecated". In the | There are [RFC4408] features that are marked "deprecated". In the | |||
context of this document, deprecated means that senders SHOULD NOT | context of this document, deprecated means that senders SHOULD NOT | |||
publish SPF records that make use of such features because they might | publish SPF records that make use of such features because they might | |||
be removed entirely in future updates to the protocol. Such features | be removed entirely in future updates to the protocol. Such features | |||
do, however, remain part of the SPF protocol and receiving systems | do, however, remain part of the SPF protocol and receiving systems | |||
MUST support them unless this document explicitly says otherwise. | MUST support them unless this document explicitly says otherwise. | |||
2. Operation | [List of deprecated features to be added here] | |||
2. Operational Overview | ||||
2.1. The "HELO" Identity | 2.1. The "HELO" Identity | |||
It is RECOMMENDED that SPF verifiers not only check the "MAIL FROM" | It is RECOMMENDED that SPF verifiers not only check the "MAIL FROM" | |||
identity, but also separately check the "HELO" identity by applying | identity, but also separately check the "HELO" identity by applying | |||
the check_host() function (Section 4) to the "HELO" identity as the | the check_host() function (Section 4) to the "HELO" identity as the | |||
<sender>. Checking "HELO" promotes consistency of results and can | <sender>. Checking "HELO" promotes consistency of results and can | |||
reduce DNS resource usage. Additionally, since SPF records published | reduce DNS resource usage. Additionally, since SPF records published | |||
for "HELO" identities refer to a single host, when available, they | for "HELO" identities refer to a single host, when available, they | |||
are a very reliable source of host authorization status. | are a very reliable source of host authorization status. | |||
skipping to change at page 9, line 52 | skipping to change at page 8, line 52 | |||
names in the "HELO" and "MAIL FROM" identities by the MTAs specified | names in the "HELO" and "MAIL FROM" identities by the MTAs specified | |||
therein. | therein. | |||
SPF results can be used to make both positive (source is authorized) | SPF results can be used to make both positive (source is authorized) | |||
and negative (source is not authorized) determinations. If domain | and negative (source is not authorized) determinations. If domain | |||
owners choose to publish SPF records and want to support receivers | owners choose to publish SPF records and want to support receivers | |||
making negative authorization determinations, then they MUST publish | making negative authorization determinations, then they MUST publish | |||
records that end in "-all", or redirect to other records that do, | records that end in "-all", or redirect to other records that do, | |||
otherwise, no definitive determination of authorization can be made. | otherwise, no definitive determination of authorization can be made. | |||
Potential issues and mitigations associated with negative | Potential issues and mitigations associated with negative | |||
determinations are discussed in Section 9. | determinations are discussed in Section 10. | |||
ADMDs can publish SPF records that explicitly authorize no hosts for | ADMDs can publish SPF records that explicitly authorize no hosts for | |||
domain names that are neither used in the domain part of email | domain names that are neither used in the domain part of email | |||
addresses nor expected to originate mail. | addresses nor expected to originate mail. | |||
When changing SPF records, care has to be taken to ensure that there | When changing SPF records, care has to be taken to ensure that there | |||
is a transition period so that the old policy remains valid until all | is a transition period so that the old policy remains valid until all | |||
legitimate email can reasonably expect to have been checked. This | legitimate email can reasonably expect to have been checked. This | |||
can be as much as 30 days. | can be as much as 30 days. | |||
skipping to change at page 10, line 28 | skipping to change at page 9, line 28 | |||
to emit mail with a given identity. Typically, such checks are done | to emit mail with a given identity. Typically, such checks are done | |||
by a receiving MTA, but can be performed elsewhere in the mail | by a receiving MTA, but can be performed elsewhere in the mail | |||
processing chain so long as the required information is available and | processing chain so long as the required information is available and | |||
reliable. At least the "MAIL FROM" identity MUST be checked, but it | reliable. At least the "MAIL FROM" identity MUST be checked, but it | |||
is RECOMMENDED that the "HELO" identity also be checked beforehand. | is RECOMMENDED that the "HELO" identity also be checked beforehand. | |||
Without explicit approval of the domain owner, checking other | Without explicit approval of the domain owner, checking other | |||
identities against SPF version 1 records is NOT RECOMMENDED because | identities against SPF version 1 records is NOT RECOMMENDED because | |||
there are cases that are known to give incorrect results. For | there are cases that are known to give incorrect results. For | |||
example, almost all mailing lists rewrite the "MAIL FROM" identity | example, almost all mailing lists rewrite the "MAIL FROM" identity | |||
(see Section 9.2.1), but some do not change any other identities in | (see Section 10.3.1), but some do not change any other identities in | |||
the message. The scenario described in Section 9.2.2, sub-section | the message. The scenario described in Section 10.3.2, sub-section | |||
1.2, is another example. Documents that define other identities will | 1.2, is another example. Documents that define other identities will | |||
have to define the method for explicit approval. | have to define the method for explicit approval. | |||
It is possible that mail receivers will use the SPF check as part of | It is possible that mail receivers will use the SPF check as part of | |||
a larger set of tests on incoming mail. The results of other tests | a larger set of tests on incoming mail. The results of other tests | |||
might influence whether or not a particular SPF check is performed. | might influence whether or not a particular SPF check is performed. | |||
For example, finding the sending host's IP address on a local white | For example, finding the sending host's IP address on a local white | |||
list might cause all other tests to be skipped and all mail from that | list might cause all other tests to be skipped and all mail from that | |||
host to be accepted. | host to be accepted. | |||
skipping to change at page 11, line 12 | skipping to change at page 10, line 12 | |||
To make the test, the mail receiver MUST evaluate the check_host() | To make the test, the mail receiver MUST evaluate the check_host() | |||
function with the arguments set as follows: | function with the arguments set as follows: | |||
<ip> - the IP address of the SMTP client that is emitting the | <ip> - the IP address of the SMTP client that is emitting the | |||
mail, either IPv4 or IPv6. | mail, either IPv4 or IPv6. | |||
<domain> - the domain portion of the "MAIL FROM" or "HELO" identity. | <domain> - the domain portion of the "MAIL FROM" or "HELO" identity. | |||
<sender> - the "MAIL FROM" or "HELO" identity. | <sender> - the "MAIL FROM" or "HELO" identity. | |||
Note that the <domain> argument might not be a well-formed domain | ||||
name. For example, if the reverse-path was null, then the EHLO/HELO | ||||
domain is used, with its associated problems (see Section 2.1). In | ||||
these cases, check_host() is defined in Section 4.3 to return a | ||||
"none" result. | ||||
Although invalid, malformed, or non-existent domains cause SPF checks | Although invalid, malformed, or non-existent domains cause SPF checks | |||
to return "none" because no SPF record can be found, it has long been | to return "none" because no SPF record can be found, it has long been | |||
the policy of many MTAs to reject email from such domains, especially | the policy of many MTAs to reject email from such domains, especially | |||
in the case of invalid "MAIL FROM". Rejecting email will prevent one | in the case of invalid "MAIL FROM". Rejecting email will prevent one | |||
method of circumventing of SPF records. | method of circumventing of SPF records. | |||
Implementations have to take care to correctly extract the <domain> | Implementations have to take care to correctly extract the <domain> | |||
from the data given with the SMTP MAIL FROM command as many MTAs will | from the data given with the SMTP MAIL FROM command as many MTAs will | |||
still accept such things as source routes (see [RFC5321], Appendix | still accept such things as source routes (see [RFC5321], Appendix | |||
C), the %-hack (see [RFC1123]), and bang paths (see [RFC1983]). | C), the %-hack (see [RFC1123]), and bang paths (see [RFC1983]). | |||
These archaic features have been maliciously used to bypass security | These archaic features have been maliciously used to bypass security | |||
systems. | systems. | |||
2.5. Interpreting the Result | 2.5. Location of Checks | |||
This section describes how software that performs the authorization | The authorization check SHOULD be performed during the processing of | |||
interprets the results of the check_host() function. The | the SMTP transaction that sends the mail. This allows errors to be | |||
authorization check SHOULD be performed during the processing of the | ||||
SMTP transaction that sends the mail. This allows errors to be | ||||
returned directly to the sending MTA by way of SMTP replies. | returned directly to the sending MTA by way of SMTP replies. | |||
Performing the authorization other than using the return-path and | Performing the authorization other than using the return-path and | |||
client address at the time of the MAIL command during the SMTP | client address at the time of the MAIL command during the SMTP | |||
transaction can cause problems, such as the following: (1) It might | transaction can cause problems, such as the following: (1) It might | |||
be difficult to accurately extract the required information from | be difficult to accurately extract the required information from | |||
potentially deceptive headers; (2) legitimate email might fail | potentially deceptive headers; (2) legitimate email might fail | |||
because the sender's policy had since changed. | because the sender's policy had since changed. | |||
Generating non-delivery notifications to forged identities that have | Generating non-delivery notifications to forged identities that have | |||
failed the authorization check is a source of backscatter and SHOULD | failed the authorization check is a source of backscatter and SHOULD | |||
be avoided. [RFC3834] section 2 describes backscatter and the | be avoided. Section 2 of [RFC3834] describes backscatter and the | |||
problems it causes. | problems it causes. | |||
2.5.1. None | 2.6. Results of Evaluation | |||
Section 4 defines check_host(), a model function definition that uses | ||||
the inputs defined above and the sender's policy published in the DNS | ||||
to reach a conclusion about client authorization. An SPF verifier | ||||
implements something semantically identical to the function defined | ||||
there. | ||||
This section enumerates and briefly defines the possible outputs of | ||||
that function. Information about how to handle these outpus is in | ||||
Section 8 | ||||
2.6.1. None | ||||
A result of "none" means either (a) no syntactically valid DNS domain | A result of "none" means either (a) no syntactically valid DNS domain | |||
name was extracted from the SMTP session that could be used as the | name was extracted from the SMTP session that could be used as the | |||
one to be authorized, or (b) no TXT records were retrieved from the | one to be authorized, or (b) no TXT records were retrieved from the | |||
DNS that appeared to be intended for use by SPF verifiers. | DNS that appeared to be intended for use by SPF verifiers. | |||
2.5.2. Neutral | 2.6.2. Neutral | |||
The domain owner has explicitly stated that they cannot or do not | The domain owner has explicitly stated that it is not asserting if | |||
want to assert whether the IP address is authorized or not. A | the IP address is authorized. This result MUST be treated exactly | |||
"neutral" result MUST be treated exactly like the "none" result; the | like the "none" result; the distinction exists only for informational | |||
distinction exists only for informational purposes. Treating | purposes. | |||
"neutral" more harshly than "none" would discourage domain owners | ||||
from testing the use of SPF records (see Section 9.1). | ||||
2.5.3. Pass | 2.6.3. Pass | |||
A "pass" result means that the client is authorized to inject mail | A "pass" result means that the client is authorized to inject mail | |||
with the given identity. The domain can now, in the sense of | with the given identity. The domain can now, in the sense of | |||
reputation, be considered responsible for sending the message. | reputation, be considered responsible for sending the message. | |||
Further policy checks can now proceed with confidence in the | Further policy checks can now proceed with confidence in the | |||
legitimate use of the identity. This is further discussed in | legitimate use of the identity. This is further discussed in | |||
Section 9.3.1. | Appendix G.1. | |||
2.5.4. Fail | 2.6.4. Fail | |||
A "fail" result is an explicit statement that the client is not | A "fail" result is an explicit statement that the client is not | |||
authorized to use the domain in the given identity. Disposition of | authorized to use the domain in the given identity. | |||
SPF fail messages is a matter of local policy. See Section 9.3.2 for | ||||
considerations on developing local policy. | ||||
If the checking software chooses to reject the mail during the SMTP | ||||
transaction, then it SHOULD use an SMTP reply code of 550 (see | ||||
[RFC5321]) and, if supported, the 5.7.1 enhanced status code (see | ||||
[RFC3463]), in addition to an appropriate reply text. The | ||||
check_host() function will return either a default explanation string | ||||
or one from the domain that published the SPF records (see | ||||
Section 6.2). If the information does not originate with the | ||||
checking software, it is good to make it clear that the text is | ||||
provided by the sender's domain. For example: | ||||
550-5.7.1 SPF MAIL FROM check failed: | ||||
550-5.7.1 The domain example.com explains: | ||||
550 5.7.1 Please see http://www.example.com/mailpolicy.html | ||||
If the checking software chooses not to reject the mail during the | ||||
SMTP transaction, then it SHOULD add a Received-SPF or | ||||
Authentication-Results header field (see Section 7) to communicate | ||||
this result to downstream message processors. While this is true for | ||||
all SPF results, it is of particular importance for "fail" results | ||||
since the message is explicitly not authorized by the domain owner. | ||||
2.5.5. Softfail | ||||
A "softfail" result ought to be treated as somewhere between "fail" | 2.6.5. Softfail | |||
and "neutral"/"none". The domain owner believes the host is not | ||||
authorized but is not willing to make a strong policy statement. | ||||
Receiving software SHOULD NOT reject the message based solely on this | ||||
result, but MAY subject the message to closer scrutiny than normal. | ||||
The domain owner wants to discourage the use of this host and thus | The domain owner has published a weak statement that the host is | |||
desires limited feedback when a "softfail" result occurs. For | probably not authorized. It has not published a stronger, more | |||
example, the recipient's Mail User Agent (MUA) could highlight the | definitive policy that results in a "fail" | |||
"softfail" status, or the receiving MTA could give the sender a | ||||
message using greylisting, [RFC6647], with a note the first time the | ||||
message is received, but accept it on a later attempt based on | ||||
receiver policy. | ||||
2.5.6. Temperror | 2.6.6. Temperror | |||
A "temperror" result means the SPF verifier encountered a transient | A "temperror" result means the SPF verifier encountered a transient | |||
(generally DNS) error while performing the check. Checking software | (generally DNS) error while performing the check. | |||
can choose to accept or temporarily reject the message. If the | ||||
message is rejected during the SMTP transaction for this reason, the | ||||
software SHOULD use an SMTP reply code of 451 and, if supported, the | ||||
4.4.3 enhanced status code. These errors can be caused by problems | ||||
in either the sender's or receiver's DNS software. | ||||
2.5.7. Permerror | 2.6.7. Permerror | |||
A "permerror" result means the domain's published records could not | A "permerror" result means the domain's published records could not | |||
be correctly interpreted. This signals an error condition that | be correctly interpreted. This signals an error condition that | |||
definitely requires manual intervention to be resolved. If the | definitely requires manual intervention to be resolved. | |||
message is rejected during the SMTP transaction for this reason, the | ||||
software SHOULD use an SMTP reply code of 550 and, if supported, the | ||||
5.5.2 enhanced status code. Be aware that if the domain owner uses | ||||
macros (Section 8), it is possible that this result is due to the | ||||
checked identities having an unexpected format. It is also possible | ||||
that this result is generated by certain SPF clients due to the input | ||||
arguments having an unexpected format; see Section 4.8. | ||||
3. SPF Records | 3. SPF Records | |||
An SPF record is a DNS record that declares which hosts are, and are | An SPF record is a DNS record that declares which hosts are, and are | |||
not, authorized to use a domain name for the "HELO" and "MAIL FROM" | not, authorized to use a domain name for the "HELO" and "MAIL FROM" | |||
identities. Loosely, the record partitions all hosts into permitted | identities. Loosely, the record partitions all hosts into permitted | |||
and not-permitted sets (though some hosts might fall into neither | and not-permitted sets (though some hosts might fall into neither | |||
category). | category). | |||
The SPF record is a single string of text. The record format is | The SPF record is a single string of text. The record format is | |||
skipping to change at page 14, line 39 | skipping to change at page 12, line 39 | |||
smtp-out.example.com. TXT "v=spf1 a -all" | smtp-out.example.com. TXT "v=spf1 a -all" | |||
Since TXT records have multiple uses, beware of other TXT records | Since TXT records have multiple uses, beware of other TXT records | |||
published there for other purposes. They might cause problems with | published there for other purposes. They might cause problems with | |||
size limits (see Section 3.4) and care has to be taken to ensure only | size limits (see Section 3.4) and care has to be taken to ensure only | |||
SPF records are used for SPF processing. | SPF records are used for SPF processing. | |||
ADMDs publishing SPF records SHOULD try to keep the number of | ADMDs publishing SPF records SHOULD try to keep the number of | |||
"include" mechanisms and chained "redirect" modifiers to a minimum. | "include" mechanisms and chained "redirect" modifiers to a minimum. | |||
ADMDs SHOULD also try to minimize the amount of other DNS information | ADMDs SHOULD also try to minimize the amount of other DNS information | |||
needed to evaluate a record. Section 4.6.4 and Section 9.1.1 provide | needed to evaluate a record. Section 4.6.4 and Section 10.1.1 | |||
some suggestions on how to achieve this. | provide some suggestions on how to achieve this. | |||
3.1. DNS Resource Records | 3.1. DNS Resource Records | |||
SPF records MUST be published as a DNS TXT (type 16) Resource Record | SPF records MUST be published as a DNS TXT (type 16) Resource Record | |||
(RR) [RFC1035] only. The character content of the record is encoded | (RR) [RFC1035] only. The character content of the record is encoded | |||
as [US-ASCII]. Use of alternate DNS RR types was supported in SPF's | as [US-ASCII]. Use of alternate DNS RR types was supported in SPF's | |||
experimental phase, but has been discontinued. See Appendix A of | experimental phase, but has been discontinued. See Appendix A of | |||
[RFC6686] for further information. | [RFC6686] for further information. | |||
3.2. Multiple DNS Records | 3.2. Multiple DNS Records | |||
skipping to change at page 15, line 21 | skipping to change at page 13, line 21 | |||
3.3. Multiple Strings in a Single DNS record | 3.3. Multiple Strings in a Single DNS record | |||
As defined in [RFC1035] sections 3.3.14 and 3.3, a single text DNS | As defined in [RFC1035] sections 3.3.14 and 3.3, a single text DNS | |||
record can be composed of more than one string. If a published | record can be composed of more than one string. If a published | |||
record contains multiple character-strings, then the record MUST be | record contains multiple character-strings, then the record MUST be | |||
treated as if those strings are concatenated together without adding | treated as if those strings are concatenated together without adding | |||
spaces. For example: | spaces. For example: | |||
IN TXT "v=spf1 .... first" "second string..." | IN TXT "v=spf1 .... first" "second string..." | |||
MUST be treated as equivalent to | MUST be treated as equivalent to: | |||
IN TXT "v=spf1 .... firstsecond string..." | IN TXT "v=spf1 .... firstsecond string..." | |||
TXT records containing multiple strings are useful in constructing | TXT records containing multiple strings are useful in constructing | |||
records that would exceed the 255-byte maximum length of a character- | records that would exceed the 255-byte maximum length of a character- | |||
string within a single TXT record. | string within a single TXT record. | |||
3.4. Record Size | 3.4. Record Size | |||
The published SPF record for a given domain name SHOULD remain small | The published SPF record for a given domain name SHOULD remain small | |||
skipping to change at page 17, line 35 | skipping to change at page 15, line 35 | |||
<ip> - the IP address of the SMTP client that is emitting the | <ip> - the IP address of the SMTP client that is emitting the | |||
mail, either IPv4 or IPv6. | mail, either IPv4 or IPv6. | |||
<domain> - the domain that provides the sought-after authorization | <domain> - the domain that provides the sought-after authorization | |||
information; initially, the domain portion of the "MAIL | information; initially, the domain portion of the "MAIL | |||
FROM" or "HELO" identity. | FROM" or "HELO" identity. | |||
<sender> - the "MAIL FROM" or "HELO" identity. | <sender> - the "MAIL FROM" or "HELO" identity. | |||
The domain portion of <sender> will usually be the same as the | For recursive evaluations, the domain portion of <sender> might not | |||
<domain> argument when check_host() is initially evaluated. However, | be the same as the <domain> argument when check_host() is initially | |||
this will generally not be true for recursive evaluations (see | evaluated. In most other cases it will be the same. (See | |||
Section 5.2 below). | Section 5.2 below). | |||
Note that the <domain> argument might not be a well-formed domain | ||||
name. For example, if the reverse-path was null, then the EHLO/HELO | ||||
domain is used, with its associated problems (see Section 2.1). In | ||||
these cases, check_host() is defined in Section 4.3 to return a | ||||
"none" result. | ||||
4.2. Results | 4.2. Results | |||
The function check_host() can return one of several results described | The function check_host() can return one of several results described | |||
in Section 2.5. Based on the result, the action to be taken is | in Section 2.6. Based on the result, the action to be taken is | |||
determined by the local policies of the receiver. | determined by the local policies of the receiver. This is discussed | |||
in Section 8 | ||||
4.3. Initial Processing | 4.3. Initial Processing | |||
If the <domain> is malformed (e.g. label longer than 63 characters, | If the <domain> is malformed (e.g. label longer than 63 characters, | |||
zero-length label not at the end, etc.) or is not a fully qualified | zero-length label not at the end, etc.) or is not a fully qualified | |||
domain name, or if the DNS lookup returns "domain does not exist" | domain name, or if the DNS lookup returns "domain does not exist" | |||
(RCODE 3), check_host() immediately returns the result "none". | (RCODE 3), check_host() immediately returns the result "none". | |||
Properly formed domains are fully qualified email domains as | Properly formed domains are fully qualified email domains as | |||
described in [RFC5321] Section 2.3.5. Internationalized domain names | described in [RFC5321] Section 2.3.5. Internationalized domain names | |||
MUST be encoded as A-labels, as described in Section 2.3 of | MUST be encoded as A-labels, as described in Section 2.3 of | |||
skipping to change at page 21, line 26 | skipping to change at page 19, line 32 | |||
For example: | For example: | |||
v=spf1 +mx -all | v=spf1 +mx -all | |||
or | or | |||
v=spf1 +mx redirect=_spf.example.com | v=spf1 +mx redirect=_spf.example.com | |||
4.8. Domain Specification | 4.8. Domain Specification | |||
Several of these mechanisms and modifiers have a domain-spec section. | Several of these mechanisms and modifiers have a domain-spec section. | |||
The domain-spec string is subject to macro expansion (see Section 8). | The domain-spec string is subject to macro expansion (see Section 7). | |||
The resulting string is the common presentation form of a fully- | The resulting string is the common presentation form of a fully- | |||
qualified DNS name: a series of labels separated by periods. This | qualified DNS name: a series of labels separated by periods. This | |||
domain is called the <target-name> in the rest of this document. | domain is called the <target-name> in the rest of this document. | |||
Note: The result of the macro expansion is not subject to any further | Note: The result of the macro expansion is not subject to any further | |||
escaping. Hence, this facility cannot produce all characters that | escaping. Hence, this facility cannot produce all characters that | |||
are legal in a DNS label (e.g., the control characters). However, | are legal in a DNS label (e.g., the control characters). However, | |||
this facility is powerful enough to express legal host names and | this facility is powerful enough to express legal host names and | |||
common utility labels (such as "_spf") that are used in DNS. | common utility labels (such as "_spf") that are used in DNS. | |||
skipping to change at page 23, line 27 | skipping to change at page 22, line 27 | |||
"all" MUST be ignored. Any "redirect" modifier (Section 6.1) MUST be | "all" MUST be ignored. Any "redirect" modifier (Section 6.1) MUST be | |||
ignored when there is an "all" mechanism in the record. | ignored when there is an "all" mechanism in the record. | |||
5.2. "include" | 5.2. "include" | |||
include = "include" ":" domain-spec | include = "include" ":" domain-spec | |||
The "include" mechanism triggers a recursive evaluation of | The "include" mechanism triggers a recursive evaluation of | |||
check_host(). | check_host(). | |||
1. The domain-spec is expanded as per Section 8. | 1. The domain-spec is expanded as per Section 7. | |||
2. Check_host() is evaluated with the resulting string as the | 2. Check_host() is evaluated with the resulting string as the | |||
<domain>. The <ip> and <sender> arguments remain the same as in | <domain>. The <ip> and <sender> arguments remain the same as in | |||
the current evaluation of check_host(). | the current evaluation of check_host(). | |||
3. The recursive evaluation returns either match, not match, or an | 3. The recursive evaluation returns either match, not match, or an | |||
error. If it matches, then the appropriate result for the | error. If it matches, then the appropriate result for the | |||
include: mechanism is used (e.g. include or +include gives a | include: mechanism is used (e.g. include or +include gives a | |||
"pass" result and -include gives "fail). | "pass" result and -include gives "fail). | |||
skipping to change at page 27, line 48 | skipping to change at page 26, line 48 | |||
5.7. "exists" | 5.7. "exists" | |||
This mechanism is used to construct an arbitrary domain name that is | This mechanism is used to construct an arbitrary domain name that is | |||
used for a DNS A record query. It allows for complicated schemes | used for a DNS A record query. It allows for complicated schemes | |||
involving arbitrary parts of the mail envelope to determine what is | involving arbitrary parts of the mail envelope to determine what is | |||
permitted. | permitted. | |||
exists = "exists" ":" domain-spec | exists = "exists" ":" domain-spec | |||
The domain-spec is expanded as per Section 8. The resulting domain | The domain-spec is expanded as per Section 7. The resulting domain | |||
name is used for a DNS A RR lookup. If any A record is returned, | name is used for a DNS A RR lookup. If any A record is returned, | |||
this mechanism matches. The lookup type is A even when the | this mechanism matches. The lookup type is A even when the | |||
connection type is IPv6. | connection type is IPv6. | |||
Domains can use this mechanism to specify arbitrarily complex | Domains can use this mechanism to specify arbitrarily complex | |||
queries. For example, suppose example.com publishes the record: | queries. For example, suppose example.com publishes the record: | |||
v=spf1 exists:%{ir}.%{l1r+-}._spf.%{d} -all | v=spf1 exists:%{ir}.%{l1r+-}._spf.%{d} -all | |||
The <target-name> might expand to | The <target-name> might expand to | |||
skipping to change at page 29, line 36 | skipping to change at page 28, line 36 | |||
among records in a single ADMD. It is possible to control both | among records in a single ADMD. It is possible to control both | |||
authorized hosts and policy for an arbitrary number of domains from a | authorized hosts and policy for an arbitrary number of domains from a | |||
single record. | single record. | |||
redirect = "redirect" "=" domain-spec | redirect = "redirect" "=" domain-spec | |||
If all mechanisms fail to match, and a "redirect" modifier is | If all mechanisms fail to match, and a "redirect" modifier is | |||
present, then processing proceeds as follows: | present, then processing proceeds as follows: | |||
The domain-spec portion of the redirect section is expanded as per | The domain-spec portion of the redirect section is expanded as per | |||
the macro rules in Section 8. Then check_host() is evaluated with | the macro rules in Section 7. Then check_host() is evaluated with | |||
the resulting string as the <domain>. The <ip> and <sender> | the resulting string as the <domain>. The <ip> and <sender> | |||
arguments remain the same as in the current evaluation of | arguments remain the same as in the current evaluation of | |||
check_host(). | check_host(). | |||
The result of this new evaluation of check_host() is then considered | The result of this new evaluation of check_host() is then considered | |||
the result of the current evaluation with the exception that if no | the result of the current evaluation with the exception that if no | |||
SPF record is found, or if the target-name is malformed, the result | SPF record is found, or if the target-name is malformed, the result | |||
is a "permerror" rather than "none". | is a "permerror" rather than "none". | |||
Note that the newly-queried domain can itself specify redirect | Note that the newly-queried domain can itself specify redirect | |||
skipping to change at page 30, line 33 | skipping to change at page 29, line 33 | |||
6.2. exp: Explanation | 6.2. exp: Explanation | |||
explanation = "exp" "=" domain-spec | explanation = "exp" "=" domain-spec | |||
If check_host() results in a "fail" due to a mechanism match (such as | If check_host() results in a "fail" due to a mechanism match (such as | |||
"-all"), and the "exp" modifier is present, then the explanation | "-all"), and the "exp" modifier is present, then the explanation | |||
string returned is computed as described below. If no "exp" modifier | string returned is computed as described below. If no "exp" modifier | |||
is present, then either a default explanation string or an empty | is present, then either a default explanation string or an empty | |||
explanation string MUST be returned. | explanation string MUST be returned. | |||
The domain-spec is macro expanded (see Section 8) and becomes the | The domain-spec is macro expanded (see Section 7) and becomes the | |||
<target-name>. The DNS TXT record for the <target-name> is fetched. | <target-name>. The DNS TXT record for the <target-name> is fetched. | |||
If there are any DNS processing errors (any RCODE other than 0), or | If there are any DNS processing errors (any RCODE other than 0), or | |||
if no records are returned, or if more than one record is returned, | if no records are returned, or if more than one record is returned, | |||
or if there are syntax errors in the explanation string, then proceed | or if there are syntax errors in the explanation string, then proceed | |||
as if no exp modifier was given. | as if no exp modifier was given. | |||
The fetched TXT record's strings are concatenated with no spaces, and | The fetched TXT record's strings are concatenated with no spaces, and | |||
then treated as an explain-string, which is macro-expanded. This | then treated as an explain-string, which is macro-expanded. This | |||
final result is the explanation string. Implementations MAY limit | final result is the explanation string. Implementations MAY limit | |||
skipping to change at page 31, line 6 | skipping to change at page 30, line 6 | |||
protocol constraints and/or reasonable processing limits. Since the | protocol constraints and/or reasonable processing limits. Since the | |||
explanation string is intended for an SMTP response and [RFC5321] | explanation string is intended for an SMTP response and [RFC5321] | |||
Section 2.4 says that responses are in [US-ASCII], the explanation | Section 2.4 says that responses are in [US-ASCII], the explanation | |||
string MUST be limited to US-ASCII. | string MUST be limited to US-ASCII. | |||
Software evaluating check_host() can use this string to communicate | Software evaluating check_host() can use this string to communicate | |||
information from the publishing domain in the form of a short message | information from the publishing domain in the form of a short message | |||
or URL. Software SHOULD make it clear that the explanation string | or URL. Software SHOULD make it clear that the explanation string | |||
comes from a third party. For example, it can prepend the macro | comes from a third party. For example, it can prepend the macro | |||
string "%{o} explains: " to the explanation, such as shown in | string "%{o} explains: " to the explanation, such as shown in | |||
Section 2.5.4. | Section 2.6.4. | |||
Suppose example.com has this record: | Suppose example.com has this record: | |||
v=spf1 mx -all exp=explain._spf.%{d} | v=spf1 mx -all exp=explain._spf.%{d} | |||
Here are some examples of possible explanation TXT records at | Here are some examples of possible explanation TXT records at | |||
explain._spf.example.com: | explain._spf.example.com: | |||
"Mail from example.com should only be sent by its own servers." | "Mail from example.com should only be sent by its own servers." | |||
-- a simple, constant message | -- a simple, constant message | |||
skipping to change at page 32, line 5 | skipping to change at page 31, line 5 | |||
"See http://%{d}/why.html?s=%{S}&i=%{I}" | "See http://%{d}/why.html?s=%{S}&i=%{I}" | |||
-- a complicated example that constructs a URL with the | -- a complicated example that constructs a URL with the | |||
arguments to check_host() so that a web page can be | arguments to check_host() so that a web page can be | |||
generated with detailed, custom instructions | generated with detailed, custom instructions | |||
Note: During recursion into an "include" mechanism, an exp= modifier | Note: During recursion into an "include" mechanism, an exp= modifier | |||
from the <target-name> MUST NOT be used. In contrast, when executing | from the <target-name> MUST NOT be used. In contrast, when executing | |||
a "redirect" modifier, an exp= modifier from the original domain MUST | a "redirect" modifier, an exp= modifier from the original domain MUST | |||
NOT be used. | NOT be used. | |||
7. Recording The Result | 7. Macros | |||
To provide downstream agents, such as MUAs, with the information they | ||||
might need in terms of evaluating or representing the apparent safety | ||||
of the message content, it is RECOMMENDED that SMTP receivers record | ||||
the result of SPF processing in the message header. For operators | ||||
that choose to record SPF results in the header of the message for | ||||
processing by internal filters or MUAs, two methods are presented. | ||||
Section 7.1 defines the Received-SPF field, which is the results | ||||
field originally defined for SPF use. Section 7.2 discusses | ||||
Authentication-Results [RFC5451] which was specified more recently | ||||
and is designed for use by SPF and other authentication methods. | ||||
Both are in common use, and hence both are included here. However, | ||||
it is important to note that they were designed to serve slightly | ||||
different purposes. Received-SPF is intended to include enough | ||||
forensic information to enable reconstruction of the SPF evaluation | ||||
of the message, while Authentication-Results is designed only to | ||||
relay the result itself and related output details of likely use to | ||||
end users (e.g., what property of the message was actually | ||||
authenticated and what it contained), leaving forensic work to the | ||||
purview of system logs and the Received field contents. Also, | ||||
Received-SPF relies on compliance of agents within the receiving ADMD | ||||
to adhere to the header field ordering rules of [RFC5321] and | ||||
[RFC5322], while Authentication-Results includes some provisions to | ||||
protect against non-compliant implementations. | ||||
An operator could choose to use both to serve different downstream | ||||
agents. In such cases, care needs to be taken to ensure both fields | ||||
are conveying the same details, or unexpected results can occur. | ||||
7.1. The Received-SPF Header Field | ||||
The Received-SPF header field is a trace field (see [RFC5322] Section | ||||
3.6.7) and SHOULD be prepended to the existing header, above the | ||||
Received: field that is generated by the SMTP receiver. It MUST | ||||
appear above all other Received-SPF fields in the message. The | ||||
header field has the following format: | ||||
header-field = "Received-SPF:" [CFWS] result FWS [comment FWS] | ||||
[ key-value-list ] CRLF | ||||
result = "pass" / "fail" / "softfail" / "neutral" / | ||||
"none" / "temperror" / "permerror" | ||||
key-value-list = key-value-pair *( ";" [CFWS] key-value-pair ) | ||||
[";"] | ||||
key-value-pair = key [CFWS] "=" ( dot-atom / quoted-string ) | ||||
key = "client-ip" / "envelope-from" / "helo" / | ||||
"problem" / "receiver" / "identity" / | ||||
mechanism / name | ||||
identity = "mailfrom" ; for the "MAIL FROM" identity | ||||
/ "helo" ; for the "HELO" identity | ||||
/ name ; other identities | ||||
dot-atom = <unquoted word as per [RFC5322]> | ||||
quoted-string = <quoted string as per [RFC5322]> | ||||
comment = <comment string as per [RFC5322]> | ||||
CFWS = <comment or folding white space as per [RFC5322]> | ||||
FWS = <folding white space as per [RFC5322]> | ||||
CRLF = <standard end-of-line token as per [RFC2532]> | ||||
The header field SHOULD include a "(...)" style comment after the | ||||
result, conveying supporting information for the result, such as | ||||
<ip>, <sender>, and <domain>. | ||||
The following key-value pairs are designed for later machine parsing. | ||||
SPF verifiers SHOULD give enough information so that the SPF results | ||||
can be verified. That is, at least "client-ip", "helo", and, if the | ||||
"MAIL FROM" identity was checked, "envelope-from". | ||||
client-ip the IP address of the SMTP client | ||||
envelope-from the envelope sender mailbox | ||||
helo the host name given in the HELO or EHLO command | ||||
mechanism the mechanism that matched (if no mechanisms matched, | ||||
substitute the word "default") | ||||
problem if an error was returned, details about the error | ||||
receiver the host name of the SPF verifier | ||||
identity the identity that was checked; see the <identity> ABNF | ||||
rule | ||||
Other keys MAY be defined by SPF verifiers. | ||||
SPF verifiers MUST make sure that the Received-SPF header field does | ||||
not contain invalid characters, is not excessively long (See | ||||
[RFC5322] Section 2.1.1), and does not contain malicious data that | ||||
has been provided by the sender. | ||||
Examples of various header field styles that could be generated are | ||||
the following: | ||||
Received-SPF: pass (mybox.example.org: domain of | ||||
myname@example.com designates 192.0.2.1 as permitted sender) | ||||
receiver=mybox.example.org; client-ip=192.0.2.1; | ||||
envelope-from="myname@example.com"; helo=foo.example.com; | ||||
Received-SPF: fail (mybox.example.org: domain of | ||||
myname@example.com does not designate | ||||
192.0.2.1 as permitted sender) | ||||
identity=mailfrom; client-ip=192.0.2.1; | ||||
envelope-from="myname@example.com"; | ||||
7.2. SPF Results in the Authentication-Results Header Field | ||||
As mentioned in Section 7, the Authentication-Results header field is | ||||
designed to communicate lists of tests a border MTA did and their | ||||
results. The specified elements of the field provide less | ||||
information than the SPF-Received field: | ||||
Authentication-Results: myhost.example.org; spf=pass | ||||
smtp.mailfrom=example.net | ||||
Received-SPF: pass (myhost.example.org: domain of | ||||
myname@example.com designates 192.0.2.1 as permitted sender) | ||||
receiver=mybox.example.org; client-ip=192.0.2.1; | ||||
envelope-from="myname@example.com"; helo=foo.example.com; | ||||
It is, however, possible to add CFWS in the "reason" part of an | ||||
Authentication-Results header field and provide the equivalent | ||||
information, if desired. | ||||
As an example, an expanded Authentication-Results header field might | ||||
look like (for a "MAIL FROM" check in this example): | ||||
Authentication-Results: myhost.example.org; spf=pass | ||||
reason="client-ip=192.0.2.1; smtp.helo=foo.example.com" | ||||
smtp.mailfrom=user@example.net | ||||
8. Macros | ||||
8.1. Macro Definitions | 7.1. Macro Definitions | |||
Many mechanisms and modifiers perform macro expansion on a term. | Many mechanisms and modifiers perform macro expansion on a term. | |||
domain-spec = macro-string domain-end | domain-spec = macro-string domain-end | |||
domain-end = ( "." toplabel [ "." ] ) / macro-expand | domain-end = ( "." toplabel [ "." ] ) / macro-expand | |||
toplabel = ( *alphanum ALPHA *alphanum ) / | toplabel = ( *alphanum ALPHA *alphanum ) / | |||
( 1*alphanum "-" *( alphanum / "-" ) alphanum ) | ( 1*alphanum "-" *( alphanum / "-" ) alphanum ) | |||
; LDH rule plus additional TLD restrictions | ; LDH rule plus additional TLD restrictions | |||
; (see [RFC3696], Section 2 for background) | ; (see [RFC3696], Section 2 for background) | |||
skipping to change at page 39, line 12 | skipping to change at page 34, line 12 | |||
powerful and allow per-user records to be published, they severely | powerful and allow per-user records to be published, they severely | |||
limit the ability of implementations to cache results of check_host() | limit the ability of implementations to cache results of check_host() | |||
and they reduce the effectiveness of DNS caches. | and they reduce the effectiveness of DNS caches. | |||
Note: If no directive processed during the evaluation of check_host() | Note: If no directive processed during the evaluation of check_host() | |||
contains an "s", "l", "o", or "h" macro, then the results of the | contains an "s", "l", "o", or "h" macro, then the results of the | |||
evaluation can be cached on the basis of <domain> and <ip> alone for | evaluation can be cached on the basis of <domain> and <ip> alone for | |||
as long as the shortest Time To Live (TTL) of all the DNS records | as long as the shortest Time To Live (TTL) of all the DNS records | |||
involved. | involved. | |||
8.2. Expansion Examples | 7.2. Expansion Examples | |||
The <sender> is strong-bad@email.example.com. | The <sender> is strong-bad@email.example.com. | |||
The IPv4 SMTP client IP is 192.0.2.3. | The IPv4 SMTP client IP is 192.0.2.3. | |||
The IPv6 SMTP client IP is 2001:DB8::CB01. | The IPv6 SMTP client IP is 2001:DB8::CB01. | |||
The PTR domain name of the client IP is mx.example.org. | The PTR domain name of the client IP is mx.example.org. | |||
macro expansion | macro expansion | |||
------- ---------------------------- | ------- ---------------------------- | |||
%{s} strong-bad@email.example.com | %{s} strong-bad@email.example.com | |||
%{o} email.example.com | %{o} email.example.com | |||
skipping to change at page 41, line 5 | skipping to change at page 36, line 5 | |||
3.2.0.192.in-addr.strong.lp._spf.example.com | 3.2.0.192.in-addr.strong.lp._spf.example.com | |||
%{d2}.trusted-domains.example.net | %{d2}.trusted-domains.example.net | |||
example.com.trusted-domains.example.net | example.com.trusted-domains.example.net | |||
IPv6: | IPv6: | |||
%{ir}.%{v}._spf.%{d2} 1.0.B.C.0.0.0.0. | %{ir}.%{v}._spf.%{d2} 1.0.B.C.0.0.0.0. | |||
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.B.D.0.1.0.0.2.ip6._spf.example.com | 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.B.D.0.1.0.0.2.ip6._spf.example.com | |||
9. Implications | 8. Result Handling | |||
This section provides guidance for operators in response to the | ||||
various possible outputs of check_host() on a message. Terse | ||||
definitions of SPF results are presented in Section 2.6; this section | ||||
provides more detail on each for use in developing local policy for | ||||
message handling. | ||||
Every operating environment is different. There are some receivers | ||||
for whom strict adherence to SPF is appropriate, and definitive | ||||
treatment of messages that are evaluated to be explicity unauthorized | ||||
("fail" and sometimes "softfail") is the norm. There are others for | ||||
which the "false negative" cases are more of a concern. In these, | ||||
SPF reports "fail" for legitimate mail. This concern is typically | ||||
handled by merely recording the result in the header and allow the | ||||
message to pass. There are still others where SPF is one of several | ||||
inputs to the message handling decision. As such, there is no | ||||
normative requirement for message handling in response to any | ||||
particular result. This section is provided to present a complete | ||||
picture of the likely cause of each result, and where available, the | ||||
experience gained during experimental deployment. | ||||
There are essentially two classes of handling choices: | ||||
o Handling within the SMTP session that attempted to deliver the | ||||
message, such as by returning a permanent SMTP error (rejection) | ||||
or temporary SMTP error ("try again later"); | ||||
o Permitting the message to pass (a successful SMTP reply code) and | ||||
adding an additional header field that indicates the result | ||||
returned by check_host() and other salient details; this is | ||||
discussed in more detail in Section 9. | ||||
8.1. None | ||||
With a "none" result, the SPF verifier has no information at all | ||||
about the authorization or lack thereof of the client to use the | ||||
checked idenity or identities. The check_host() function completed | ||||
without errors but was not able to reach any conclusion. | ||||
8.2. Neutral | ||||
A "neutral" result indicates that although a policy for the identity | ||||
was discovered, there is no definite assertion about the (positive or | ||||
negative) about the client. | ||||
A "neutral" result MUST be treated exactly like the "none" result; | ||||
the distinction exists only for informational purposes. Treating | ||||
"neutral" more harshly than "none" would discourage domain owners | ||||
from testing the use of SPF records (see Section 10.1). | ||||
8.3. Pass | ||||
A "pass" result means that the client is authorized to inject mail | ||||
with the given identity. The domain can now, in the sense of | ||||
reputation, be considered responsible for sending the message. | ||||
Further policy checks can now proceed with confidence in the | ||||
legitimate use of the identity. This is further discussed in | ||||
Appendix G.1. | ||||
8.4. Fail | ||||
A "fail" result is an explicit statement that the client is not | ||||
authorized to use the domain in the given identity. Disposition of | ||||
SPF fail messages is a matter of local policy. See Appendix G.2 for | ||||
considerations on developing local policy. | ||||
If the checking software chooses to reject the mail during the SMTP | ||||
transaction, then it SHOULD use an SMTP reply code of 550 (see | ||||
[RFC5321]) and, if supported, the 5.7.1 enhanced status code (see | ||||
[RFC3463]), in addition to an appropriate reply text. The | ||||
check_host() function will return either a default explanation string | ||||
or one from the domain that published the SPF records (see | ||||
Section 6.2). If the information does not originate with the | ||||
checking software, it is good to make it clear that the text is | ||||
provided by the sender's domain. For example: | ||||
550-5.7.1 SPF MAIL FROM check failed: | ||||
550-5.7.1 The domain example.com explains: | ||||
550 5.7.1 Please see http://www.example.com/mailpolicy.html | ||||
If the checking software chooses not to reject the mail during the | ||||
SMTP transaction, then it SHOULD add a Received-SPF or | ||||
Authentication-Results header field (see Section 9) to communicate | ||||
this result to downstream message processors. While this is true for | ||||
all SPF results, it is of particular importance for "fail" results | ||||
since the message is explicitly not authorized by the domain owner. | ||||
8.5. Softfail | ||||
A "softfail" result ought to be treated as somewhere between "fail" | ||||
and "neutral"/"none". The domain owner believes the host is not | ||||
authorized but is not willing to make a strong policy statement. | ||||
Receiving software SHOULD NOT reject the message based solely on this | ||||
result, but MAY subject the message to closer scrutiny than normal. | ||||
The domain owner wants to discourage the use of this host and thus | ||||
desires limited feedback when a "softfail" result occurs. For | ||||
example, the recipient's Mail User Agent (MUA) could highlight the | ||||
"softfail" status, or the receiving MTA could give the sender a | ||||
message using greylisting, [RFC6647], with a note the first time the | ||||
message is received, but accept it on a later attempt based on | ||||
receiver policy. | ||||
8.6. Temperror | ||||
A "temperror" result means the SPF verifier encountered a transient | ||||
(generally DNS) error while performing the check. Checking software | ||||
can choose to accept or temporarily reject the message. If the | ||||
message is rejected during the SMTP transaction for this reason, the | ||||
software SHOULD use an SMTP reply code of 451 and, if supported, the | ||||
4.4.3 enhanced status code. These errors can be caused by problems | ||||
in either the sender's or receiver's DNS software. | ||||
8.7. Permerror | ||||
A "permerror" result means the domain's published records could not | ||||
be correctly interpreted. This signals an error condition that | ||||
definitely requires manual intervention to be resolved. If the | ||||
message is rejected during the SMTP transaction for this reason, the | ||||
software SHOULD use an SMTP reply code of 550 and, if supported, the | ||||
5.5.2 enhanced status code. Be aware that if the domain owner uses | ||||
macros (Section 7), it is possible that this result is due to the | ||||
checked identities having an unexpected format. It is also possible | ||||
that this result is generated by certain SPF clients due to the input | ||||
arguments having an unexpected format; see Section 4.8. | ||||
9. Recording The Result | ||||
To provide downstream agents, such as MUAs, with the information they | ||||
might need in terms of evaluating or representing the apparent safety | ||||
of the message content, it is RECOMMENDED that SMTP receivers record | ||||
the result of SPF processing in the message header. For operators | ||||
that choose to record SPF results in the header of the message for | ||||
processing by internal filters or MUAs, two methods are presented. | ||||
Section 9.1 defines the Received-SPF field, which is the results | ||||
field originally defined for SPF use. Section 9.2 discusses | ||||
Authentication-Results [RFC5451] which was specified more recently | ||||
and is designed for use by SPF and other authentication methods. | ||||
Both are in common use, and hence both are included here. However, | ||||
it is important to note that they were designed to serve slightly | ||||
different purposes. Received-SPF is intended to include enough | ||||
forensic information to enable reconstruction of the SPF evaluation | ||||
of the message, while Authentication-Results is designed only to | ||||
relay the result itself and related output details of likely use to | ||||
end users (e.g., what property of the message was actually | ||||
authenticated and what it contained), leaving forensic work to the | ||||
purview of system logs and the Received field contents. Also, | ||||
Received-SPF relies on compliance of agents within the receiving ADMD | ||||
to adhere to the header field ordering rules of [RFC5321] and | ||||
[RFC5322], while Authentication-Results includes some provisions to | ||||
protect against non-compliant implementations. | ||||
An operator could choose to use both to serve different downstream | ||||
agents. In such cases, care needs to be taken to ensure both fields | ||||
are conveying the same details, or unexpected results can occur. | ||||
9.1. The Received-SPF Header Field | ||||
The Received-SPF header field is a trace field (see [RFC5322] Section | ||||
3.6.7) and SHOULD be prepended to the existing header, above the | ||||
Received: field that is generated by the SMTP receiver. It MUST | ||||
appear above all other Received-SPF fields in the message. The | ||||
header field has the following format: | ||||
header-field = "Received-SPF:" [CFWS] result FWS [comment FWS] | ||||
[ key-value-list ] CRLF | ||||
result = "pass" / "fail" / "softfail" / "neutral" / | ||||
"none" / "temperror" / "permerror" | ||||
key-value-list = key-value-pair *( ";" [CFWS] key-value-pair ) | ||||
[";"] | ||||
key-value-pair = key [CFWS] "=" ( dot-atom / quoted-string ) | ||||
key = "client-ip" / "envelope-from" / "helo" / | ||||
"problem" / "receiver" / "identity" / | ||||
mechanism / name | ||||
identity = "mailfrom" ; for the "MAIL FROM" identity | ||||
/ "helo" ; for the "HELO" identity | ||||
/ name ; other identities | ||||
dot-atom = <unquoted word as per [RFC5322]> | ||||
quoted-string = <quoted string as per [RFC5322]> | ||||
comment = <comment string as per [RFC5322]> | ||||
CFWS = <comment or folding white space as per [RFC5322]> | ||||
FWS = <folding white space as per [RFC5322]> | ||||
CRLF = <standard end-of-line token as per [RFC2532]> | ||||
The header field SHOULD include a "(...)" style comment after the | ||||
result, conveying supporting information for the result, such as | ||||
<ip>, <sender>, and <domain>. | ||||
The following key-value pairs are designed for later machine parsing. | ||||
SPF verifiers SHOULD give enough information so that the SPF results | ||||
can be verified. That is, at least "client-ip", "helo", and, if the | ||||
"MAIL FROM" identity was checked, "envelope-from". | ||||
client-ip the IP address of the SMTP client | ||||
envelope-from the envelope sender mailbox | ||||
helo the host name given in the HELO or EHLO command | ||||
mechanism the mechanism that matched (if no mechanisms matched, | ||||
substitute the word "default") | ||||
problem if an error was returned, details about the error | ||||
receiver the host name of the SPF verifier | ||||
identity the identity that was checked; see the <identity> ABNF | ||||
rule | ||||
Other keys MAY be defined by SPF verifiers. | ||||
SPF verifiers MUST make sure that the Received-SPF header field does | ||||
not contain invalid characters, is not excessively long (See | ||||
[RFC5322] Section 2.1.1), and does not contain malicious data that | ||||
has been provided by the sender. | ||||
Examples of various header field styles that could be generated are | ||||
the following: | ||||
Received-SPF: pass (mybox.example.org: domain of | ||||
myname@example.com designates 192.0.2.1 as permitted sender) | ||||
receiver=mybox.example.org; client-ip=192.0.2.1; | ||||
envelope-from="myname@example.com"; helo=foo.example.com; | ||||
Received-SPF: fail (mybox.example.org: domain of | ||||
myname@example.com does not designate | ||||
192.0.2.1 as permitted sender) | ||||
identity=mailfrom; client-ip=192.0.2.1; | ||||
envelope-from="myname@example.com"; | ||||
9.2. SPF Results in the Authentication-Results Header Field | ||||
As mentioned in Section 9, the Authentication-Results header field is | ||||
designed to communicate lists of tests a border MTA did and their | ||||
results. The specified elements of the field provide less | ||||
information than the Received-SPF field: | ||||
Authentication-Results: myhost.example.org; spf=pass | ||||
smtp.mailfrom=example.net | ||||
Received-SPF: pass (myhost.example.org: domain of | ||||
myname@example.com designates 192.0.2.1 as permitted sender) | ||||
receiver=mybox.example.org; client-ip=192.0.2.1; | ||||
envelope-from="myname@example.com"; helo=foo.example.com; | ||||
It is, however, possible to add CFWS in the "reason" part of an | ||||
Authentication-Results header field and provide the equivalent | ||||
information, if desired. | ||||
As an example, an expanded Authentication-Results header field might | ||||
look like (for a "MAIL FROM" check in this example): | ||||
Authentication-Results: myhost.example.org; spf=pass | ||||
reason="client-ip=192.0.2.1; smtp.helo=foo.example.com" | ||||
smtp.mailfrom=user@example.net | ||||
10. Effects on Infrastructure | ||||
This section outlines the major implications that adoption of this | This section outlines the major implications that adoption of this | |||
document will have on various entities involved in Internet email. | document will have on various entities involved in Internet email. | |||
It is intended to make clear to the reader where this document | It is intended to make clear to the reader where this document | |||
knowingly affects the operation of such entities. This section is | knowingly affects the operation of such entities. This section is | |||
not a "how-to" manual, or a "best practices" document, and it is not | not a "how-to" manual, or a "best practices" document, and it is not | |||
a comprehensive list of what such entities SHOULD do in light of this | a comprehensive list of what such entities SHOULD do in light of this | |||
document. | document. | |||
This section is non-normative. [RFC5598] describes the Internet | This section provides operational advice and instruction only. It is | |||
email architecture. This section is organized based on the different | non-normative. | |||
segments of the architecture. | ||||
9.1. Sending Domains | [RFC5598] describes the Internet email architecture. This section is | |||
organized based on the different segments of the architecture. | ||||
10.1. Sending Domains | ||||
Originating ADMDs (ADministrative Management Domains - [RFC5598] | Originating ADMDs (ADministrative Management Domains - [RFC5598] | |||
Section 2.2.1 and Section 2.3) that wish to be compliant with this | Section 2.2.1 and Section 2.3) that wish to be compliant with this | |||
specification will need to determine the list of relays ([RFC5598] | specification will need to determine the list of relays ([RFC5598] | |||
Section 2.2.2) that they allow to use their domain name in the "HELO" | Section 2.2.2) that they allow to use their domain name in the "HELO" | |||
and "MAIL FROM" identities when relaying to other ADMDs. It is | and "MAIL FROM" identities when relaying to other ADMDs. It is | |||
recognized that forming such a list is not just a simple technical | recognized that forming such a list is not just a simple technical | |||
exercise, but involves policy decisions with both technical and | exercise, but involves policy decisions with both technical and | |||
administrative considerations. | administrative considerations. | |||
9.1.1. DNS Resource Considerations | 10.1.1. DNS Resource Considerations | |||
Minimizing the DNS resources required for SPF lookups can be done by | Minimizing the DNS resources required for SPF lookups can be done by | |||
choosing directives that require less DNS information and by placing | choosing directives that require less DNS information and by placing | |||
lower-cost mechanisms earlier in the SPF record. | lower-cost mechanisms earlier in the SPF record. | |||
+----------+--------+-----------------+ | +----------+--------+-----------------+ | |||
| term | cost | limit | | | term | cost | limit | | |||
+----------+--------+-----------------+ | +----------+--------+-----------------+ | |||
| ip4/ip6 | 0 | - | | | ip4/ip6 | 0 | - | | |||
| a | 1 | 10 | | | a | 1 | 10 | | |||
skipping to change at page 42, line 31 | skipping to change at page 44, line 33 | |||
@ IN TXT "v=spf1 a:authorized-spf.example.com -all" | @ IN TXT "v=spf1 a:authorized-spf.example.com -all" | |||
authorized-spf IN A 192.0.2.1 | authorized-spf IN A 192.0.2.1 | |||
IN A 192.0.2.129 | IN A 192.0.2.129 | |||
Expensive record: | Expensive record: | |||
example.com. IN TXT "v=spf1 mx:example.com -all" | example.com. IN TXT "v=spf1 mx:example.com -all" | |||
Wasteful, bad record: | Wasteful, bad record: | |||
example.com. IN TXT "v=spf1 ip4:192.0.2.0/24 mx -all" | example.com. IN TXT "v=spf1 ip4:192.0.2.0/24 mx -all" | |||
9.1.2. Administrator's Considerations | 10.1.2. Administrator's Considerations | |||
There might be administrative considerations: using "a" over "ip4" or | There might be administrative considerations: using "a" over "ip4" or | |||
"ip6" allows hosts to be renumbered easily. Using "mx" over "a" | "ip6" allows hosts to be renumbered easily. Using "mx" over "a" | |||
allows the set of mail hosts to be changed easily. Unless such | allows the set of mail hosts to be changed easily. Unless such | |||
changes are common, it is better to use the less resource intensive | changes are common, it is better to use the less resource intensive | |||
mechanisms like "ip4" and "ip6" over "a" or "a" or "mx". | mechanisms like "ip4" and "ip6" over "a" or "a" or "mx". | |||
In some specific cases, standard advice on record content is | In some specific cases, standard advice on record content is | |||
appropriate. Publishing SPF records for domains that send no mail is | appropriate. Publishing SPF records for domains that send no mail is | |||
a well established best practice. The record for a domain that sends | a well established best practice. The record for a domain that sends | |||
skipping to change at page 42, line 47 | skipping to change at page 45, line 4 | |||
mechanisms like "ip4" and "ip6" over "a" or "a" or "mx". | mechanisms like "ip4" and "ip6" over "a" or "a" or "mx". | |||
In some specific cases, standard advice on record content is | In some specific cases, standard advice on record content is | |||
appropriate. Publishing SPF records for domains that send no mail is | appropriate. Publishing SPF records for domains that send no mail is | |||
a well established best practice. The record for a domain that sends | a well established best practice. The record for a domain that sends | |||
no mail is: | no mail is: | |||
www.example.com. IN TXT "v=spf1 -all" | www.example.com. IN TXT "v=spf1 -all" | |||
Publishing SPF records for individual hosts is also best practice. | Publishing SPF records for individual hosts is also best practice. | |||
The hostname is generally the identity used in the 5321.HELO/.EHLO | The hostname is generally the identity used in the 5321.HELO/.EHLO | |||
command. In the case of messages with a null 5321.MailFrom, this is | command. In the case of messages with a null 5321.MailFrom, this is | |||
used as the domain for 5321.MailFrom SPF checks, in addition to being | used as the domain for 5321.MailFrom SPF checks, in addition to being | |||
used in 5321.HELO/.EHLO based SPF checks. The standard SPF record | used in 5321.HELO/.EHLO based SPF checks. The standard SPF record | |||
for an individual host that is involved in mail processing is: | for an individual host that is involved in mail processing is: | |||
relay.example.com. IN TXT "v=spf1 a -all" | relay.example.com. IN TXT "v=spf1 a -all" | |||
Validating correct deployment is difficult. [RFC6652] describes one | Validating correct deployment is difficult. [RFC6652] describes one | |||
mechanism for soliciting feedback on SPF failures. Another approach | mechanism for soliciting feedback on SPF failures. Another | |||
that can be helpful to publish records that include a "tracking | suggestion can be found in Appendix C. | |||
exists:" mechanism. By looking at the name server logs, a rough list | ||||
can then be generated. For example: | ||||
v=spf1 exists:_h.%{h}._l.%{l}._o.%{o}._i.%{i}._spf.%{d} ?all | ||||
Regardless of the method used, understanding the ADMD's outbound mail | Regardless of the method used, understanding the ADMD's outbound mail | |||
architecture is essential to effective deployment. | architecture is essential to effective deployment. | |||
9.1.3. Bounces | 10.1.3. Bounces | |||
As explained in Section 1.3.3, [RFC5321] allows the reverse-path to | As explained in Section 1.1.3, [RFC5321] allows the reverse-path to | |||
be null, which is typical of some Delivery Status Notification | be null, which is typical of some Delivery Status Notification | |||
[RFC3464], commonly called email bounces. In this case the only | [RFC3464], commonly called email bounces. In this case the only | |||
entity available for performing an SPF check is the "HELO" identity | entity available for performing an SPF check is the "HELO" identity | |||
defined in Section 1.3.4. SPF functionality is enhanced by | defined in Section 1.1.4. SPF functionality is enhanced by | |||
administrators ensuring this identity is set correctly and has an | administrators ensuring this identity is set correctly and has an | |||
appropriate SPF record. It is normal to have the HELO identity set | appropriate SPF record. It is normal to have the HELO identity set | |||
to hostname instead of domain. Zone file generation for significant | to hostname instead of domain. Zone file generation for significant | |||
numbers of hosts can be consolidated using the redirect modifier and | numbers of hosts can be consolidated using the redirect modifier and | |||
scripted for initial deployment. Specific deployment advice is given | scripted for initial deployment. Specific deployment advice is given | |||
above in Section 9.1.2. | above in Section 10.1.2. | |||
9.2. Mediators | 10.2. Receivers | |||
SPF results can be used in combination with other methods to | ||||
determine the final local disposition (either positive or negative of | ||||
a message. It can also be considered dispositive on its own. | ||||
An attempt to have one organization (sender) direct the email | ||||
handling policies of another (receiver) is inherently challenging and | ||||
often controversial. As stated elsewhere in this document, there is | ||||
no normative requirement for specific handling of a message based on | ||||
any SPF result. The information presented in Section 8 and in | ||||
Appendix G is offered for receiver consideration when forming local | ||||
handling policies. | ||||
The primary considerations are that SPF might return "pass" for mail | ||||
that is ultimately harmful (e.g., spammers that arrange for SPF to | ||||
pass using nonsense domain names, or virus or spam outbreaks from | ||||
within trusted sources), and might also return "fail" for mail that | ||||
is ultimately legitimate (e.g., legitimate mail that has traversed a | ||||
mail alias). It is important take both of these cases under | ||||
consideration when establishing local handling policy. | ||||
10.3. Mediators | ||||
Broadly speaking, there are two types of mediating ADMDs that can | Broadly speaking, there are two types of mediating ADMDs that can | |||
affect SPF deployment of other ADMDs: mailing lists (see [RFC5598] | affect SPF deployment of other ADMDs: mailing lists (see [RFC5598] | |||
Section 5.3) and ReSenders ([RFC5598] Section 5.2). | Section 5.3) and ReSenders ([RFC5598] Section 5.2). | |||
9.2.1. Mailing Lists | 10.3.1. Mailing Lists | |||
Mailing lists have to be aware of how they re-inject mail that is | Mailing lists have to be aware of how they re-inject mail that is | |||
sent to the list. Mailing lists MUST comply with the requirements in | sent to the list. Mailing lists MUST comply with the requirements in | |||
[RFC5321], Section 3.10, and [RFC1123], Section 5.3.6, that say that | [RFC5321], Section 3.10, and [RFC1123], Section 5.3.6, that say that | |||
the reverse-path MUST be changed to be the mailbox of a person or | the reverse-path MUST be changed to be the mailbox of a person or | |||
other entity who administers the list. Whereas the reasons for | other entity who administers the list. Whereas the reasons for | |||
changing the reverse-path are many and long-standing, SPF adds | changing the reverse-path are many and long-standing, SPF adds | |||
enforcement to this requirement. | enforcement to this requirement. | |||
In practice, almost all mailing list software in use already complies | In practice, almost all mailing list software in use already complies | |||
with this requirement. Mailing lists that do not comply might | with this requirement. Mailing lists that do not comply might | |||
encounter problems depending on how access to the list is restricted. | encounter problems depending on how access to the list is restricted. | |||
Such lists that are entirely internal to a domain (only people in the | Such lists that are entirely internal to a domain (only people in the | |||
domain can send to or receive from the list) are not affected. | domain can send to or receive from the list) are not affected. | |||
9.2.2. Forwarding Services and Aliases | 10.3.2. Forwarding Services and Aliases | |||
Forwarding services take mail that is received at a mailbox and | Forwarding services take mail that is received at a mailbox and | |||
direct it to some external mailbox. At the time of this writing, the | direct it to some external mailbox. At the time of this writing, the | |||
near-universal practice of such services is to use the original "MAIL | near-universal practice of such services is to use the original "MAIL | |||
FROM" of a message when re-injecting it for delivery to the external | FROM" of a message when re-injecting it for delivery to the external | |||
mailbox. [RFC1123] and [RFC5321] describe this action as an "alias" | mailbox. [RFC1123] and [RFC5321] describe this action as an "alias" | |||
rather than a "mail list". This means the external mailbox's MTA | rather than a "mail list". This means the external mailbox's MTA | |||
sees all such mail in a connection from a host of the forwarding | sees all such mail in a connection from a host of the forwarding | |||
service, and so the "MAIL FROM" identity will not, in general, pass | service, and so the "MAIL FROM" identity will not, in general, pass | |||
authorization. | authorization. | |||
There are three places that techniques can be used to ameliorate this | Appendix D provides some operational suggestions to adapt these | |||
problem. | services to an SPF-aware environment. | |||
1. The beginning, when email is first sent (Originating ADMDs). | ||||
1. "Neutral" results could be given for IP addresses that might | ||||
be forwarders, instead of "fail" results based on a list of | ||||
known reliable forwarders. For example: | ||||
"v=spf1 mx ?exists:%{ir}.whitlist.example.org -all" | ||||
This would cause a lookup on an DNS white list (DNSWL) and | ||||
cause a result of "fail" only for email not either coming | ||||
from the domain's mx host(s) (SPF pass) or white listed | ||||
sources (SPF neutral). This, in effect, outsources an | ||||
element of sender policy to the maintainer of the whitelist. | ||||
2. The "MAIL FROM" identity could have additional information in | ||||
the local-part that cryptographically identifies the mail as | ||||
coming from an authorized source. In this case, such an SPF | ||||
record could be used: | ||||
"v=spf1 mx exists:%{l}._spf_verify.%{d} -all" | ||||
Then, a specialized DNS server can be set up to serve the | ||||
_spf_verify subdomain that validates the local-part. | ||||
Although this requires an extra DNS lookup, this happens only | ||||
when the email would otherwise be rejected as not coming from | ||||
a known good source. | ||||
Note that due to the 63-character limit for domain labels, | ||||
this approach only works reliably if the local-part signature | ||||
scheme is guaranteed either to only produce local-parts with | ||||
a maximum of 63 characters or to gracefully handle truncated | ||||
local-parts. | ||||
3. Similarly, a specialized DNS server could be set up that will | ||||
rate-limit the email coming from unexpected IP addresses. | ||||
"v=spf1 mx exists:%{ir}._spf_rate.%{d} -all" | ||||
4. SPF allows the creation of per-user policies for special | ||||
cases. For example, the following SPF record and appropriate | ||||
wildcard DNS records can be used: | ||||
"v=spf1 mx redirect=%{l1r+}._at_.%{o}._spf.%{d}" | ||||
2. The middle, when email is forwarded (Mediating ADMDs). | ||||
1. Forwarding services can solve the problem by rewriting the | ||||
"MAIL FROM" to be in their own domain. This means mail | ||||
rejected from the external mailbox will have to be forwarded | ||||
back to the original sender by the forwarding service. | ||||
Various schemes to do this exist though they vary widely in | ||||
complexity and resource requirements on the part of the | ||||
forwarding service. | ||||
2. Several popular MTAs can be forced from "alias" semantics to | ||||
"mailing list" semantics by configuring an additional alias | ||||
with "owner-" prepended to the original alias name (e.g., an | ||||
alias of "friends: george@example.com, fred@example.org" | ||||
would need another alias of the form "owner-friends: | ||||
localowner"). | ||||
3. Forwarding servers could reject mail that would "fail" SPF if | ||||
forwarded using an SMTP reply code of 551, User not local, | ||||
(see [RFC5321] section 3.4) to communicate the correct target | ||||
address to resend the mail to. | ||||
3. The end, when email is received (Receiving ADMDs). | ||||
1. If the owner of the external mailbox wishes to trust the | ||||
forwarding service, he can direct the external mailbox's MTA | ||||
to skip SPF tests when the client host belongs to the | ||||
forwarding service. | ||||
2. Tests against other identities, such as the "HELO" identity, | ||||
MAY be used to override a failed test against the "MAIL FROM" | ||||
identity. | ||||
3. For larger domains, it might not be possible to have a | ||||
complete or accurate list of forwarding services used by the | ||||
owners of the domain's mailboxes. In such cases, whitelists | ||||
of generally-recognized forwarding services could be | ||||
employed. | ||||
9.2.3. Mail Services | ||||
MSPs (Mail Service Providers - [RFC5598] Section 2.3) that offer mail | ||||
services to third-party domains, such as sending of bulk mail, might | ||||
want to adjust their configurations in light of the authorization | ||||
check described in this document. If the domain part of the "MAIL | ||||
FROM" identity used for such email uses the domain of one of the MSPs | ||||
domain, then the provider needs only to ensure that its sending host | ||||
is authorized by its own SPF record, if any. | ||||
If the "MAIL FROM" identity does not use the MSP's domain, then extra | ||||
care has to be taken. The SPF record format has several options for | ||||
the third-party domain to authorize the service provider's MTAs to | ||||
send mail on its behalf. For MSPs, such as ISPs, that have a wide | ||||
variety of customers using the same MTA, steps are required to | ||||
mitiate the risk of cross-customer forgery (see Section 10.4). | ||||
9.2.4. MTA Relays | ||||
Relays are described in [RFC5598] Section 2.2.2. The authorization | ||||
check generally precludes the use of arbitrary MTA relays between | ||||
sender and receiver of an email message. | ||||
Within an organization, MTA relays can be effectively deployed. | ||||
However, for purposes of this document, such relays are effectively | ||||
transparent. The SPF authorization check is a check between border | ||||
MTAs of different ADMDs. | ||||
For mail senders, this means that published SPF records have to | ||||
authorize any MTAs that actually send across the Internet. Usually, | ||||
these are just the border MTAs as internal MTAs simply forward mail | ||||
to these MTAs for relaying. | ||||
The receiving ADMD will generally want to perform the authorization | ||||
check at the boundary MTAs, including all secondary MXs. Internal | ||||
MTAs (including MTAs that might serve both as boundary MTAs and | ||||
internal relays from secondary MXs when they are processing the | ||||
relayed mail stream) then do not perform the authorization test. To | ||||
perform the authorization test other than at the boundary, the host | ||||
that first transferred the message to the receiving ADMD have to be | ||||
determined, which can be difficult to extract from the message header | ||||
because (a) header fields can be forged or malformed, and (b) there's | ||||
no standard way to encode that information such that it can be | ||||
reliably extracted. Testing other than at the boundary is likely to | ||||
produce unreliable results. | ||||
9.3. Receivers | ||||
SPF results can be used in combination with other methods to | ||||
determine the final local disposition (either positive or negative of | ||||
a message. It can also be considered dispositive on its own. | ||||
9.3.1. Policy For SPF Pass | ||||
SPF pass results can be used in combination with "white lists" of | ||||
known "good" domains to bypass some or all additional pre-delivery | ||||
email checks. Exactly which checks and how to determine appropriate | ||||
white list entries has to be based on local conditions and | ||||
requirements. | ||||
9.3.2. Policy For SPF Fail | ||||
SPF fail results can be used to reject messages during the SMTP | ||||
transaction based on either "MAIL FROM" or "HELO" identity results. | ||||
This reduces resource requirements for various content filtering | ||||
methods and conserves bandwidth since rejection can be done before | ||||
the SMTP content is transferred. It also gives immediate feedback to | ||||
the sender who might then be able to resolve the issue. Due to some | ||||
of the issues described above in this section (Section 9), SPF based | ||||
rejection does present some risk of rejecting legitimate email when | ||||
rejecting based on "MAIL FROM" results. | ||||
SPF fail results can alternately be used as one input into a larger | ||||
set of evaluations which might, based on a combination with other | ||||
evaluation techniques, result in the email being marked negatively in | ||||
some way (this might be via delivery to a special spam folder, | ||||
modifying subject lines, or other locally determined means). | ||||
Developing the details of such an approach have to be based on local | ||||
conditions and requirements. Using SPF results in this way does not | ||||
have the advantages of resource conservation and immediate feedback | ||||
to the sender associated with SMTP rejection, but could produce fewer | ||||
undesirable rejections in a well designed system. Such an approach | ||||
might result in email that was not authorized by the sending ADMD | ||||
being unknowingly delivered to end users. | ||||
Either general approach can be used as they both leave a clear | ||||
disposition of emails. They are either delivered in some manner or | ||||
the sender is notified of the failure. Other dispositions such as | ||||
"dropping" or deleting email after acceptance are inappropriate | ||||
because they leave uncertainty and reduce the overall reliabilility | ||||
and utility of email across the Internet. | ||||
9.3.3. Policy For SPF Permerror | ||||
The "permerror" result (see Section 2.5.7) indicates the SPF | ||||
processing module at the receiver determined that the retrieved SPF | ||||
policy record could not be interpreted. This gives no true | ||||
indication about the authorized use of the data found in the | ||||
envelope. | ||||
As with all results, implementers have a choice to make regarding | ||||
what to do with a message that yields this result. SMTP allows only | ||||
a few basic options. | ||||
Rejection of the message is an option, in that it is the one thing a | ||||
receiver can do to draw attention to the difficulty encountered while | ||||
protecting itself from messages that do not have a definite SPF | ||||
result of some kind. However, if the SPF implementation is defective | ||||
and returns spurious "permerror" results, only the sender is actively | ||||
notified of the defect (in the form of rejected mail), and not the | ||||
receiver making use of SPF. | ||||
The less intrusive handling choice is to deliver the message, perhaps | ||||
with some kind of annotation of the difficulty encountered and/or | ||||
logging of a similar nature. However, this will not be desirable to | ||||
operators that wish to implement SPF checking as strictly as | ||||
possible, nor is this sort of passive problem reporting typically | ||||
effective. | ||||
There is of course the option placing this choice in the hands of the | ||||
operator rather than the implementer since this kind of choice is | ||||
often a matter of local policy rather than a condition with a | ||||
universal solution, but this adds one more piece of complexity to an | ||||
already non-trivial environment. | ||||
Both implementers and operators need to be cautious of all choices | ||||
and outcomes when handling SPF results. | ||||
10. Security Considerations | 11. Security Considerations | |||
10.1. Processing Limits | 11.1. Processing Limits | |||
As with most aspects of email, there are a number of ways that | As with most aspects of email, there are a number of ways that | |||
malicious parties could use the protocol as an avenue for a | malicious parties could use the protocol as an avenue for a | |||
Denial-of-Service (DoS) attack. The processing limits outlined in | Denial-of-Service (DoS) attack. The processing limits outlined in | |||
Section 4.6.4 are designed to prevent attacks such as the following: | Section 4.6.4 are designed to prevent attacks such as the following: | |||
o A malicious party could create an SPF record with many references | o A malicious party could create an SPF record with many references | |||
to a victim's domain and send many emails to different SPF | to a victim's domain and send many emails to different SPF | |||
verifiers; those SPF verifiers would then create a DoS attack. In | verifiers; those SPF verifiers would then create a DoS attack. In | |||
effect, the SPF verifiers are being used to amplify the attacker's | effect, the SPF verifiers are being used to amplify the attacker's | |||
skipping to change at page 49, line 41 | skipping to change at page 47, line 41 | |||
come from the intended target to a wide variety of legitimate mail | come from the intended target to a wide variety of legitimate mail | |||
hosts. These legitimate machines would then present a DNS load on | hosts. These legitimate machines would then present a DNS load on | |||
the target as they fetched the relevant records. | the target as they fetched the relevant records. | |||
Of these, the case of a third party referenced in the SPF record is | Of these, the case of a third party referenced in the SPF record is | |||
the easiest for a DoS attack to effectively exploit. As a result, | the easiest for a DoS attack to effectively exploit. As a result, | |||
limits that might seem reasonable for an individual mail server can | limits that might seem reasonable for an individual mail server can | |||
still allow an unreasonable amount of bandwidth amplification. | still allow an unreasonable amount of bandwidth amplification. | |||
Therefore, the processing limits need to be quite low. | Therefore, the processing limits need to be quite low. | |||
10.2. SPF-Authorized Email May Contain Other False Identities | 11.2. SPF-Authorized Email May Contain Other False Identities | |||
Do not construe the "MAIL FROM" and "HELO" identity authorizations to | Do not construe the "MAIL FROM" and "HELO" identity authorizations to | |||
provide more assurance than they do. It is entirely possible for a | provide more assurance than they do. It is entirely possible for a | |||
malicious sender to inject a message using his own domain in the | malicious sender to inject a message using his own domain in the | |||
identities used by SPF, to have that domain's SPF record authorize | identities used by SPF, to have that domain's SPF record authorize | |||
the sending host, and yet the message can easily list other | the sending host, and yet the message can easily list other | |||
identities in its header. Unless the user or the MUA takes care to | identities in its header. Unless the user or the MUA takes care to | |||
note that the authorized identity does not match the other more | note that the authorized identity does not match the other more | |||
commonly-presented identities (such as the From: header field), the | commonly-presented identities (such as the From: header field), the | |||
user might be lulled into a false sense of security. | user might be lulled into a false sense of security. | |||
10.3. Spoofed DNS and IP Data | 11.3. Spoofed DNS and IP Data | |||
There are two aspects of this protocol that malicious parties could | There are two aspects of this protocol that malicious parties could | |||
exploit to undermine the validity of the check_host() function: | exploit to undermine the validity of the check_host() function: | |||
o The evaluation of check_host() relies heavily on DNS. A malicious | o The evaluation of check_host() relies heavily on DNS. A malicious | |||
attacker could attack the DNS infrastructure and cause | attacker could attack the DNS infrastructure and cause | |||
check_host() to see spoofed DNS data, and then return incorrect | check_host() to see spoofed DNS data, and then return incorrect | |||
results. This could include returning "pass" for an <ip> value | results. This could include returning "pass" for an <ip> value | |||
where the actual domain's record would evaluate to "fail". See | where the actual domain's record would evaluate to "fail". See | |||
[RFC3833] for a description of DNS weaknesses. | [RFC3833] for a description of DNS weaknesses. | |||
o The client IP address, <ip>, is assumed to be correct. In a | o The client IP address, <ip>, is assumed to be correct. In a | |||
modern, correctly configured system the risk of this not being | modern, correctly configured system the risk of this not being | |||
true is nil. | true is nil. | |||
10.4. Cross-User Forgery | 11.4. Cross-User Forgery | |||
By definition, SPF policies just map domain names to sets of | By definition, SPF policies just map domain names to sets of | |||
authorized MTAs, not whole email addresses to sets of authorized | authorized MTAs, not whole email addresses to sets of authorized | |||
users. Although the "l" macro (Section 8) provides a limited way to | users. Although the "l" macro (Section 7) provides a limited way to | |||
define individual sets of authorized MTAs for specific email | define individual sets of authorized MTAs for specific email | |||
addresses, it is generally impossible to verify, through SPF, the use | addresses, it is generally impossible to verify, through SPF, the use | |||
of specific email addresses by individual users of the same MTA. | of specific email addresses by individual users of the same MTA. | |||
It is up to mail services and their MTAs to directly prevent | It is up to mail services and their MTAs to directly prevent | |||
cross-user forgery: based on SMTP AUTH ([RFC4954]), users have to be | cross-user forgery: based on SMTP AUTH ([RFC4954]), users have to be | |||
restricted to using only those email addresses that are actually | restricted to using only those email addresses that are actually | |||
under their control (see [RFC6409], Section 6.1). Another means to | under their control (see [RFC6409], Section 6.1). Another means to | |||
verify the identity of individual users is message cryptography such | verify the identity of individual users is message cryptography such | |||
as PGP ([RFC4880]) or S/MIME ([RFC5751]). | as PGP ([RFC4880]) or S/MIME ([RFC5751]). | |||
10.5. Untrusted Information Sources | 11.5. Untrusted Information Sources | |||
An SPF compliant receiver gathers information from the SMTP commands | An SPF compliant receiver gathers information from the SMTP commands | |||
it receives and from the published DNS records of the sending domain | it receives and from the published DNS records of the sending domain | |||
holder, (e.g., "HELO" domain name, the "MAIL FROM" address from the | holder, (e.g., "HELO" domain name, the "MAIL FROM" address from the | |||
envelope, and SPF DNS records published by the domain holder). | envelope, and SPF DNS records published by the domain holder). | |||
10.5.1. Recorded Results | 11.5.1. Recorded Results | |||
This information, passed to the receiver in the Received-SPF: or | This information, passed to the receiver in the Received-SPF: or | |||
Authentication-Results: trace fields, may be returned to the client | Authentication-Results: trace fields, may be returned to the client | |||
MTA as an SMTP rejection message. If such an SMTP rejection message | MTA as an SMTP rejection message. If such an SMTP rejection message | |||
is generated, the information from the trace fields has to be checked | is generated, the information from the trace fields has to be checked | |||
for such problems as invalid characters and excessively long lines. | for such problems as invalid characters and excessively long lines. | |||
10.5.2. External Explanations | 11.5.2. External Explanations | |||
When the authorization check fails, an explanation string could be | When the authorization check fails, an explanation string could be | |||
included in the reject response. Both the sender and the rejecting | included in the reject response. Both the sender and the rejecting | |||
receiver need to be aware that the explanation was determined by the | receiver need to be aware that the explanation was determined by the | |||
publisher of the SPF record checked and, in general, not the | publisher of the SPF record checked and, in general, not the | |||
receiver. The explanation can contain malicious URLs, or it might be | receiver. The explanation can contain malicious URLs, or it might be | |||
offensive or misleading. | offensive or misleading. | |||
Explanations returned to sender domains due to "exp" modifiers, | Explanations returned to sender domains due to "exp" modifiers, | |||
(Section 6.2), were generated by the sender policy published by the | (Section 6.2), were generated by the sender policy published by the | |||
domain holders themselves. As long as messages are only returned | domain holders themselves. As long as messages are only returned | |||
with non-delivery notification ([RFC3464]) to domains publishing the | with non-delivery notification ([RFC3464]) to domains publishing the | |||
explanation strings from their own DNS SPF records, the only affected | explanation strings from their own DNS SPF records, the only affected | |||
parties are the original publishers of the domain's SPF records. | parties are the original publishers of the domain's SPF records. | |||
In practice, such non-delivery notifications can be misdirected, such | In practice, such non-delivery notifications can be misdirected, such | |||
as when an MTA accepts an email and only later generates the | as when an MTA accepts an email and only later generates the | |||
notification to a forged address, or when an email forwarder does not | notification to a forged address, or when an email forwarder does not | |||
direct the bounce back to the original sender. | direct the bounce back to the original sender. | |||
10.5.3. Macro Expansion | 11.5.3. Macro Expansion | |||
Macros (Section 8) allow senders to inject arbitrary text (any non- | Macros (Section 7) allow senders to inject arbitrary text (any non- | |||
null [US-ASCII] character) into receiver DNS queries. It is necesary | null [US-ASCII] character) into receiver DNS queries. It is necesary | |||
to be prepared for hostile or unexpected content. | to be prepared for hostile or unexpected content. | |||
10.6. Privacy Exposure | 11.6. Privacy Exposure | |||
Checking SPF records causes DNS queries to be sent to the domain | Checking SPF records causes DNS queries to be sent to the domain | |||
owner. These DNS queries, especially if they are caused by the | owner. These DNS queries, especially if they are caused by the | |||
"exists" mechanism, can contain information about who is sending | "exists" mechanism, can contain information about who is sending | |||
email and likely to which MTA the email is being sent. This can | email and likely to which MTA the email is being sent. This can | |||
introduce some privacy concerns, which are more or less of an issue | introduce some privacy concerns, which are more or less of an issue | |||
depending on local laws and the relationship between the domain owner | depending on local laws and the relationship between the domain owner | |||
and the person sending the email. | and the person sending the email. | |||
11. Contributors and Acknowledgements | 12. Contributors and Acknowledgements | |||
This document is largely based on the work of Meng Weng Wong, Mark | This document is largely based on the work of Meng Weng Wong, Mark | |||
Lentczner, and Wayne Schlitt. Although, as this section | Lentczner, and Wayne Schlitt. Although, as this section | |||
acknowledges, many people have contributed to this document, a very | acknowledges, many people have contributed to this document, a very | |||
large portion of the writing and editing are due to Meng, Mark, and | large portion of the writing and editing are due to Meng, Mark, and | |||
Wayne. | Wayne. | |||
This design owes a debt of parentage to [RMX] by Hadmut Danisch and | This design owes a debt of parentage to [RMX] by Hadmut Danisch and | |||
to [DMP] by Gordon Fecyk. The idea of using a DNS record to check | to [DMP] by Gordon Fecyk. The idea of using a DNS record to check | |||
the legitimacy of an email address traces its ancestry further back | the legitimacy of an email address traces its ancestry further back | |||
skipping to change at page 53, line 5 | skipping to change at page 51, line 5 | |||
the development of this design. They are far too numerous to name, | the development of this design. They are far too numerous to name, | |||
but they include the following: | but they include the following: | |||
The participants in the SPFbis working group. | The participants in the SPFbis working group. | |||
The folks on the spf-discuss mailing list. | The folks on the spf-discuss mailing list. | |||
The folks on the SPAM-L mailing list. | The folks on the SPAM-L mailing list. | |||
The folks on the IRTF ASRG mailing list. | The folks on the IRTF ASRG mailing list. | |||
The folks on the IETF MARID mailing list. | The folks on the IETF MARID mailing list. | |||
The folks on #perl. | The folks on #perl. | |||
12. IANA Considerations | 13. IANA Considerations | |||
12.1. The SPF DNS Record Type | 13.1. The SPF DNS Record Type | |||
Per [RFC4408], the IANA assigned the Resource Record Type and Qtype | Per [RFC4408], the IANA assigned the Resource Record Type and Qtype | |||
from the DNS Parameters Registry for the SPF RR type with code 99. | from the DNS Parameters Registry for the SPF RR type with code 99. | |||
The format of this type is identical to the TXT RR [RFC1035]. The | The format of this type is identical to the TXT RR [RFC1035]. The | |||
character content of the record is encoded as [US-ASCII]. Use of | character content of the record is encoded as [US-ASCII]. Use of | |||
this record type is obsolete for SPF Version 1. | this record type is obsolete for SPF Version 1. | |||
IANA is requested to add an annotation to the SPF RRTYPE saying | IANA is requested to add an annotation to the SPF RRTYPE saying | |||
"(OBSOLETE - use TXT)" in the DNS Parameters registry. | "(OBSOLETE - use TXT)" in the DNS Parameters registry. | |||
[NOTE TO RFC EDITOR: (to be changed to " ... has added ..." upon | [NOTE TO RFC EDITOR: (to be changed to " ... has added ..." upon | |||
publication)] | publication)] | |||
12.2. The Received-SPF Mail Header Field | 13.2. The Received-SPF Mail Header Field | |||
Per [RFC3864], the "Received-SPF:" header field is added to the IANA | Per [RFC3864], the "Received-SPF:" header field is added to the IANA | |||
Permanent Message Header Field Registry. The following is the | Permanent Message Header Field Registry. The following is the | |||
registration template: | registration template: | |||
Header field name: Received-SPF | Header field name: Received-SPF | |||
Applicable protocol: mail ([RFC5322]) | Applicable protocol: mail ([RFC5322]) | |||
Status: Standards Track | Status: Standards Track | |||
Author/Change controller: IETF | Author/Change controller: IETF | |||
Specification document(s): RFC XXXX | Specification document(s): RFC XXXX | |||
[NOTE TO RFC EDITOR: (this document)] | [NOTE TO RFC EDITOR: (this document)] | |||
12.3. SPF Modifier Registration | 13.3. SPF Modifier Registration | |||
[RFC6652] created a new SPF Modifier Registration. IANA is requested | [RFC6652] created a new SPF Modifier Registration. IANA is requested | |||
to change the reference for the exp and redirect modifiers from | to change the reference for the exp and redirect modifiers from | |||
[RFC4408] to this document. Their status should not be changed. | [RFC4408] to this document. Their status should not be changed. | |||
13. References | 14. References | |||
13.1. Normative References | 14.1. Normative References | |||
[RFC1035] Mockapetris, P., "Domain names - implementation and | [RFC1035] Mockapetris, P., "Domain names - implementation and | |||
specification", STD 13, RFC 1035, November 1987. | specification", STD 13, RFC 1035, November 1987. | |||
[RFC1123] Braden, R., "Requirements for Internet Hosts - Application | [RFC1123] Braden, R., "Requirements for Internet Hosts - Application | |||
and Support", STD 3, RFC 1123, October 1989. | and Support", STD 3, RFC 1123, October 1989. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
skipping to change at page 55, line 11 | skipping to change at page 53, line 11 | |||
[US-ASCII] | [US-ASCII] | |||
American National Standards Institute (formerly United | American National Standards Institute (formerly United | |||
States of America Standards Institute), "USA Code for | States of America Standards Institute), "USA Code for | |||
Information Interchange, X3.4", 1968. | Information Interchange, X3.4", 1968. | |||
ANSI X3.4-1968 has been replaced by newer versions with | ANSI X3.4-1968 has been replaced by newer versions with | |||
slight modifications, but the 1968 version remains | slight modifications, but the 1968 version remains | |||
definitive for the Internet. | definitive for the Internet. | |||
13.2. Informative References | 14.2. Informative References | |||
[DMP] Fecyk, G., "Designated Mailers Protocol". | [DMP] Fecyk, G., "Designated Mailers Protocol". | |||
Work In Progress | Work In Progress | |||
[Green] Green, D., "Domain-Authorized SMTP Mail", 2002. | [Green] Green, D., "Domain-Authorized SMTP Mail", 2002. | |||
[RFC1034] Mockapetris, P., "Domain names - concepts and facilities", | [RFC1034] Mockapetris, P., "Domain names - concepts and facilities", | |||
STD 13, RFC 1034, November 1987. | STD 13, RFC 1034, November 1987. | |||
skipping to change at page 63, line 5 | skipping to change at page 61, line 5 | |||
"-include:ip4._spf.%{d} " | "-include:ip4._spf.%{d} " | |||
"-include:ptr._spf.%{d} " | "-include:ptr._spf.%{d} " | |||
"+all" ) | "+all" ) | |||
ip4._spf.example.com. SPF "v=spf1 -ip4:192.0.2.0/24 +all" | ip4._spf.example.com. SPF "v=spf1 -ip4:192.0.2.0/24 +all" | |||
ptr._spf.example.com. SPF "v=spf1 -ptr +all" | ptr._spf.example.com. SPF "v=spf1 -ptr +all" | |||
This example shows how the "-include" mechanism can be useful, how an | This example shows how the "-include" mechanism can be useful, how an | |||
SPF record that ends in "+all" can be very restrictive, and the use | SPF record that ends in "+all" can be very restrictive, and the use | |||
of De Morgan's Law. | of De Morgan's Law. | |||
Appendix C. Change History | Appendix C. Further Testing Advice | |||
Another approach that can be helpful to publish records that include | ||||
a "tracking exists:" mechanism. By looking at the name server logs, | ||||
a rough list can then be generated. For example: | ||||
v=spf1 exists:_h.%{h}._l.%{l}._o.%{o}._i.%{i}._spf.%{d} ?all | ||||
Appendix D. Updating Mail Forwarders | ||||
There are three places that techniques can be used to ameliorate this | ||||
problem. | ||||
1. The beginning, when email is first sent (Originating ADMDs). | ||||
* "Neutral" results could be given for IP addresses that might | ||||
be forwarders, instead of "fail" results based on a list of | ||||
known reliable forwarders. For example: | ||||
"v=spf1 mx ?exists:%{ir}.whitlist.example.org -all" | ||||
This would cause a lookup on an DNS white list (DNSWL) and | ||||
cause a result of "fail" only for email not either coming from | ||||
the domain's mx host(s) (SPF pass) or white listed sources | ||||
(SPF neutral). This, in effect, outsources an element of | ||||
sender policy to the maintainer of the whitelist. | ||||
* The "MAIL FROM" identity could have additional information in | ||||
the local-part that cryptographically identifies the mail as | ||||
coming from an authorized source. In this case, such an SPF | ||||
record could be used: | ||||
"v=spf1 mx exists:%{l}._spf_verify.%{d} -all" | ||||
Then, a specialized DNS server can be set up to serve the | ||||
_spf_verify subdomain that validates the local-part. Although | ||||
this requires an extra DNS lookup, this happens only when the | ||||
email would otherwise be rejected as not coming from a known | ||||
good source. | ||||
Note that due to the 63-character limit for domain labels, | ||||
this approach only works reliably if the local-part signature | ||||
scheme is guaranteed either to only produce local-parts with a | ||||
maximum of 63 characters or to gracefully handle truncated | ||||
local-parts. | ||||
* Similarly, a specialized DNS server could be set up that will | ||||
rate-limit the email coming from unexpected IP addresses. | ||||
"v=spf1 mx exists:%{ir}._spf_rate.%{d} -all" | ||||
* SPF allows the creation of per-user policies for special | ||||
cases. For example, the following SPF record and appropriate | ||||
wildcard DNS records can be used: | ||||
"v=spf1 mx redirect=%{l1r+}._at_.%{o}._spf.%{d}" | ||||
2. The middle, when email is forwarded (Mediating ADMDs). | ||||
* Forwarding services can solve the problem by rewriting the | ||||
"MAIL FROM" to be in their own domain. This means mail | ||||
rejected from the external mailbox will have to be forwarded | ||||
back to the original sender by the forwarding service. | ||||
Various schemes to do this exist though they vary widely in | ||||
complexity and resource requirements on the part of the | ||||
forwarding service. | ||||
* Several popular MTAs can be forced from "alias" semantics to | ||||
"mailing list" semantics by configuring an additional alias | ||||
with "owner-" prepended to the original alias name (e.g., an | ||||
alias of "friends: george@example.com, fred@example.org" would | ||||
need another alias of the form "owner-friends: localowner"). | ||||
* Forwarding servers could reject mail that would "fail" SPF if | ||||
forwarded using an SMTP reply code of 551, User not local, | ||||
(see [RFC5321] section 3.4) to communicate the correct target | ||||
address to resend the mail to. | ||||
3. The end, when email is received (Receiving ADMDs). | ||||
* If the owner of the external mailbox wishes to trust the | ||||
forwarding service, he can direct the external mailbox's MTA | ||||
to skip SPF tests when the client host belongs to the | ||||
forwarding service. | ||||
* Tests against other identities, such as the "HELO" identity, | ||||
MAY be used to override a failed test against the "MAIL FROM" | ||||
identity. | ||||
* For larger domains, it might not be possible to have a | ||||
complete or accurate list of forwarding services used by the | ||||
owners of the domain's mailboxes. In such cases, whitelists | ||||
of generally-recognized forwarding services could be employed. | ||||
Appendix E. Mail Services | ||||
MSPs (Mail Service Providers - [RFC5598] Section 2.3) that offer mail | ||||
services to third-party domains, such as sending of bulk mail, might | ||||
want to adjust their configurations in light of the authorization | ||||
check described in this document. If the domain part of the "MAIL | ||||
FROM" identity used for such email uses the domain of one of the MSPs | ||||
domain, then the provider needs only to ensure that its sending host | ||||
is authorized by its own SPF record, if any. | ||||
If the "MAIL FROM" identity does not use the MSP's domain, then extra | ||||
care has to be taken. The SPF record format has several options for | ||||
the third-party domain to authorize the service provider's MTAs to | ||||
send mail on its behalf. For MSPs, such as ISPs, that have a wide | ||||
variety of customers using the same MTA, steps are required to | ||||
mitiate the risk of cross-customer forgery (see Section 11.4). | ||||
Appendix F. MTA Relays | ||||
Relays are described in [RFC5598] Section 2.2.2. The authorization | ||||
check generally precludes the use of arbitrary MTA relays between | ||||
sender and receiver of an email message. | ||||
Within an organization, MTA relays can be effectively deployed. | ||||
However, for purposes of this document, such relays are effectively | ||||
transparent. The SPF authorization check is a check between border | ||||
MTAs of different ADMDs. | ||||
For mail senders, this means that published SPF records have to | ||||
authorize any MTAs that actually send across the Internet. Usually, | ||||
these are just the border MTAs as internal MTAs simply forward mail | ||||
to these MTAs for relaying. | ||||
The receiving ADMD will generally want to perform the authorization | ||||
check at the boundary MTAs, including all secondary MXs. Internal | ||||
MTAs (including MTAs that might serve both as boundary MTAs and | ||||
internal relays from secondary MXs when they are processing the | ||||
relayed mail stream) then do not perform the authorization test. To | ||||
perform the authorization test other than at the boundary, the host | ||||
that first transferred the message to the receiving ADMD have to be | ||||
determined, which can be difficult to extract from the message header | ||||
because (a) header fields can be forged or malformed, and (b) there's | ||||
no standard way to encode that information such that it can be | ||||
reliably extracted. Testing other than at the boundary is likely to | ||||
produce unreliable results. | ||||
Appendix G. Local Policy Considerations | ||||
SPF results can be used in combination with other methods to | ||||
determine the final local disposition (either positive or negative of | ||||
a message. It can also be considered dispositive on its own. | ||||
G.1. Policy For SPF Pass | ||||
SPF pass results can be used in combination with "white lists" of | ||||
known "good" domains to bypass some or all additional pre-delivery | ||||
email checks. Exactly which checks and how to determine appropriate | ||||
white list entries has to be based on local conditions and | ||||
requirements. | ||||
G.2. Policy For SPF Fail | ||||
SPF fail results can be used to reject messages during the SMTP | ||||
transaction based on either "MAIL FROM" or "HELO" identity results. | ||||
This reduces resource requirements for various content filtering | ||||
methods and conserves bandwidth since rejection can be done before | ||||
the SMTP content is transferred. It also gives immediate feedback to | ||||
the sender who might then be able to resolve the issue. Due to some | ||||
of the issues described above in this section (Section 10), SPF based | ||||
rejection does present some risk of rejecting legitimate email when | ||||
rejecting based on "MAIL FROM" results. | ||||
SPF fail results can alternately be used as one input into a larger | ||||
set of evaluations which might, based on a combination with other | ||||
evaluation techniques, result in the email being marked negatively in | ||||
some way (this might be via delivery to a special spam folder, | ||||
modifying subject lines, or other locally determined means). | ||||
Developing the details of such an approach have to be based on local | ||||
conditions and requirements. Using SPF results in this way does not | ||||
have the advantages of resource conservation and immediate feedback | ||||
to the sender associated with SMTP rejection, but could produce fewer | ||||
undesirable rejections in a well designed system. Such an approach | ||||
might result in email that was not authorized by the sending ADMD | ||||
being unknowingly delivered to end users. | ||||
Either general approach can be used as they both leave a clear | ||||
disposition of emails. They are either delivered in some manner or | ||||
the sender is notified of the failure. Other dispositions such as | ||||
"dropping" or deleting email after acceptance are inappropriate | ||||
because they leave uncertainty and reduce the overall reliabilility | ||||
and utility of email across the Internet. | ||||
G.3. Policy For SPF Permerror | ||||
The "permerror" result (see Section 2.6.7) indicates the SPF | ||||
processing module at the receiver determined that the retrieved SPF | ||||
policy record could not be interpreted. This gives no true | ||||
indication about the authorized use of the data found in the | ||||
envelope. | ||||
As with all results, implementers have a choice to make regarding | ||||
what to do with a message that yields this result. SMTP allows only | ||||
a few basic options. | ||||
Rejection of the message is an option, in that it is the one thing a | ||||
receiver can do to draw attention to the difficulty encountered while | ||||
protecting itself from messages that do not have a definite SPF | ||||
result of some kind. However, if the SPF implementation is defective | ||||
and returns spurious "permerror" results, only the sender is actively | ||||
notified of the defect (in the form of rejected mail), and not the | ||||
receiver making use of SPF. | ||||
The less intrusive handling choice is to deliver the message, perhaps | ||||
with some kind of annotation of the difficulty encountered and/or | ||||
logging of a similar nature. However, this will not be desirable to | ||||
operators that wish to implement SPF checking as strictly as | ||||
possible, nor is this sort of passive problem reporting typically | ||||
effective. | ||||
There is of course the option placing this choice in the hands of the | ||||
operator rather than the implementer since this kind of choice is | ||||
often a matter of local policy rather than a condition with a | ||||
universal solution, but this adds one more piece of complexity to an | ||||
already non-trivial environment. | ||||
Both implementers and operators need to be cautious of all choices | ||||
and outcomes when handling SPF results. | ||||
Appendix H. Protocol Status | ||||
SPF has been in development since the summer of 2003 and has seen | ||||
deployment beyond the developers beginning in December 2003. The | ||||
design of SPF slowly evolved until the spring of 2004 and has since | ||||
stabilized. There have been quite a number of forms of SPF, some | ||||
written up as documents, some submitted as Internet Drafts, and many | ||||
discussed and debated in development forums. The protocol was | ||||
originally defined in [RFC4408], which this document replaces. | ||||
[RFC4408] was designed to clearly document the protocol defined by | ||||
earlier draft specifications of SPF as used in existing | ||||
implementations. This updated specification is intended to clarify | ||||
identified ambiguities in [RFC4408], resolve techincal issues | ||||
identified in post-RFC 4408 deplyment experience, and document widely | ||||
deployed extensions to SPF that have been developed since [RFC4408] | ||||
was published. | ||||
Appendix I. Experimental History | ||||
This document updates and replaces RFC 4408 that was part of a group | ||||
of simultaneously published Experimental RFCs (RFC 4405, RFC 4406, | ||||
RFC 4407, and RFC 4408) in 2006. At that time the IESG requested the | ||||
community observe the success or failure of the two approaches | ||||
documented in these RFCs during the two years following publication, | ||||
in order that a community consensus could be reached in the future. | ||||
SPF is widely deployed by large and small email providers alike. | ||||
There are multiple, interoperable implementations. | ||||
For SPF (as documented in RFC 4408) a careful effort was made to | ||||
collect and document lessons learned and errata during the two year | ||||
period. The errata list has been stable (no new submissions) and | ||||
only minor protocol lessons learned were identified. Resolution of | ||||
the IESG's experiment is documented in [RFC6686]. | ||||
Appendix J. Change History | ||||
Changes since RFC 4408 (to be removed prior to publication) | Changes since RFC 4408 (to be removed prior to publication) | |||
Moved to standards track | Moved to standards track | |||
Authors updated | Authors updated | |||
IESG Note regarding experimental use replaced with discussion of | IESG Note regarding experimental use replaced with discussion of | |||
results | results | |||
End of changes. 82 change blocks. | ||||
631 lines changed or deleted | 767 lines changed or added | |||
This html diff was produced by rfcdiff 1.33. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |