DNSSEC
CS 161 Spring 2023 - Lecture 22
Computer Science 161
Last Time: DNS
2
. (root)
.edu
.org
.com
google.com
piazza.com
cs161.org
mit.edu
berkeley.edu
Computer Science 161
Last Time: DNS
3
Computer Science 161
Last Time: DNS Security
4
Computer Science 161
Outline
5
“I know a guy who knows a guy, who knows a guy, who knows a guy…”
Computer Science 161
DNS over TLS
6
Computer Science 161
Securing DNS Lookups
7
Computer Science 161
DNS over TLS
8
. (root)
.edu
berkeley.edu
Stub Resolver
Recursive Resolver
6
7
4
5
1
3
8
2
Computer Science 161
DNS over TLS: Issues
9
Computer Science 161
Object Security and Channel Security
10
Computer Science 161
DNS over TLS in Practice
11
Computer Science 161
DNSSEC: High-Level Design
12
Computer Science 161
DNSSEC
13
Computer Science 161
Warning: Unfiltered DNSSEC Ahead
14
Computer Science 161
Scratchpad: Let’s Design It Together
15
Computer Science 161
Scratchpad: Let’s Design It Together
16
Recursive Resolver
berkeley.edu name server
What is the IP address of eecs.berkeley.edu?
“The IP address of eecs.berkeley.edu is 23.185.0.1.”
Here is a signature on the above record.
Here is my public key so you can verify the signature.
Computer Science 161
Scratchpad: Let’s Design It Together
17
Recursive Resolver
berkeley.edu name server
What is the IP address of eecs.berkeley.edu?
“The IP address of eecs.berkeley.edu is 23.185.0.1.”
Here is a signature on the above record.
Here is my public key so you can verify the signature.
Computer Science 161
Scratchpad: Let’s Design It Together
18
Recursive Resolver
root name server
What is the IP address of eecs.berkeley.edu?
I don’t know, but you should ask the .edu name server.
Here is a signature on the the public key of the .edu name server. If you trust me, then now you trust them too.
Here is my public key so you can verify the signature.
Computer Science 161
DNSSEC: Design Details
19
Computer Science 161
Idea #1: Sign Records
20
Computer Science 161
Idea #2: Public-Key Infrastructure (PKI)
21
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #1)
22
Recursive Resolver
root name server
What is the IP address of eecs.berkeley.edu?
I don’t know, but you should ask the .edu name server.
Here is a signature on the public key of the .edu name server. If you trust me, then now you trust them too.
Here is my public key so you can verify the signature.
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #1)
23
Recursive Resolver
.edu name server
What is the IP address of eecs.berkeley.edu?
I don’t know, but you should ask the berkeley.edu name server.
Here is a signature on the public key of the berkeley.edu name server. If you trust me, then now you trust them too.
Here is my public key so you can verify the signature.
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #1)
24
Recursive Resolver
berkeley.edu name server
What is the IP address of eecs.berkeley.edu?
A record: “The IP address of eecs.berkeley.edu is 23.185.0.1.”
Here is a signature on the above record.
Here is my public key so you can verify the signature.
Computer Science 161
DNSSEC: Implementation
25
Computer Science 161
Warning: Unfiltered DNSSEC Ahead
26
Computer Science 161
Review: DNS Packet Format
27
Source Port | Destination Port |
Checksum | Length |
ID number | Flags |
Question count | Answer count |
Authority count | Additional count |
Question Records | |
Answer Records | |
Authority Records | |
Additional Records |
DNS Payload
UDP Header
DNS Header
Computer Science 161
OPT Pseudosection
28
Computer Science 161
OPT Pseudosection
29
Computer Science 161
Resource Record Sets (RRSETs)
30
Computer Science 161
New DNSSEC Record Types
31
Computer Science 161
New DNSSEC Record Types: RRSIG
32
Computer Science 161
New DNSSEC Record Types: DNSKEY
33
Computer Science 161
New DNSSEC Record Types: DS
34
Computer Science 161
New DNSSEC Record Types: DS
35
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #2)
36
Recursive Resolver
root name server
What is the IP address of eecs.berkeley.edu?
I don’t know, but you should ask the .edu name server.
Here is a signature on the public key of the .edu name server. If you trust me, then now you trust them too.
Here is my public key so you can verify the signature.
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #2)
37
Recursive Resolver
.edu name server
What is the IP address of eecs.berkeley.edu?
I don’t know, but you should ask the berkeley.edu name server.
Here is a signature on the public key of the berkeley.edu name server. If you trust me, then now you trust them too.
Here is my public key so you can verify the signature.
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #2)
38
Recursive Resolver
berkeley.edu name server
What is the IP address of eecs.berkeley.edu?
Here is a signature on the above record.
Here is my public key so you can verify the signature.
Computer Science 161
Key-Signing Keys and Zone-Signing Keys
39
Computer Science 161
Motivation: Recovering from Key Compromise
40
Computer Science 161
Key-Signing Keys and Zone-Signing Keys
41
Computer Science 161
Path of Trust (without KSKs and ZSKs)
42
KSK
.
KSK
org
DS
cs161.org
DS
A
MX
Root of trust
NS
NS
H(KSK)
H(KSK)
KSK
Computer Science 161
Path of Trust (with KSKs and ZSKs)
43
KSK
ZSK
ZSK
DNSKEY
DNSKEY
.
KSK
ZSK
ZSK
DNSKEY
DNSKEY
org
DS
KSK
ZSK
ZSK
DNSKEY
DNSKEY
cs161.org
DS
A
MX
Root of trust
NS
NS
H(KSK)
H(KSK)
The thick arrows represented authenticated data
Notice: We don’t need to authenticate NS records. As long as the final A record is authenticated by the chain of trust, it doesn’t matter which server we got it from!
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #3)
44
Recursive Resolver
root name server
(“upper half”)
What are your public keys?
Here are my public keys.
Here is a signature on my ZSK. If you trust my KSK, then now you trust my ZSK.
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #3)
45
Recursive Resolver
root name server
(“lower half”)
What is the IP address of eecs.berkeley.edu?
I don’t know, but you should ask the .edu name server.
Here is a signature on the public KSK of the .edu name server. If you trust my ZSK, then now you trust them too.
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #3)
46
Recursive Resolver
.edu name server
(“upper half”)
What are your public keys?
Here are my public keys.
Here is a signature on my ZSK. If you trust my KSK, then now you trust my ZSK.
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #3)
47
Recursive Resolver
.edu name server
(“lower half”)
What is the IP address of eecs.berkeley.edu?
I don’t know, but you should ask the berkeley.edu name server.
Here is a signature on the public KSK of the berkeley.edu name server. If you trust my ZSK, then now you trust them too.
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #3)
48
Recursive Resolver
berkeley.edu name server
(“upper half”)
What are your public keys?
Here are my public keys.
Here is a signature on my ZSK. If you trust my KSK, then now you trust my ZSK.
Computer Science 161
Steps of a DNSSEC Lookup (Attempt #3)
49
Recursive Resolver
What is the IP address of eecs.berkeley.edu?
Here is a signature on the above record.
berkeley.edu name server
(“lower half”)
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec DNSKEY . @198.41.0.4
50
You can try this at home! Use the dig utility in your terminal, and remember to set the +norecurse flag so you can traverse the name server hierarchy yourself and the +dnssec flag so that you receive DNSSEC responses.
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec DNSKEY . @198.41.0.4
51
The first step is to query the root name server for its public keys.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
| |
| |
| |
| |
| |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec DNSKEY . @198.41.0.4
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7149
;; flags: qr aa; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1472
;; QUESTION SECTION:
;. IN DNSKEY
;; ANSWER SECTION:
. 172800 IN DNSKEY 256 {ZSK of root}
. 172800 IN DNSKEY 257 {KSK of root}
. 172800 IN RRSIG DNSKEY {signature on DNSKEY records}
...
52
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
| |
| |
| |
| |
| |
| |
| |
| |
The header says there’s 1 record in the additional section, but the additional section is empty! What happened?
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec DNSKEY . @198.41.0.4
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7149
;; flags: qr aa; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1472
;; QUESTION SECTION:
;. IN DNSKEY
;; ANSWER SECTION:
. 172800 IN DNSKEY 256 {ZSK of root}
. 172800 IN DNSKEY 257 {KSK of root}
. 172800 IN RRSIG DNSKEY {signature on DNSKEY records}
...
53
The additional record is actually the OPT pseudosection, which dig lists separately for us.
Note the do flag, which indicates that DNSSEC is supported.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
| |
| |
| |
| |
| |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec DNSKEY . @198.41.0.4
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7149
;; flags: qr aa; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1472
;; QUESTION SECTION:
;. IN DNSKEY
;; ANSWER SECTION:
. 172800 IN DNSKEY 256 {ZSK of root}
. 172800 IN DNSKEY 257 {KSK of root}
. 172800 IN RRSIG DNSKEY {signature on DNSKEY records}
...
54
The root’s KSK signs the root’s ZSK. If you trust the root’s KSK (trust anchor), now you trust the root’s ZSK.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
| |
| |
| |
| |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec eecs.berkeley.edu @198.41.0.4
55
Next, we ask the root name server about the IP address of eecs.berkeley.edu.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
| |
| |
| |
| |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec eecs.berkeley.edu @198.41.0.4
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5232
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 15, ADDITIONAL: 27
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;eecs.berkeley.edu. IN A
;; AUTHORITY SECTION:
edu. 172800 IN NS a.edu-servers.net.
edu. 172800 IN NS b.edu-servers.net.
edu. 172800 IN NS c.edu-servers.net.
...
edu. 86400 IN DS {hash of .edu's KSK}
edu. 86400 IN RRSIG DS {signature on DS record}
;; ADDITIONAL SECTION:
a.edu-servers.net. 172800 IN A 192.5.6.30
b.edu-servers.net. 172800 IN A 192.33.14.30
c.edu-servers.net. 172800 IN A 192.26.92.30
...
56
The records are all the same as ordinary DNS, except for these two extra records endorsing the .edu name server’s public KSK.
If you trust the root’s ZSK, now you trust the .edu name server’s KSK.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
edu. | DS |
| |
| |
| |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec DNSKEY edu. @192.5.6.30
57
Next, we query the .edu name server for its public keys.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
edu. | DS |
| |
| |
| |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec DNSKEY edu. @192.5.6.30
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9776
;; flags: qr aa; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;edu. IN DNSKEY
;; ANSWER SECTION:
edu. 86400 IN DNSKEY 256 {ZSK of .edu}
edu. 86400 IN DNSKEY 257 {KSK of .edu}
edu. 86400 IN RRSIG DNSKEY {signature on DNSKEY records}
...
58
The .edu name server’s KSK signs the .edu name server’s ZSK. If you trust .edu’s KSK, now you trust .edu’s ZSK.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
edu. | DS |
edu. | DNSKEY (KSK) |
edu. | DNSKEY (ZSK) |
| |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec eecs.berkeley.edu @192.5.6.30
59
Next, we ask the .edu name server about the IP address of eecs.berkeley.edu.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
edu. | DS |
edu. | DNSKEY (KSK) |
edu. | DNSKEY (ZSK) |
| |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec eecs.berkeley.edu @192.5.6.30
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60799
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 5, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;eecs.berkeley.edu. IN A
;; AUTHORITY SECTION:
berkeley.edu. 172800 IN NS adns1.berkeley.edu.
berkeley.edu. 172800 IN NS adns2.berkeley.edu.
berkeley.edu. 172800 IN NS adns3.berkeley.edu.
berkeley.edu. 86400 IN DS {hash of berkeley.edu's KSK}
berkeley.edu. 86400 IN RRSIG DS {signature on DS record}
;; ADDITIONAL SECTION:
adns1.berkeley.edu. 172800 IN A 128.32.136.3
adns2.berkeley.edu. 172800 IN A 128.32.136.14
adns3.berkeley.edu. 172800 IN A 192.107.102.142
...
60
Again, the records are all the same as ordinary DNS, except for these two extra records endorsing the berkeley.edu name server’s public KSK.
If you trust the .edu name server’s ZSK, now you trust the berkeley.edu name server’s KSK.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
edu. | DS |
edu. | DNSKEY (KSK) |
edu. | DNSKEY (ZSK) |
berkeley.edu. | DS |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec DNSKEY berkeley.edu @128.32.136.3
61
Next, we query the berkeley.edu name server for its public keys.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
edu. | DS |
edu. | DNSKEY (KSK) |
edu. | DNSKEY (ZSK) |
berkeley.edu. | DS |
| |
| |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec DNSKEY berkeley.edu @128.32.136.3
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4169
;; flags: qr aa; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1220
;; QUESTION SECTION:
;berkeley.edu. IN DNSKEY
;; ANSWER SECTION:
berkeley.edu. 172800 IN DNSKEY 256 {ZSK of berkeley.edu}
berkeley.edu. 172800 IN DNSKEY 257 {KSK of berkeley.edu}
berkeley.edu. 172800 IN RRSIG DNSKEY {signature on DNSKEY records}
...
62
The berkeley.edu name server’s KSK signs the berkeley.edu name server’s ZSK. If you trust berkeley.edu’s KSK, now you trust berkeley.edu’s ZSK.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
edu. | DS |
edu. | DNSKEY (KSK) |
edu. | DNSKEY (ZSK) |
berkeley.edu. | DS |
berkeley.edu. | DNSKEY (KSK) |
berkeley.edu. | DNSKEY (ZSK) |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec eecs.berkeley.edu @128.32.136.3
63
Finally, we ask the berkeley.edu name server about the IP address of eecs.berkeley.edu.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
edu. | DS |
edu. | DNSKEY (KSK) |
edu. | DNSKEY (ZSK) |
berkeley.edu. | DS |
berkeley.edu. | DNSKEY (KSK) |
berkeley.edu. | DNSKEY (ZSK) |
| |
Computer Science 161
DNSSEC Lookup Walkthrough
$ dig +norecurse +dnssec eecs.berkeley.edu @128.32.136.3
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21205
;; flags: qr aa; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1220
;; QUESTION SECTION:
;eecs.berkeley.edu. IN A
;; ANSWER SECTION:
eecs.berkeley.edu. 86400 IN A 23.185.0.1
eecs.berkeley.edu. 86400 IN RRSIG A {signature on A record}
64
Here’s the final answer record, signed by berkeley.edu’s public ZSK. If you trust berkeley.edu’s ZSK, then now you trust the final answer.
The chain of trust | |
Name | Type |
. | DNSKEY (KSK) |
. | DNSKEY (ZSK) |
edu. | DS |
edu. | DNSKEY (KSK) |
edu. | DNSKEY (ZSK) |
berkeley.edu. | DS |
berkeley.edu. | DNSKEY (KSK) |
berkeley.edu. | DNSKEY (ZSK) |
eecs.berkeley.edu. | A |
Computer Science 161
NSEC: Signing Non-Existent Domains
65
Computer Science 161
Nonexistent Domains
66
Computer Science 161
NSEC: Authenticated Denial of Existence
67
maps
one
web
Computer Science 161
Issues with NSEC
68
web
ap
apps
Computer Science 161
NSEC3: Hashed Authenticated Denial of Existence
69
c612f3
d810de
Computer Science 161
Issues with NSEC3
70
Computer Science 161
DNSSEC in Practice
71
Computer Science 161
Offline Signature Generation
72
Computer Science 161
Efficiency: Parallelization
73
Computer Science 161
Implementation Errors
74
Computer Science 161
Implementation Errors: Examples
75
Computer Science 161
Implementation Error: Incomplete Validation
76
Computer Science 161
DNSSEC: Summary
77
Computer Science 161