<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-yorgos-dnsop-dry-run-dnssec-00" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true" consensus="true">

<front>
<title abbrev="dry-run-dnssec">dry-run DNSSEC</title><seriesInfo value="draft-yorgos-dnsop-dry-run-dnssec-00" stream="IETF" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="Y." surname="Thessalonikefs" fullname="Yorgos Thessalonikefs"><organization>NLnet Labs</organization><address><postal><street>Science Park 400</street>
<city>Amsterdam</city>
<code>1098 XH</code>
<country>Netherlands</country>
</postal><email>george@nlnetlabs.nl</email>
</address></author><author initials="W." surname="Toorop" fullname="Willem Toorop"><organization>NLnet Labs</organization><address><postal><street>Science Park 400</street>
<city>Amsterdam</city>
<code>1098 XH</code>
<country>Netherlands</country>
</postal><email>willem@nlnetlabs.nl</email>
</address></author><author initials="R." surname="Arends" fullname="Roy Arends"><organization>ICANN</organization><address><postal><street></street>
</postal><email>roy.arends@icann.org</email>
</address></author><date year="2022" month="March" day="4"></date>
<area>Internet</area>
<workgroup>DNSOP Working Group</workgroup>

<abstract>
<t>This document describes a method called &quot;dry-run DNSSEC&quot; that allows for
testing DNSSEC deployments without affecting the DNS service in case of
DNSSEC errors. It accomplishes that by introducing a new DS Type Digest
Algorithm that signals to validating resolvers that dry-run DNSSEC is used for
the zone. DNSSEC errors are then reported with DNS Error Reporting, but the
bogus response is withheld. Instead resolvers fallback from dry-run DNSSEC and
provide the response that would have been answered without the presence of a dry-run DS.
A further option is presented for
clients to opt-in for dry-run DNSSEC errors and allow for end-to-end DNSSEC
testing.</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>DNSSEC was introduced to provide DNS with data origin authentication and data
integrity. This introduced quite an amount of complexity and fragility to the
DNS which in turn still hinders general adoption. When an operator decides to
publish a newly signed zone there is no way to realistically check that DNS
will not break for the zone.</t>
<t>This document describes a method called &quot;dry-run DNSSEC&quot; that gives confidence
to operators to adopt DNSSEC by introducing a new DS Type Digest
Algorithm. Resolvers that don't support the algorithm continue to treat the
delegation as insecure <xref target="RFC6840" sectionFormat="comma" relative="#" section="5.2"></xref>. Validating resolvers are
signaled to treat the delegation as being in an intermediate test step for
DNSSEC. Valid answers yield authentic data (AD) responses. Therefore, clients that expect
the AD flag can already profit from the transition. Invalid answers instead of
SERVFAIL yield the response that would have been answered when no dry-run
DS would have been present in the parent. For zones that had only dry-run DS RRs
in the parent, an invalid answer yields an insecure response.
This is of course not proper data integrity
but the delegation should not be considered DNSSEC signed at this point.</t>
<t>Based on DNS Error Reporting <xref target="DNS-ERROR-REPORTING"></xref>, invalid answers for
dry-run DNSSEC errors generate reports in order to monitor potential DNS
breakage when changing the DNSSEC configuration for a zone. This is also the
main purpose of dry-run DNSSEC.</t>
<t>The signed zone is publicly deployed but DNSSEC configuration errors cannot
break DNS resolution yet. DNSSEC health feedback can pinpoint potential issues
back to the operator. When the operator is confident that the DNSSEC adoption
does not introduce DNS breakage, the real DS record can be published on the
parent zone and that concludes the actual DNSSEC deployment.</t>
<t>Dry-run DNSSEC can further be used on already singed zones to test key
rollovers. In this case a dry-run DS record for the future key is used next to
the current DS record which itself needs to be also presented in the dry-run
format. Validating resolvers that understand dry-run DNSSEC first try to
validate with a dry-run DS before falling back to real DSes.</t>
<t>For further end-to-end DNS testing, a new EDNS0 option code is introduced that
a client can send along with a query to a validating resolver. This signals
validating resolvers that the client has opted-in to DNSSEC errors for dry-run
delegations. The resolver still uses DNS Error Reporting <xref target="DNS-ERROR-REPORTING"></xref> for dry-run errors
but instead of the insecure answer it provides the client with the SERVFAIL
answer, same as with actual DNSSEC. These clients are called &quot;wet-run clients&quot;.</t>
</section>

<section anchor="terminology"><name>Terminology</name>
<t>The key words &quot;<bcp14>MUST</bcp14>&quot;, &quot;<bcp14>MUST NOT</bcp14>&quot;, &quot;<bcp14>REQUIRED</bcp14>&quot;,
&quot;<bcp14>SHALL</bcp14>&quot;, &quot;<bcp14>SHALL NOT</bcp14>&quot;, &quot;<bcp14>SHOULD</bcp14>&quot;, &quot;<bcp14>SHOULD NOT</bcp14>&quot;,
&quot;<bcp14>RECOMMENDED</bcp14>&quot;, &quot;<bcp14>NOT RECOMMENDED</bcp14>&quot;, &quot;<bcp14>MAY</bcp14>&quot;, and
&quot;<bcp14>OPTIONAL</bcp14>&quot; in this document are to be interpreted as described in
BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only when, they appear in all
capitals, as shown here.</t>

<dl spacing="compact">
<dt>dry-run DS</dt>
<dd>The DS record with the special DS type digest algorithm that signals dry-run
DNSSEC for the delegation.</dd>
<dt>real DS</dt>
<dd>The actual DS record for the delegation. Replaces the dry-run DS to complete
DNSSEC deployment.</dd>
<dt>dry-run zone</dt>
<dd>A zone that is DNSSEC signed but uses a dry-run DS to signal the use of the
dry-run DNSSEC method.</dd>
<dt>wet-run client</dt>
<dd>A client that has opted-in to receive the actual DNSSEC errors from the
upstream validating resolver instead of the insecure answers.</dd>
</dl>
</section>

<section anchor="description"><name>Description</name>
<t>TODO</t>

<section anchor="dry-run-structure"><name>The dry-run DS structure</name>
<t>The dry-run DS record is a normal DS record with updated semantics to allow for
dry-run signaling to a validating resolver. The DS Type Digest Algorithm value
MUST be TBD (DRY-RUN). The first octet of the DS Digest field contains the
actual Type Digest Algorithm, followed by the actual Digest:</t>

<sourcecode type="ascii-art">                     1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Key Tag             |  Algorithm    |    DRY-RUN    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Digest Type   |                                               /
+-+-+-+-+-+-+-+-+            Digest                             /
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</sourcecode>
<t>Validating resolvers encountering such a DS record will know to mark this
delegation as dry-run DNSSEC and extract the actual Type Digest Algorithm and
Digest from the dry-run DS Digest field.</t>
<t>Validating resolvers that have no knowledge for the DRY-RUN DS Type Digest
Algorithm MUST disregard the DS record as per <xref target="RFC6840" sectionFormat="comma" relative="#" section="5.2"></xref>.</t>
</section>

<section anchor="dnssec-error-reporting"><name>DNSSEC Error Reporting</name>
<t>The main purpose of the dry-run DNSSEC proposal is to be able to monitor
potential DNS breakage when adopting DNSSEC for a zone. The main tool to do
that is DNS Error Reporting <xref target="DNS-ERROR-REPORTING"></xref>.</t>
<t>Operators that want to use dry-run DNSSEC SHOULD support DNSSEC Error Reporting
and have a reporting agent in place to receive the error reports.</t>
<t>Implementations that support dry-run DNSSEC MUST also support DNSSEC Error
Reporting and report any DNSSEC errors for the dry-run zone to the
designated report agent.</t>
</section>

<section anchor="parent-zone-records"><name>Parent zone records</name>
<t>The only change that needs to happen for dry-run DNSSEC is for the parent to
be able to publish the dry-run DS record. If the parent accepts DS records from
the child, the child needs to provide the dry-run DS record. If the parent does
not accept DS records and generates the DS records from the DNSKEY, support for
generating the dry-run DS record, when needed, should be added to the parent if
dry-run DNSSEC is a desirable feature.</t>
<t>When the child zone operator wants to complete the DNSSEC deployment, the
parent needs to be notified for the real DS record.</t>

<section anchor="cds-cdnskey-consideration"><name>CDS and CDNSKEY Consideration</name>
<t>CDS works as expected by providing the dry-run DS content for the CDS
record. CDNSKEY cannot work by itself; it needs to be accompanied by the
aforementioned CDS to signal dry-run DNSSEC for the delegation. Thus, parents
that rely only on CDNSKEY need to add support for checking the accompanying CDS
record for the DRY-RUN DS Type Digest Algorithm and generating a dry-run DS
record.</t>
<t>Operators of a dry-run child zone are advised to publish both CDS and
CDNSKEY so that both cases above are covered.</t>
</section>
</section>

<section anchor="dry-run-realDS-coexistence"><name>dry-run DS and real DS coexistence</name>
<t>TODO
tldr:
for example testing key rollover.</t>

<ul spacing="compact">
<li>For ease of implementation and DoS prevention validators SHOULD pick a DS and
DNSKEY pair they understand from both the dry-run and real pool of available
DSes.</li>
<li>If dry-run DSes are present, the validator MUST first consider those.</li>
<li>If real DS is picked by validator, carry on.</li>
<li><t>If dry-run DS is picked,</t>

<ul spacing="compact">
<li>If everything OK, secure.</li>
<li>If something not OK, should report and fallback to real DS. No insecure
answers for this one. It guarantees that the DNSSEC of the zone is not
altered.</li>
<li>If going back to real DS, the real DS is now cached and no EDER reports
for the same dry-run DS should be generated.</li>
</ul></li>
</ul>
</section>

<section anchor="wet-run-clients"><name>wet-run clients</name>
<t>Wet-run clients are clients that send the EDNS0 option code TBD (Wet-Run
DNSSEC) when querying a validating resolver. These clients opt-in to receive
error responses in case of DNSSEC errors in a dry-run zone. They allow for
end-to-end DNSSEC testing in a controlled environment.</t>
<t>Validating resolvers that recognise the option MUST respond with the error that
they would normally respond for a DNSSEC zone and MUST attach the same EDNS0
option code TBD in the response to mark the error response as coming from a
dry-run zone.</t>
<t>Additional Extended DNS Errors can also be attached in the error response by
the validating resolver as per <xref target="RFC8914"></xref>.</t>
</section>
</section>

<section anchor="implementation-notes"><name>Implementation Notes</name>
<t>TODO
tldr; validating resolvers need to keep an additional DNSSEC status for cached
records that notes the DNSSEC status for the dry-run part. Responses can then
be provided based on the Wet-Run DNSSEC EDNS0 option.</t>
</section>

<section anchor="security"><name>Security Considerations</name>
<t>Dry-run DNSSEC disables one of the fundamental guarantees of DNSSEC, data
integrity. Bogus answers for expired/invalid data will become insecure
answers providing the potentially wrong information back to the requester. This
is a feature of this proposal but it also allows forged answers by third
parties to still affect the zone. This should be treated as a warning that
dry-run DNSSEC is not an end solution but rather a temporarily intermediate
test step of a zone going secure.</t>
<t>Parent zones that provide signed delegations to child zones should be aware
that by using dry-run DNSSEC (e.g., testing a key roll to a stronger algorithm
key) they risk the DNSSEC status of the child zones. If the trust chain becomes
invalid between parent and child because of dry-run DNSSEC the child zone will
be treated as insecure.</t>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="dry-run-ds-type-digest-algorithm"><name>DRY-RUN DS Type Digest Algorithm</name>
<t>This document defines a new entry in the &quot;Delegation Signer (DS) Resource Record (RR) Type Digest
Algorithms&quot; registry:</t>
<table>
<thead>
<tr>
<th align="right">Value</th>
<th>Digest Type</th>
<th>Status</th>
<th>Reference</th>
</tr>
</thead>

<tbody>
<tr>
<td align="right">TBD</td>
<td>DRY-RUN</td>
<td>OPTIONAL</td>
<td>[this document]</td>
</tr>
</tbody>
</table></section>

<section anchor="wet-run-edns0-option"><name>Wet-Run EDNS0 Option</name>
<t>This document defines a new entry in the &quot;DNS EDNS0 Option Codes (OPT)&quot; registry on the &quot;Domain Name System (DNS) Parameters&quot; page:</t>
<table>
<thead>
<tr>
<th align="right">Value</th>
<th>Name</th>
<th>Status</th>
<th>Reference</th>
</tr>
</thead>

<tbody>
<tr>
<td align="right">TBD</td>
<td>Wet-Run DNSSEC</td>
<td>Optional</td>
<td>[this document]</td>
</tr>
</tbody>
</table></section>
</section>

<section anchor="acknowledgements"><name>Acknowledgements</name>
<t>Martin Hoffmann contributed the idea of using the DS record of an already
signed zone also as a dry-run DS in order to facilitate testing key rollovers.</t>
</section>

</middle>

<back>
<references><name>Normative References</name>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8914.xml"/>
</references>
<references><name>Informative References</name>
<reference anchor="DNS-ERROR-REPORTING" target="https://datatracker.ietf.org/doc/html/draft-ietf-dnsop-dns-error-reporting">
  <front>
    <title>DNS Error Reporting</title>
    <author fullname="Roy Arends" initials="R." surname="Arends"></author>
    <author fullname="Matt Larson" initials="M." surname="Larson"></author>
    <date></date>
  </front>
</reference>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6840.xml"/>
</references>

<section anchor="implementation-status"><name>Implementation Status</name>
<t><strong>Note to the RFC Editor</strong>: please remove this entire section before publication.</t>
<t>In the following implementation status descriptions, &quot;dry-run DNSSEC&quot; refers
to dry-run DNSSEC as described in this document.</t>

<ul spacing="compact">
<li>TODO</li>
</ul>
</section>

<section anchor="change-history-to-be-removed-before-final-publication"><name>Change History (to be removed before final publication)</name>

<ul spacing="compact">
<li>draft-yorgos-dnsop-dry-run-dnssec-00</li>
</ul>
<blockquote><t>Initial public draft.</t>
</blockquote></section>

</back>

</rfc>
