Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Version Notification for draft-thomassen-dnsop-dnssec-bootstrapping-02.txt
Peter Thomassen <peter@desec.io> Wed, 27 April 2022 03:29 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 6B4DDC1FF90F; Tue, 26 Apr 2022 20:29:37 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -3.755
X-Spam-Level:
X-Spam-Status: No, score=-3.755 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, NICE_REPLY_A=-1.857, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, SPOOF_COM2OTH=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 ([50.223.129.194]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id La71yLtnZ9El; Tue, 26 Apr 2022 20:29:32 -0700 (PDT)
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 AA592C1FF909; Tue, 26 Apr 2022 20:29:25 -0700 (PDT)
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:Subject:From :References:Cc:To:MIME-Version:Date:Message-ID: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=kkLjrdFLI81gwQI0gM/dsq1ycDpUtE3cycmwti8lAuI=; b=OyIpzQx98pjo+Mfp/fJvOkDPXd zNaoyUf8n+GLJu3CToWpT6m0EJT1aNg0rcTnCHv1Y1mdXnEa9DQWjYDikdnyzjde0PYDZiapnNKpW +ZTmyDDSCRRX+U8wU3S1bbVjYlCrUf1Z65FCxM9ij/qMkLKBagwnb2U0h/YBWSYym/jBY6VXM127O M8uXdjlLUV1qC00B6TnSsrndBRUVqQzvmq85jG9spEoIsJ6vaOlcyB/gNqiUlYBE1KGqgRx5TqzI7 TJcP2imB5eda4HYTIvUyGg5FB/QscP5AUBanytGV+mgn7Dce+hOz10Xkla5eTkjKO4VhYYBbc1SM/ nZOVBwQA==;
Received: from 2603-9001-0e08-d96f-3639-29c8-2f55-9aff.inf6.spectrum.com ([2603:9001:e08:d96f:3639:29c8:2f55:9aff]) 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 1njYMj-0002Z3-8I; Wed, 27 Apr 2022 05:29:21 +0200
Message-ID: <805e32ca-aa4f-4550-adc9-2913b81becde@desec.io>
Date: Wed, 27 Apr 2022 05:29:15 +0200
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.0
Content-Language: en-US
To: Paul Wouters <paul.wouters=40aiven.io@dmarc.ietf.org>
Cc: Paul Wouters <paul.wouters@aiven.io>, "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> <26f99653-0b88-1226-fa7d-6ce6267c9eea@desec.io> <608f2d3d-6e63-7e33-2c52-bd78aa4e9f39@nohats.ca>
From: Peter Thomassen <peter@desec.io>
In-Reply-To: <608f2d3d-6e63-7e33-2c52-bd78aa4e9f39@nohats.ca>
Content-Type: text/plain; charset="UTF-8"; format="flowed"
Content-Transfer-Encoding: 8bit
Archived-At: <https://mailarchive.ietf.org/arch/msg/dnsop/euhvLfY2P5SI1I_QIKxWM4DPg5U>
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.34
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: Wed, 27 Apr 2022 03:29:37 -0000
Hi Paul, Thank you for all your thoughts, which I think we should continue discussing so that we arrive at something we both agree with. While that's of course not strictly required, I think it is possible if we twist our brains a bit more. :-) I've spent some time writing down the problem from scratch, in a very structured way and from rather basic principles. I hope that this way, it will be possible to point very directly at where my arguments go wrong, so that I will understand your perspective better. As the draft has been adopted now, I think it's better to continue discussion on dnsop@ietf.org only (this thread is also on dnssec-bootstrapping@ietf.org) The fresh write-up is now here: https://mailarchive.ietf.org/arch/msg/dnsop/FE5Sm5vzZtq9VgKxgkfmv4VuVI8/ Note that I'm not specifically arguing for the hashed naming scheme (anymore). Instead, the new write-up points out a problem that is implicit in the current draft, and then discusses various possible solutions (the hashed scheme being but one if them). Thanks, Peter On 11/9/21 22:53, Paul Wouters wrote: > On Tue, 9 Nov 2021, Peter Thomassen wrote: > >> 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. > > I think in this case, you cannot start foo.example.com._boot. because > its parental agent (which happens to be you too but should still follow > the RFC) detects that the parent zone example.com is not signed and > thus cannot perform a bootstrap of foo.example.com. Doing them at once > would be a race condition. You'd really want to do these one after the > other. > >> 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". > > But can't you still publish all of these? like: > > in dedyn.io zone (or ns1.dedyn.io zone or _boot.ns1.dedyn.io zoe): > > example.<hash-of-example.com>._boot.ns1.dedyn.io IN CDNSKEY [...] > foo.<hash-of-foo.example.com>._boot.ns1.dedyn.io IN CDNSKEY [...] > > in your example.com zone: > > example.com. IN CDNSKEY [...] > > In your foo.example.com zone: > > foo.example.com. IN CDNSKEY [...] > >> 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.) > > I still don't see the APEX problem? > >> However, there's nothing wrong with enabling bootstrapping records >> for both these domains at once. > > I think there is. You can't boostrap a domain whose parent is not > already fully DNSSEC enabled. As those parents are not valid candidates > to take in CDS records. > >> 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. > > There is because the parent is unsigned and so whatever it is publishing > about its children is lacking trust. > >> (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.) > > There is. nothing under example.com will ever DNSSEC validate. It cannot > make claims abouts its sub delegations via DS records as those DS > records would be bogus. > >> 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. > > This intension was not clear to me from reading the draft. You want to > DNSSEC bootstrap "islands of trust" ? I think that should be out of > scope. You are then already in enterprise/provisioning territory where > this provisioning can just be added without this new protocol. > >> 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. > > I disagree. Sure you can have an island of trust, eg a manually > configured trust anchor for internal.example.com with a DS trust anchor, > but then you should still insist on all checks from internal.example.com > to be securely delegated. So you first have to do foo.internal.example.com > before you can do bar.foo.internal.example.com. > > While I think this is true from a security and logical point of view, I > think you will run into practical issues if you are attempting to > retrieve or publish DS records that lack DNSSEC validation. > >> 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. > > But then you are most certainly better of without hashing, because then > you can make a zone for each <tld>._boot.ns1.desec.io. Or when you see > that foo.tld is a generic domain too that is becoming too large, create > a zone for foo.tld._boot.ns1.desec.io. > > Whereas with hashes, you just have an unpredictable flat <blob>._boot.ns1.desec.io zone. > >> 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. > > Ok, so I think you are saying that for: > > example.com._boot.ns1.desec.io. IN CDS [..] > > or > > example.<hash-of-com>._boot.ns1.desec.io. IN CDS [..] > > or > > com._boot.ns1.desec.io. IN CDS [..] > > That without the <hash> method, having a zone cut at > com._boot.ns1.desec.io. could somehow change the meaning ? > > You would have an NS and DS record for com._boot.ns1.desec.io., but > not for example.com._boot.ns1.desec.io. where you would have a CDS > or CDNSKEY. In fact, the lack of NS for example.com._boot.ns1.desec.io. means > that you are not using CDS to update a DS. > > I don't see the "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. > > So for com._boot.ns1.desec.io. I dont see that happening, but I guess > if you do both example.com._boot.ns1.desec.io. and > foo.example.com._boot.ns1.desec.io, then you have: > > com._boot.ns1.desec.io. IN NS .... > com._boot.ns1.desec.io. IN DS .... > example.com._boot.ns1.desec.io. IN CDS .... > > If this last record is treated in the "regular" way, that means that example.com._boot.ns1.desec.io. > is signaling to com._boot.ns1.desec.io to update its DS record. But > there is no zone cut there, so the "traditional" meaning has no effect. > > In a way, this is just the same as me publishing www.example.com IN CDS [...]. No one will ever > ask for the record since there is no NS for www.example.com. So there is > no way for "current deployed software" to do anything wrong. In your > document, you could simply say "no bootraps are allowed under a _boot" > delegation. > > I don't think this issue is improved by using hashes. > > Now let's say you want to use CDS for com._boot.ns1.desec.io. to notify boot.ns1.desec.io. > > You would publish: > > com._boot.ns1.desec.io. IN CDS .... > > Now someone could think you are boosttrapping for com. Someone could > fake the (unsigned) com NS records to be ns1.desec.io. And they could > possible convince com's parent to do dnssec bootstrap. If the attacker > manages to trigger the boostrap in com's parent, the parent would still > find com is either A) already signed so only CDS in com directly can be > used to update, not this bootstrap, or B) unsigned, in which case I > again press my point that nothing under an unsinged delegation should > qualify for booststrap anyway. Still the common non-attack case here > would be that com has no nameserver ns2.desec.io so the bootstrap would > be aborted. Meanwhile, your nameservers involved in the com._boot.ns1.desec.io. > and _boot.ns1.desec.io zones can still use regular CDS updating, > verifying the CDS/CDNSKEY is really in use for that domain and proceed > with publication of the updated DS record. > >>>> 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). > > We disagree. I think the boostrap should only extend the validation path > from a parent zone to the child zone. It should not try to skip a > zonecut in the hierarchy. Yes this causes a delay to deploy, but you > need some delay for security anyway and people won't be deploying 7 > delegations deep dnssec bootstraps, or if they do, a 7*1 day delay is > fine. > >>>> 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. > > the boostrap is usually needed to bridge the gap of Registrar and DNS > Hoster. If the DNS hoster already has signed dnshoster.com, then they > can just atomically create NS/DS records for _boot.ns1.dnshoster.com. > They are not depending on another party that lacks the automation to > deploy DNSSEC. > >>>> 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. > > Yes :) But I hope I managed to point out you can still use CDS/DS within > your bootstrap without the double meaning of the names outside the > bootstrap chain. > >>>> 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. > > See above. I think you can. > >>>> 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. > > I was trying to say that I think these all work fine, with or without > delegations in the FQDN path of the bootstrap names. > >>>> 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 > > Yes. > >> - They could mean "thing 2", that is DS rollover for the bootstrapping >> zone *itself* (dedyn.io._boot.ns1.desec.io) > > No? > > If your zone cut is at io._boot.ns1.desec.io or _boot.ns1.desec.io, then > CDS dedyn.io._boot.ns1.desec.io does not have a traditional (C)DS record meaning, > as there is no NS (zonecut) for dedyn.io._boot.ns1.desec.io. > > If your zone cut is at dedyn.io._boot.ns1.desec.io because you have many > delegations for <customers>.dedyn.io then the interpretation of CDS cannot > be for boostrap because dedyn.io is already DNSSEC signed (or else you > cannot / should not accept secure delegations for <customers>), so its > intepretation is always for a classic DNSKEY roll signaling of the zone > dedyn.io._boot.ns1.desec.io to its parent (either io._boot.ns1.desec.io > or _boot.ns1.desec.io or ns1.desec.io or even desec.io). If you would > try to mean it as this protocol and old software reads it as > traditional, that software would abort too if it is unsigned. So I don't > think you can accidentally break things either? > >> 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. > > But the meaning only changes from one invalid use to another invalid > use? > >> So, yes, the DNS is good at naming things differently, but we have to >> create a naming scheme that is free of collisions. > > I am not convinced. See above. I think it is clear based on where the > (C)DS records are and who would even query for it at that particular > location. > > I don't think it helps scaling either because large zones are pretty > trivial these days and all these records are fairly short lived > (days). I doubt we will see 60M of these on 1 nameserver. Can you (or > John) explain what you think is the scale that would no longer work on > a DNSSEC system? And how would that scaling compare to the CPU/disk > required to generate new DNSKEYs for all those new DNSSEC domains, > signing the domains and creating CDNSKEY/CDS records for them? > > And regardless, you can create delegatations for com._boot just as > easilly as <hash-of-com>._boot. > > I think it only helps prevent hitting the theoretical but non-real > FQDN limit of 255, but as I said before, anything that prepends an > _underscore prefix will always have a limit under 255. Not using hashes > would reduce the max length to 128 minues the _boot prefix length versus > 255 - 64 (length of base64(sha256)) - _boot prefix length. So more or > less reduce support of FQDNs from ~200 to ~128. This already requires a > minimum of 3 subdelegations, but since most TLDs dont exceed ~10 to > ~20, would require 4+ delegations. At which point you should really be in > part of the DNS tree where you control all parties to provision zones > without needing the bootstrap, that is mainly aimed at Registrar - DNS > Operator limitations. Eg you would be using catalog zones with your > nameservers that would be able to do CDS -> DS because of existing XFR > or NSUPDATE based trust relationships, or would even run on the same > nameserver to completely automated DS updates when hosting both child > and parent. > > Anyway, just to reflect, I _do_ like and this idea, but strongly prefer no > hashing and not using it to go two delegations deep over unsigned parents. > > Paul > > _______________________________________________ > DNSOP mailing list > DNSOP@ietf.org > https://www.ietf.org/mailman/listinfo/dnsop -- 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
- [DNSOP] Fwd: New Version Notification for draft-t… Peter Thomassen
- Re: [DNSOP] Fwd: New Version Notification for dra… Paul Wouters
- Re: [DNSOP] Fwd: New Version Notification for dra… John Levine
- Re: [DNSOP] Fwd: New Version Notification for dra… Peter Thomassen
- Re: [DNSOP] Fwd: New Version Notification for dra… Paul Wouters
- Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Versi… Peter Thomassen
- Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Versi… Nils Wisiol
- Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Versi… Paul Wouters
- Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Versi… Peter Thomassen
- Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Versi… Paul Wouters
- Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Versi… Christian Elmerot
- Re: [DNSOP] Fwd: New Version Notification for dra… Peter Thomassen
- Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Versi… Peter Thomassen
- Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Versi… Bob Harold
- Re: [DNSOP] [DNSSEC-Bootstrapping] Fwd: New Versi… Peter Thomassen