Network Working Group | P. Saint-Andre |
Internet-Draft | &yet |
Intended status: Standards Track | M. Miller |
Expires: August 21, 2015 | Cisco Systems, Inc. |
P. Hancke | |
&yet | |
February 17, 2015 |
Domain Name Associations (DNA) in the Extensible Messaging and Presence Protocol (XMPP)
draft-ietf-xmpp-dna-09
This document improves the security of the Extensible Messaging and Presence Protocol (XMPP) in two ways. First, it specifies how to establish a strong association between a domain name and an XML stream, using the concept of "prooftypes". Second, it describes how to securely delegate a service domain name (e.g., example.com) to a target server host name (e.g., hosting.example.net), which is especially important in multi-tenanted environments where the same target server hosts a large number of domains.
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."
This Internet-Draft will expire on August 21, 2015.
Copyright (c) 2015 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
In systems that use the Extensible Messaging and Presence Protocol (XMPP) [RFC6120], it is important to establish a strong association between the DNS domain name of an XMPP service (e.g., example.com) and the XML stream that a client or peer server initiates with that service. In other words, the client or peer server needs to verify the identity of the server to which it connects. Additionally, servers need to verify incoming connections from other servers.
To date, such verification has been established based on information obtained from the Domain Name System (DNS), the Public Key Infrastructure (PKI), or similar sources. In relation to such associations, this document does the following:
This document also provides guidelines for secure delegation of a service domain name (e.g., example.com) to a target server host name (e.g., hosting.example.net). The need for secure delegation arises because the process for resolving the domain name of an XMPP service into the IP address at which an XML stream will be negotiated (see [RFC6120]) can involve delegation of a service domain name to a target server host name using technologies such as DNS SRV records [RFC2782]. A more detailed description of the delegation problem can be found in [I-D.ietf-xmpp-posh]. If such delegation is not done in a secure manner, then the domain name association cannot be verified.
This document inherits XMPP terminology from [RFC6120] and [XEP-0220], DNS terminology from [RFC1034], [RFC1035], [RFC2782] and [RFC4033], and security terminology from [RFC4949] and [RFC5280]. The terms "reference identity", and "presented identity" are used as defined in the "CertID" specification [RFC6125]. For the sake of consistency with [I-D.ietf-dane-srv], this document uses the terms "service domain name" and "target server host name" to refer to the same entities identified by the terms "source domain" and "derived domain" from [RFC6125].
The client-to-server case is much simpler than the server-to-server case because the client does not assert a domain name, which means verification happens in only one direction. Therefore we describe this case first to help the reader understand domain name associations in XMPP.
The following flow chart illustrates the protocol flow for establishing a domain name association for an XML stream from a client (C) to a server (S) using the standard PKIX prooftype specified in [RFC6120].
| DNS RESOLUTION ETC. | +-----------------STREAM HEADERS---------------------+ | | | C: <stream from='user@a.example' to='a.example'> | | | | S: <stream from='a.example' to='user@a.example'> | | | +----------------------------------------------------+ | +-----------------TLS NEGOTIATION--------------------+ | | | S: Server Certificate | | | +----------------------------------------------------+ | (client checks certificate and establishes DNA for a.example) |
The simplified order of events (see [RFC6120] for details) in establishing an XML stream from a client (user@a.exmaple) to a server (a.example) is as follows:
The certificate that the server presents might not be trusted by the client. As one example, the server might be hosting multiple domains and secure delegation as described in Section 6 is necessary. As another example, the server might present a self-signed certificate, which requires the client to apply either the fallback process described in section 6.6.4 of [RFC6125] or prompt the user to accept an unauthenticated connection as described in [I-D.ietf-uta-xmpp].
The server-to-server case is significantly more complex than the client-to-server case, and involves checking of domain name associations in both directions along with other "wrinkles" described in the following sections.
The following flow chart illustrates the protocol flow for establishing domain name associations between Server A (the initiating entity) and Server B (the receiving entity), as described in the remaining sections of this document.
| (A Simple S2S Scenario) | DNS RESOLUTION ETC. | +-------------STREAM HEADERS--------------------+ | | | A: <stream from='a.example' to='b.example'> | | | | B: <stream from='b.example' to='a.example'> | | | +-----------------------------------------------+ | +-------------TLS NEGOTIATION-------------------+ | | | B: Server Certificate | | B: Certificate Request | | A: Client Certificate | | | +-----------------------------------------------+ | (A establishes DNA for b.example) | +-------------AUTHENTICATION--------------------+ | | | | {valid client certificate?} --+ | | | | | | | yes no | | | v | | | SASL EXTERNAL | | | (mutual auth!) | | | (B establishes DNA for a.example) | | +-------------------------------------|---------+ | +-----------------+ | B needs to establish DNA | for this stream from a.example, | so A asserts its identity | +----------DIALBACK IDENTITY ASSERTION----------+ | | | A: <db:result from='a.example' | | to='b.example'> | | some-dialback-key | | </db:result> | | | +-----------------------------------------------+ | (Section 4.3: One-Way Authentication) | DNS RESOLUTION ETC. | +-------------STREAM HEADERS--------------------+ | | | B: <stream from='b.example' to='a.example'> | | | | A: <stream from='a.example' to='b.example'> | | | +-----------------------------------------------+ | +-------------TLS NEGOTIATION-------------------+ | | | A: Server Certificate | | | +-----------------------------------------------+ | +----------DIALBACK IDENTITY VERIFICATION-------+ | | | B: <db:verify from='b.example' | | to='a.example' | | id='...'> | | some-dialback-key | | </db:verify> | | | | A: <db:verify from='a.example' | | to='b.example' | | type='valid' | | id='...'> | | | +-----------------------------------------------+ | (B establishes DNA for a.example) | | (Section 4.4.1: Piggybacking Assertion) | +----------DIALBACK IDENTITY ASSERTION----------+ | | | B: <db:result from='c.example' | | to='a.example'/> | | | +-----------------------------------------------+ | +-----------DNA DANCE AS ABOVE------------------+ | | | DNS RESOLUTION, STREAM HEADERS, | | TLS NEGOTIATION, AUTHENTICATION | | | +-----------------------------------------------+ | +----------DIALBACK IDENTITY VERIFICATION-------+ | | | A: <db:result from='a.example' | | to='c.example' | | type='valid'/> | | | +-----------------------------------------------+ | | (Section 4.4.2: Piggybacking Supposition) | +-----------SUBSEQUENT CONNECTION---------------+ | | | B: <stream from='c.example' | | to='rooms.a.example'> | | | | A: <stream from='rooms.a.example' | | to='c.example'> | | | +-----------------------------------------------+ | +-----------DNA DANCE AS ABOVE------------------+ | | | DNS RESOLUTION, STREAM HEADERS, | | TLS NEGOTIATION, AUTHENTICATION | | | +-----------------------------------------------+ | +-----------DIALBACK OPTIMIZATION---------------+ | | | B: <db:result from='c.example' | | to='rooms.a.example'/> | | | | B: <db:result from='rooms.a.example' | | to='c.example' | | type='valid'/> | | | +-----------------------------------------------+ |
To illustrate the problem, consider the simplified order of events (see [RFC6120] for details) in establishing an XML stream between Server A (a.example) and Server B (b.example):
Several simplifying assumptions underlie the happy scenario just outlined:
Let's consider each of these "wrinkles" in turn. Since Server A is acting as a S2S client the behaviour is same as in the C2S case described in Section 3.2.
If the PKIX certificate presented by Server A during TLS negotiation is not trusted by Server B, Server B is unable to mutually authenticate Server A. Therefore, Server B needs to verify the asserted identity of Server A by other means.
At this point the servers are using two TCP connections instead of one, which is somewhat wasteful. However, there are ways to tie the authentication achieved on the second TCP connection to the first TCP connection; see [XEP-0288] for further discussion.
Consider the common scenario in which Server B hosts not only b.example but also a second domain c.example (often called a "multi-tenanted" environment). If a user of Server B associated with c.example wishes to communicate with a friend at a.example, Server B needs to send XMPP stanzas from the domain c.example rather than b.example. Although Server B could open a new TCP connection and negotiate new XML streams for the domain pair of c.example and a.example, that too is wasteful (especially if Server B hosts a large number of domains). Server B already has a connection to a.example, so how can it assert that it would like to add a new domain pair to the existing connection?
The traditional method for doing so is the Server Dialback protocol, first specified in (the now obsolete) [RFC3920] and since moved to [XEP-0220]. Here, Server B can send a <db:result/> element for the new domain pair over the existing stream.
<db:result from='c.example' to='a.example'> some-dialback-key </db:result>
This element functions as Server B's assertion that it is (also) c.example, and thus is functionally equivalent to the 'from' address of an initial stream header as previously described.
In response to this assertion, Server A needs to obtain some kind of proof that Server B really is also c.example. If the certificate presented by Server B is also valid for c.example then no further action is necessary. However, if not then Server A needs to do a bit more work. Specifically, Server A can pursue the same strategy it used before:
Now that Server A accepts the domain name association, it informs Server B of that fact:
<db:result from='a.example' to='c.example' type='valid'/>
The parties can then terminate the second connection, since it was used only for Server A to associate a stream with the domain name c.example (the dialback key links the original stream to the new association).
Piggybacking can also occur in the other direction. Consider the common scenario in which Server A provides XMPP services not only for a.example but also for a subdomain such as a groupchat service (e.g., Multi-User Chat [XEP-0045]) at rooms.a.example. If a user from c.example at Server B wishes to join a room on the groupchat sevice, Server B needs to send XMPP stanzas from the domain c.example to the domain rooms.a.example rather than a.example. First, Server B needs to determine whether it can piggyback the domain rooms.a.example on the connection to a.example:
Server B sends a dialback key to Server A over the existing connection.
<db:result from='c.example' to='rooms.a.example'> some-dialback-key </db:result>
Server A then informs Server B that it accepts the domain name association:
<db:result from='rooms.a.example' to='c.example' type='valid'/>
The foregoing protocol flows assumed that domain name associations were proved using the PKI prooftype specified in [RFC6120]: that is, the server's proof consists of a PKIX certificate that is checked according to the XMPP profile [RFC6120] of the matching rules from [RFC6125] (and the overall validation rules from [RFC5280]), the client's verification material is obtained out of band in the form of a trusted root, and secure DNS is not necessary.
However, sometimes XMPP server administrators are unable or unwilling to obtain valid PKIX certificates for all of the domains they host at their servers. For example:
(Additional discussion can be found in [I-D.ietf-xmpp-posh].)
In these circumstances, prooftypes other than PKIX are desirable or necessary. As described below, two alternatives have been defined so far: DNS-Based Authentication of Named Entities (DANE) and PKIX Over Secure HTTP (POSH).
The DANE prooftype can be defined as follows:
The DANE prooftype makes use of the DNS-Based Authentication of Named Entities [RFC6698], specifically the use of DANE with DNS SRV records [I-D.ietf-dane-srv]. For XMPP purposes, the following rules apply:
The POSH prooftype can be defined as follows:
POSH is defined in [I-D.ietf-xmpp-posh]. For XMPP purposes, the following rules apply:
The well-known URIs [RFC5785] to be used for POSH are:
One common method for deploying XMPP services is multi-tenancy: e.g., XMPP services for the service domain example.com are actually hosted at the target server hosting.example.net. Such an arrangement is relatively convenient in XMPP given the use of DNS SRV records [RFC2782], such as the following delegation from example.com to hosting.example.net:
_xmpp-server._tcp.example.com. 0 IN SRV 0 0 5269 hosting.example.net
Secure connections with multi-tenancy can work using the PKIX prooftype on a small scale if the provider itself wishes to host several domains (e.g., related domains such as jabber-de.example and jabber-ch.example). However, in practice the security of multi-tenancy has been found to be unwieldy when the provider hosts large numbers of XMPP services on behalf of multiple tenants (see [I-D.ietf-xmpp-posh] for a detailed description). Typically there are two main reasons for this state of affairs: the service provider (say, hosting.example.net) wishes to limit its liability and therefore does not wish to hold the certificate and private key for the tenant (say, example.com) and the tenant wishes to improve the security of the service and therefore does not wish to share its certificate and private key with the service provider. As a result, server-to-server communications to example.com go unencrypted or the communications are TLS-encrypted but the certificates are not checked (which is functionally equivalent to a connection using an anonymous key exchange). This is also true of client-to-server communications, forcing end users to override certificate warnings or configure their clients to accept or "pin" certificates for hosting.example.net instead of example.com. The fundamental problem here is that if DNSSEC is not used then the act of delegation via DNS SRV records is inherently insecure.
The specification for use of SRV records with DANE [I-D.ietf-dane-srv] explains how to use DNSSEC for secure delegation with the DANE prooftype, and the POSH specification [I-D.ietf-xmpp-posh] explains how to use HTTPS redirects for secure delegation with the POSH prooftype.
In general, a domain name association (DNA) prooftype conforms to the following definition:
The PKIX, DANE, and POSH prooftypes adhere to this model. (Some prooftypes depend on, or are enhanced by, secure DNS and thus also need to describe how they ensure secure delegation.)
Other prooftypes are possible; examples might include TLS with PGP keys [RFC6091], a token mechanism such as Kerberos [RFC4120] or OAuth [RFC6749], and Server Dialback keys [XEP-0220].
Although the PKIX prooftype reuses the syntax of the XMPP Server Dialback protocol [XEP-0220] for signalling between servers, this framework document does not define how the generation and validation of Server Dialback keys (also specified in [XEP-0220]) is a DNA prooftype. However, nothing in this document prevents the continued use of Server Dialback for signaling, and a future specification (or an updated version of [XEP-0220]) might define a DNA prooftype for Server Dialback keys in a way that is consistent with this framework.
The POSH specification [I-D.ietf-xmpp-posh] provides guidelines for registering the well-known URIs [RFC5785] of protocols that make use of POSH. This specification registers two such URIs, for which the completed registration templates follow.
This specification registers "posh._xmpp-client._tcp.json" in the Well-Known URI Registry as defined by [RFC5785].
URI suffix: posh._xmpp-client._tcp.json
Change controller: IETF
Specification document(s): [[ this document ]]
This specification registers "posh._xmpp-server._tcp.json" in the Well-Known URI Registry as defined by [RFC5785].
URI suffix: posh._xmpp-server._tcp.json
Change controller: IETF
Specification document(s): [[ this document ]]
With regard to the PKIX prooftype, this document supplements but does not supersede the security considerations of [RFC6120] and [RFC6125].
With regard to the DANE and PKIX prooftypes, the reader is referred to [I-D.ietf-dane-srv] and [I-D.ietf-xmpp-posh], respectively.
Any future prooftypes need to thoroughly describe how they conform to the prooftype model specified in Section 7 of this document.
Thanks to Richard Barnes, Stephen Farrell, and Jonas Lindberg for contributing to earlier versions of this document.