draft-ietf-uta-mta-sts-17.txt | draft-ietf-uta-mta-sts-18.txt | |||
---|---|---|---|---|
Using TLS in Applications D. Margolis | Using TLS in Applications D. Margolis | |||
Internet-Draft M. Risher | Internet-Draft M. Risher | |||
Intended status: Standards Track Google, Inc | Intended status: Standards Track Google, Inc | |||
Expires: November 4, 2018 B. Ramakrishnan | Expires: November 21, 2018 B. Ramakrishnan | |||
Yahoo!, Inc | Yahoo!, Inc | |||
A. Brotman | A. Brotman | |||
Comcast, Inc | Comcast, Inc | |||
J. Jones | J. Jones | |||
Microsoft, Inc | Microsoft, Inc | |||
May 3, 2018 | May 20, 2018 | |||
SMTP MTA Strict Transport Security (MTA-STS) | SMTP MTA Strict Transport Security (MTA-STS) | |||
draft-ietf-uta-mta-sts-17 | draft-ietf-uta-mta-sts-18 | |||
Abstract | Abstract | |||
SMTP Mail Transfer Agent Strict Transport Security (MTA-STS) is a | SMTP Mail Transfer Agent Strict Transport Security (MTA-STS) is a | |||
mechanism enabling mail service providers to declare their ability to | mechanism enabling mail service providers to declare their ability to | |||
receive Transport Layer Security (TLS) secure SMTP connections, and | receive Transport Layer Security (TLS) secure SMTP connections, and | |||
to specify whether sending SMTP servers should refuse to deliver to | to specify whether sending SMTP servers should refuse to deliver to | |||
MX hosts that do not offer TLS with a trusted server certificate. | MX hosts that do not offer TLS with a trusted server certificate. | |||
Status of This Memo | Status of This Memo | |||
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 November 3, 2018. | This Internet-Draft will expire on November 21, 2018. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2018 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 | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. Related Technologies . . . . . . . . . . . . . . . . . . . . 3 | 2. Related Technologies . . . . . . . . . . . . . . . . . . . . 4 | |||
3. Policy Discovery . . . . . . . . . . . . . . . . . . . . . . 4 | 3. Policy Discovery . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3.1. MTA-STS TXT Records . . . . . . . . . . . . . . . . . . . 4 | 3.1. MTA-STS TXT Records . . . . . . . . . . . . . . . . . . . 4 | |||
3.2. MTA-STS Policies . . . . . . . . . . . . . . . . . . . . 5 | 3.2. MTA-STS Policies . . . . . . . . . . . . . . . . . . . . 6 | |||
3.3. HTTPS Policy Fetching . . . . . . . . . . . . . . . . . . 8 | 3.3. HTTPS Policy Fetching . . . . . . . . . . . . . . . . . . 9 | |||
3.4. Policy Selection for Smart Hosts and Subdomains . . . . . 9 | 3.4. Policy Selection for Smart Hosts and Subdomains . . . . . 10 | |||
4. Policy Validation . . . . . . . . . . . . . . . . . . . . . . 10 | 4. Policy Validation . . . . . . . . . . . . . . . . . . . . . . 10 | |||
4.1. MX Certificate Validation . . . . . . . . . . . . . . . . 10 | 4.1. MX Host Validation . . . . . . . . . . . . . . . . . . . 11 | |||
4.2. Recipient MTA Certificate Validation . . . . . . . . . . 11 | ||||
5. Policy Application . . . . . . . . . . . . . . . . . . . . . 11 | 5. Policy Application . . . . . . . . . . . . . . . . . . . . . 11 | |||
5.1. Policy Application Control Flow . . . . . . . . . . . . . 11 | 5.1. Policy Application Control Flow . . . . . . . . . . . . . 12 | |||
6. Reporting Failures . . . . . . . . . . . . . . . . . . . . . 12 | 6. Reporting Failures . . . . . . . . . . . . . . . . . . . . . 12 | |||
7. Interoperability Considerations . . . . . . . . . . . . . . . 12 | 7. Interoperability Considerations . . . . . . . . . . . . . . . 13 | |||
7.1. SNI Support . . . . . . . . . . . . . . . . . . . . . . . 12 | 7.1. SNI Support . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
7.2. Minimum TLS Version Support . . . . . . . . . . . . . . . 13 | 7.2. Minimum TLS Version Support . . . . . . . . . . . . . . . 13 | |||
8. Operational Considerations . . . . . . . . . . . . . . . . . 13 | 8. Operational Considerations . . . . . . . . . . . . . . . . . 13 | |||
8.1. Policy Updates . . . . . . . . . . . . . . . . . . . . . 13 | 8.1. Policy Updates . . . . . . . . . . . . . . . . . . . . . 13 | |||
8.2. Policy Delegation . . . . . . . . . . . . . . . . . . . . 13 | 8.2. Policy Delegation . . . . . . . . . . . . . . . . . . . . 14 | |||
8.3. Removing MTA-STS . . . . . . . . . . . . . . . . . . . . 14 | 8.3. Removing MTA-STS . . . . . . . . . . . . . . . . . . . . 15 | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 15 | 8.4. Preserving MX Candidate Traversal . . . . . . . . . . . . 15 | |||
9.1. Well-Known URIs Registry . . . . . . . . . . . . . . . . 15 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 16 | |||
9.2. MTA-STS TXT Record Fields . . . . . . . . . . . . . . . . 15 | 9.1. Well-Known URIs Registry . . . . . . . . . . . . . . . . 16 | |||
9.3. MTA-STS Policy Fields . . . . . . . . . . . . . . . . . . 15 | 9.2. MTA-STS TXT Record Fields . . . . . . . . . . . . . . . . 16 | |||
10. Security Considerations . . . . . . . . . . . . . . . . . . . 16 | 9.3. MTA-STS Policy Fields . . . . . . . . . . . . . . . . . . 16 | |||
10.1. Obtaining a Signed Certificate . . . . . . . . . . . . . 16 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 17 | |||
10.2. Preventing Policy Discovery . . . . . . . . . . . . . . 16 | 10.1. Obtaining a Signed Certificate . . . . . . . . . . . . . 17 | |||
10.3. Denial of Service . . . . . . . . . . . . . . . . . . . 17 | 10.2. Preventing Policy Discovery . . . . . . . . . . . . . . 18 | |||
10.4. Weak Policy Constraints . . . . . . . . . . . . . . . . 18 | 10.3. Denial of Service . . . . . . . . . . . . . . . . . . . 18 | |||
10.5. Compromise of the Web PKI System . . . . . . . . . . . . 18 | 10.4. Weak Policy Constraints . . . . . . . . . . . . . . . . 19 | |||
11. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 19 | 10.5. Compromise of the Web PKI System . . . . . . . . . . . . 19 | |||
12. References . . . . . . . . . . . . . . . . . . . . . . . . . 19 | 11. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
12.1. Normative References . . . . . . . . . . . . . . . . . . 19 | 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
12.2. Informative References . . . . . . . . . . . . . . . . . 20 | 12.1. Normative References . . . . . . . . . . . . . . . . . . 20 | |||
Appendix A. MTA-STS example record & policy . . . . . . . . . . 21 | 12.2. Informative References . . . . . . . . . . . . . . . . . 22 | |||
Appendix B. Message delivery pseudocode . . . . . . . . . . . . 22 | Appendix A. MTA-STS example record & policy . . . . . . . . . . 23 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 24 | Appendix B. Message delivery pseudocode . . . . . . . . . . . . 23 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
1. Introduction | 1. Introduction | |||
The STARTTLS extension to SMTP [RFC3207] allows SMTP clients and | The STARTTLS extension to SMTP [RFC3207] allows SMTP clients and | |||
hosts to negotiate the use of a TLS channel for encrypted mail | hosts to negotiate the use of a TLS channel for encrypted mail | |||
transmission. | transmission. | |||
While this opportunistic encryption protocol by itself provides a | While this opportunistic encryption protocol by itself provides a | |||
high barrier against passive man-in-the-middle traffic interception, | high barrier against passive man-in-the-middle traffic interception, | |||
any attacker who can delete parts of the SMTP session (such as the | any attacker who can delete parts of the SMTP session (such as the | |||
"250 STARTTLS" response) or who can redirect the entire SMTP session | "250 STARTTLS" response) or who can redirect the entire SMTP session | |||
(perhaps by overwriting the resolved MX record of the delivery | (perhaps by overwriting the resolved MX record of the delivery | |||
domain) can perform downgrade or interception attacks. | domain) can perform downgrade or interception attacks. | |||
This document defines a mechanism for recipient domains to publish | This document defines a mechanism for recipient domains to publish | |||
policies specifying: | policies, via a combination of DNS and HTTPS, specifying: | |||
o whether MTAs sending mail to this domain can expect PKIX- | o whether MTAs sending mail to this domain can expect PKIX- | |||
authenticated TLS support | authenticated TLS support | |||
o what a conforming client should do with messages when TLS cannot | o what a conforming client should do with messages when TLS cannot | |||
be successfully negotiated | be successfully negotiated | |||
1.1. Terminology | 1.1. Terminology | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
skipping to change at page 3, line 46 ¶ | skipping to change at page 3, line 46 ¶ | |||
o MTA-STS Policy: A commitment by the Policy Domain to support PKIX | o MTA-STS Policy: A commitment by the Policy Domain to support PKIX | |||
[RFC5280] authenticated TLS for the specified MX hosts. | [RFC5280] authenticated TLS for the specified MX hosts. | |||
o Policy Domain: The domain for which an MTA-STS Policy is defined. | o Policy Domain: The domain for which an MTA-STS Policy is defined. | |||
This is the next-hop domain; when sending mail to | This is the next-hop domain; when sending mail to | |||
"alice@example.com" this would ordinarily be "example.com", but | "alice@example.com" this would ordinarily be "example.com", but | |||
this may be overridden by explicit routing rules (as described in | this may be overridden by explicit routing rules (as described in | |||
Section 3.4, "Policy Selection for Smart Hosts and Subdomains"). | Section 3.4, "Policy Selection for Smart Hosts and Subdomains"). | |||
o Policy Host: The HTTPS host which serves the MTA-STS Policy for a | ||||
Policy Domain. Rules for constructing the hostname are described | ||||
in Section 3.2, "MTA-STS Policies". | ||||
o Sender: The SMTP Mail Transfer Agent sending an email message. | ||||
2. Related Technologies | 2. Related Technologies | |||
The DANE TLSA record [RFC7672] is similar, in that DANE is also | The DANE TLSA record [RFC7672] is similar, in that DANE is also | |||
designed to upgrade unauthenticated encryption or plaintext | designed to upgrade unauthenticated encryption or plaintext | |||
transmission into authenticated, downgrade-resistant encrypted | transmission into authenticated, downgrade-resistant encrypted | |||
transmission. DANE requires DNSSEC [RFC4033] for authentication; the | transmission. DANE requires DNSSEC [RFC4033] for authentication; the | |||
mechanism described here instead relies on certificate authorities | mechanism described here instead relies on certificate authorities | |||
(CAs) and does not require DNSSEC, at a cost of risking malicious | (CAs) and does not require DNSSEC, at a cost of risking malicious | |||
downgrades. For a thorough discussion of this trade-off, see | downgrades. For a thorough discussion of this trade-off, see | |||
Section 10, "Security Considerations". | Section 10, "Security Considerations". | |||
skipping to change at page 5, line 35 ¶ | skipping to change at page 5, line 41 ¶ | |||
sts-ext-name = (ALPHA / DIGIT) | sts-ext-name = (ALPHA / DIGIT) | |||
*31(ALPHA / DIGIT / "_" / "-" / ".") | *31(ALPHA / DIGIT / "_" / "-" / ".") | |||
sts-ext-value = 1*(%x21-3A / %x3C / %x3E-7E) | sts-ext-value = 1*(%x21-3A / %x3C / %x3E-7E) | |||
; chars excluding "=", ";", and control chars | ; chars excluding "=", ";", and control chars | |||
The TXT record MUST begin with sts-version field, and the order of | The TXT record MUST begin with sts-version field, and the order of | |||
other fields is not significant. If multiple TXT records for "_mta- | other fields is not significant. If multiple TXT records for "_mta- | |||
sts" are returned by the resolver, records which do not begin with | sts" are returned by the resolver, records which do not begin with | |||
"v=STSv1;" are discarded. If the number of resulting records is not | "v=STSv1;" are discarded. If the number of resulting records is not | |||
one, senders MUST assume the recipient domain does not implement MTA- | one, senders MUST assume the recipient domain does not have an | |||
STS and skip the remaining steps of policy discovery. If the | available MTA-STS policy and skip the remaining steps of policy | |||
resulting TXT record contains multiple strings, then the record MUST | discovery. (Note that lack of an available policy does not signal | |||
be treated as if those strings are concatenated together without | opting out of MTA-STS altogether if the sender has a previously | |||
adding spaces. | cached policy for the recipient domain, as discussed in Section 5.1, | |||
"Policy Application Control Flow".) If the resulting TXT record | ||||
contains multiple strings, then the record MUST be treated as if | ||||
those strings are concatenated together without adding spaces. | ||||
3.2. MTA-STS Policies | 3.2. MTA-STS Policies | |||
The policy itself is a set of key/value pairs (similar to [RFC5322] | The policy itself is a set of key/value pairs (similar to [RFC5322] | |||
header fields) served via the HTTPS GET method from the fixed | header fields) served via the HTTPS GET method from the fixed | |||
[RFC5785] "well-known" path of ".well-known/mta-sts.txt" served by | [RFC5785] "well-known" path of ".well-known/mta-sts.txt" served by | |||
the "mta-sts" host at the Policy Domain. Thus for "example.com" the | the Policy Host. The Policy Host DNS name is constructed by | |||
path is "https://mta-sts.example.com/.well-known/mta-sts.txt". | prepending "mta-sts" to the Policy Domain. | |||
Thus for a Policy Domain of "example.com" the path is "https://mta- | ||||
sts.example.com/.well-known/mta-sts.txt". | ||||
When fetching a policy, senders SHOULD validate that the media type | When fetching a policy, senders SHOULD validate that the media type | |||
is "text/plain" to guard against cases where webservers allow | is "text/plain" to guard against cases where webservers allow | |||
untrusted users to host non-text content (typically, HTML or images) | untrusted users to host non-text content (typically, HTML or images) | |||
at a user-defined path. All parameters other charset=utf-8 or | at a user-defined path. All parameters other than charset=utf-8 or | |||
charset=us-ascii are ignored. Additional "Content-Type" parameters | charset=us-ascii are ignored. Additional "Content-Type" parameters | |||
are also ignored. | are also ignored. | |||
This resource contains the following CRLF-separated key/value pairs: | This resource contains the following CRLF-separated key/value pairs: | |||
o "version": (plain-text). Currently only "STSv1" is supported. | o "version": Currently only "STSv1" is supported. | |||
o "mode": (plain-text). One of "enforce", "testing", or "none", | o "mode": One of "enforce", "testing", or "none", indicating the | |||
indicating the expected behavior of a sending MTA in the case of a | expected behavior of a sending MTA in the case of a policy | |||
policy validation failure. See Section 5, "Policy Application." | validation failure. See Section 5, "Policy Application." for more | |||
for more details about the three modes. | details about the three modes. | |||
o "max_age": Max lifetime of the policy (plain-text non-negative | o "max_age": Max lifetime of the policy (plain-text non-negative | |||
integer seconds, maximum value of 31557600). Well-behaved clients | integer seconds, maximum value of 31557600). Well-behaved clients | |||
SHOULD cache a policy for up to this value from last policy fetch | SHOULD cache a policy for up to this value from last policy fetch | |||
time. To mitigate the risks of attacks at policy refresh time, it | time. To mitigate the risks of attacks at policy refresh time, it | |||
is expected that this value typically be in the range of weeks or | is expected that this value typically be in the range of weeks or | |||
greater. | greater. | |||
o "mx": MX identity patterns (list of plain-text strings). One or | o "mx": Allowed MX patterns. One or more patterns matching allowed | |||
more patterns matching a Common Name or Subject Alternative Name | MX hosts for the Policy Domain. As an example, | |||
([RFC5280]) DNS-ID ([RFC6125]) present in the X.509 certificate | ||||
presented by any MX receiving mail for this domain. For example: | ||||
mx: mail.example.com <CRLF> | mx: mail.example.com <CRLF> | |||
mx: .example.net | mx: *.example.net | |||
indicates that mail for this domain might be handled by any MX with a | indicates that mail for this domain might be handled by MX | |||
certificate valid for a host at "mail.example.com" or "example.net". | "mail.example.com" or any MX at "example.net". Valid patterns can be | |||
Valid patterns can be either fully specified names ("example.com") or | either fully specified names ("example.com") or suffixes prefixed by | |||
suffixes (".example.net") matching the right-hand parts of a server's | a wildcard ("*.example.net"). If a policy specifies more than one | |||
identity; the latter case are distinguished by a leading period. If | MX, each MX MUST have its own "mx:" key, and each MX key/value pair | |||
there are more than one MX specified by the policy, they MUST be on | MUST be on its own line in the policy file. In the case of | |||
separate lines within the policy file. In the case of | Internationalized Domain Names ([RFC5891]), the "mx" value MUST | |||
Internationalized Domain Names ([RFC5891]), the MX MUST specify the | specify the Punycode-encoded A-label [RFC3492] to match against, and | |||
Punycode-encoded A-label [RFC3492] and not the Unicode-encoded | not the Unicode-encoded U-label. The full semantics of certificate | |||
U-label. The full semantics of certificate validation are described | validation (including the use of wildcard patterns) are described in | |||
in Section 4.1, "MX Certificate Validation." | Section 4.1, "MX Host Validation." | |||
An example policy is as below: | An example policy is as below: | |||
version: STSv1 | version: STSv1 | |||
mode: enforce | mode: enforce | |||
mx: mail.example.com | mx: mail.example.com | |||
mx: .example.net | mx: *.example.net | |||
mx: backupmx.example.com | mx: backupmx.example.com | |||
max_age: 123456 | max_age: 604800 | |||
The formal definition of the policy resource, defined using | The formal definition of the policy resource, defined using | |||
[RFC7405], is as follows: | [RFC7405], is as follows: | |||
sts-policy-record = sts-policy-field *WSP | sts-policy-record = sts-policy-field *WSP | |||
*(sts-policy-term sts-policy-field *WSP) | *(CRLF sts-policy-field *WSP) | |||
[sts-policy-term] | [CRLF] | |||
sts-policy-field = sts-policy-version / ; required once | sts-policy-field = sts-policy-version / ; required once | |||
sts-policy-mode / ; required once | sts-policy-mode / ; required once | |||
sts-policy-max-age / ; required once | sts-policy-max-age / ; required once | |||
sts-policy-mx / | 0*(sts-policy-mx *WSP CRLF) / | |||
; required at least once, except when | ; required at least once, except when | |||
; mode is "none" | ; mode is "none" | |||
sts-policy-extension ; other fields | sts-policy-extension ; other fields | |||
field-delim = ":" *WSP | field-delim = ":" *WSP | |||
sts-policy-version = sts-policy-version-field field-delim | sts-policy-version = sts-policy-version-field field-delim | |||
sts-policy-version-value | sts-policy-version-value | |||
sts-policy-version-field = %s"version" | sts-policy-version-field = %s"version" | |||
sts-policy-version-value = %s"STSv1" | sts-policy-version-value = %s"STSv1" | |||
sts-policy-mode = sts-policy-mode-field field-delim | sts-policy-mode = sts-policy-mode-field field-delim | |||
sts-policy-mode-value | sts-policy-mode-value | |||
sts-policy-mode-field = %s"mode" | sts-policy-mode-field = %s"mode" | |||
sts-policy-mode-value = %s"testing" / %s"enforce" / %s"none" | sts-policy-mode-value = %s"testing" / %s"enforce" / %s"none" | |||
sts-policy-mx = sts-policy-mx-field field-delim | sts-policy-mx = sts-policy-mx-field field-delim | |||
sts-policy-mx-value | sts-policy-mx-value | |||
sts-policy-mx-field = %s"mx" | sts-policy-mx-field = %s"mx" | |||
sts-policy-mx-value = 1*(ALPHA / DIGIT / "_" / "-" / ".") | sts-policy-mx-value = ["*."] *(sts-policy-mx-label ".") | |||
sts-policy-mx-toplabel | ||||
sts-policy-max-age = sts-policy-max-age-field field-delim | sts-policy-mx-label = sts-policy-alphanum | | |||
sts-policy-max-age-value | sts-policy-alphanum *(sts-policy-alphanum | "-") | |||
sts-policy-alphanum | ||||
sts-policy-max-age-field = %s"max_age" | sts-policy-mx-toplabel = ALPHA | ALPHA *(sts-policy-alphanum | "-") | |||
sts-policy-alphanum | ||||
sts-policy-max-age-value = 1*10(DIGIT) | sts-policy-max-age = sts-policy-max-age-field field-delim | |||
sts-policy-max-age-value | ||||
sts-policy-extension = sts-policy-ext-name ; additional | sts-policy-max-age-field = %s"max_age" | |||
field-delim ; extension | ||||
sts-policy-ext-value ; fields | ||||
sts-policy-ext-name = (ALPHA / DIGIT) | sts-policy-max-age-value = 1*10(DIGIT) | |||
*31(ALPHA / DIGIT / "_" / "-" / ".") | ||||
sts-policy-term = CRLF / LF | sts-policy-extension = sts-policy-ext-name ; additional | |||
field-delim ; extension | ||||
sts-policy-ext-value ; fields | ||||
sts-policy-ext-value = sts-policy-vchar | sts-policy-ext-name = (sts-policy-alphanum) | |||
[*(%x20 / sts-policy-vchar) | *31(sta-policy-alphanum / "_" / "-" / ".") | |||
sts-policy-vchar] | ||||
; chars, including UTF-8 [RFC3629], | ||||
; excluding CTLs and no | ||||
; leading/trailing spaces | ||||
sts-policy-vchar = %x21-7E / UTF8-2 / UTF8-3 / UTF8-4 | sts-policy-term = CRLF / LF | |||
sts-policy-ext-value = sts-policy-vchar | ||||
[*(%x20 / sts-policy-vchar) | ||||
sts-policy-vchar] | ||||
; chars, including UTF-8 [@?RFC3629], | ||||
; excluding CTLs and no | ||||
; leading/trailing spaces | ||||
sts-policy-alphanum = ALPHA | DIGIT | ||||
sts-policy-vchar = %x21-7E / UTF8-2 / UTF8-3 / UTF8-4 | ||||
Parsers MUST accept TXT records and policy files which are | Parsers MUST accept TXT records and policy files which are | |||
syntactically valid (i.e. valid key/value pairs separated by semi- | syntactically valid (i.e., valid key/value pairs separated by semi- | |||
colons for TXT records) and but containing additional key/value pairs | colons for TXT records) and but containing additional key/value pairs | |||
not specified in this document, in which case unknown fields SHALL be | not specified in this document, in which case unknown fields SHALL be | |||
ignored. If any non-repeated field--i.e. all fields excepting "mx"-- | ignored. If any non-repeated field--i.e., all fields excepting "mx" | |||
is duplicated, all entries except for the first SHALL be ignored. If | --is duplicated, all entries except for the first SHALL be ignored. | |||
any field is not specified, the policy SHALL be treated as invalid. | If any field is not specified, the policy SHALL be treated as | |||
invalid. | ||||
3.3. HTTPS Policy Fetching | 3.3. HTTPS Policy Fetching | |||
When fetching a new policy or updating a policy, the HTTPS endpoint | Policy bodies are, as described above, retrieved by sending MTAs via | |||
HTTPS [RFC2818]. During the TLS handshake initiated to fetch a new | ||||
or updated policy from the Policy Host, the Policy Host HTTPS server | ||||
MUST present a X.509 certificate which is valid for the "mta-sts" | MUST present a X.509 certificate which is valid for the "mta-sts" | |||
host (e.g. "mta-sts.example.com") as described below, chain to a | DNS-ID ([RFC6125]) (e.g., "mta-sts.example.com") as described below, | |||
root CA that is trusted by the sending MTA, and be non-expired. It | chain to a root CA that is trusted by the sending MTA, and be non- | |||
is expected that sending MTAs use a set of trusted CAs similar to | expired. It is expected that sending MTAs use a set of trusted CAs | |||
those in widely deployed Web browsers and operating systems. See | similar to those in widely deployed Web browsers and operating | |||
[RFC5280] for more details about certificate verification. | systems. See [RFC5280] for more details about certificate | |||
verification. | ||||
The certificate is valid for the "mta-sts" host with respect to the | The certificate is valid for the Policy Host (i.e., "mta-sts" | |||
rules described in [RFC6125], with the following application-specific | prepended to the Policy Domain) with respect to the rules described | |||
considerations: | in [RFC6125], with the following application-specific considerations: | |||
o Matching is performed only against the DNS-ID identifiers. | o Matching is performed only against the DNS-ID identifiers. | |||
o DNS domain names in server certificates MAY contain the wildcard | o DNS domain names in server certificates MAY contain the wildcard | |||
character '*' as the complete left-most label within the | character '*' as the complete left-most label within the | |||
identifier. | identifier. | |||
The certificate MAY be checked for revocation via the Online | The certificate MAY be checked for revocation via the Online | |||
Certificate Status Protocol (OCSP) [RFC6960], certificate revocation | Certificate Status Protocol (OCSP) [RFC6960], certificate revocation | |||
lists (CRLs), or some other mechanism. | lists (CRLs), or some other mechanism. | |||
Policies fetched via HTTPS are only valid if the HTTP response code | Policies fetched via HTTPS are only valid if the HTTP response code | |||
is 200 (OK). HTTP 3xx redirects MUST NOT be followed, and HTTP | is 200 (OK). HTTP 3xx redirects MUST NOT be followed, and HTTP | |||
caching (as specified in [RFC7234]) MUST NOT be used. | caching (as specified in [RFC7234]) MUST NOT be used. | |||
Senders may wish to rate-limit the frequency of attempts to fetch the | Senders may wish to rate-limit the frequency of attempts to fetch the | |||
HTTPS endpoint even if a valid TXT record for the recipient domain | HTTPS endpoint even if a valid TXT record for the recipient domain | |||
exists. In the case that the HTTPS GET fails, we suggest | exists. In the case that the HTTPS GET fails, we implementions | |||
implementions may limit further attempts to a period of five minutes | SHOULD limit further attempts to a period of five minutes or longer | |||
or longer per version ID, to avoid overwhelming resource-constrained | per version ID, to avoid overwhelming resource-constrained recipients | |||
recipients with cascading failures. | with cascading failures. | |||
Senders MAY impose a timeout on the HTTPS GET and/or a limit on the | Senders MAY impose a timeout on the HTTPS GET and/or a limit on the | |||
maximum size of the response body to avoid long delays or resource | maximum size of the response body to avoid long delays or resource | |||
exhaustion during attempted policy updates. A suggested timeout is | exhaustion during attempted policy updates. A suggested timeout is | |||
one minute, and a suggested maximum policy size 64 kilobytes; policy | one minute, and a suggested maximum policy size 64 kilobytes; policy | |||
hosts SHOULD respond to requests with a complete policy body within | hosts SHOULD respond to requests with a complete policy body within | |||
that timeout and size limit. | that timeout and size limit. | |||
If a valid TXT record is found but no policy can be fetched via HTTPS | If a valid TXT record is found but no policy can be fetched via HTTPS | |||
(for any reason), and there is no valid (non-expired) previously- | (for any reason), and there is no valid (non-expired) previously- | |||
skipping to change at page 10, line 9 ¶ | skipping to change at page 10, line 36 ¶ | |||
When sending mail to a mailbox at a subdomain, compliant senders MUST | When sending mail to a mailbox at a subdomain, compliant senders MUST | |||
NOT attempt to fetch a policy from the parent zone. Thus for mail | NOT attempt to fetch a policy from the parent zone. Thus for mail | |||
sent to "user@mail.example.com", the policy can be fetched only from | sent to "user@mail.example.com", the policy can be fetched only from | |||
"mail.example.com", not "example.com". | "mail.example.com", not "example.com". | |||
4. Policy Validation | 4. Policy Validation | |||
When sending to an MX at a domain for which the sender has a valid | When sending to an MX at a domain for which the sender has a valid | |||
and non-expired MTA-STS policy, a sending MTA honoring MTA-STS MUST | and non-expired MTA-STS policy, a sending MTA honoring MTA-STS MUST | |||
validate: | check whether: | |||
1. That the recipient MX supports STARTTLS and offers a valid PKIX- | ||||
based TLS certificate. | ||||
2. That at least one of the policy's "mx" patterns matches at least | ||||
one of the identities presented in the MX's X.509 certificate, as | ||||
described in "MX Certificate Validation". | ||||
This section does not dictate the behavior of sending MTAs when | 1. At least one of the policy's "mx" patterns matches the selected | |||
policies fail to validate; see Section 5, "Policy Application" for a | MX host, as described in Section 4.1, "MX Host Validation". | |||
description of sending MTA behavior when policy validation fails. | ||||
4.1. MX Certificate Validation | 2. The recipient mail server supports STARTTLS and offers a PKIX- | |||
based TLS certificate, during TLS handshake, which is valid for | ||||
that host, as described in Section 4.2, "Recipient MTA | ||||
Certificate Validation". | ||||
The certificate presented by the receiving MX MUST chain to a root CA | When these conditions are not met, a policy is said to fail to | |||
that is trusted by the sending MTA and be non-expired. The | validate. This section does not dictate the behavior of sending MTAs | |||
certificate MUST have a subject alternative name (SAN, [RFC5280]) | when the above conditions are not met; see Section 5, "Policy | |||
with a DNS-ID ([RFC6125]) matching the "mx" pattern. The MX's | Application" for a description of sending MTA behavior when policy | |||
certificate MAY also be checked for revocation via OCSP [RFC6960], | validation fails. | |||
CRLs [RFC6818], or some other mechanism. | ||||
Because the "mx" patterns are not hostnames, however, matching is not | 4.1. MX Host Validation | |||
identical to other common cases of X.509 certificate authentication | ||||
(as described, for example, in [RFC6125]). Consider the example | ||||
policy given above, with an "mx" pattern containing ".example.com". | ||||
In this case, if the MX server's X.509 certificate contains a SAN | ||||
matching "*.example.com", we are required to implement "wildcard-to- | ||||
wildcard" matching. | ||||
To simplify this case, we impose the following constraints on | A receiving candidate MX host is valid according to an applied MTA- | |||
wildcard certificates, identical to those in [RFC7672] section 3.2.3 | STS policy if the MX record name matches one or more of the "mx" | |||
and [RFC6125] section 6.4.3: wildcards are valid in DNS-IDs, but must | fields in the applied policy. Matching is identical to the rules | |||
be the entire first label of the identifier (that is, | given in [RFC6125], with restriction that the wildcard character "*" | |||
"*.example.com", not "mail*.example.com"). Senders who are comparing | may only be used to match the entire left-most label in the presented | |||
a "suffix" MX pattern with a wildcard identifier should thus strip | identifier. Thus the mx pattern "*.example.com" matches | |||
the wildcard and ensure that the two sides match label-by-label, | "mail.example.com" but not "example.com" or "foo.bar.example.com". | |||
until all labels of the shorter side (if unequal length) are | ||||
consumed. | ||||
Note that a wildcard must match a label; an "mx" pattern of | 4.2. Recipient MTA Certificate Validation | |||
".example.com" thus does not match a SAN of "example.com", nor does a | ||||
SAN of "*.example.com" match an "mx" of "example.com". | ||||
A simple pseudocode implementation of this algorithm is presented in | The certificate presented by the receiving MTA MUST chain to a root | |||
Appendix B. | CA that is trusted by the sending MTA and be non-expired. The | |||
certificate MUST have a subject alternative name (SAN, [RFC5280]) | ||||
with a DNS-ID ([RFC6125]) matching the host name, per the rules given | ||||
in [RFC6125]. The MX's certificate MAY also be checked for | ||||
revocation via OCSP [RFC6960], CRLs [RFC6818], or some other | ||||
mechanism. | ||||
5. Policy Application | 5. Policy Application | |||
When sending to an MX at a domain for which the sender has a valid, | When sending to an MX at a domain for which the sender has a valid, | |||
non-expired MTA-STS policy, a sending MTA honoring MTA-STS applies | non-expired MTA-STS policy, a sending MTA honoring MTA-STS applies | |||
the result of a policy validation failure one of two ways, depending | the result of a policy validation failure one of two ways, depending | |||
on the value of the policy "mode" field: | on the value of the policy "mode" field: | |||
1. "enforce": In this mode, sending MTAs MUST NOT deliver the | 1. "enforce": In this mode, sending MTAs MUST NOT deliver the | |||
message to hosts which fail MX matching or certificate | message to hosts which fail MX matching or certificate | |||
validation. | validation, or do not support STARTTLS. | |||
2. "testing": In this mode, sending MTAs which also implement the | 2. "testing": In this mode, sending MTAs which also implement the | |||
TLSRPT specification [I-D.ietf-uta-smtp-tlsrpt] merely send a | TLSRPT specification [I-D.ietf-uta-smtp-tlsrpt] merely send a | |||
report indicating policy application failures (so long as TLSRPT | report indicating policy application failures (so long as TLSRPT | |||
is also implemented by the recipient domain). | is also implemented by the recipient domain). | |||
3. "none": In this mode, sending MTAs should treat the policy domain | 3. "none": In this mode, sending MTAs should treat the policy domain | |||
as though it does not have any active policy; see Section 8.3, | as though it does not have any active policy; see Section 8.3, | |||
"Removing MTA-STS", for use of this mode value. | "Removing MTA-STS", for use of this mode value. | |||
When a message fails to deliver due to an "enforce" policy, a | When a message fails to deliver due to an "enforce" policy, a | |||
compliant MTA MUST NOT permanently fail to deliver messages before | compliant MTA MUST NOT permanently fail to deliver messages before | |||
checking for the presence of an updated policy at the Policy Domain. | checking, via DNS, for the presence of an updated policy at the | |||
(In all cases, MTAs SHOULD treat such failures as transient errors | Policy Domain. (In all cases, MTAs SHOULD treat such failures as | |||
and retry delivery later.) This allows implementing domains to | transient errors and retry delivery later.) This allows implementing | |||
update long-lived policies on the fly. | domains to update long-lived policies on the fly. | |||
5.1. Policy Application Control Flow | 5.1. Policy Application Control Flow | |||
An example control flow for a compliant sender consists of the | An example control flow for a compliant sender consists of the | |||
following steps: | following steps: | |||
1. Check for a cached policy whose time-since-fetch has not exceeded | 1. Check for a cached policy whose time-since-fetch has not exceeded | |||
its "max_age". If none exists, attempt to fetch a new policy | its "max_age". If none exists, attempt to fetch a new policy | |||
(perhaps asynchronously, so as not to block message delivery). | (perhaps asynchronously, so as not to block message delivery). | |||
Optionally, sending MTAs may unconditionally check for a new | Optionally, sending MTAs may unconditionally check for a new | |||
policy at this step. | policy at this step. | |||
2. For each candidate MX, in order of MX priority, attempt to | 2. For each candidate MX, in order of MX priority, attempt to | |||
deliver the message, enforcing STARTTLS and, assuming a policy is | deliver the message. If a policy is present with an "enforce" | |||
present, PKIX certificate validation as described in Section 4.1, | mode, when attempting to deliver to each candidate MX, ensure | |||
"MX Certificate Validation." | STARTTLS support and host identity validity as described in | |||
Section 4, "Policy Validation". If a candidate fails validation, | ||||
continue to the next candidate (if there is one). | ||||
3. A message delivery MUST NOT be permanently failed until the | 3. A message delivery MUST NOT be permanently failed until the | |||
sender has first checked for the presence of a new policy (as | sender has first checked for the presence of a new policy (as | |||
indicated by the "id" field in the "_mta-sts" TXT record). If a | indicated by the "id" field in the "_mta-sts" TXT record). If a | |||
new policy is not found, existing rules for the case of temporary | new policy is not found, existing rules for the case of temporary | |||
message delivery failures apply (as discussed in [RFC5321] | message delivery failures apply (as discussed in [RFC5321] | |||
section 4.5.4.1). | section 4.5.4.1). | |||
6. Reporting Failures | 6. Reporting Failures | |||
skipping to change at page 12, line 35 ¶ | skipping to change at page 13, line 12 ¶ | |||
according to the applied policy, except if that policy's mode is | according to the applied policy, except if that policy's mode is | |||
"none". | "none". | |||
7. Interoperability Considerations | 7. Interoperability Considerations | |||
7.1. SNI Support | 7.1. SNI Support | |||
To ensure that the server sends the right certificate chain, the SMTP | To ensure that the server sends the right certificate chain, the SMTP | |||
client MUST have support for the TLS SNI extension [RFC6066]. When | client MUST have support for the TLS SNI extension [RFC6066]. When | |||
connecting to a HTTP server to retrieve the MTA-STS policy, the SNI | connecting to a HTTP server to retrieve the MTA-STS policy, the SNI | |||
extension MUST contain the name of the policy host (e.g. "mta- | extension MUST contain the name of the policy host (e.g., "mta- | |||
sts.example.com"). When connecting to an SMTP server, the SNI | sts.example.com"). When connecting to an SMTP server, the SNI | |||
extension MUST contain the MX hostname. | extension MUST contain the MX hostname. | |||
HTTP servers used to deliver MTA-STS policies MAY rely on SNI to | HTTP servers used to deliver MTA-STS policies MAY rely on SNI to | |||
determine which certificate chain to present to the client. HTTP | determine which certificate chain to present to the client. HTTP | |||
servers MUST respond with a certificate chain that matches the policy | servers MUST respond with a certificate chain that matches the policy | |||
hostname or abort the TLS handshake if unable to do so. Clients that | hostname or abort the TLS handshake if unable to do so. Clients that | |||
do not send SNI information may not see the expected certificate | do not send SNI information may not see the expected certificate | |||
chain. | chain. | |||
skipping to change at page 13, line 33 ¶ | skipping to change at page 14, line 10 ¶ | |||
Updating the policy requires that the owner make changes in two | Updating the policy requires that the owner make changes in two | |||
places: the "_mta-sts" TXT record in the Policy Domain's DNS zone and | places: the "_mta-sts" TXT record in the Policy Domain's DNS zone and | |||
at the corresponding HTTPS endpoint. As a result, recipients should | at the corresponding HTTPS endpoint. As a result, recipients should | |||
expect a policy will continue to be used by senders until both the | expect a policy will continue to be used by senders until both the | |||
HTTPS and TXT endpoints are updated and the TXT record's TTL has | HTTPS and TXT endpoints are updated and the TXT record's TTL has | |||
passed. | passed. | |||
In other words, a sender who is unable to successfully deliver a | In other words, a sender who is unable to successfully deliver a | |||
message while applying a cache of the recipient's now-outdated policy | message while applying a cache of the recipient's now-outdated policy | |||
may be unable to discover that a new policy exists until the DNS TTL | may be unable to discover that a new policy exists until the DNS TTL | |||
has passed. Recipients should therefore ensure that old policies | has passed. Recipients SHOULD therefore ensure that old policies | |||
continue to work for message delivery during this period of time, or | continue to work for message delivery during this period of time, or | |||
risk message delays. | risk message delays. | |||
Recipients should also prefer to update the HTTPS policy body before | Recipients SHOULD also update the HTTPS policy body before updating | |||
updating the TXT record; this ordering avoids the risk that senders, | the TXT record; this ordering avoids the risk that senders, seeing a | |||
seeing a new TXT record, mistakenly cache the old policy from HTTPS. | new TXT record, mistakenly cache the old policy from HTTPS. | |||
8.2. Policy Delegation | 8.2. Policy Delegation | |||
Domain owners commonly delegate SMTP hosting to a different | Domain owners commonly delegate SMTP hosting to a different | |||
organization, such as an ISP or a Web host. In such a case, they may | organization, such as an ISP or a Web host. In such a case, they may | |||
wish to also delegate the MTA-STS policy to the same organization | wish to also delegate the MTA-STS policy to the same organization | |||
which can be accomplished with two changes. | which can be accomplished with two changes. | |||
First, the Policy Domain must point the "_mta-sts" record, via CNAME, | First, the Policy Domain must point the "_mta-sts" record, via CNAME, | |||
to the "_mta-sts" record maintained by the hosting organization. | to the "_mta-sts" record maintained by the hosting organization. | |||
skipping to change at page 14, line 23 ¶ | skipping to change at page 14, line 47 ¶ | |||
For example, given a user domain "user.example" hosted by a mail | For example, given a user domain "user.example" hosted by a mail | |||
provider "provider.example", the following configuration would allow | provider "provider.example", the following configuration would allow | |||
policy delegation: | policy delegation: | |||
DNS: | DNS: | |||
_mta-sts.user.example. IN CNAME _mta-sts.provider.example. | _mta-sts.user.example. IN CNAME _mta-sts.provider.example. | |||
Policy: | Policy: | |||
> GET /.well-known/mta-sts.txt | > GET /.well-known/mta-sts.txt Host: mta-sts.user.example | |||
> Host: mta-sts.user.example | < HTTP/1.1 200 OK # Response proxies content from | |||
< HTTP/1.1 200 OK # Response proxies content from | # https://mta-sts.provider.example | |||
# https://mta-sts.provider.example | ||||
Note that in all such cases, the policy endpoint ("https://mta- | ||||
sts.user.example/.well-known/mta-sts.txt" in this example) must still | ||||
present a certificate valid for the Policy Domain ("user.example"), | ||||
and not for that of the provider ("provider.example"). | ||||
Note that while sending MTAs MUST NOT use HTTP caching when fetching | Note that while sending MTAs MUST NOT use HTTP caching when fetching | |||
policies via HTTPS, such caching may nonetheless be useful to a | policies via HTTPS, such caching may nonetheless be useful to a | |||
reverse proxy configured as described in this section. An HTTPS | reverse proxy configured as described in this section. An HTTPS | |||
policy endpoint expecting to be proxied for multiple hosted domains-- | policy endpoint expecting to be proxied for multiple hosted domains-- | |||
as with a large mail hosting provider or similar--may wish to | as with a large mail hosting provider or similar--may wish to | |||
indicate an HTTP Cache-Control "max-age" response directive (as | indicate an HTTP Cache-Control "max-age" response directive (as | |||
specified in [RFC7234]) of 60 seconds as a reasonable value to save | specified in [RFC7234]) of 60 seconds as a reasonable value to save | |||
reverse proxies an unnecessarily high-rate of proxied policy | reverse proxies an unnecessarily high-rate of proxied policy | |||
fetching. | fetching. | |||
skipping to change at page 14, line 51 ¶ | skipping to change at page 15, line 33 ¶ | |||
policy domains, and to distinguish clearly between failures which | policy domains, and to distinguish clearly between failures which | |||
indicate attacks and those which indicate such opt-outs, MTA-STS | indicate attacks and those which indicate such opt-outs, MTA-STS | |||
implements the "none" mode, which allows validated policies to | implements the "none" mode, which allows validated policies to | |||
indicate authoritatively that the policy domain wishes to no longer | indicate authoritatively that the policy domain wishes to no longer | |||
implement MTA-STS and may, in the future, remove the MTA-STS TXT and | implement MTA-STS and may, in the future, remove the MTA-STS TXT and | |||
policy endpoints entirely. | policy endpoints entirely. | |||
A suggested workflow to implement such an opt out is as follows: | A suggested workflow to implement such an opt out is as follows: | |||
1. Publish a new policy with "mode" equal to "none" and a small | 1. Publish a new policy with "mode" equal to "none" and a small | |||
"max_age" (e.g. one day). | "max_age" (e.g., one day). | |||
2. Publish a new TXT record to trigger fetching of the new policy. | 2. Publish a new TXT record to trigger fetching of the new policy. | |||
3. When all previously served policies have expired--normally this | 3. When all previously served policies have expired--normally this | |||
is the time the previously published policy was last served plus | is the time the previously published policy was last served plus | |||
that policy's "max_age", but note that older policies may have | that policy's "max_age", but note that older policies may have | |||
been served with a greater "max_age", allowing overlapping policy | been served with a greater "max_age", allowing overlapping policy | |||
caches--safely remove the TXT record and HTTPS endpoint. | caches--safely remove the TXT record and HTTPS endpoint. | |||
8.4. Preserving MX Candidate Traversal | ||||
Implementors of send-time MTA-STS validation in mail transfer agents | ||||
should take note of the risks of modifying the logic of traversing MX | ||||
candidate lists. Because an MTA-STS policy can be used to prefilter | ||||
invalid MX candidates from the MX candidate list, it is tempting to | ||||
implement a "two-pass" model, where MX candidates are first filtered | ||||
for possible validity according to the MTA-STS policy, and then the | ||||
remaining candidates attempted in order as without an MTA-STS policy. | ||||
This may lead to incorrect implementations, such a message loops; | ||||
implementors are instead recommended to traverse the MX candidate | ||||
list as usual, and treat invalid candidates as though they were | ||||
unreachable (i.e., as though there were some transient error when | ||||
trying to deliver to that candidate). | ||||
One consequence of validating MX hosts in order of ordinary candidate | ||||
traversal is that, in the event that a higher-priority MX is MTA-STS | ||||
valid and a lower-priority MX is not, senders may never encounter the | ||||
lower-priority MX, leading to a risk that policy misconfigurations | ||||
that apply only to "backup" MXes may only be discovered in the case | ||||
of primary MX failure. | ||||
9. IANA Considerations | 9. IANA Considerations | |||
9.1. Well-Known URIs Registry | 9.1. Well-Known URIs Registry | |||
A new "well-known" URI as described in Section 3 will be registered | A new "well-known" URI as described in Section 3 will be registered | |||
in the Well-Known URIs registry as described below: | in the Well-Known URIs registry as described below: | |||
URI Suffix: mta-sts.txt Change Controller: IETF | URI Suffix: mta-sts.txt Change Controller: IETF | |||
9.2. MTA-STS TXT Record Fields | 9.2. MTA-STS TXT Record Fields | |||
skipping to change at page 16, line 8 ¶ | skipping to change at page 17, line 20 ¶ | |||
| max_age | Policy lifetime | Section 3.2 of RFC XXX | | | max_age | Policy lifetime | Section 3.2 of RFC XXX | | |||
| mx | MX identities | Section 3.2 of RFC XXX | | | mx | MX identities | Section 3.2 of RFC XXX | | |||
+------------+----------------------+------------------------+ | +------------+----------------------+------------------------+ | |||
New fields are added to this registry using IANA's "Expert Review" | New fields are added to this registry using IANA's "Expert Review" | |||
policy. | policy. | |||
10. Security Considerations | 10. Security Considerations | |||
SMTP MTA Strict Transport Security attempts to protect against an | SMTP MTA Strict Transport Security attempts to protect against an | |||
active attacker who wishes to intercept or tamper with mail between | active attacker trying to intercept or tamper with mail between hosts | |||
hosts who support STARTTLS. There are two classes of attacks | that support STARTTLS. There are two classes of attacks considered: | |||
considered: | ||||
o Foiling TLS negotiation, for example by deleting the "250 | o Foiling TLS negotiation, for example by deleting the "250 | |||
STARTTLS" response from a server or altering TLS session | STARTTLS" response from a server or altering TLS session | |||
negotiation. This would result in the SMTP session occurring over | negotiation. This would result in the SMTP session occurring over | |||
plaintext, despite both parties supporting TLS. | plaintext, despite both parties supporting TLS. | |||
o Impersonating the destination mail server, whereby the sender | o Impersonating the destination mail server, whereby the sender | |||
might deliver the message to an impostor, who could then monitor | might deliver the message to an impostor, who could then monitor | |||
and/or modify messages despite opportunistic TLS. This | and/or modify messages despite opportunistic TLS. This | |||
impersonation could be accomplished by spoofing the DNS MX record | impersonation could be accomplished by spoofing the DNS MX record | |||
skipping to change at page 16, line 35 ¶ | skipping to change at page 17, line 46 ¶ | |||
MTA-STS can thwart such attacks only if the sender is able to | MTA-STS can thwart such attacks only if the sender is able to | |||
previously obtain and cache a policy for the recipient domain, and | previously obtain and cache a policy for the recipient domain, and | |||
only if the attacker is unable to obtain a valid certificate that | only if the attacker is unable to obtain a valid certificate that | |||
complies with that policy. Below, we consider specific attacks on | complies with that policy. Below, we consider specific attacks on | |||
this model. | this model. | |||
10.1. Obtaining a Signed Certificate | 10.1. Obtaining a Signed Certificate | |||
SMTP MTA-STS relies on certificate validation via PKIX based TLS | SMTP MTA-STS relies on certificate validation via PKIX based TLS | |||
identity checking [RFC6125]. Attackers who are able to obtain a | identity checking [RFC6125]. Attackers who are able to obtain a | |||
valid certificate for the targeted recipient mail service (e.g. by | valid certificate for the targeted recipient mail service (e.g., by | |||
compromising a certificate authority) are thus able to circumvent STS | compromising a certificate authority) are thus able to circumvent STS | |||
authentication. | authentication. | |||
10.2. Preventing Policy Discovery | 10.2. Preventing Policy Discovery | |||
Since MTA-STS uses DNS TXT records for policy discovery, an attacker | Since MTA-STS uses DNS TXT records for policy discovery, an attacker | |||
who is able to block DNS responses can suppress the discovery of an | who is able to block DNS responses can suppress the discovery of an | |||
MTA-STS Policy, making the Policy Domain appear not to have an MTA- | MTA-STS Policy, making the Policy Domain appear not to have an MTA- | |||
STS Policy. The sender policy cache is designed to resist this | STS Policy. The sender policy cache is designed to resist this | |||
attack by decreasing the frequency of policy discovery and thus | attack by decreasing the frequency of policy discovery and thus | |||
reducing the window of vulnerability; it is nonetheless a risk that | reducing the window of vulnerability; it is nonetheless a risk that | |||
attackers who can predict or induce policy discovery--for example, by | attackers who can predict or induce policy discovery--for example, by | |||
inducing a sending domain to send mail to a never-before-contacted | inducing a sending domain to send mail to a never-before-contacted | |||
recipient while carrying out a man-in-the-middle attack--may be able | recipient while carrying out a man-in-the-middle attack--may be able | |||
to foil policy discovery and effectively downgrade the security of | to foil policy discovery and effectively downgrade the security of | |||
the message delivery. | the message delivery. | |||
Since this attack depends upon intercepting initial policy discovery, | Since this attack depends upon intercepting initial policy discovery, | |||
we strongly recommend implementers to prefer policy "max_age" values | implementers SHOULD prefer policy "max_age" values to be as long as | |||
to be as long as is practical. | is practical. | |||
Because this attack is also possible upon refresh of a cached policy, | Because this attack is also possible upon refresh of a cached policy, | |||
we suggest implementers do not wait until a cached policy has expired | implementors SHOULD NOT wait until a cached policy has expired before | |||
before checking for an update; if senders attempt to refresh the | checking for an update; if senders attempt to refresh the cache | |||
cache regularly (for instance, by checking their cached version | regularly (for example, by fetching currently live policy in a | |||
string against the TXT record on each successful send, or in a | background task that runs daily or weekly, regardless of the state of | |||
background task that runs daily or weekly), an attacker would have to | the "_mta_sts" TXT record, and updating their cache's "max age" | |||
foil policy discovery consistently over the lifetime of a cached | accordingly), an attacker would have to foil policy discovery | |||
policy to prevent a successful refresh. | consistently over the lifetime of a cached policy to prevent a | |||
successful refresh. | ||||
Additionally, MTAs should alert administrators to repeated policy | Additionally, MTAs SHOULD alert administrators to repeated policy | |||
refresh failures long before cached policies expire (through warning | refresh failures long before cached policies expire (through warning | |||
logs or similar applicable mechanisms), allowing administrators to | logs or similar applicable mechanisms), allowing administrators to | |||
detect such a persistent attack on policy refresh. (However, they | detect such a persistent attack on policy refresh. (However, they | |||
should not implement such alerts if the cached policy has a "none" | should not implement such alerts if the cached policy has a "none" | |||
mode, to allow clean MTA-STS removal, as described in Section 8.3.) | mode, to allow clean MTA-STS removal, as described in Section 8.3.) | |||
Resistance to downgrade attacks of this nature--due to the ability to | Resistance to downgrade attacks of this nature--due to the ability to | |||
authoritatively determine "lack of a record" even for non- | authoritatively determine "lack of a record" even for non- | |||
participating recipients--is a feature of DANE, due to its use of | participating recipients--is a feature of DANE, due to its use of | |||
DNSSEC for policy discovery. | DNSSEC for policy discovery. | |||
skipping to change at page 17, line 50 ¶ | skipping to change at page 19, line 16 ¶ | |||
the MX records. | the MX records. | |||
This attack is mitigated in part by the ability of a victim domain to | This attack is mitigated in part by the ability of a victim domain to | |||
(at any time) publish a new policy updating the cached, malicious | (at any time) publish a new policy updating the cached, malicious | |||
policy, though this does require the victim domain to both obtain a | policy, though this does require the victim domain to both obtain a | |||
valid CA-signed certificate and to understand and properly configure | valid CA-signed certificate and to understand and properly configure | |||
MTA-STS. | MTA-STS. | |||
Similarly, we consider the possibility of domains that deliberately | Similarly, we consider the possibility of domains that deliberately | |||
allow untrusted users to serve untrusted content on user-specified | allow untrusted users to serve untrusted content on user-specified | |||
subdomains. In some cases (e.g. the service Tumblr.com) this takes | subdomains. In some cases (e.g., the service Tumblr.com) this takes | |||
the form of providing HTTPS hosting of user-registered subdomains; in | the form of providing HTTPS hosting of user-registered subdomains; in | |||
other cases (e.g. dynamic DNS providers) this takes the form of | other cases (e.g. dynamic DNS providers) this takes the form of | |||
allowing untrusted users to register custom DNS records at the | allowing untrusted users to register custom DNS records at the | |||
provider's domain. | provider's domain. | |||
In these cases, there is a risk that untrusted users would be able to | In these cases, there is a risk that untrusted users would be able to | |||
serve custom content at the "mta-sts" host, including serving an | serve custom content at the "mta-sts" host, including serving an | |||
illegitimate MTA-STS policy. We believe this attack is rendered more | illegitimate MTA-STS policy. We believe this attack is rendered more | |||
difficult by the need for the attacker to also serve the "_mta-sts" | difficult by the need for the attacker to also serve the "_mta-sts" | |||
TXT record on the same domain--something not, to our knowledge, | TXT record on the same domain--something not, to our knowledge, | |||
widely provided to untrusted users. This attack is additionally | widely provided to untrusted users. This attack is additionally | |||
mitigated by the aforementioned ability for a victim domain to update | mitigated by the aforementioned ability for a victim domain to update | |||
an invalid policy at any future date. | an invalid policy at any future date. | |||
10.4. Weak Policy Constraints | 10.4. Weak Policy Constraints | |||
Even if an attacker cannot modify a served policy, the potential | Even if an attacker cannot modify a served policy, the potential | |||
exists for configurations that allow attackers on the same domain to | exists for configurations that allow attackers on the same domain to | |||
receive mail for that domain. For example, an easy configuration | receive mail for that domain. For example, an easy configuration | |||
option when authoring an MTA-STS Policy for "example.com" is to set | option when authoring an MTA-STS Policy for "example.com" is to set | |||
the "mx" equal to ".example.com"; recipient domains must consider in | the "mx" equal to "*.example.com"; recipient domains must consider in | |||
this case the risk that any user possessing a valid hostname and CA- | this case the risk that any user possessing a valid hostname and CA- | |||
signed certificate (for example, "dhcp-123.example.com") will, from | signed certificate (for example, "dhcp-123.example.com") will, from | |||
the perspective of MTA-STS Policy validation, be a valid MX host for | the perspective of MTA-STS Policy validation, be a valid MX host for | |||
that domain. | that domain. | |||
10.5. Compromise of the Web PKI System | 10.5. Compromise of the Web PKI System | |||
A host of risks apply to the PKI system used for certificate | A host of risks apply to the PKI system used for certificate | |||
authentication, both of the "mta-sts" HTTPS host's certificate and | authentication, both of the "mta-sts" HTTPS host's certificate and | |||
the SMTP servers' certificates. These risks are broadly applicable | the SMTP servers' certificates. These risks are broadly applicable | |||
within the Web PKI ecosystem and are not specific to MTA-STS; | within the Web PKI ecosystem and are not specific to MTA-STS; | |||
nonetheless, they deserve some consideration in this context. | nonetheless, they deserve some consideration in this context. | |||
Broadly speaking, attackers may compromise the system by obtaining | Broadly speaking, attackers may compromise the system by obtaining | |||
certificates under fraudulent circumstances (i.e. by impersonating | certificates under fraudulent circumstances (i.e., by impersonating | |||
the legitimate owner of the victim domain), by compromising a | the legitimate owner of the victim domain), by compromising a | |||
Certificate Authority or Delegate Authority's private keys, by | Certificate Authority or Delegate Authority's private keys, by | |||
obtaining a legitimate certificate issued to the victim domain, and | obtaining a legitimate certificate issued to the victim domain, and | |||
similar. | similar. | |||
One approach commonly employed by Web browsers to help mitigate | One approach commonly employed by Web browsers to help mitigate | |||
against some of these attacks is to allow for revocation of | against some of these attacks is to allow for revocation of | |||
compromised or fraudulent certificates via OCSP [RFC6960] or CRLs | compromised or fraudulent certificates via OCSP [RFC6960] or CRLs | |||
[RFC6818]. Such mechanisms themselves represent tradeoffs and are | [RFC6818]. Such mechanisms themselves represent tradeoffs and are | |||
not universally implemented; we nonetheless recommend implementors of | not universally implemented; we nonetheless recommend implementors of | |||
MTA-STS to implement revocation mechanisms which are most applicable | MTA-STS to implement revocation mechanisms which are most applicable | |||
to their implementations. | to their implementations. | |||
11. Contributors | 11. Contributors | |||
Wei Chuang Google, Inc weihaw (at) google (dot com) | Wei Chuang Google, Inc weihaw@google.com | |||
Viktor Dukhovni ietf-dane (at) dukhovni (dot org) | Viktor Dukhovni ietf-dane@dukhovni.de | |||
Markus Laber 1&1 Mail & Media Development & Technology GmbH | Markus Laber 1&1 Mail & Media Development & Technology GmbH | |||
markus.laber (at) 1und1 (dot de) | markus.laber@1und1.de | |||
Nicolas Lidzborski Google, Inc nlidz (at) google (dot com) | Nicolas Lidzborski Google, Inc nlidz@google.com | |||
Brandon Long Google, Inc blong (at) google (dot com) | Brandon Long Google, Inc blong@google.com | |||
Franck Martin LinkedIn, Inc fmartin (at) linkedin (dot com) | Franck Martin LinkedIn, Inc fmartin@linkedin.com | |||
Klaus Umbach 1&1 Mail & Media Development & Technology GmbH | Klaus Umbach 1&1 Mail & Media Development & Technology GmbH | |||
klaus.umbach (at) 1und1 (dot de) | klaus.umbach@1und1.de | |||
12. References | 12. References | |||
12.1. Normative References | 12.1. Normative References | |||
[I-D.ietf-uta-smtp-tlsrpt] | [I-D.ietf-uta-smtp-tlsrpt] | |||
Margolis, D., Brotman, A., Ramakrishnan, B., Jones, J., | Margolis, D., Brotman, A., Ramakrishnan, B., Jones, J., | |||
and M. Risher, "SMTP TLS Reporting", draft-ietf-uta-smtp- | and M. Risher, "SMTP TLS Reporting", draft-ietf-uta-smtp- | |||
tlsrpt-18 (work in progress), April 2018. | tlsrpt-20 (work in progress), May 2018. | |||
[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, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, <https://www.rfc- | DOI 10.17487/RFC2119, March 1997, <https://www.rfc- | |||
editor.org/info/rfc2119>. | editor.org/info/rfc2119>. | |||
[RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, | ||||
DOI 10.17487/RFC2818, May 2000, <https://www.rfc- | ||||
editor.org/info/rfc2818>. | ||||
[RFC3207] Hoffman, P., "SMTP Service Extension for Secure SMTP over | [RFC3207] Hoffman, P., "SMTP Service Extension for Secure SMTP over | |||
Transport Layer Security", RFC 3207, DOI 10.17487/RFC3207, | Transport Layer Security", RFC 3207, DOI 10.17487/RFC3207, | |||
February 2002, <https://www.rfc-editor.org/info/rfc3207>. | February 2002, <https://www.rfc-editor.org/info/rfc3207>. | |||
[RFC3492] Costello, A., "Punycode: A Bootstring encoding of Unicode | [RFC3492] Costello, A., "Punycode: A Bootstring encoding of Unicode | |||
for Internationalized Domain Names in Applications | for Internationalized Domain Names in Applications | |||
(IDNA)", RFC 3492, DOI 10.17487/RFC3492, March 2003, | (IDNA)", RFC 3492, DOI 10.17487/RFC3492, March 2003, | |||
<https://www.rfc-editor.org/info/rfc3492>. | <https://www.rfc-editor.org/info/rfc3492>. | |||
[RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
skipping to change at page 22, line 10 ¶ | skipping to change at page 23, line 26 ¶ | |||
_mta-sts.example.com. IN TXT "v=STSv1; id=20160831085700Z;" | _mta-sts.example.com. IN TXT "v=STSv1; id=20160831085700Z;" | |||
MTA-STS Policy file served as the response body at "https://mta- | MTA-STS Policy file served as the response body at "https://mta- | |||
sts.example.com/.well-known/mta-sts.txt": | sts.example.com/.well-known/mta-sts.txt": | |||
version: STSv1 | version: STSv1 | |||
mode: testing | mode: testing | |||
mx: mx1.example.com | mx: mx1.example.com | |||
mx: mx2.example.com | mx: mx2.example.com | |||
mx: mx.backup-example.com | mx: mx.backup-example.com | |||
max_age: 12345678 | max_age: 1296000 | |||
Appendix B. Message delivery pseudocode | Appendix B. Message delivery pseudocode | |||
Below is pseudocode demonstrating the logic of a compliant sending | Below is pseudocode demonstrating the logic of a compliant sending | |||
MTA. | MTA. | |||
While this pseudocode implementation suggests synchronous policy | While this pseudocode implementation suggests synchronous policy | |||
retrieval in the delivery path, in a working implementation that may | retrieval in the delivery path, in a working implementation that may | |||
be undesirable, and we expect some implementers to instead prefer a | be undesirable, and we expect some implementers to instead prefer a | |||
background fetch that does not block delivery if no cached policy is | background fetch that does not block delivery if no cached policy is | |||
skipping to change at page 22, line 35 ¶ | skipping to change at page 23, line 51 ¶ | |||
} | } | |||
func isNonExpired(policy) { | func isNonExpired(policy) { | |||
// Return true if the policy is not expired. | // Return true if the policy is not expired. | |||
} | } | |||
func tryStartTls(connection) { | func tryStartTls(connection) { | |||
// Attempt to open an SMTP connection with STARTTLS with the MX. | // Attempt to open an SMTP connection with STARTTLS with the MX. | |||
} | } | |||
func isWildcardMatch(pat, host) { | func certMatches(connection, host) { | |||
// Literal matches are true. | // Assume a handy function to return check if the server certificate presented | |||
if pat == host { | // in "connection" is valid for "host". | |||
return true | ||||
} | ||||
// Leading '.' matches a wildcard against the first part, i.e. | ||||
// .example.com matches x.example.com but not x.y.example.com. | ||||
if pat[0] == '.' { | ||||
parts = SplitN(host, '.', 2) // Split on the first '.'. | ||||
if len(parts) > 1 && parts[1] == pat[1:] { | ||||
return true | ||||
} | ||||
} | ||||
return false | ||||
} | } | |||
func certMatches(connection, policy) { | func policyMatches(candidate, policy) { | |||
// Assume a handy function to return DNS-ID SANs. | for mx in policy.mx { | |||
for san in getDnsIdSansFromCert(connection) { | // Literal match. | |||
for mx in policy.mx { | if mx == candidate { | |||
// Return if the server certificate from "connection" matches the | return true | |||
// "mx" host. | } | |||
if san[0] == '*' { | // Wildcard matches only the leftmost label. | |||
// Invalid wildcard! | // Wildcards must always be followed by a '.'. | |||
if san[1] != '.' continue | if mx[0] == '*' { | |||
san = san[1:] | parts = SplitN(candidate, '.', 2) // Split on the first '.'. | |||
} | if len(parts) > 1 && parts[1] == mx[2:] { | |||
if isWildcardMatch(san, mx) || isWildcardMatch(mx, san) { | ||||
return true | return true | |||
} | } | |||
} | } | |||
} | } | |||
return false | return false | |||
} | } | |||
func tryDeliverMail(connection, message) { | func tryDeliverMail(connection, message) { | |||
// Attempt to deliver "message" via "connection". | // Attempt to deliver "message" via "connection". | |||
} | } | |||
skipping to change at page 23, line 48 ¶ | skipping to change at page 25, line 4 ¶ | |||
func reportError(error) { | func reportError(error) { | |||
// Report an error via TLSRPT. | // Report an error via TLSRPT. | |||
} | } | |||
func tryMxAccordingTo(message, mx, policy) { | func tryMxAccordingTo(message, mx, policy) { | |||
connection := connect(mx) | connection := connect(mx) | |||
if !connection { | if !connection { | |||
return false // Can't connect to the MX so it's not an MTA-STS | return false // Can't connect to the MX so it's not an MTA-STS | |||
// error. | // error. | |||
} | } | |||
secure := true | secure := true | |||
if !tryStartTls(connection) { | if !policyMatches(mx, policy) { | |||
secure = false | ||||
reportError(E_HOST_MISMATCH) | ||||
} else if !tryStartTls(connection) { | ||||
secure = false | secure = false | |||
reportError(E_NO_VALID_TLS) | reportError(E_NO_VALID_TLS) | |||
} else if !certMatches(connection, policy) { | } else if !certMatches(connection, policy) { | |||
secure = false | secure = false | |||
reportError(E_CERT_MISMATCH) | reportError(E_CERT_MISMATCH) | |||
} | } | |||
if secure || !isEnforce(policy) { | if secure || !isEnforce(policy) { | |||
return tryDeliverMail(connection, message) | return tryDeliverMail(connection, message) | |||
} | } | |||
return false | return false | |||
skipping to change at page 24, line 36 ¶ | skipping to change at page 25, line 44 ¶ | |||
domain := ... // domain part after '@' from recipient | domain := ... // domain part after '@' from recipient | |||
policy := tryGetNewPolicy(domain) | policy := tryGetNewPolicy(domain) | |||
if policy { | if policy { | |||
cachePolicy(domain, policy) | cachePolicy(domain, policy) | |||
} else { | } else { | |||
policy = tryGetCachedPolicy(domain) | policy = tryGetCachedPolicy(domain) | |||
} | } | |||
if policy { | if policy { | |||
return tryWithPolicy(message, domain, policy) | return tryWithPolicy(message, domain, policy) | |||
} | } | |||
// Try to deliver the message normally (i.e. without MTA-STS). | // Try to deliver the message normally (i.e., without MTA-STS). | |||
} | } | |||
Authors' Addresses | Authors' Addresses | |||
Daniel Margolis | Daniel Margolis | |||
Google, Inc | Google, Inc | |||
Email: dmargolis (at) google (dot com) | Email: dmargolis@google.com | |||
Mark Risher | Mark Risher | |||
Google, Inc | Google, Inc | |||
Email: risher (at) google (dot com) | Email: risher@google.com | |||
Binu Ramakrishnan | Binu Ramakrishnan | |||
Yahoo!, Inc | Yahoo!, Inc | |||
Email: rbinu (at) yahoo-inc (dot com) | Email: rbinu@yahoo-inc.com | |||
Alexander Brotman | Alexander Brotman | |||
Comcast, Inc | Comcast, Inc | |||
Email: alex_brotman@comcast.com | Email: alex_brotman@comcast.com | |||
Janet Jones | Janet Jones | |||
Microsoft, Inc | Microsoft, Inc | |||
Email: janet.jones (at) microsoft (dot com) | Email: janet.jones@microsoft.com | |||
End of changes. 95 change blocks. | ||||
235 lines changed or deleted | 274 lines changed or added | |||
This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |