| < draft-ietf-dnsop-nsec-aggressiveuse-06.txt | draft-ietf-dnsop-nsec-aggressiveuse-07.txt > | |||
|---|---|---|---|---|
| Network Working Group K. Fujiwara | Network Working Group K. Fujiwara | |||
| Internet-Draft JPRS | Internet-Draft JPRS | |||
| Updates: 4035 (if approved) A. Kato | Updates: 4035 (if approved) A. Kato | |||
| Intended status: Standards Track Keio/WIDE | Intended status: Standards Track Keio/WIDE | |||
| Expires: May 20, 2017 W. Kumari | Expires: June 16, 2017 W. Kumari | |||
| November 16, 2016 | December 13, 2016 | |||
| Aggressive use of NSEC/NSEC3 | Aggressive use of NSEC/NSEC3 | |||
| draft-ietf-dnsop-nsec-aggressiveuse-06 | draft-ietf-dnsop-nsec-aggressiveuse-07 | |||
| Abstract | Abstract | |||
| The DNS relies upon caching to scale; however, the cache lookup | The DNS relies upon caching to scale; however, the cache lookup | |||
| generally requires an exact match. This document specifies the use | generally requires an exact match. This document specifies the use | |||
| of NSEC/NSEC3 resource records to allow DNSSEC validating resolvers | of NSEC/NSEC3 resource records to allow DNSSEC validating resolvers | |||
| to generate negative answers within a range, and positive answers | to generate negative answers within a range, and positive answers | |||
| from wildcards. This increases performance / decreases latency, | from wildcards. This increases performance / decreases latency, | |||
| decreases resource utilization on both authoritative and recursive | decreases resource utilization on both authoritative and recursive | |||
| servers, and also increases privacy. It may also help increase | servers, and also increases privacy. It may also help increase | |||
| resilience to certain DoS attacks in some circumstances. | resilience to certain DoS attacks in some circumstances. | |||
| This document updates RFC4035 by allowing validating resolvers to | This document updates RFC4035 by allowing validating resolvers to | |||
| generate negative based upon NSEC/NSEC3 records (and positive answers | generate negative answers based upon NSEC/NSEC3 records (and positive | |||
| in the presence of wildcards). | answers in the presence of wildcards). | |||
| [ Ed note: Text inside square brackets ([]) is additional background | [ Ed note: Text inside square brackets ([]) is additional background | |||
| information, answers to frequently asked questions, general musings, | information, answers to frequently asked questions, general musings, | |||
| etc. They will be removed before publication.This document is being | etc. They will be removed before publication.This document is being | |||
| collaborated on in Github at: https://github.com/wkumari/draft-ietf- | collaborated on in Github at: https://github.com/wkumari/draft-ietf- | |||
| dnsop-nsec-aggressiveuse. The most recent version of the document, | dnsop-nsec-aggressiveuse. The most recent version of the document, | |||
| open issues, etc should all be available here. The authors | open issues, etc should all be available here. The authors | |||
| (gratefully) accept pull requests.] | (gratefully) accept pull requests.] | |||
| Status of This Memo | Status of This Memo | |||
| skipping to change at page 2, line 7 ¶ | skipping to change at page 2, line 7 ¶ | |||
| 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 May 20, 2017. | This Internet-Draft will expire on June 16, 2017. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2016 IETF Trust and the persons identified as the | Copyright (c) 2016 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 | |||
| skipping to change at page 2, line 30 ¶ | skipping to change at page 2, line 30 ¶ | |||
| 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 | |||
| 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 3. Problem Statement . . . . . . . . . . . . . . . . . . . . . . 3 | 3. Problem Statement . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 4. Background . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 4. Background . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 5. Aggressive use of Cache . . . . . . . . . . . . . . . . . . . 5 | 5. Aggressive use of Cache . . . . . . . . . . . . . . . . . . . 6 | |||
| 5.1. NSEC . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 5.1. NSEC . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 5.2. NSEC3 . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 5.2. NSEC3 . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 5.3. Wildcards . . . . . . . . . . . . . . . . . . . . . . . . 6 | 5.3. Wildcards . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 5.4. Consideration on TTL . . . . . . . . . . . . . . . . . . 7 | 5.4. Consideration on TTL . . . . . . . . . . . . . . . . . . 7 | |||
| 6. Benefits . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 6. Benefits . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 7. Update to RFC 4035 . . . . . . . . . . . . . . . . . . . . . 8 | 7. Update to RFC 4035 . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 8 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 9. Security Considerations . . . . . . . . . . . . . . . . . . . 9 | 9. Security Considerations . . . . . . . . . . . . . . . . . . . 9 | |||
| 10. Implementation Status . . . . . . . . . . . . . . . . . . . . 9 | 10. Implementation Status . . . . . . . . . . . . . . . . . . . . 9 | |||
| 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 9 | 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 11.1. Change History . . . . . . . . . . . . . . . . . . . . . 10 | 11.1. Change History . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 11.1.1. Version draft-fujiwara-dnsop-nsec-aggressiveuse-01 . 12 | 11.1.1. Version draft-fujiwara-dnsop-nsec-aggressiveuse-01 . 13 | |||
| 11.1.2. Version draft-fujiwara-dnsop-nsec-aggressiveuse-02 . 13 | 11.1.2. Version draft-fujiwara-dnsop-nsec-aggressiveuse-02 . 13 | |||
| 11.1.3. Version draft-fujiwara-dnsop-nsec-aggressiveuse-03 . 13 | 11.1.3. Version draft-fujiwara-dnsop-nsec-aggressiveuse-03 . 13 | |||
| 11.2. new section . . . . . . . . . . . . . . . . . . . . . . 13 | 11.2. new section . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 13 | 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 12.1. Normative References . . . . . . . . . . . . . . . . . . 13 | 12.1. Normative References . . . . . . . . . . . . . . . . . . 13 | |||
| 12.2. Informative References . . . . . . . . . . . . . . . . . 14 | 12.2. Informative References . . . . . . . . . . . . . . . . . 14 | |||
| Appendix A. Detailed implementation notes . . . . . . . . . . . 14 | Appendix A. Detailed implementation notes . . . . . . . . . . . 14 | |||
| Appendix B. Procedure for determining ENT vs NXDOMAN . . . . . . 15 | Appendix B. Procedure for determining ENT vs NXDOMAN with NSEC . 15 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 16 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 1. Introduction | 1. Introduction | |||
| A DNS negative cache exists, and is used to cache the fact that a | A DNS negative cache exists, and is used to cache the fact that an | |||
| name does not exist. This method of negative caching requires exact | RRset does not exist. This method of negative caching requires exact | |||
| matching; this leads to unnecessary additional lookups, increases | matching; this leads to unnecessary additional lookups, increases | |||
| latency, leads to extra resource utilization on both authoritative | latency, leads to extra resource utilization on both authoritative | |||
| and recursive servers, and decreases privacy by leaking queries. | and recursive servers, and decreases privacy by leaking queries. | |||
| This document updates RFC 4035 to allow recursive resolvers to use | This document updates RFC 4035 to allow recursive resolvers to use | |||
| NSEC/NSEC3 resource records to synthesize negative answers from the | NSEC/NSEC3 resource records to synthesize negative answers from the | |||
| information they have in the cache. This allows validating resolvers | information they have in the cache. This allows validating resolvers | |||
| to respond with NXDOMAIN immediately if the name in question falls | to respond with a negative answer immediately if the name in question | |||
| into a range expressed by a NSEC/NSEC3 resource record already in the | falls into a range expressed by a NSEC/NSEC3 resource record already | |||
| cache. It also allows the synthesis of positive answers in the | in the cache. It also allows the synthesis of positive answers in | |||
| presence of wildcard records. | the presence of wildcard records. | |||
| Aggressive Negative Caching was first proposed in Section 6 of DNSSEC | Aggressive Negative Caching was first proposed in Section 6 of DNSSEC | |||
| Lookaside Validation (DLV) [RFC5074] in order to find covering NSEC | Lookaside Validation (DLV) [RFC5074] in order to find covering NSEC | |||
| records efficiently. | records efficiently. | |||
| [RFC8020] proposes a first step to using NXDOMAIN information for | [RFC8020], and [I-D.vixie-dnsext-resimprove] proposes first steps to | |||
| more effective caching. This takes this technique further. | using NXDOMAIN information for more effective caching. This takes | |||
| this technique further. | ||||
| 2. Terminology | 2. Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
| Many of the specialized terms used in this document are defined in | Many of the specialized terms used in this document are defined in | |||
| DNS Terminology [RFC7719]. | DNS Terminology [RFC7719]. | |||
| The key words "Closest Encloser" and "Source of Synthesis" in this | The key words "Source of Synthesis" in this document are to be | |||
| document are to be interpreted as described in [RFC4592]. | interpreted as described in [RFC4592]. | |||
| "Closest Encloser" is also defined in NSEC3 [RFC5155], as is "Next | ||||
| closer name". | ||||
| 3. Problem Statement | 3. Problem Statement | |||
| The DNS negative cache caches negative (non-existent) information, | The DNS negative cache caches negative (non-existent) information, | |||
| and requires an exact match in most instances [RFC2308]. | and requires an exact match in most instances [RFC2308]. | |||
| Assume that the (DNSSEC signed) "example.com" zone contains: | Assume that the (DNSSEC signed) "example.com" zone contains: | |||
| albatross.example.com IN A 192.0.2.1 | albatross.example.com IN A 192.0.2.1 | |||
| elephant.example.com IN A 192.0.2.2 | elephant.example.com IN A 192.0.2.2 | |||
| zebra.example.com IN A 192.0.2.3 | zebra.example.com IN A 192.0.2.3 | |||
| If a validating resolver receives a query for cat.example.com, it | If a validating resolver receives a query for cat.example.com, it | |||
| contacts its resolver (which may be itself) to query the example.com | contacts its resolver (which may be itself) to query the example.com | |||
| servers and will get back an NSEC record starting that there are no | servers and will get back an NSEC record stating that there are no | |||
| records (alphabetically) between albatross and elephant, or an NSEC3 | records (alphabetically) between albatross and elephant, or an NSEC3 | |||
| record stating there is nothing between two hashed names. The | record stating there is nothing between two hashed names. The | |||
| resolver then knows that cat.example.com does not exist; however, it | resolver then knows that cat.example.com does not exist; however, it | |||
| does not use the fact that the proof covers a range (albatross to | does not use the fact that the proof covers a range (albatross to | |||
| elephant) to suppress queries for other labels that fall within this | elephant) to suppress queries for other labels that fall within this | |||
| range. This means that if the validating resolver gets a query for | range. This means that if the validating resolver gets a query for | |||
| ball.example.com (or dog.example.com) it will once again go off and | ball.example.com (or dog.example.com) it will once again go off and | |||
| query the example.com servers for these names. | query the example.com servers for these names. | |||
| Apart from wasting bandwidth, this also wastes resources on the | Apart from wasting bandwidth, this also wastes resources on the | |||
| recursive server (it needs to keep state for outstanding queries), | recursive server (it needs to keep state for outstanding queries), | |||
| wastes resources on the authoritative server (it has to answer | wastes resources on the authoritative server (it has to answer | |||
| additional questions), increases latency (the end user has to wait | additional questions), increases latency (the end user has to wait | |||
| longer than necessary to get back an NXDOMAIN answer), can be used by | longer than necessary to get back an NXDOMAIN answer), can be used by | |||
| attackers to cause a DoS (see additional resources), and also has | attackers to cause a DoS (see additional resources), and also has | |||
| privacy implications (e.g: typos leak out further than necessary). | privacy implications (e.g: typos leak out further than necessary). | |||
| Now, assume that the (DNSSEC signed) "example.org" zone contains: | Another example: assume that the (DNSSEC signed) "example.org" zone | |||
| contains: | ||||
| avocado.example.org IN A 192.0.2.1 | avocado.example.org IN A 192.0.2.1 | |||
| *.example.org IN A 192.0.2.2 | *.example.org IN A 192.0.2.2 | |||
| zucchini.example.org IN A 192.0.2.3 | zucchini.example.org IN A 192.0.2.3 | |||
| If a query is received for leek.example.org, it contacts its resolver | If a query is received for leek.example.org, it contacts its resolver | |||
| (which may be itself) to query the example.org servers and will get | (which may be itself) to query the example.org servers and will get | |||
| back an NSEC record stating that there are no records | back an NSEC record stating that there are no records | |||
| (alphabetically) between avocado and zucchini (or an NSEC3 record | (alphabetically) between avocado and zucchini (or an NSEC3 record | |||
| stating there is nothing between two hashed names), as well as an | stating there is nothing between two hashed names), as well as an | |||
| answer for leek.example.org, with the label count of the signature | answer for leek.example.org, with the label count of the signature | |||
| set to two (see [RFC7129], section 5.3 for more details). | set to two (see [RFC7129], section 5.3 for more details). | |||
| If the validating resolver gets a query for banana.example.org it | If the validating resolver gets a query for banana.example.org it | |||
| will once again go off and query the example.com servers for | will once again go off and query the example.org servers for | |||
| banana.example.com (even though it already has proof that there is a | banana.example.org (even though it already has proof that there is a | |||
| wildcard record) - just like above, this has privacy implications, | wildcard record) - just like above, this has privacy implications, | |||
| wastes resources, can be used to contribute to a DoS, etc. | wastes resources, can be used to contribute to a DoS, etc. | |||
| 4. Background | 4. Background | |||
| DNSSEC [RFC4035] and [RFC5155] both provide "authenticated denial of | DNSSEC [RFC4035] and [RFC5155] both provide "authenticated denial of | |||
| existence"; this is a cryptographic proof that the queried for name | existence"; this is a cryptographic proof that the queried for name | |||
| does not exist, accomplished by providing a (DNSSEC secured) record | does not exist or type does not exist. Proof that a name does not | |||
| exist is accomplished by providing a (DNSSEC secured) record | ||||
| containing the names which appear alphabetically before and after the | containing the names which appear alphabetically before and after the | |||
| queried for name. In the first example above, if the (DNSSEC | queried for name. In the first example above, if the (DNSSEC | |||
| validating) recursive server were to query for dog.example.com it | validating) recursive server were to query for dog.example.com it | |||
| would receive a (signed) NSEC record stating that there are no labels | would receive a (signed) NSEC record stating that there are no labels | |||
| between "albatross" and "elephant" (or, for NSEC3, a similar pair of | between "albatross" and "elephant" (or, for NSEC3, a similar pair of | |||
| hashed names). This is a signed, cryptographic proof that these | hashed names). This is a signed, cryptographic proof that these | |||
| names are the ones before and after the queried for label. As | names are the ones before and after the queried for label. As | |||
| dog.example.com falls within this range, the recursive server knows | dog.example.com falls within this range, the recursive server knows | |||
| that dog.example.com really does not exist. | that dog.example.com really does not exist. Proof that a type does | |||
| not exist is accomplished by providing a (DNSSEC secured) record | ||||
| containing the queried for name, and a type bitmap which does not | ||||
| include the requested type. | ||||
| This document specifies that this NSEC/NSEC3 record should be used to | This document specifies that this NSEC/NSEC3 record should be used to | |||
| generate negative answers for any queries that the validating server | generate negative answers for any queries that the validating server | |||
| receives that fall within the range covered by the record (for the | receives that fall within the range covered by the record (for the | |||
| TTL for the record). This document also specifies that a positive | TTL for the record). This document also specifies that a positive | |||
| answer should be generated for any queries that the validating server | answer should be generated for any queries that the validating server | |||
| receives that are proven to be covered by a wildcard record. | receives that are proven to be covered by a wildcard record. | |||
| Section 4.5 of [RFC4035] says: | Section 4.5 of [RFC4035] says: | |||
| skipping to change at page 5, line 34 ¶ | skipping to change at page 5, line 39 ¶ | |||
| synthesizing new data on their own. Resolvers that follow this | synthesizing new data on their own. Resolvers that follow this | |||
| recommendation will have a more consistent view of the namespace." | recommendation will have a more consistent view of the namespace." | |||
| and "The reason for these recommendations is that, between the | and "The reason for these recommendations is that, between the | |||
| initial query and the expiration of the data from the cache, the | initial query and the expiration of the data from the cache, the | |||
| authoritative data might have been changed (for example, via dynamic | authoritative data might have been changed (for example, via dynamic | |||
| update).". In other words, if a resolver generates negative answers | update).". In other words, if a resolver generates negative answers | |||
| from an NSEC record, it will not send any queries for names within | from an NSEC record, it will not send any queries for names within | |||
| that NSEC range (for the TTL). If a new name is added to the zone | that NSEC range (for the TTL). If a new name is added to the zone | |||
| during this interval the resolver will not know this. Similarly, if | during this interval the resolver will not know this. Similarly, if | |||
| the resolver is generating responses from a wildcard record, it will | the resolver is generating responses from a wildcard record, it will | |||
| continue to do so (for the | continue to do so (for the TTL). | |||
| We believe this recommendation can be relaxed because, in the absense | We believe this recommendation can be relaxed because, in the absence | |||
| of this technique, a lookup for the exact name could have come in | of this technique, a lookup for the exact name could have come in | |||
| during this interval, and so a negative answer could already be | during this interval, and so a negative answer could already be | |||
| cached (see [RFC2308] for more background). This means that zone | cached (see [RFC2308] for more background). This means that zone | |||
| operators should have no expectation that an added name would work | operators should have no expectation that an added name would work | |||
| immediately. With DNSSEC and Aggressive NSEC, the TTL of the NSEC | immediately. With DNSSEC and Aggressive NSEC, the TTL of the NSEC/ | |||
| record is the authoritative statement of how quickly a name can start | NSEC3 record and the SOA.MINIMUM field are the authoritative | |||
| working within a zone. | statement of how quickly a name can start working within a zone. | |||
| 5. Aggressive use of Cache | 5. Aggressive use of Cache | |||
| Section 4.5 of [RFC4035] says that "In theory, a resolver could use | Section 4.5 of [RFC4035] says that "In theory, a resolver could use | |||
| wildcards or NSEC RRs to generate positive and negative responses | wildcards or NSEC RRs to generate positive and negative responses | |||
| (respectively) until the TTL or signatures on the records in question | (respectively) until the TTL or signatures on the records in question | |||
| expire. However, it seems prudent for resolvers to avoid blocking | expire. However, it seems prudent for resolvers to avoid blocking | |||
| new authoritative data or synthesizing new data on their own. | new authoritative data or synthesizing new data on their own. | |||
| Resolvers that follow this recommendation will have a more consistent | Resolvers that follow this recommendation will have a more consistent | |||
| view of the namespace". This document relaxes this this restriction, | view of the namespace". This document relaxes this this restriction, | |||
| see Section 7 for more detail. | see Section 7 for more detail. | |||
| If the negative cache of the validating resolver has sufficient | If the negative cache of the validating resolver has sufficient | |||
| information to validate the query, the resolver SHOULD use NSEC, | information to validate the query, the resolver SHOULD use NSEC, | |||
| NSEC3 and wildcard records aggressively. Otherwise, it MUST fall | NSEC3 and wildcard records aggressively. Otherwise, it MUST fall | |||
| back to send the query to the authoritative DNS servers. | back to send the query to the authoritative DNS servers. | |||
| It is recommended that resolvers that implement Aggressive Negative | ||||
| Caching provide a configuration switch to disable the feature. | ||||
| Separate configuration switches may be implemented for the aggressive | ||||
| use of NSEC, NSEC3 and wildcard records, and it is recommended to | ||||
| enable aggressive negative caching by default. | ||||
| 5.1. NSEC | 5.1. NSEC | |||
| The validating resolver needs to check the existence of an NSEC RR | The validating resolver needs to check the existence of an NSEC RR | |||
| matching/covering the source of synthesis and an NSEC RR covering the | matching/covering the source of synthesis and an NSEC RR covering the | |||
| query name. | query name. | |||
| If denial of existence can be determined according to the rules set | If denial of existence can be determined according to the rules set | |||
| out in Section 5.4 of [RFC4035], using NSEC records in the cache, | out in Section 5.4 of [RFC4035], using NSEC records in the cache, | |||
| then the resolver can immediately return an NXDOMAIN or NODATA (as | then the resolver can immediately return an NXDOMAIN or NODATA (as | |||
| appropriate) response. | appropriate) response. | |||
| skipping to change at page 7, line 10 ¶ | skipping to change at page 7, line 10 ¶ | |||
| The last paragraph of [RFC4035] Section 4.5 also discusses the use of | The last paragraph of [RFC4035] Section 4.5 also discusses the use of | |||
| wildcards and NSEC RRs to generate positive responses and recommends | wildcards and NSEC RRs to generate positive responses and recommends | |||
| that it not be relied upon. Just like the case for the aggressive | that it not be relied upon. Just like the case for the aggressive | |||
| use of NSEC/NSEC3 for negative answers, we revise this | use of NSEC/NSEC3 for negative answers, we revise this | |||
| recommendation. | recommendation. | |||
| As long as the validating resolver can determine that a name would | As long as the validating resolver can determine that a name would | |||
| not exist without the wildcard match, determined according to the | not exist without the wildcard match, determined according to the | |||
| rules set out in Section 5.3.4 of [RFC4035] (NSEC), or in Section 8.8 | rules set out in Section 5.3.4 of [RFC4035] (NSEC), or in Section 8.8 | |||
| of [RFC5155], it SHOULD synthesize an answer for that name using the | of [RFC5155], it SHOULD synthesize an answer (or NODATA response) for | |||
| cached deduced wildcard. If the corresponding wildcard record is not | that name using the cached deduced wildcard. If the corresponding | |||
| in the cache, it MUST fall back to send the query to the | wildcard record is not in the cache, it MUST fall back to send the | |||
| authoritative DNS servers. | query to the authoritative DNS servers. | |||
| 5.4. Consideration on TTL | 5.4. Consideration on TTL | |||
| The TTL value of negative information is especially important, | The TTL value of negative information is especially important, | |||
| because newly added domain names cannot be used while the negative | because newly added domain names cannot be used while the negative | |||
| information is effective. | information is effective. | |||
| Section 5 of [RFC2308] states that the maximum number of negative | Section 5 of [RFC2308] states that the maximum number of negative | |||
| cache TTL value is 3 hours (10800). It is RECOMMENDED that | cache TTL value is 3 hours (10800). It is RECOMMENDED that | |||
| validating resolvers limit the maximum effective TTL value of | validating resolvers limit the maximum effective TTL value of | |||
| negative responses (NSEC/NSEC3 RRs) to this same value. | negative responses (NSEC/NSEC3 RRs) to this same value. | |||
| Section 5 of [RFC2308]also states that a negative cache entry TTL is | Section 5 of [RFC2308] also states that a negative cache entry TTL is | |||
| taken from the minimum of the SOA.MINIMUM field and SOA's TTL. This | taken from the minimum of the SOA.MINIMUM field and SOA's TTL. This | |||
| can be less than the TTL of an NSEC or NSEC3 record, since their TTL | can be less than the TTL of an NSEC or NSEC3 record, since their TTL | |||
| is equal to the SOA.MINIMUM field (see [RFC4035]section 2.3 and | is equal to the SOA.MINIMUM field (see [RFC4035]section 2.3 and | |||
| [RFC5155] section 3.) | [RFC5155] section 3.) | |||
| A resolver that supports aggressive use of NSEC and NSEC3 should | A resolver that supports aggressive use of NSEC and NSEC3 SHOULD | |||
| reduce the TTL of NSEC and NSEC3 records to match the SOA.MINIMUM | reduce the TTL of NSEC and NSEC3 records to match the SOA.MINIMUM | |||
| field in the authority section of a negative response, if SOA.MINIMUM | field in the authority section of a negative response, if SOA.MINIMUM | |||
| is smaller. | is smaller. | |||
| 6. Benefits | 6. Benefits | |||
| The techniques described in this document provide a number of | The techniques described in this document provide a number of | |||
| benefits, including (in no specific order): | benefits, including (in no specific order): | |||
| Reduced latency: By answering directly from cache, validating | Reduced latency: By answering directly from cache, validating | |||
| resolvers can immediately inform clients that the name they are | resolvers can immediately inform clients that the name they are | |||
| looking for does not exist, improving the user experience. | looking for does not exist, improving the user experience. | |||
| Decreased recursive server load: By answering queries from the cache | Decreased recursive server load: By answering queries from the cache | |||
| by synthesizing answers, validating servers avoid having to send a | by synthesizing answers, validating servers avoid having to send a | |||
| query and wait for a response. In addition to decreasing the | query and wait for a response. In addition to decreasing the | |||
| bandwidth used, it also means that the server does not need to | bandwidth used, it also means that the server does not need to | |||
| allocate and maintain state, thereby decreasing memory and CPU | allocate and maintain state, thereby decreasing memory and CPU | |||
| load. | load. | |||
| Decreased authorative server load: Because recursive servers can | Decreased authoritative server load: Because recursive servers can | |||
| answer queries without asking the authoritative server, the | answer queries without asking the authoritative server, the | |||
| authoritative servers receive fewer queries. This decreases the | authoritative servers receive fewer queries. This decreases the | |||
| authoritative server bandwidth, queries per second and CPU | authoritative server bandwidth, queries per second and CPU | |||
| utilization. | utilization. | |||
| The scale of the benefit depends upon multiple factors, including the | The scale of the benefit depends upon multiple factors, including the | |||
| query distribution. For example, at the time of this writing, around | query distribution. For example, at the time of this writing, around | |||
| 65% of queries to Root Name servers result in NXDOMAIN responses (see | 65% of queries to Root Name servers result in NXDOMAIN responses (see | |||
| statistics from [root-servers.org]); this technique will eliminate a | statistics from [root-servers.org]); this technique will eliminate a | |||
| sizable quantity of these. | sizable quantity of these. | |||
| skipping to change at page 8, line 28 ¶ | skipping to change at page 8, line 28 ¶ | |||
| "random QNAME attacks", in which attackers send many queries for | "random QNAME attacks", in which attackers send many queries for | |||
| random sub-domains to resolvers. As the resolver will not have the | random sub-domains to resolvers. As the resolver will not have the | |||
| answers cached, it has to ask external servers for each random query, | answers cached, it has to ask external servers for each random query, | |||
| leading to a DoS on the authoritative servers (and often resolvers). | leading to a DoS on the authoritative servers (and often resolvers). | |||
| Aggressive NSEC may help mitigate these attacks by allowing the | Aggressive NSEC may help mitigate these attacks by allowing the | |||
| resolver to answer directly from cache for any random queries which | resolver to answer directly from cache for any random queries which | |||
| fall within already requested ranges. It will not always work as an | fall within already requested ranges. It will not always work as an | |||
| effective defense, not least because not many zones are DNSSEC signed | effective defense, not least because not many zones are DNSSEC signed | |||
| at all -- but it will still provide an additional layer of defense. | at all -- but it will still provide an additional layer of defense. | |||
| As these benefits are only accrued by those using DNSSEC, it is hoped | ||||
| that these techniques will lead to more DNSSEC deployment. | ||||
| 7. Update to RFC 4035 | 7. Update to RFC 4035 | |||
| Section 4.5 of [RFC4035] shows that "In theory, a resolver could use | Section 4.5 of [RFC4035] shows that "In theory, a resolver could use | |||
| wildcards or NSEC RRs to generate positive and negative responses | wildcards or NSEC RRs to generate positive and negative responses | |||
| (respectively) until the TTL or signatures on the records in question | (respectively) until the TTL or signatures on the records in question | |||
| expire. However, it seems prudent for resolvers to avoid blocking | expire. However, it seems prudent for resolvers to avoid blocking | |||
| new authoritative data or synthesizing new data on their own. | new authoritative data or synthesizing new data on their own. | |||
| Resolvers that follow this recommendation will have a more consistent | Resolvers that follow this recommendation will have a more consistent | |||
| view of the namespace". | view of the namespace". | |||
| The paragraph is updated as follows: | The paragraph is updated as follows: | |||
| +--------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| | Once the records are validated, DNSSEC enabled validating | | | Once the records are validated, DNSSEC enabled validating | | |||
| | resolvers MAY use wildcards and NSEC/NSEC3 resource records | | | resolvers SHOULD use wildcards and NSEC/NSEC3 resource records | | |||
| | to generate positive and negative responses until the | | | to generate positive and negative responses until the | | |||
| | effective TTLs or signatures for those records expire. | | | effective TTLs or signatures for those records expire. | | |||
| +--------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| 8. IANA Considerations | 8. IANA Considerations | |||
| This document has no IANA actions. | This document has no IANA actions. | |||
| 9. Security Considerations | 9. Security Considerations | |||
| Use of NSEC / NSEC3 resource records without DNSSEC validation may | Use of NSEC / NSEC3 resource records without DNSSEC validation may | |||
| create serious security issues, and so this technique requires DNSSEC | create serious security issues, and so this technique requires DNSSEC | |||
| validation. | validation. | |||
| Newly registered resource records may not be used immediately. | Newly registered resource records may not be used immediately. | |||
| However, choosing suitable TTL value and negative cache TTL value | However, choosing suitable TTL value and negative cache TTL value | |||
| (SOA MINIMUM field) will mitigate the delay concern, and it is not a | (SOA MINIMUM field) will mitigate the delay concern, and it is not a | |||
| security problem. | security problem. | |||
| It is also suggested to limit the maximum TTL value of NSEC / NSEC3 | It is also suggested to limit the maximum TTL value of NSEC / NSEC3 | |||
| resource records in the negative cache to, for example, 10800 seconds | resource records in the negative cache to, for example, 10800 seconds | |||
| (3hrs), to mitigate this issue. Implementations which comply with | (3hrs), to mitigate this issue. | |||
| this proposal are recommended to have a configurable maximum value of | ||||
| NSEC RRs in the negative cache. | ||||
| Although the TTL of NSEC/NSEC3 records is typically fairly short | Although the TTL of NSEC/NSEC3 records is typically fairly short | |||
| (minutes or hours), their RRSIG expiration time can be much further | (minutes or hours), their RRSIG expiration time can be much further | |||
| in the future (weeks). An attacker who is able to successfully spoof | in the future (weeks). An attacker who is able to successfully spoof | |||
| responses might poison a cache with old NSEC/NSEC3 records. If the | responses might poison a cache with old NSEC/NSEC3 records. If the | |||
| resolver is NOT making aggressive use of NSEC/NSEC3, the attacker has | resolver is NOT making aggressive use of NSEC/NSEC3, the attacker has | |||
| to repeat the attack for every query. If the resolver IS making | to repeat the attack for every query. If the resolver IS making | |||
| aggressive use of NSEC/NSEC3, one successful attack would be able to | aggressive use of NSEC/NSEC3, one successful attack would be able to | |||
| suppress many queries for new names, up to the negative TTL. | suppress many queries for new names, up to the negative TTL. | |||
| skipping to change at page 9, line 45 ¶ | skipping to change at page 9, line 47 ¶ | |||
| it is inappropriate for inclusion in a published RFC." ] | it is inappropriate for inclusion in a published RFC." ] | |||
| Unbound currently implements aggressive negative caching, as does | Unbound currently implements aggressive negative caching, as does | |||
| Google Public DNS. | Google Public DNS. | |||
| 11. Acknowledgments | 11. Acknowledgments | |||
| The authors gratefully acknowledge DLV [RFC5074] author Samuel Weiler | The authors gratefully acknowledge DLV [RFC5074] author Samuel Weiler | |||
| and the Unbound developers. | and the Unbound developers. | |||
| Thanks to Mark Andrews for providing the helpful notes for | ||||
| implementors provided in Appendix B. | ||||
| The authors would like to specifically thank Stephane Bortzmeyer (for | The authors would like to specifically thank Stephane Bortzmeyer (for | |||
| standing next to and helping edit), Tony Finch, Tatuya JINMEI for | standing next to and helping edit), Ralph Dolmans, Tony Finch, Tatuya | |||
| extensive review and comments, and also Mark Andrews, Casey Deccio, | JINMEI for extensive review and comments, and also Mark Andrews, | |||
| Alexander Dupuy, Olafur Gudmundsson, Bob Harold, Shumon Huque, John | Casey Deccio, Alexander Dupuy, Olafur Gudmundsson, Bob Harold, Shumon | |||
| Levine, Pieter Lexis and Matthijs Mekking (who even sent pull | Huque, John Levine, Pieter Lexis, Matthijs Mekking (who even sent | |||
| requests!). Mark Andrews also provided the text | pull requests!) and Ondrej Sury. Mark Andrews also provided the | |||
| (https://www.ietf.org/mail-archive/web/dnsop/current/msg18332.html) | helpful notes for implementors (https://www.ietf.org/mail- | |||
| which we made into Appendix B. | archive/web/dnsop/current/msg18332.html) which we made into | |||
| Appendix B. | ||||
| 11.1. Change History | 11.1. Change History | |||
| RFC Editor: Please remove this section prior to publication. | RFC Editor: Please remove this section prior to publication. | |||
| -05 to -06: | -05 to -06: | |||
| o Moved some dangling text around - when the examples were added | o Moved some dangling text around - when the examples were added | |||
| some text added in the wrong place. | some text added in the wrong place. | |||
| o There were some bits which mentioned "negative" in the title. | o There were some bits which mentioned "negative" in the title. | |||
| o We had the cut-and-paste of what changed in 4035 twice. | o We had the cut-and-paste of what changed in 4035 twice. | |||
| o Clarified that this also allows NODATA responses to be | ||||
| synthesized. | ||||
| -04 to -05: | -04 to -05: | |||
| o Bob pointed out that I did a stupid - when I added the wildcard to | o Bob pointed out that I did a stupid - when I added the wildcard to | |||
| 'example.com' I made the example wrong / confusing. I have | 'example.com' I made the example wrong / confusing. I have | |||
| attempted to fix this by adding a second example zone | attempted to fix this by adding a second example zone | |||
| (example.org) with the wildcard instead. | (example.org) with the wildcard instead. | |||
| o More helpful changes (in a pull request, thanks!) from Matthijs | o More helpful changes (in a pull request, thanks!) from Matthijs | |||
| o Included Mark Andrew's useful explanation of how to tell ENT from | o Included Mark Andrew's useful explanation of how to tell ENT from | |||
| skipping to change at page 14, line 24 ¶ | skipping to change at page 14, line 33 ¶ | |||
| [RFC7129] Gieben, R. and W. Mekking, "Authenticated Denial of | [RFC7129] Gieben, R. and W. Mekking, "Authenticated Denial of | |||
| Existence in the DNS", RFC 7129, DOI 10.17487/RFC7129, | Existence in the DNS", RFC 7129, DOI 10.17487/RFC7129, | |||
| February 2014, <http://www.rfc-editor.org/info/rfc7129>. | February 2014, <http://www.rfc-editor.org/info/rfc7129>. | |||
| [RFC7719] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | [RFC7719] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | |||
| Terminology", RFC 7719, DOI 10.17487/RFC7719, December | Terminology", RFC 7719, DOI 10.17487/RFC7719, December | |||
| 2015, <http://www.rfc-editor.org/info/rfc7719>. | 2015, <http://www.rfc-editor.org/info/rfc7719>. | |||
| 12.2. Informative References | 12.2. Informative References | |||
| [I-D.ietf-dnsop-nxdomain-cut] | ||||
| Bortzmeyer, S. and S. Huque, "NXDOMAIN really means there | ||||
| is nothing underneath", draft-ietf-dnsop-nxdomain-cut-03 | ||||
| (work in progress), May 2016. | ||||
| [I-D.vixie-dnsext-resimprove] | [I-D.vixie-dnsext-resimprove] | |||
| Vixie, P., Joffe, R., and F. Neves, "Improvements to DNS | Vixie, P., Joffe, R., and F. Neves, "Improvements to DNS | |||
| Resolvers for Resiliency, Robustness, and Responsiveness", | Resolvers for Resiliency, Robustness, and Responsiveness", | |||
| draft-vixie-dnsext-resimprove-00 (work in progress), June | draft-vixie-dnsext-resimprove-00 (work in progress), June | |||
| 2010. | 2010. | |||
| [RFC8020] Bortzmeyer, S. and S. Huque, "NXDOMAIN: There Really Is | [RFC8020] Bortzmeyer, S. and S. Huque, "NXDOMAIN: There Really Is | |||
| Nothing Underneath", RFC 8020, DOI 10.17487/RFC8020, | Nothing Underneath", RFC 8020, DOI 10.17487/RFC8020, | |||
| November 2016, <http://www.rfc-editor.org/info/rfc8020>. | November 2016, <http://www.rfc-editor.org/info/rfc8020>. | |||
| skipping to change at page 15, line 6 ¶ | skipping to change at page 15, line 10 ¶ | |||
| o Previously, cached negative responses were indexed by QNAME, | o Previously, cached negative responses were indexed by QNAME, | |||
| QCLASS, QTYPE, and the setting of the CD bit (see RFC 4035, | QCLASS, QTYPE, and the setting of the CD bit (see RFC 4035, | |||
| Section 4.7), and only queries matching the index key would be | Section 4.7), and only queries matching the index key would be | |||
| answered from the cache. With aggressive negative caching, the | answered from the cache. With aggressive negative caching, the | |||
| validator, in addition to checking to see if the answer is in its | validator, in addition to checking to see if the answer is in its | |||
| cache before sending a query, checks to see whether any cached and | cache before sending a query, checks to see whether any cached and | |||
| validated NSEC record denies the existence of the sought | validated NSEC record denies the existence of the sought | |||
| record(s). Using aggressive negative caching, a validator will | record(s). Using aggressive negative caching, a validator will | |||
| not make queries for any name covered by a cached and validated | not make queries for any name covered by a cached and validated | |||
| NSEC record. Furthermore, a validator answering queries from | NSEC record. Furthermore, a validator answering queries from | |||
| clients will synthesize a negative answer whenever it has an | clients will synthesize a negative answer (or NODATA response) | |||
| applicable validated NSEC in its cache unless the CD bit was set | whenever it has an applicable validated NSEC in its cache unless | |||
| on the incoming query. (Imported from Section 6 of [RFC5074]). | the CD bit was set on the incoming query. (Imported from | |||
| Section 6 of [RFC5074]). | ||||
| o Implementing aggressive negative caching suggests that a validator | o Implementing aggressive negative caching suggests that a validator | |||
| will need to build an ordered data structure of NSEC and NSEC3 | will need to build an ordered data structure of NSEC and NSEC3 | |||
| records for each signer domain name of NSEC / NSEC3 records in | records for each signer domain name of NSEC / NSEC3 records in | |||
| order to efficiently find covering NSEC / NSEC3 records. Call the | order to efficiently find covering NSEC / NSEC3 records. Call the | |||
| table as NSEC_TABLE. (Imported from Section 6.1 of [RFC5074] and | table as NSEC_TABLE. (Imported from Section 6.1 of [RFC5074] and | |||
| expanded.) | expanded.) | |||
| o The aggressive negative caching may be inserted at the cache | o The aggressive negative caching may be inserted at the cache | |||
| lookup part of the recursive resolvers. | lookup part of the recursive resolvers. | |||
| o If errors happen in aggressive negative caching algorithm, | o If errors happen in aggressive negative caching algorithm, | |||
| resolvers MUST fall back to resolve the query as usual. "Resolve | resolvers MUST fall back to resolve the query as usual. "Resolve | |||
| the query as usual" means that the resolver must process the query | the query as usual" means that the resolver must process the query | |||
| as though it does not implement aggressive negative caching. | as though it does not implement aggressive negative caching. | |||
| Appendix B. Procedure for determining ENT vs NXDOMAN | Appendix B. Procedure for determining ENT vs NXDOMAN with NSEC | |||
| Thanks to Mark Andrews for providing these helpful notes for | This procedure outlines how to determine if a given name does not | |||
| implementors. As they are more general than for Aggressive NSEC we | exist, or is an ENT (Empty Non-Terminal, see [RFC5155] Section 1.3) | |||
| have placed them in an appendix. | with NSEC. | |||
| If the NSEC record has not been verified as secure discard it. | If the NSEC record has not been verified as secure discard it. | |||
| If the given name sorts before or matches the NSEC owner name discard | If the given name sorts before or matches the NSEC owner name discard | |||
| it as it does not prove the NXDOMAIN or ENT. | it as it does not prove the NXDOMAIN or ENT. | |||
| If the given name is a subdomain of the NSEC owner name and the NS | If the given name is a subdomain of the NSEC owner name and the NS | |||
| bit is present and the SOA bit is absent then discard the NSEC as it | bit is present and the SOA bit is absent then discard the NSEC as it | |||
| is from a parent zone. | is from a parent zone. | |||
| End of changes. 37 change blocks. | ||||
| 76 lines changed or deleted | 76 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||