<?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-thomassen-dnsop-mske-00" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" updates="4034" consensus="true">

<front>
<title abbrev="mske">DNSSEC Multi-Signer Key Exchange (MSKE)</title><seriesInfo value="draft-thomassen-dnsop-mske-00" stream="IETF" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="P." surname="Thomassen" fullname="Peter Thomassen"><organization>Secure Systems Engineering, deSEC</organization><address><postal><street></street>
<city>Berlin</city>
<country>Germany</country>
</postal><email>peter.thomassen@securesystems.de</email>
</address></author>
<date year="2022" month="October" day="24"></date>
<area>Internet</area>
<workgroup>DNSOP Working Group</workgroup>

<abstract>
<t>Answering DNSKEY/CDS/CDNSKEY queries in an <xref target="RFC8901"></xref> multi-signer DNSSEC
configuration requires all operators to serve not only their own public key
information, but also include each other's public keys.
This ensures that clients obtain a consistent view of the DNSSEC configuration
regardless of who is answering a given query.
In order to enable operators to import the keys needed for assembling these
responses, a method for discovering them is necessary.</t>
<t>This document specifies how DNS operators can announce which are the keys they
intend to use for signing a given zone (DNSKEY) and which keys are designated
for secure entry into the zone (CDS/CDNSKEY).
It further introduces the CNS record type to facilitate proactive discovery of
the aforementioned signals.
Taken together, these parts function as an authenticated multi-signer
key-exchange (MSKE) scheme.</t>
<t>This MSKE mechanism uses the signaling mechanism introduced in
<xref target="I-D.ietf-dnsop-dnssec-bootstrapping"></xref> to complete the automated workflows
described in <xref target="I-D.ietf-dnsop-dnssec-automation"></xref>.</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>In comparison to single-signer DNSSEC deployments, multi-signer setups as
described in <xref target="RFC8901"></xref> come with additional coordination overhead.
This overhead entails</t>

<ul>
<li>the key exchange process that is needed so that each provider can serve a
joint record set reflecting all relevant providers' DNSSEC keys when
responding to a DNSKEY or CDS/CDNSKEY query,</li>
<li>timing coordination when updating the DNSSEC confguration (similarly to
what's needed when performing a key rollover, see <xref target="RFC7583"></xref> for details).</li>
</ul>
<t>While the logistics and timing considerations of adding and removing a DNSSEC
signer to/from a given constellation are described in
<xref target="I-D.ietf-dnsop-dnssec-automation"></xref>, an automatable method for the key exchange
step has not been specified so far.
It is thus proposed with this document.</t>
<t>Readers are expected to be familiar with DNSSEC, including <xref target="RFC4033"></xref>,
<xref target="RFC4034"></xref>, <xref target="RFC4035"></xref>, <xref target="RFC6781"></xref>, <xref target="RFC7344"></xref>, <xref target="RFC7477"></xref>, <xref target="RFC7583"></xref>,
and <xref target="RFC8901"></xref>.</t>

<section anchor="requirements-notation"><name>Requirements Notation</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;<strong>SHALL
NOT</strong>&quot;, &quot;<bcp14>SHOULD</bcp14>&quot;, &quot;<bcp14>SHOULD NOT</bcp14>&quot;, &quot;<bcp14>RECOMMENDED</bcp14>&quot;, &quot;<strong>NOT
RECOMMENDED</strong>&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>
</section>
</section>

<section anchor="conceptual-overview"><name>Conceptual Overview</name>
<t>DNS resolvers may direct queries against any nameserver contained in a zone's NS
record set.
When asking (for instance) for an A record set, the response (including the
RRSIG signature) may thus be retrieved from one nameserver, while the DNSKEY
record set required for validation may be retrieved from another nameserver (and
hence provider).
This is by design: Resolvers do not have any notion of multi-provider concepts;
the multi-signer models described in <xref target="RFC8901"></xref> just look like multi-key setups
to them.</t>
<t>DNSSEC multi-signer setups thus require that a DNSKEY response contains all keys
a validating resolver may need to validate an RRSIG signature from that zone,
irrespective of whether that RRSIG is obtained from the same nameserver/provider
as the DNSKEY record set.
To allow validation to work properly, the DNSKEY RRset therefore must be the
union of all of the DNSKEY record sets that each provider would serve if they
were the only (signing) provider.</t>
<t>Similarly, CDS/CDNSKEY record sets published on any of the nameservers for the
purpose of automated DS record maintenance
(<xref target="RFC7344"></xref><xref target="RFC8078"></xref><xref target="I-D.ietf-dnsop-dnssec-bootstrapping"></xref>) are required to be
the union across all signers in order to prevent accidents caused by a single
provider publishing an inconsistent RRset
(<xref target="I-D.thomassen-dnsop-cds-consistency"></xref>).</t>

<section anchor="keyannouncement"><name>Key Announcement</name>
<t>In order for the participating providers to discover each others'
DNSKEY/CDS/CDNSKEY records for inclusion in their responses, providers need to
signal what their single-provider record sets would be.
Specifically, each provider needs to separately announce</t>

<ul>
<li>their KSK (or CSK) public keys for inclusion in CDS/CDNSKEY record sets, and</li>
<li>their ZSK (or CSK) public keys for inclusion in the DNSKEY record set.</li>
</ul>
<t>Ideally, the mechanism would be authenticated and in-band, and allow each
provider to import these records in a straightforward manner.
In particular, no heuristics should need to be applied to determine the usage
mode of any given key.
The publishing provider, having ultimate knowledge of how each key is used,
should instead make this distinction explicit in what they publish.</t>
<t>(This is in contrast to inference methods, such as querying the DNSKEY RRset
from each provider and guessing which keys are used for KSK and/or ZSK purposes.
Such methods do not adequately cover edge cases such as distinguishing a standby
key from a retired key that needs to be cleaned up, or a key that looks like a
KSK but also signs another RRset.)</t>
<t>The signaling mechanism described in <xref target="I-D.ietf-dnsop-dnssec-bootstrapping"></xref>
Section 2 provides a suitable framework for these key announcements.</t>
</section>

<section anchor="triggering-initial-key-synchronization"><name>Triggering Initial Key Synchronization</name>
<t>Once providers have put their key announcements in place, they need to be made
aware of each other so that keys can be retrieved, validated, and included in
each provider's local copy of the DNSKEY/CDS/CDNSKEY record sets.</t>
<t>To see how this can work, consider the process of onboarding a new signing
provider.
Suppose that the zone is configured both at the existing and the new
provider(s), with equivalent contents as far as non-DNSSEC records are concerned
(that is, same A/MX/CNAME/TXT/... records).</t>
<t>As the new provider can only be added to the NS record set once the key exchange
has concluded, the new provider's nameservers are not yet part of it and cannot
be discovered by looking at the NS RRset.
The NS record set therefore is not a suitable starting point for provider
discovery.</t>

<section anchor="mechanism"><name>Mechanism</name>
<t>Discovery can be achieved by adding a new record set which holds the prospective
set of NS hostnames.
This is similar to how the CDS record set holds the prospective DS records.
Like the CDS RRset, it also resides on the child side of the zone cut, and it is
used for scanning (albeit peer-to-peer, not parent-child).
The type of the new record set is therefore called CNS.</t>
<t>To indicate that the set of providers is about to change, the zone administrator
adds a CNS record set to the zone at all involved providers (both old and new).
The record set is the same at all providers (just like any regular record set in
the zone, such as A/MX/...).</t>
<t>Providers can detect that a CNS record set has been created, and subsequently
start collecting keys (see <xref target="keyannouncement"></xref>) from the other providers'
nameservers, as extracted from the CNS record set.</t>
</section>

<section anchor="properties"><name>Properties</name>
<t>The process is symmetrical in two ways: (1) it works the same way for old and
new signers alike (both existing and incoming provider(s) see the same CNS
record set); (2) it covers both additional and removal of providers.
It therefore also covers transitions from one single provider to another single
provider (with a temporary multi-signer period in between).</t>
<t>If necessary, the method can further be used to trigger a key re-sync without
changing providers (such as when revoking a key).
This is achieved by copying the NS records into the CNS record set, upon which
key collection would occur.</t>
</section>
</section>

<section anchor="parent-side-updates"><name>Parent-side Updates</name>
<t>After importing, each provider can periodically check whether the key exchange
has converged.
This can be done by verifying that the zone's DNSKEY/CDS/CDNSKEY record sets as
served by the other providers are equivalent to the joint set seen locally
(containing both local and imported keys).
As the process is fully transparent, it can also be externally observed.</t>
<t>In case convergence does not occur for a while, any provider (or other observer)
MAY detect which keys are missing on whose nameservers (by comparing each apex
DNSKEY record set to everyone's announced keys, see <xref target="keyannouncement"></xref>).
Detecting providers can easily relay this information to the zone owner.
This allows the zone owner to proactively tackle the problem (e.g. by contacting
customer support), instead of experiencing a silent or intransparent failure.</t>
<t>Once convergence is confirmed and the parent has updated the DS record
accordingly (e.g. after observing the new CDS/CDNSKEY records), the NS record
set can be replaced with the records from the CNS RRset.
Finally, the updated NS RRset can be conveyed to the parent for updating the
delegation (e.g. via CSYNC, or EPP if available to one of the providers).</t>
<t>From the parent's perspective, this process is identical to how DS and NS
records would be updated in a single-provider setup.
No dedicated functionality specific to multi-signer setups is required.</t>
</section>
</section>

<section anchor="the-cns-record-type"><name>The CNS Record Type</name>
<t>During a multi-provider configuration process, CNS records indicate which are
the NS records that are expected to be in place once the process finishes.
As such, record parameters, value constraints, and wire as well as presentation
format are the same as for NS records (<xref target="RFC1034"></xref> Section 3.3.11).</t>
<t>This is similar to how CDS records indicate the prospective DS records, and thus
share formats and constraints with the DS record type.</t>
</section>

<section anchor="multi-signer-key-exchange-protocol"><name>Multi-Signer Key Exchange Protocol</name>
<t>This section specifies the details of how each provider publishes their keys and
how they can be discovered by peers.</t>
<t>The signaling-related terminology in this section is as defined in
<xref target="I-D.ietf-dnsop-dnssec-bootstrapping"></xref>.</t>

<section anchor="key-announcements"><name>Key Announcements</name>
<t>To indicate that a provider is willing to participate in a multi-signer key
exchange for a given zone, iterate over the zone's DNSKEY records for which the
provider holds the private key.
For each such key, execute all of the following steps:</t>

<ol>
<li><t>Mark the key for CDS/CDNSKEY signaling if the provider intends to use the
key as a secure entry point into the zone (= would want it referenced in the
delegation's DS record set);</t>
</li>
<li><t>Mark the key for DNSKEY signaling if the provider intends to sign, with the
corresponding private key, any RRsets besides the apex DNSKEY RRset.</t>
</li>
</ol>
<t>Next, publish CDS and CDNSKEY records corresponding to (1) and DNSKEY records
corresponding to (2) under the zone's Signaling Domains using Signaling Type
&quot;_multi&quot;.</t>
<t>Existing use of DNSKEY and CDS/CDNSKEY records is specified at the apex only
(<xref target="RFC4034"></xref>, Section 2.1.1 and <xref target="RFC7344"></xref>, Section 4.1, respectively).
This protocol extends the use of these record types to non-apex owner names for
the purposes of DNSSEC MSKE.
To exclude the possibility of semantic collision, there MUST NOT be a zone cut
at a the Signaling Records' owner name.</t>

<section anchor="example"><name>Example</name>
<t>Consider Provider 1 with nameservers ns1.example.net and ns2.example.net.
To prepare a multi-signer key exchange for the zone example.co.uk hosted on
these nameservers, the provider starts from the list of DNSKEY records for which
the provider holds the private key.</t>
<t>Iterating over all these DNSKEYs, the provider publishes CDS/CDNSKEY records for
each key that it would like promoted to the delegation's DS record set (KSK-like
use), at the following owner names:</t>

<artwork>   _multi.example.co.uk._signal.ns1.example.net
   _multi.example.co.uk._signal.ns2.example.net
</artwork>
<t>Iterating over the same list, the provider also publishes a DNSKEY record for
each key that it wants to use for signing any RRsets besides the apex DNSKEY
RRset (ZSK-like use), at the same owner names.</t>
<t>The records are accompanied by RRSIG records created using the key(s) of the
respective Signaling Zone.</t>
<t>Provider 2 (with nameservers under example.org) follows the same steps to
announce their multi-signer keys, under the owner names:</t>

<artwork>   _multi.example.co.uk._signal.ns1.example.org
   _multi.example.co.uk._signal.ns2.example.org
</artwork>
<t>[TODO Strictly, if Provider 1 knows that a key will ONLY be used as a KSK and
NOT for signing any other records, it doesn't need to be imported by other
providers and thus does not need to be announced here as a DNSKEY. -- This is
because the key is needed only for verifying the target zone's DNKSEY RRset when
retrieved from Provider 1, and in this case, it will be included in the apex
DNSKEY RRset itself. To validate a DNSKEY RRset retrieved from Provider 2, the
KSK of Provider 1 is not needed.]</t>
</section>
</section>

<section anchor="key-discovery"><name>Key Discovery</name>
<t>When a provider finds that the zone owner has created a CNS record set, the
provider creates an &quot;external nameserver list&quot; by filtering the NS hostnames
contained in the CNS RRset, removing those which are under the provider's
control.
The remaining list represent the subset of prospective NS hostnames operated by
other providers.</t>
<t>To import the other providers' DNSSEC keys, the provider starts out from initial
DNKSEY/CDS/CDNSKEY record sets that only reference keys for which the provider
holds the private key.
These record sets are called &quot;local RRsets&quot; below.</t>
<t>Next, for each hostname in the &quot;external nameserver list&quot;, the provider
constructs the owner names of the corresponding Signaling Records and queries
CDS, CDNSKEY, and DNSKEY records at these owner names.
Answers that can be DNSSEC-validated are added to the corresponding
&quot;local RRset&quot;.</t>

<section anchor="example-1"><name>Example</name>
<t>The zone owner is generally tasked with keeping the zone contents at all
provider in sync.
It is thus the first step for the zone owner to ensure that general zone content
(such as A/MX/TXT records) is equal everywhere.</t>
<t>Next, the zone owner adds the following record set to the zone configuration at
both Provider 1 and Provider 2:</t>

<artwork>example.co.uk. 3600 IN CNS ns1.example.net.
example.co.uk. 3600 IN CNS ns2.example.net.
example.co.uk. 3600 IN CNS ns1.example.org.
example.co.uk. 3600 IN CNS ns2.example.org.
</artwork>
<t>When Provider 1 detects the CNS RRset, Provider 1 creates the &quot;external
nameserver list&quot; by removing their own nameservers.
The list then contains the hostnames ns1.example.org and ns2.example.org, which
belong to Provider 2.</t>
<t>Provider 1 then uses these hostnames, the target zone name and the Signaling
Type &quot;_multi&quot; to query the CDS/CDNSKEY/DNSKEY Signaling Records from the
following owner names:</t>

<artwork>   _multi.example.co.uk._signal.ns1.example.org
   _multi.example.co.uk._signal.ns2.example.org
</artwork>
<t>Starting out from DNSKEY/CDS/CDNSKEY &quot;local RRsets&quot; that only have Provider 1's
keys, Provider 1 validates the received answers and adds them to the
corresponding local RRset.</t>
<t>Provider 2 performs the same steps to import Provider 1's keys, by querying and
validating the CDS/CDNSKEY/DNSKEY records from the following owner names:</t>

<artwork>   _multi.example.co.uk._signal.ns1.example.net
   _multi.example.co.uk._signal.ns2.example.net
</artwork>
</section>
</section>

<section anchor="parent-side-updates-1"><name>Parent-side Updates</name>
<t>Multi-signer setups are not in any way special from the parent's perspective:
Like for any client (such as resolvers), they merely look like a multi-key
setup.</t>
<t>Once convergence has been detected, existing protocols can therefore be used for
DS management automation (via CDS/CDNSKEY,
<xref target="RFC7344"></xref><xref target="RFC8078"></xref><xref target="I-D.ietf-dnsop-dnssec-bootstrapping"></xref>)</t>
<t>Once providers detect that the DS record set has been updated accordingly, the
zone's NS record set can be updated to reflect the changes indicated by the CNS
RRset.
This is most easily done wy overwriting the NS records set with the contents of
the CNS RRset.</t>
<t>Finally, existing protocols can be used to propagate the NS (and possibly glue)
changes to the parent (e.g. via CSYNC, <xref target="RFC7477"></xref>).</t>
<t>If one of the participating providers is also a registrar, the EPP protocol may
be used as well <xref target="RFC5730"></xref>.</t>
</section>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>TODO</t>
</section>

</middle>

<back>
<references><name>Normative References</name>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-dnsop-dnssec-automation.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml-ids/reference.I-D.ietf-dnsop-dnssec-bootstrapping.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml-ids/reference.I-D.thomassen-dnsop-cds-consistency.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1034.xml"/>
<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.4033.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4034.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4035.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5730.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6781.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7344.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7477.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7583.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8078.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.8901.xml"/>
</references>

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

<ul>
<li>draft-thomassen-dnsop-mske-00</li>
</ul>
<blockquote><t>Initial public draft.</t>
</blockquote></section>

</back>

</rfc>
