Internet DRAFT - draft-hoffman-dns-over-http

draft-hoffman-dns-over-http







Network Working Group                                         P. Hoffman
Internet-Draft                                                     ICANN
Intended status: Standards Track                           J. Hildebrand
Expires: April 18, 2017                                 October 15, 2016


                         DNS Queries over HTTPS
                    draft-hoffman-dns-over-http-01

Abstract

   This document describes how to make DNS queries and get DNS responses
   over HTTPS.  The main driver for this document is to allow clients
   who want to send DNS queries over HTTP transport to be able to do in
   a secure and interoperable fashion, regardless of the format of the
   responses.

   Comments on this draft can be sent to the dnsoverhttp mailing list at
   https://www.ietf.org/mailman/listinfo/dnsoverhttp .

Status of This Memo

   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 April 18, 2017.

Copyright Notice

   Copyright (c) 2016 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



Hoffman & Hildebrand     Expires April 18, 2017                 [Page 1]

Internet-Draft                 DNS in JSON                  October 2016


   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.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   2
     1.1.  Use Cases . . . . . . . . . . . . . . . . . . . . . . . .   3
     1.2.  Protocol Requirements . . . . . . . . . . . . . . . . . .   3
     1.3.  Terminology . . . . . . . . . . . . . . . . . . . . . . .   4
   2.  Template  . . . . . . . . . . . . . . . . . . . . . . . . . .   4
     2.1.  PREFIX  . . . . . . . . . . . . . . . . . . . . . . . . .   4
     2.2.  QNAME . . . . . . . . . . . . . . . . . . . . . . . . . .   5
     2.3.  QTYPE . . . . . . . . . . . . . . . . . . . . . . . . . .   6
     2.4.  Additional Parameters . . . . . . . . . . . . . . . . . .   6
   3.  Queries . . . . . . . . . . . . . . . . . . . . . . . . . . .   7
   4.  Responses . . . . . . . . . . . . . . . . . . . . . . . . . .   8
   5.  Use in HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . .   9
   6.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .   9
   7.  Security Considerations . . . . . . . . . . . . . . . . . . .   9
   8.  Acknowledgements  . . . . . . . . . . . . . . . . . . . . . .   9
   9.  References  . . . . . . . . . . . . . . . . . . . . . . . . .   9
     9.1.  Normative References  . . . . . . . . . . . . . . . . . .   9
     9.2.  Informative References  . . . . . . . . . . . . . . . . .  10
   Appendix A.  Previous Work on DNS over HTTP or in Other Formats .  12
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  12

1.  Introduction

   Over time, there have been many proposals for using HTTP and HTTPS as
   a substrate for DNS queries and responses.  To date, none of those
   proposals have made it beyond early discussion, partially due to
   disagreement about what is the "best" method to do so.  In
   particular, there has been disagreement about what the best format
   for the responses should be.  Also, some early proposals have not
   followed best practices for using HTTP.

   This document defines a specific protocol for sending DNS [RFC1035]
   queries and getting DNS responses over HTTP [RFC7230] that is running
   over TLS [RFC5246].  Although there might be a desire to run this
   protocol over an insecure transport such as bare HTTP, this document
   only defines the protocol as HTTP over TLS.

   This design focuses on DNS stub-to-resolver communication, but DNS
   resolver-to-authoritative communication should work just as well.

   A server that supports this protocol is called a "DNS API server" to
   differentiate it from a "DNS server" (one that uses the regular DNS



Hoffman & Hildebrand     Expires April 18, 2017                 [Page 2]

Internet-Draft                 DNS in JSON                  October 2016


   protocol).  Similarly, a client supports this protocol is called a
   "DNS API client".

1.1.  Use Cases

   Earlier proposals for DNS over HTTP have had many different use
   cases.  The primary use case is an application that wants to avoid
   network path involvement with DNS.  The protocol can be implemented
   in the application such as a browser if the location of the DNS API
   server can be configured, hard-coded, or discoverable such as through
   DHCP.

   Another use case is an operating system that wants to help
   applications when the OS detects broken DNS in its operations.  The
   OS can still respond to calls such as getaddrinfo() and
   gethostbyname() by using this protocol without the applications
   needing to do anything.

   A more recent use case is a small ("IoT") device that already runs
   COAP [RFC7252] and has a JSON [RFC7159] or CBOR [RFC7049] parser and
   wants to make DNS queries beyond what are supported by the device's
   operating system.

   An eventual use case might be editing of DNS zones by end users, such
   as described in [I-D.hildebrand-deth].  Such editing could easily be
   done using existing HTTP semantics.

   As HTTP/2 [RFC7540] and QUIC [I-D.hamilton-early-deployment-quic]
   become more widely deployed, this protocol might become more
   important because an HTTP/2 or QUIC server might push DNS responses
   to a client that the HTTP/2 server expects the client to look up.
   This will be covered in Section 5.  TODO: this discussion of H2 push
   needs to be expanded by people with this use case.

   These use cases assume that the server is a resolver, but this
   protocol can certainly be used in use cases where the server is an
   authoritative server.  Such use cases may be added to this document,
   or may be documented later.

1.2.  Protocol Requirements

   The protocol described here bases its design on the following
   protocol requirements:

   o  The protocol must use HTTP semantics the way that they are
      commonly used in other protocols; there is nothing special about
      the DNS use case.




Hoffman & Hildebrand     Expires April 18, 2017                 [Page 3]

Internet-Draft                 DNS in JSON                  October 2016


   o  The protocol must run over secure transport.

   o  The query format must be able to be flexible enough to express
      every normal DNS query.

   o  The response must be able to be in different formats that can be
      described by different documents.

   o  Both the query format and the response formats must be extensible.
      In specific, a query must be able to contain one or more EDNS
      extensions, including those not yet defined.  Further, it must be
      easy to define different response formats and to extend already-
      defined formats.

   Non-requirements:

   o  Supporting network-specific DNS64 [RFC6147]

   o  Supporting other network-specific inferences from plaintext DNS
      queries

1.3.  Terminology

   In this document, the key words "MUST", "MUST NOT", "REQUIRED",
   "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
   and "OPTIONAL" are to be interpreted as described in BCP 14, RFC 2119
   [RFC2119].

2.  Template

   The URI template (see [RFC6570]) for DNS API queries is:

   {PREFIX}{QNAME}/{QTYPE}

   [I-D.nottingham-json-home] will be evaluated in the future to see if
   the added complexity of including it in the discovery process would
   make for an interesting increase in deployment flexibility.

   The following variables are used to expand the URI template.

2.1.  PREFIX

   "PREFIX" will be a URI fragment, such as "https://example.net/api/".
   The URI protocol MUST be "https:" or "coaps:".  The prefix MUST NOT
   contain the character "?", and MUST be suitable for processing using
   the above template.  Often, this will mean that the template should
   end with a "/" (U+002F: SOLIDUS).




Hoffman & Hildebrand     Expires April 18, 2017                 [Page 4]

Internet-Draft                 DNS in JSON                  October 2016


   The DNS API client discovers the PREFIX for the DNS API through the
   same mechanism as for a DNS resolver: DHCPv4, DHCPv6, IPv6 RA, and
   configuration.  Specific PREFIX discovery mechanisms will be defined
   later, but imagine a new DHCP or RA option that gives a PREFIX.

   If no PREFIX is configured as above, the client MAY query a DNS
   resolver for which they have an IP address.  The query is

      https://<IPADDRESS>/.well_known/TBD1

   If the DNS server knows about API support, the returned URI will be
   the PREFIX.

   The response to this discovery might be multiple PREFIXes.  In that
   case, some of the URI types might not be supported by the resolver;
   this is fine as long as at least one type is.  For example, if a
   discovery query returns both https: and coaps: URI templates, but the
   DNS API client can only generate https: queries, the other URI
   templates are ignored.

   TODO: there are several concerns to be worked out with respect to the
   PREFIX, including how to bootstrap PREFIXes that contain domain
   names, and how to trust TLS connections to PREFIXes that contain only
   IP addresses in a deployable way.  Some ideas might come from RFC
   7858.

   Note: The discovery response may give hints that the DNS API server
   requires a form of HTTP authorization.  The configuration of that
   authorization is out of scope for the DNS API protocol.  TODO: Need
   to think about HTTP authorization mechanisms.  This would allow user
   tracking, but could also free resolvers from having to use IP address
   ranges for filtering.  Several bad ideas are likely here, so let's
   think about it early.

2.2.  QNAME

   The QNAME is adopted from [RFC1035].

   TODO: how to encode non-ASCII domain names.  For IDNs, there are
   several options:

   o  Punycode all labels before sending

   o  Send the UTF8-encoded version after normalization, but before
      Punycoding

   o  Send generic UTF8-encoded labels, and make the server do
      normalization



Hoffman & Hildebrand     Expires April 18, 2017                 [Page 5]

Internet-Draft                 DNS in JSON                  October 2016


   TODO: domain names (not host names) that have values that might cause
   problems in the URI format, such as values that are control
   characters in ASCII, and values greater than 127.

2.3.  QTYPE

   The numerical QTYPE is adopted from [RFC1035].

   TODO: there are some people that want to use the string forms, such
   as "AAAA", perhaps in addition to the numerical form.  To be
   discussed.

2.4.  Additional Parameters

   The following are the names and descriptions of parameters for DNS
   API queries.  All parameters are optional.  DNS header values and
   extensions that are not appropriate for queries are not defined.
   Each parameter in the list below will need to include a use case in a
   later version of this document; this list is a first approximation of
   what may be needed.

   Each of these parameters may be used in a query component of the URI
   sent to the API, to modify the request.

   qc:  QCLASS from [RFC1035] - if omitted, server assumes 1 (IN).
      Might be needed to support legacy DNS classes, or to access
      interesting new DNS capabilities.

   id:  ID from [RFC1035] - if omitted, there is no default value.
      Could be used to track responses.

   opcode:  Opcode from [RFC1035] - if omitted, server assumes 0
      (standard query)

   rd:  RD from [RFC1035] - if omitted, server assumes 1 (recursion
      desired)

   cd:  CD from [RFC4035] - if omitted, server assumes 1 (DNSSec
      checking by the resolver disabled)

   do:  DO from [RFC4035] - if omitted, server assumes 1 (include RRSIG
      RDATA in the response)

   The following are EDNS0 [RFC6891] extensions.  If an extension is
   omitted, the server assumes that the extension was not given in the
   request.





Hoffman & Hildebrand     Expires April 18, 2017                 [Page 6]

Internet-Draft                 DNS in JSON                  October 2016


   nsid:  Request the server's NSID, based on [RFC5001].  Set to "1" to
      enable.

   dau:  Specify the list of signing algorithms understood, based on
      [RFC6975].  The value is a list of integers separated by commas
      (with no spaces).

   dhu:  Specify the list of hash algorithms understood, based on
      [RFC6975].  The value is a list of integers separated by commas
      (with no spaces).

   n3u:  Specify the list of NSEC3 hash algorithms understood, based on
      [RFC6975].  The value is a list of integers separated by commas
      (with no spaces).

   ecs:  Specify the client subnet, based on [RFC7871].  The value is
      the bytes of the ECS option, starting with byte 4, encoded in
      lowercase hexadecimal.

   pad:  Optional padding, used for the same purposes as described in
      [RFC7830].  This can be used to normalize the length of queries.

   See Section 6 for a registry for additional names for queries.

3.  Queries

   To send a DNS query, the DNS API client prepares an HTTP/CoAP GET
   request using the template (see Section 2).  If any additional
   parameters (see Section 2.4) are desired, they are appended to the
   template as if they are HTML form data.  (See Sections 4.10.22.3 and
   4.10.22.4 of [HTMLSPEC] for the full specification of form data.)
   Typically, this is done using a "?"  (U+003F: QUESTION MARK), then
   each parameter specified as a name, "=" (U+003D: EQUALS SIGN), and
   value, each name=value pair separated by a "&" (U+0026: AMPERSAND).
   Each value should be percent-encoded as needed.  The client MUST
   ensure that the resulting URI is valid.

   The HTTP-related requirements include:

   o  The HTTP GET request MUST have no body.

   o  The HTTP GET request SHOULD be sent with an HTTP "Accept:" header
      to say what type of content can be returned; of course, a server
      can return whatever type of content it wants.  If the request does
      not have an HTTP "Accept:" header, the DNS API server might return
      a content type that the DNS API client does not understand.





Hoffman & Hildebrand     Expires April 18, 2017                 [Page 7]

Internet-Draft                 DNS in JSON                  October 2016


   o  The HTTP GET request SHOULD use If-None-Match headers if earlier
      responses to the same query used HTTP ETag headers as described in
      [RFC7232].

   For example, assume that the server's PREFIX is:

      https://dnsserver.example.net/api/v1/

   A query for the A records for "www.example.com" with recursion turned
   off would be:

      https://dnsserver.example.net/api/v1/www.example.com/1?rd=0

   The HTTP request might look like:

      GET api/v1/www.example.com/1?rd=0 HTTP/1.1
      User-Agent: curl/7.16.3 libcurl/7.16.3
      Host: dnsserver.example.net
      Accept: application/dns+json

   This document only defines the semantics of the HTTP/CoAP GET command
   for normal DNS queries and responses.  Other verbs will be defined in
   the future.  Other verbs will likely need different authorization
   semantics.  For example, see [I-D.hildebrand-deth].

4.  Responses

   Different response formats will provide more or less information from
   a DNS response.  For example, one response type might include the
   information from the DNS header bytes while another might omit it.
   The amount and type of information that a response format gives is
   solely up to the format, and not defined in this protocol.

   At the time this is published, the response types are works in
   progress.  The know response types include:

   o  [I-D.hoffman-dns-in-json] describes a response type in JSON

   o  [I-D.song-dns-wireformat-http] describes a response type in DNS
      wire format

   In the HTTP responses, the HTTP cache headers are set to shortest DNS
   TTL in the response.  The HTTP responses SHOULD set the HTTP ETag
   headers as described in [RFC7232].

   TODO: Add more detail about setting the HTTP cache headers.

   TODO: Add examples of creating these ETag headers.



Hoffman & Hildebrand     Expires April 18, 2017                 [Page 8]

Internet-Draft                 DNS in JSON                  October 2016


   Servers conforming to this protocol MUST implement responding with
   messages formatted with [I-D.hoffman-dns-in-json].

5.  Use in HTTP/2

   TODO: Full discussion about using this protocol in HTTP/2 for server
   push.  This will also hopefully cover caching and DNS TTLs.

6.  IANA Considerations

   TODO: Create a new registry for option names for DNS queries.  This
   will be a simple registry for new option names, probably with a
   designated expert.

   TODO: Replace TBD1 in the body with a string from the .well_known
   registry.  Reference [RFC5785].

7.  Security Considerations

   This protocol requires the use of TLS for communication.  If a client
   does not enforce authentication of the TLS server, the communication
   channel will be susceptible to many security problems.  See [RFC7435]
   for a fuller description of non-authenticated TLS.

   TODO: Think about whether cross-origin resource sharing (CORS)
   applies to this protocol and, if so, how to specify it.

8.  Acknowledgements

   Early input to this document came from Mark Nottingham and and
   Patrick McManus.

9.  References

9.1.  Normative References

   [HTMLSPEC]
              W3C, "HTML5, A vocabulary and associated APIs for HTML and
              XHTML", 2016, <https://www.w3.org/TR/html5/>.

   [RFC1035]  Mockapetris, P., "Domain names - implementation and
              specification", STD 13, RFC 1035, DOI 10.17487/RFC1035,
              November 1987, <http://www.rfc-editor.org/info/rfc1035>.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <http://www.rfc-editor.org/info/rfc2119>.



Hoffman & Hildebrand     Expires April 18, 2017                 [Page 9]

Internet-Draft                 DNS in JSON                  October 2016


   [RFC4035]  Arends, R., Austein, R., Larson, M., Massey, D., and S.
              Rose, "Protocol Modifications for the DNS Security
              Extensions", RFC 4035, DOI 10.17487/RFC4035, March 2005,
              <http://www.rfc-editor.org/info/rfc4035>.

   [RFC5246]  Dierks, T. and E. Rescorla, "The Transport Layer Security
              (TLS) Protocol Version 1.2", RFC 5246,
              DOI 10.17487/RFC5246, August 2008,
              <http://www.rfc-editor.org/info/rfc5246>.

   [RFC6570]  Gregorio, J., Fielding, R., Hadley, M., Nottingham, M.,
              and D. Orchard, "URI Template", RFC 6570,
              DOI 10.17487/RFC6570, March 2012,
              <http://www.rfc-editor.org/info/rfc6570>.

   [RFC7230]  Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
              Protocol (HTTP/1.1): Message Syntax and Routing",
              RFC 7230, DOI 10.17487/RFC7230, June 2014,
              <http://www.rfc-editor.org/info/rfc7230>.

   [RFC7232]  Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
              Protocol (HTTP/1.1): Conditional Requests", RFC 7232,
              DOI 10.17487/RFC7232, June 2014,
              <http://www.rfc-editor.org/info/rfc7232>.

9.2.  Informative References

   [I-D.hamilton-early-deployment-quic]
              Hamilton, R., Iyengar, J., Swett, I., and A. Wilk, "QUIC:
              A UDP-Based Secure and Reliable Transport for HTTP/2",
              draft-hamilton-early-deployment-quic-00 (work in
              progress), July 2016.

   [I-D.hildebrand-deth]
              Hildebrand, J. and P. Hoffman, "DNS Editing Through HTTPS
              (DETH)", draft-hildebrand-deth-00 (work in progress),
              March 2016.

   [I-D.hoffman-dns-in-json]
              Hoffman, P., "Representing DNS Messages in JSON", draft-
              hoffman-dns-in-json-09 (work in progress), October 2016.

   [I-D.nottingham-json-home]
              Nottingham, M., "Home Documents for HTTP APIs", draft-
              nottingham-json-home-04 (work in progress), May 2016.






Hoffman & Hildebrand     Expires April 18, 2017                [Page 10]

Internet-Draft                 DNS in JSON                  October 2016


   [I-D.song-dns-wireformat-http]
              Song, L., Vixie, P., Kerr, S., and R. Wan, "DNS wire-
              format over HTTP", draft-song-dns-wireformat-http-04 (work
              in progress), June 2016.

   [RFC5001]  Austein, R., "DNS Name Server Identifier (NSID) Option",
              RFC 5001, DOI 10.17487/RFC5001, August 2007,
              <http://www.rfc-editor.org/info/rfc5001>.

   [RFC5785]  Nottingham, M. and E. Hammer-Lahav, "Defining Well-Known
              Uniform Resource Identifiers (URIs)", RFC 5785,
              DOI 10.17487/RFC5785, April 2010,
              <http://www.rfc-editor.org/info/rfc5785>.

   [RFC6147]  Bagnulo, M., Sullivan, A., Matthews, P., and I. van
              Beijnum, "DNS64: DNS Extensions for Network Address
              Translation from IPv6 Clients to IPv4 Servers", RFC 6147,
              DOI 10.17487/RFC6147, April 2011,
              <http://www.rfc-editor.org/info/rfc6147>.

   [RFC6891]  Damas, J., Graff, M., and P. Vixie, "Extension Mechanisms
              for DNS (EDNS(0))", STD 75, RFC 6891,
              DOI 10.17487/RFC6891, April 2013,
              <http://www.rfc-editor.org/info/rfc6891>.

   [RFC6975]  Crocker, S. and S. Rose, "Signaling Cryptographic
              Algorithm Understanding in DNS Security Extensions
              (DNSSEC)", RFC 6975, DOI 10.17487/RFC6975, July 2013,
              <http://www.rfc-editor.org/info/rfc6975>.

   [RFC7049]  Bormann, C. and P. Hoffman, "Concise Binary Object
              Representation (CBOR)", RFC 7049, DOI 10.17487/RFC7049,
              October 2013, <http://www.rfc-editor.org/info/rfc7049>.

   [RFC7159]  Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
              Interchange Format", RFC 7159, DOI 10.17487/RFC7159, March
              2014, <http://www.rfc-editor.org/info/rfc7159>.

   [RFC7252]  Shelby, Z., Hartke, K., and C. Bormann, "The Constrained
              Application Protocol (CoAP)", RFC 7252,
              DOI 10.17487/RFC7252, June 2014,
              <http://www.rfc-editor.org/info/rfc7252>.

   [RFC7435]  Dukhovni, V., "Opportunistic Security: Some Protection
              Most of the Time", RFC 7435, DOI 10.17487/RFC7435,
              December 2014, <http://www.rfc-editor.org/info/rfc7435>.





Hoffman & Hildebrand     Expires April 18, 2017                [Page 11]

Internet-Draft                 DNS in JSON                  October 2016


   [RFC7540]  Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext
              Transfer Protocol Version 2 (HTTP/2)", RFC 7540,
              DOI 10.17487/RFC7540, May 2015,
              <http://www.rfc-editor.org/info/rfc7540>.

   [RFC7830]  Mayrhofer, A., "The EDNS(0) Padding Option", RFC 7830,
              DOI 10.17487/RFC7830, May 2016,
              <http://www.rfc-editor.org/info/rfc7830>.

   [RFC7871]  Contavalli, C., van der Gaast, W., Lawrence, D., and W.
              Kumari, "Client Subnet in DNS Queries", RFC 7871,
              DOI 10.17487/RFC7871, May 2016,
              <http://www.rfc-editor.org/info/rfc7871>.

Appendix A.  Previous Work on DNS over HTTP or in Other Formats

   The following is a list of earlier work that related to DNS over HTTP
   or representing DNS data in other formats.  It is very likely
   incomplete, but will be expanded as this document progresses.

   The list includes links to the tools.ietf.org site (because these
   documents are all expired) and web sites of software.

   o  https://tools.ietf.org/html/draft-mohan-dns-query-xml

   o  https://tools.ietf.org/html/draft-daley-dnsxml

   o  https://tools.ietf.org/html/draft-dulaunoy-dnsop-passive-dns-cof

   o  https://tools.ietf.org/html/draft-bortzmeyer-dns-json

   o  https://www.nlnetlabs.nl/projects/dnssec-trigger/

Authors' Addresses

   Paul Hoffman
   ICANN

   Email: paul.hoffman@icann.org


   Joe Hildebrand

   Email: hildjj@cursive.net







Hoffman & Hildebrand     Expires April 18, 2017                [Page 12]