A trust anchor is a key that is placed into a validating resolver so that the validator can verify the results for a given request back to a known or trusted public key (the trust anchor). A validating resolver must have at least one trust anchor installed in order to perform DNSSEC validation.
In the section the section called “How Does DNSSEC Change DNS Lookup (Revisited)?”, we walked through the DNSSEC lookup process (12 steps), and at the end of the 12 steps, a critical comparison happens: the key received from the remote server, and the key we have on file are compared to see if we trust it. The key we have on file is called a trust anchor, sometimes also known as a trust key, trust point, or secure entry point.
The 12-step lookup process describes the DNSSEC lookup in the ideal world where every single domain name is signed and properly delegated, each validating resolver only needs to have one trust anchor, and that is the root's public key. But there is no restriction that the validating resolver must only have one trust anchor. In fact, in the early stages of DNSSEC adoption, it was not unusual for a validating resolver to have more than one trust anchor.
For instance, before the root zone was signed (prior to the year 2010),
some validating resolvers that wish to validate domain names in the
.gov
zone needed to obtain and install the key for
.gov
. A sample lookup process for www.fbi.gov
would
thus be only 8 steps rather than 12 steps that look like this:
fbi.gov
name server for
the A record of www.fbi.gov
..gov
name server for DS
record of fbi.gov
..gov
name server responds with DS record and RRSIG
for fbi.gov
..gov
name server for
DNSKEY..gov
name server responds with DNSKEY and
RRSIG.
This all looks very similar, except it's shorter than the 12-steps that
we saw earlier. Once the validating resolver receives the DNSKEY file in #8,
it recognizes that this is the manually configured trusted key (trust
anchor), and never goes to the root name servers to ask for the DS record for
.gov
, or ask the root name servers for its DNSKEY.
In fact, whenever the validating resolver receives a DNSKEY, it checks to see if this is a configured trusted key, to decide whether or not it needs to continue chasing down the validation chain.
So, as the resolver is validating, we must have at least one key (trust anchor) configured. How did it get here, and how do we maintain it?
If you followed the recommendation in the section called “Easy Start Guide for Recursive Servers”, by setting
dnssec-validation
to auto
, then
there is nothing you need to do. BIND already includes a default key (in the
file bind.keys
), that will automatically update itself.
It looks something like this:
managed-keys { . initial-key 257 3 8 "AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0="; };
You could, of course, decide to manage this key on your own by hand.
First, you'll need to make sure that your
dnssec-validation
is set to yes
rather than auto
:
options { dnssec-validation yes; };
Then, download the root key manually from a trustworthy source, such as
https://www.isc.org/bind-keys. Finally, take the root key you
manually downloaded, and put it into a trusted-keys
statement as shown below:
trusted-keys { . 257 3 8 "AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0="; };
Looking back at the example in the section called “How Trust Anchors are Used”, if you wanted to explicitly trust
.gov
and only validate domain names under .gov
,
your trusted-keys
statement would look something like
this:
trusted-keys { gov. 257 3 8 "AQO8daaz7B+yshOfL60rytKd9aOSujgponEw3fwBMEC3 /+e9XzHw2k+VKnbJTZ+QaVtpfUd1q9HKZIv/ck83Gl5T jYKE5jtUZ2kpEDZfVNGv6yx0smtWAXv1nCJS9ohnyOTd 397eMojGDHqkEC+uojEScZheEkMxzgCZwDAs+/CSU7mS uHtCRZn19xlZUd5Gv7yDQ3mbOUwuy30oSk0z1Q5UUPpo ihOugIZHFX6Jk7NLiW2wlqfq9qhV4zj7TiBiJY0mCc4z HN8/aq2VKDHp2Na7mWzvKyTy+SYQkBQ/08LbPwj9YMc+ uCzKL6sU/ObHv17EFhD8aPDftTHZvV9L+OZr"; };
As the name trusted-keys
suggests, it is possible to
have more than one key configured. You could also leverage the section called “DNSSEC Look-aside Validation (DLV)” as part of your trust-anchor management strategy.
While trusted-keys
and
managed-keys
appear similar, there is an
important difference: trusted-keys
are always
trusted, until they are deleted from named.conf
;
managed-keys
(specifically,
initial-key
, which is the only supported type
currently) are only trusted once: for as long as it takes to load
the managed key database and start the key maintenance process.
Remember, if you choose to manage the keys on your own, whenever the
key changes, the configuration needs to be updated manually. Failing to do so
will result in breaking nearly all DNS queries for the sub domain of the key.
So if you are manually managing .gov
, all domain names in the
.gov
space may become unresolvable; if you are manually managing
the root key, you could break all DNS requests made to your recursive name
server.