Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Version Notification for draft-thomassen-dnsop-dnssec-bootstrapping-02.txt

Peter Thomassen <peter@desec.io> Tue, 09 November 2021 15:53 UTC

Return-Path: <peter@desec.io>
X-Original-To: dnsop@ietfa.amsl.com
Delivered-To: dnsop@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 014153A088F; Tue, 9 Nov 2021 07:53:57 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -5.229
X-Spam-Level:
X-Spam-Status: No, score=-5.229 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, NICE_REPLY_A=-3.33, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=a4a.de
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id CJmpu0Cdy20M; Tue, 9 Nov 2021 07:53:51 -0800 (PST)
Received: from mail.a4a.de (mail.a4a.de [IPv6:2a01:4f8:10a:1d5c:8000::8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 3D0583A0A84; Tue, 9 Nov 2021 07:53:46 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=a4a.de; s=20170825; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:MIME-Version :Date:Message-ID:Subject:From:References:Cc:To:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=tchswy2WTAY9LP7NDLq1RkluT5my/H/URoEDU5JmKjA=; b=nsfzF3bDQXrPn0CBodK/p9NPQm 6FNjwbx0x+/gHSiWxJKCrVN/bW25KFz3XGS/fnW5agb2vThs/Wo0F6JOVKmSHalSOIHMKv2jixY/M PB5rDh+iaUnjW+XupH1kGBCfsck+DyGURuvw9zm2ZtYXFRiRLLr1c6rW6MTUnU0vGmQQyyxihUsxN mzNVgXBI1B+p2PlGRpje0AnGSK3lKGWGO/Nequu0j8Bg0nr5C/KD32ohUDQv9gVpJAMsXcNXE4VoS YDy05KJE9uDQK2ZkqDOA7fxlTNa4bbOBJz2mC07pN9G+D3TIGhuWQ8yjiVI/guyE4mMhahKa57adk QLnFYc+w==;
Received: from ip5f5aec68.dynamic.kabel-deutschland.de ([95.90.236.104] helo=[192.168.1.171]) by mail.a4a.de with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from <peter@desec.io>) id 1mkTRI-0002in-2K; Tue, 09 Nov 2021 16:53:36 +0100
To: Paul Wouters <paul.wouters@aiven.io>
Cc: Paul Wouters <paul.wouters=40aiven.io@dmarc.ietf.org>, "dnsop@ietf.org WG" <dnsop@ietf.org>, dnssec-bootstrapping@ietf.org
References: <163520620129.17275.16274772439094875607@ietfa.amsl.com> <91154628-0ca3-15d8-c6bd-b71232b2e64b@desec.io> <8d3b2ae-70e3-74b4-40a0-70e848acc4aa@nohats.ca> <66e2a81b-b971-cdea-0f40-cfed68be574f@desec.io> <705c1434-532-6840-8ae4-545bde91822@nohats.ca> <37fa7324-643a-9c3c-4256-97abe52f1118@desec.io> <2c8d972a-1388-2f42-994-56a58fe03916@nohats.ca>
From: Peter Thomassen <peter@desec.io>
Message-ID: <26f99653-0b88-1226-fa7d-6ce6267c9eea@desec.io>
Date: Tue, 09 Nov 2021 16:53:33 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0
MIME-Version: 1.0
In-Reply-To: <2c8d972a-1388-2f42-994-56a58fe03916@nohats.ca>
Content-Type: text/plain; charset="UTF-8"; format="flowed"
Content-Language: de-DE
Content-Transfer-Encoding: 8bit
Archived-At: <https://mailarchive.ietf.org/arch/msg/dnsop/cbe6HaiRPUMZH6V4SegwucfdbNg>
Subject: Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Version Notification for draft-thomassen-dnsop-dnssec-bootstrapping-02.txt
X-BeenThere: dnsop@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: IETF DNSOP WG mailing list <dnsop.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/dnsop>, <mailto:dnsop-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/dnsop/>
List-Post: <mailto:dnsop@ietf.org>
List-Help: <mailto:dnsop-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/dnsop>, <mailto:dnsop-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 09 Nov 2021 15:53:57 -0000

Hi Paul,

On 11/9/21 3:56 PM, Paul Wouters wrote:
>> Now let's consider bootstrapping for dedyn.io *itself* (not one of its
>> children!).  The location of the bootstrapping records for this domain
>> would be dedyn.io._boot.ns1.desec.io, which is the same as the name of
>> the *zone* which constains bootstrapping records for domains *under*
>> dedyn.io, such as at example.dedyn.io._boot.ns1.desec.io.
> 
> Aren't you saying here that you want to be able to boostrap dedyn.io,
> meaning it is currently unsigned, while also having a problem with
> containing its "children", eg it is already used for boostrapping
> other domains, while it it unsigned yet itself ?

In such a situation, a domain like dedyn.io (which has other subzones
on the same nameserver) is not necessarily already being used for
bootstrapping.

Example: Imagine a DNS operator which supports both DNSSEC and
bootstrapping.  They have a customer with the zone example.com and
a subzone foo.example.com, but DNSSEC is currently off.

Suppose the customer turns on DNSSEC in the operator's service portal.
What will happen now is that the _boot zones under the operator's
nameserver hostnames will be populated with bootstrapping records for
these domains, with prefixes example.com._boot and
foo.example.com._boot.

Remember, the bootstrapping records are of type CDS/CDNSKEY, and they
will now show up both at the level of "foo.example.com._boot" and one
level up, at the level of "example.com._boot".

As a result, the DNS operator is no longer free to make a delegation
at "example.com._boot", because that would change the meaning of the
bootstrapping records.  (CDS/CDNSKEY records have a conflicting meaning
when they occur at an apex.)

However, there's nothing wrong with enabling bootstrapping records
for both these domains at once.  There's no reason why DS records for
foo.example.com should not be put into example.com while
bootstrapping for example.com is running in parallel.  (It's not
even necessary for example.com to ever be securely delegated, if there
is another trust root for it, e.g. in an enterprise setting.)

DS bootstrapping does not require the parent of the bootstrapped domain
to be secure.  The protocol should not concern itself with the chain of
trust above the domain that is being bootstrapped.

The protocol should not make any assumptions like that, so that
bootstrapping of several domains along the same branch in the DNS tree
(e.g. example.com, and foo.example.com) can be fully orthogonal.
The only thing that's necessary is that the NS hostname have a
validation path.

>> To clear up the misunderstanding, I'll write out the example in detail.
>>
>> dedyn.io has NS ns1.desec.io and ns2.desec.org.  Children of dedyn.io
>> typically have the same NS rrset.
> 
> I'm a bit confused about the term "children" here. Normally in DNS we
> say children for subdomains/delegations. But further done, you are
> talking about entrie in .com too, so I think the term children here is
> confusing. Maybe use "target domains" or "customer domains" instead of
> the term "children" ?

The example I gave was primarily about dedyn.io and example.dedyn.io;
that's why I made the statement about the children of dedyn.io and
their NS records.

Of course, other zones (such as under .com) can be hosted on the same
nameserver.  That's why I later gave another example of a bootstrapping
zone that may deserve its own delegation (com._boot.ns1.desec.io).
Apologies in case this made things less clear.

>> dedyn.io._boot.ns1.desec.io  # bootstrapping zone for dedyn.io children
>>      com._boot.ns1.desec.io  # bootstrapping zone for com children
>>          _boot.ns1.desec.io  # zone for all other bootstrapping
> 
> Ok, so you want either an NS/DS for _boot.ns1.desec.io or you want
> individual NS/DS records for <TLD>._boot.s1.desec.io ?

Let's consider the bootstrapping namespace under _boot.ns1.desec.io.
There would usually be NS/DS records at this name.

However, it should be possible to introduce zone cuts underneath that
name, so operators can control the size and churn of the zones involved
in bootstrapping.  This idea madeit into the draft based on feedback
by John Levine, who pointed out that scalability should be a very
strong priority.

So, there may be additional NS/DS rrsets at com._boot.ns1.desec.io, or
dedyn.io._boot.ns1.desec.io.

Adding such a delegation turns the corresponding name into an apex, and
thus requires that there are no bootstrapping CDS/CDNSKEY records at
that name, because they would silently change in meaning.

The problem is that if we now put bootstrapping records at these
delegation points, they suddenly take on the meaning of conventional
(non-bootstrapping) CDS/CDNSKEY records for these subzones.

>> Now let's consider bootstrapping for dedyn.io *itself* (not one of its
>> children!).  The location of the bootstrapping records for this domain
>> would be dedyn.io._boot.ns1.desec.io, which is the same as the name of
>> the *zone* which constains bootstrapping records for domains *under*
>> dedyn.io, such as at example.dedyn.io._boot.ns1.desec.io.
> 
> So as stated above, I don't think this is a valid use case, as you need
> the bootstrap already in place ?

You don't need that.

You only need a validation path to exist for each NS hostname (and the
_boot zone underneath).

>> This has nothing to do with in-bailiwick.  The problem occurs because
>> bootstrapping records cannot be at the apex (as to not overload the
>> meaning of apex CDS/CDNSKEY records), but by "inheriting" the structure
>> under dedyn.io, a situation arises where this condition is not met.
>>
>> The solution is to not "inherit", but flatten the hierarchy, which is
>> what the hash does.  With hashing, children of dedyn.io would have
>> their bootstrapping records under h(dedyn.io)._boot.ns1.desec.io, such
>> as example.h(dedyn.io)._boot.ns1.desec.io.
> 
> I would think you could still use exmaple.dedyn.io._boot.ns1.desec.io.
> (regardless of hashing or not). But you need desec.io to already be DNSSEC
> signed, and since you control desec.io, it should be trivial to add NS
> and DS for _boot.dedyn.io, or TLD._boot.dedyn.io without needing to
> bootstrap?

I am not following.

>> It is unclear to me how such situations would properly be dealt with if
>> the bootstrapping owner names retained the target domains' hierarchy.
> 
> Can you explain why the above wouldn't work ?

In the general case, there will be a collision between bootstrapping
records and conventional apex-level CDS/CDNSKEY records, unless
delegations within the _boot subtree are prohibited.

>> One could of course specify that you can only ever bootstrap *one*
>> name along a certain branch of the DNS tree.  But what would be the
>> motivation for such a limitation?
> 
> No, you should be able to do all the domains you want, as long as you
> prefix them into the _boot zone?

Only if you enforce there are no delegations there, within the _boot
zone.

>> I'm sure the situation could be complicated futher by considering more
>> sophisticated delegation hierarchies (e.g. dedyn.io is at ns1.desec.io,
>> foo.dedyn.io is not, but bar.foo.dedyn.io is again at ns1.desec.io, and
>> so on).  These are all things the protocol should be ignorant of.
> 
> I don't think that needs to matter, you can even run NS/DS onto
> _boot.ns1.dedyn.io with only ns1 as its nameserver and _boot.ns2.dedyn.io
> with only ns2 as its nameserver?

I am not following.

>> The hash ensures that *different things* get *different names*.
> 
> But the DNS is already pretty good at that with FQDNs?

The DNS provides sufficient naming capabilities, yes.  My point is that
in your proposal, when dedyn.io and its children are hosted on the same
nameserver, two different things will turn up with the same name:

1.) the name of the bootstrapping records for dedyn.io
2.) the name of the zone containing bootstrapping records for children
     of dedyn.io

The name in question is: dedyn.io._boot.ns1.desec.io

CDS/CDNSKEY records at that name can now mean two things:

- They could mean "thing 1", i.e. bootstrapping records for dedyn.io
- They could mean "thing 2", that is DS rollover for the bootstrapping
   zone *itself* (dedyn.io._boot.ns1.desec.io)

It's not explicit what's meant, so there's an ambiguity.  Worse, if
you add or remove the delegation at dedyn.io_boot.ns1.desec.io, the
meaning of CDS/CDNSKEY records at that name silently changes.

So, yes, the DNS is good at naming things differently, but we have to
create a naming scheme that is free of collisions.

>> It is a namespacing mechanism, and avoids overloading the names of
>> bootstrapping records with the names of bootstrapping zones.  Such
>> overloading would be unclean design even if the was no pre-existing use
>> of CDS/CDNSKEY records at the apex.
> 
> Not sure where CDS/CDSNKEY comes in, as those live in the target domains
> zone itself, outside of any _boot prefixed zone.

The whole point of the bootstrapping protocol is to co-publish the
target domain's CDS/CDNSKEY records verbatim under the corresponding
name below _boot.

>> I agree about the dig command.  But, it's only possible (e.g. for
>> DNSSEC debugging) because dig has some explicit things implemented,
>> e.g. options like +multiline or +trace.
> 
> But I could just easilly without manual hashing, look if the records for
> ietf.org are in ietf.org._boot.ns1.desec.de are published with dig.
> Where as if it is hashed, I will need a special tool.

I absolutely subscribe to this reasoning, but unfortunately it doesn't
make the above problem go away.

Cheers,
Peter

-- 
Like our community service? 💛
Please consider donating at

https://desec.io/

deSEC e.V.
Kyffhäuserstr. 5
10781 Berlin
Germany

Vorstandsvorsitz: Nils Wisiol
Registergericht: AG Berlin (Charlottenburg) VR 37525