Hello Paul,
I wanted to take a step back and explain the reasoning behind this
implementation and why we didn't pick a different implementation.
So lets start at the beginning, why do we want to encrypt the
communication between then resolvers and the authoritatives in the first
place. There are two main reasons for encrypting things. One is
authentication. DNSSEC already covers this aspect, at least in the sense
of data authentication, it does not guarantee sender authenticity, I'll
come back to this aspect later. One important aspect of the way DNSSEC
works is that the parent zone is assumed to be trustworthy. We use that
same assumption, since going around it would require a completely
separate system, not unlike the CA system.
So the second reason to encrypt things is confidentiality. This is what
the draft is meant to accomplish. Ideally this would mean we would get
encryption all the way from the root to the eventual authoritative
nameserver. This seems unlikely, so for this draft, and any other
efforts to use DoT, we also need QNAME minimization to be used. To
ensure confidentiality we need to ensure that the nameserver we are
talking to is the actual nameserver we want to talk to. Like I said
before DNSSEC does not offer that guarantee, primarily due to the fact
that while DS records are signed in the parent zone, NS records are not,
and thus can easily be spoofed by an attacker.
So we need some way to identify the nameservers we should talk to.
Luckily we already have a mechanism for this, TLSA! So the simplest way
to implement this would be to just put a TLSA record at
_853._tcp.<nameserver>. There are a few problems with this approach
though. Like I said before NS records are not to be trusted coming from
the parent, this means that the TLSA record you get is initially not
trustworthy either. You can establish the authenticity by requesting the
NS records from the child as described in
draft-huque-dnsop-ns-revalidation. This approach could work. But
depending on the data you are trying to request it could lead to a 2
times increase in queries at the very least, if you chain a bunch of
nameservers that have yet more nameservers it at some point becomes
problematic, because you need to request the TLSA record for each of
them. And mind you, this slow down would be for all domains, not only
those supporting DoT.
So a much cleaner, and more efficient sollution, would be to put a TLSA
record for the specific domain somewhere. Ideally this would be in the
parent zone, for example on a _dot label. However, that would mean that
registry would need to implement a completely new concept, we would need
a new EPP RFC, which knowing the average deployment time for new
technologies by registries, would mean we would be done by the time hell
is frozen over.
Another solution would be to put the TLSA record in the child zone. This
could work, it would require only 2 additional queries (QNAME
minimization remember). However, the downside is that your initial
communication with the authoritative will still be plain text. You could
solve this by putting a chain in the TLS handshake, however you would
still need some way to signal that DoT should be attempted in the first
place, otherwise resolvers would be wasting a lot of time probing which
authoritatives support DoT.
So we are back to ideally signaling something via the parent. The only
way to do this securely and without registries having to make large
changes would be to use the DS record. The simplest way to accomplish
this would be to just add a dummy DS record with an algorithm DoT.
However, that still leaves the problem of getting some way to
authenticate the sender. We could use the methods described above,
however the problem of the initial communication remains. Stuffing the
TLSA chain into the TLS Hello would solve that, but it would be a very
complex solution to a simple problem.
This is where our idea comes from. “Hey, if we are going to be abusing
the DS record anyway, why not put a hash of the key in there”. It is a
simple solution, it will most likely be relatively easy to implement for
registries (they only need to add a new algorithm number in some cases,
the hashing method remains the same), and the amount of code needed in a
DNSSEC resolver is minimal. It also requires no extra queries, which is
a nice bonus.
So in summary, we think this solution is the simplest, and has the
highest chance of deployment, due to it requiring minimal effort from
all parties involved. Other solutions are definitely possible, however
this is as far as I call tell the only one, outside TLSA records in the
parent, that allows full start to finish encryption.
Regards,
Robin Geuze
On 03-06-2020 17:51, Paul Wouters wrote:
On Wed, 3 Jun 2020, Peter van Dijk wrote:
We have definitely thought about that! The way this signaling
protocol is structured means that we cannot see DNSKEY flags until we
have established some encrypted connection (in our case, DoT). So
flags are out. I think it would be simplest to allocate one
'algorithm' number per protocol. This would also allow protocols
other than DoT to perhaps use the various DNSKEY/DS fields for
different semantics.
I had a discussion with Viktor Dukhovni about the concepts of the draft.
We kind of came to the following conclusion:
If you need EPP and/or Registry and Registrar support for new things,
this is not really going to get deployed at scale. (and we need scale
to hide)
Syncing between domain owner and nameserver operator for public keys is
basically impossible. While it might work manually for one domain,
imagine GoDaddy or Cloudflare wanting to change their DoT key. They have
to get all their domain DS records updated. We can hope for CDS, but is
that realistic?
All of the draft (storing DoT signal plus pubkey in DS record) is
basically the same as storing this in a TLSA record at the nameserver
name, except it saves a few RTTs. But saving those RTTs is really not
that important if you do this at the large nameserver hosters, for which
a recursive presumbly already has a working DoT connection open because
it is serving so many more other domains.
It really makes much more sense to signal the capability of nameservers
with nameservers, and not with the domains they serve. Then if someone
uses ns0.nohats.ca, ns1.cloudflare.com and ns2.godaddy.com, those
hosters can all maintain their keys themselves and update their
nameservers without needing to inform or get consent from their millions
of domain name owners.
So we kind of concluded this was a neat hack, but we shouldn't really
think it leads to realistic at scale stable deployments.
Let's just use TLSA records on the nameservers. It is logically where
this information is authoritative for.
Paul and Viktor
_______________________________________________
dns-privacy mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/dns-privacy