| 1 |
1. Introduction |
|---|
| 2 |
|
|---|
| 3 |
A second workshop to test and refine the NSEC3 extension for DNSSEC |
|---|
| 4 |
was held September 18-20, 2006, in Dulles, Virginia, USA, and hosted |
|---|
| 5 |
by VeriSign. Attending were (in alphabetical order by first name): |
|---|
| 6 |
|
|---|
| 7 |
David Blacka (VeriSign) |
|---|
| 8 |
Edward Lewis (NeuStar) |
|---|
| 9 |
Geoff Sisson (Nominet) |
|---|
| 10 |
Jelte Jansen (NLNet Labs) |
|---|
| 11 |
John Dickinson (Nominet) |
|---|
| 12 |
Mark Andrews (ISC) |
|---|
| 13 |
Matt Larson (VeriSign) |
|---|
| 14 |
Peter Koch (DENIC) |
|---|
| 15 |
Roy Arends (Nominet) |
|---|
| 16 |
Sam Weiler (SPARTA) |
|---|
| 17 |
Scott Rose (VeriSign) |
|---|
| 18 |
Suresh Krishnaswamy (SPARTA) |
|---|
| 19 |
Suzanne Woolf (ISC) |
|---|
| 20 |
Wouter Wijngaards (NLNet Labs) |
|---|
| 21 |
Ólafur Guðmundsson (OGUD Consulting) |
|---|
| 22 |
|
|---|
| 23 |
After the first NSEC3 workshop in Frankfurt in May 2006, the attendees |
|---|
| 24 |
felt, along with others in the dnsext working group, that a second |
|---|
| 25 |
workshop was needed to address additional issues that couldn't be |
|---|
| 26 |
tested at the first workshop for various reasons. |
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 |
2. Issues tested |
|---|
| 30 |
|
|---|
| 31 |
In this second NSEC3 workshop we tested five main areas: |
|---|
| 32 |
|
|---|
| 33 |
(a) Signalling NSEC3 and traversing various combinations |
|---|
| 34 |
|
|---|
| 35 |
We tested the mechanism proposed in the -07 NSEC3 draft for a zone to |
|---|
| 36 |
signal its use of NSEC3. This mechanism requires the zone to be |
|---|
| 37 |
signed with new DNSKEY algorithm IDs that correspond to existing |
|---|
| 38 |
algorithm IDs but specifically indicate NSEC3 is in use. For example, |
|---|
| 39 |
DNSKEY algorithm ID 5 indicates a zone signed with RSA/SHA-1. For |
|---|
| 40 |
this workshop, algorithm ID 133 (5+128) indicated RSA/SHA-1 and also |
|---|
| 41 |
possibly NSEC3. |
|---|
| 42 |
|
|---|
| 43 |
The goal of this signalling mechanism is to "blind" legacy, |
|---|
| 44 |
NSEC3-oblivious DNSSEC validators to NSEC3 zones, causing these |
|---|
| 45 |
validators to treat responses containing NSEC3 records as insecure |
|---|
| 46 |
rather than bogus. We tested different delegation paths alternating |
|---|
| 47 |
between NSEC3 and NSEC and including opt-out. Details of the |
|---|
| 48 |
workshop's test zone structure environment are described below in |
|---|
| 49 |
section 3.1. |
|---|
| 50 |
|
|---|
| 51 |
(b) Transitioning from NSEC to NSEC3 |
|---|
| 52 |
|
|---|
| 53 |
We tested how a zone could transition from signing with NSEC to |
|---|
| 54 |
signing with NSEC3, again as described in the -07 NSEC3 draft, while |
|---|
| 55 |
maintaining a secure state and not requiring the zone to become |
|---|
| 56 |
unsigned at any point during the transition. |
|---|
| 57 |
|
|---|
| 58 |
(c) Zone signing |
|---|
| 59 |
|
|---|
| 60 |
We tested the interoperability of NSEC3-capable DNSSEC zone signers. |
|---|
| 61 |
|
|---|
| 62 |
(d) Zone loading and transfer |
|---|
| 63 |
|
|---|
| 64 |
We tested the ability of several authoritative servers to successfully |
|---|
| 65 |
load NSEC3-signed zones and then the interoperability of these servers |
|---|
| 66 |
to transfer the NSEC3-signed zones without any errors or loss of |
|---|
| 67 |
information. |
|---|
| 68 |
|
|---|
| 69 |
(e) Handling brokenness |
|---|
| 70 |
|
|---|
| 71 |
We tested the reaction of different NSEC3-capable validators to |
|---|
| 72 |
different scenarios involving deliberately broken packets. The |
|---|
| 73 |
specific brokenness is discussed below, but broken responses included, |
|---|
| 74 |
for example, missing or malformed NSEC3 records. |
|---|
| 75 |
|
|---|
| 76 |
|
|---|
| 77 |
3. Test environment |
|---|
| 78 |
|
|---|
| 79 |
3.1. Zone structure |
|---|
| 80 |
|
|---|
| 81 |
In contrast to some previous DNSSEC workshops, where the structure of |
|---|
| 82 |
test zones was decided during the workshop and configured on |
|---|
| 83 |
attendees' workstations, for this workshop the test zone structure was |
|---|
| 84 |
created before the workshop by Roy Arends of Nominet and hosted on |
|---|
| 85 |
publicly accessible name servers at Nominet. This method saved |
|---|
| 86 |
considerable time, since we could begin the workshop with minimal |
|---|
| 87 |
on-site setup. Participants needed only to set up |
|---|
| 88 |
resolvers/validators on their workstations, which then queried the |
|---|
| 89 |
test zone structure on the Nominet name servers. |
|---|
| 90 |
|
|---|
| 91 |
The test zone structure was hosted by three authoritative servers. |
|---|
| 92 |
The 'trust-anchored zone' (ws.nsec3.org) resided on one server, the |
|---|
| 93 |
second level zones resided on another server, and the third level |
|---|
| 94 |
zones resided on yet another server. The ws.nsec3.org zone was |
|---|
| 95 |
DNSSEC-NSEC signed and contained delegations to signed zones and one |
|---|
| 96 |
unsigned zone. The delegations immediately under ws.nsec3.org were: |
|---|
| 97 |
|
|---|
| 98 |
n0 unsigned zone |
|---|
| 99 |
n1u signed zone with unsigned delegations, using NSEC |
|---|
| 100 |
n1s signed zone with signed delegations, using NSEC |
|---|
| 101 |
n3o signed zone with opted out, unsigned delegations, using NSEC3 |
|---|
| 102 |
n3u signed zone with unsigned delegations, using NSEC3 |
|---|
| 103 |
n3s signed zone with signed delegations, using NSEC3 |
|---|
| 104 |
|
|---|
| 105 |
The zones with unsigned delegations (n0,n1u,n3o,n3u) had a delegation |
|---|
| 106 |
to n0.(n0,n1u,n3o,n3u). The zones with signed delegations (n1s,n3s) |
|---|
| 107 |
had delegations to n1.n3s and n3.(n1s,n3s). |
|---|
| 108 |
|
|---|
| 109 |
3.2. Software |
|---|
| 110 |
|
|---|
| 111 |
The workshop tests used different authoritative servers, |
|---|
| 112 |
resolver/validators and zone signers. Implementation names are |
|---|
| 113 |
obfuscated to avoid even unintentionally casting any implementations |
|---|
| 114 |
in a negative light. |
|---|
| 115 |
|
|---|
| 116 |
Five name server implementations were used as authoritative servers |
|---|
| 117 |
and are designated A1 through A5 in this report. (Different major |
|---|
| 118 |
versions of the same software are counted as a different |
|---|
| 119 |
implementation.) The zones in the test structure were hosted by two |
|---|
| 120 |
different NSEC3-capable authoritative server implementations, A1 and |
|---|
| 121 |
A4. The zone loading and transfer tests used all five. |
|---|
| 122 |
|
|---|
| 123 |
Participants configured multiple different resolver/validators on |
|---|
| 124 |
their workstations to query the workshop zone structure hosted at |
|---|
| 125 |
Nominet and validate the responses. Eleven different implementations |
|---|
| 126 |
were used, although similarly to the authoritative servers, different |
|---|
| 127 |
major versions of the same software count as different |
|---|
| 128 |
implementations. In some cases, the software was used only as a |
|---|
| 129 |
resolver and in other cases a trust anchor was configured and the |
|---|
| 130 |
software was also used as a DNSSEC validator. These implementations |
|---|
| 131 |
are referred to as R1 through R11 when used only in a resolver context |
|---|
| 132 |
(i.e., no DNSSEC validation). The same eleven implementations are |
|---|
| 133 |
referred to as V1 through V11 when configured with a trust anchor and |
|---|
| 134 |
performed DNSSEC validation. |
|---|
| 135 |
|
|---|
| 136 |
For the zone signing tests, there were four different NSEC3-capable |
|---|
| 137 |
DNSSEC zone signers that were tested for interoperability and their |
|---|
| 138 |
ability to generate equivalent signed zones from the same unsigned |
|---|
| 139 |
input. These signers are designated S1 through S4. |
|---|
| 140 |
|
|---|
| 141 |
Finally, for the brokenness tests, we used Roy Arends's "packet |
|---|
| 142 |
server", which is special-purpose name server designed to serve |
|---|
| 143 |
specially constructed deliberately broken packets to test validator |
|---|
| 144 |
behavior to known-bad responses. |
|---|
| 145 |
|
|---|
| 146 |
|
|---|
| 147 |
4. Signalling NSEC3 and traversing various combinations |
|---|
| 148 |
|
|---|
| 149 |
Setup |
|---|
| 150 |
|
|---|
| 151 |
This series of test were developed to test the NSEC/NSEC3 signaling |
|---|
| 152 |
mechanism. Previous work showed that non-NSEC3 aware validating |
|---|
| 153 |
resolvers could not follow a unsigned delegation from a NSEC3 zone. |
|---|
| 154 |
The proposed solution was to signal NSEC3 signed zones by using an |
|---|
| 155 |
alternative DNSKEY algorithm code, which non-NSEC3 aware validators |
|---|
| 156 |
would interpret as insecure and not attempt to validate security |
|---|
| 157 |
information from those zones. In this experiment, the algorithm code |
|---|
| 158 |
for "NSEC3 signed" zones was 133. |
|---|
| 159 |
|
|---|
| 160 |
Test Format |
|---|
| 161 |
|
|---|
| 162 |
The tree used for the signaling and traversing tests are summarized below. |
|---|
| 163 |
For resolvers that required DNSSEC, the KSK for ws.nsec3.org was used as the |
|---|
| 164 |
trust anchor. |
|---|
| 165 |
|
|---|
| 166 |
* ws.nsec3.org (signed with nsec) |
|---|
| 167 |
* n0.ws.nsec3.org |
|---|
| 168 |
* n0.n0.ws.nsec3.org |
|---|
| 169 |
* n1u.ws.nsec3.org |
|---|
| 170 |
* n0.n1u.ws.nsec3.org |
|---|
| 171 |
* n1s.ws.nsec3.org |
|---|
| 172 |
* n3.n1s.ws.nsec3.org |
|---|
| 173 |
* n3u.ws.nsec3.org |
|---|
| 174 |
* n0.n3u.nsec3.org |
|---|
| 175 |
* n3s.ws.nsec3.org |
|---|
| 176 |
* n1.n3s.ws.nsec3.org |
|---|
| 177 |
* n3.n3s.ws.nsec3.org |
|---|
| 178 |
* n3o.ws.nsec3.org |
|---|
| 179 |
* n0.n3o.ws.nsec3.org |
|---|
| 180 |
* full.ws.nsec3.org |
|---|
| 181 |
|
|---|
| 182 |
The labels indicate the following: |
|---|
| 183 |
|
|---|
| 184 |
n0 - unsigned zone data |
|---|
| 185 |
n1 - DNSSEC signed data (NSEC chain) |
|---|
| 186 |
n1u - DNSSEC signed data (NSEC chain) with unsigned delegations |
|---|
| 187 |
n1s - DNSSEC signed data (NSEC chain) with signed delegations |
|---|
| 188 |
n3 - DNSSEC with NSEC3 chain |
|---|
| 189 |
n3u - DNSSEC with NSEC3 chain, unsigned delegations |
|---|
| 190 |
n3s - DNSSEC with NSEC3 chain, signed delegations |
|---|
| 191 |
n3o - DNSSEC with NSEC3 chain with Opt-Out |
|---|
| 192 |
full - DNSSEC with NSEC3, includes wildcards, empty non-terminals, etc. |
|---|
| 193 |
|
|---|
| 194 |
Each zone contained a single host (www) and DNSKEY RRs as appropriate. There |
|---|
| 195 |
was two versions of this tree - one served by A1 servers and one served by |
|---|
| 196 |
A4 servers. Each type of resolver sent queries for the www host in each of |
|---|
| 197 |
the following zones: |
|---|
| 198 |
|
|---|
| 199 |
www.n0.n0.ws.nsec3.org |
|---|
| 200 |
www.n0.n1u.ws.nsec3.org |
|---|
| 201 |
www.n3.n1s.ws.nsec3.org |
|---|
| 202 |
www.n0.n3u.ws.nsec3.org |
|---|
| 203 |
www.n0.n3o.ws.nsec3.org |
|---|
| 204 |
www.n1.n3s.ws.nsec3.org |
|---|
| 205 |
www.n3.n3s.ws.nsec3.org |
|---|
| 206 |
|
|---|
| 207 |
Along with various queries to full.ws.nsec3.org as time permitted. |
|---|
| 208 |
For each resolver implementation, the expected results depended on the |
|---|
| 209 |
characteristics of the resolver: |
|---|
| 210 |
|
|---|
| 211 |
Expected results: |
|---|
| 212 |
|
|---|
| 213 |
Tree authoritative servers: A1, A4 |
|---|
| 214 |
NSEC3-aware: R9, R1, R7, R10, R9 |
|---|
| 215 |
NSEC-aware: R8, R3, R10 |
|---|
| 216 |
DNSSEC unaware: R11, R5, R4, R6 |
|---|
| 217 |
|
|---|
| 218 |
NSEC3-aware NSEC-aware DNSSEC-unaware |
|---|
| 219 |
|
|---|
| 220 |
www.n0.n0 insecure insecure traditional resp. |
|---|
| 221 |
|
|---|
| 222 |
www.n0.n1u insecure insecure traditional resp. |
|---|
| 223 |
|
|---|
| 224 |
www.n1.n1s nxdomain nxdomain traditional resp. |
|---|
| 225 |
|
|---|
| 226 |
www.n3.n1s secure/AD insecure traditional resp. |
|---|
| 227 |
|
|---|
| 228 |
www.n0.n3u insecure insecure traditional resp. |
|---|
| 229 |
|
|---|
| 230 |
www.n0.n3o insecure insecure traditional resp. |
|---|
| 231 |
|
|---|
| 232 |
www.n1.n3s secure/AD insecure traditional resp. |
|---|
| 233 |
|
|---|
| 234 |
www.n3.n3s secure/AD insecure traditional resp. |
|---|
| 235 |
|
|---|
| 236 |
|
|---|
| 237 |
Actual results from tests: |
|---|
| 238 |
|
|---|
| 239 |
|
|---|
| 240 |
R9 R1 R11 R8 R5 R3 R6 |
|---|
| 241 |
|
|---|
| 242 |
www.n0.n0 P P P P P P P |
|---|
| 243 |
|
|---|
| 244 |
www.n0.n1u P P P P P P P |
|---|
| 245 |
|
|---|
| 246 |
www.n1.n1s P P P P P P P |
|---|
| 247 |
|
|---|
| 248 |
www.n3.n1s P P P P P P P |
|---|
| 249 |
|
|---|
| 250 |
www.n0.n3u P P P P P P P |
|---|
| 251 |
|
|---|
| 252 |
www.n0.n3o P * P P P P P |
|---|
| 253 |
|
|---|
| 254 |
www.n1.n3s P P P P P P P |
|---|
| 255 |
|
|---|
| 256 |
www.n3.n3s P P P P P P P |
|---|
| 257 |
|
|---|
| 258 |
|
|---|
| 259 |
|
|---|
| 260 |
|
|---|
| 261 |
R3 R4 R7 R10 R10 |
|---|
| 262 |
(dnssec) (with nsec3) (no nsec3) (nsec3) |
|---|
| 263 |
|
|---|
| 264 |
www.n0.n0 P P P P P |
|---|
| 265 |
|
|---|
| 266 |
www.n0.n1u P P P P P |
|---|
| 267 |
|
|---|
| 268 |
www.n1.n1s P P P P P |
|---|
| 269 |
|
|---|
| 270 |
www.n3.n1s P P P P P |
|---|
| 271 |
|
|---|
| 272 |
www.n0.n3u P P P P P |
|---|
| 273 |
|
|---|
| 274 |
www.n0.n3o P P P P P |
|---|
| 275 |
|
|---|
| 276 |
www.n1.n3s P P P P P |
|---|
| 277 |
|
|---|
| 278 |
www.n3.n3s P P P P P |
|---|
| 279 |
|
|---|
| 280 |
|
|---|
| 281 |
Discussion |
|---|
| 282 |
|
|---|
| 283 |
From the results in the tables above, the "*" indicates that the tree |
|---|
| 284 |
using A1 returning ServFail for that query. It was later believed to |
|---|
| 285 |
be an environment bug, not a protocol error. One that may repeat if |
|---|
| 286 |
the zones are not set up correctly. All other queries resulted in |
|---|
| 287 |
matching behavior with both domain trees and the expected results |
|---|
| 288 |
(marked with the 'P' for "pass"). |
|---|
| 289 |
|
|---|
| 290 |
These tests do not cover all possible DNS environments. More work |
|---|
| 291 |
would need to be done as corner cases and unique zones are |
|---|
| 292 |
encountered. For the majority of expected scenarios, the expected |
|---|
| 293 |
results (from the resolvers point of view) were recieved. That is, |
|---|
| 294 |
when a non-NSEC3 aware validating resolver encounters a zone along a |
|---|
| 295 |
resolution path, it will see the unknown key algorithm and consider |
|---|
| 296 |
that zone (and all children of that zone) to be insecure. |
|---|
| 297 |
|
|---|
| 298 |
|
|---|
| 299 |
5. Transitioning from NSEC to NSEC3 |
|---|
| 300 |
|
|---|
| 301 |
Synopsis: |
|---|
| 302 |
|
|---|
| 303 |
This tested the observed behaviour of several different |
|---|
| 304 |
resolvers/validators before, during and after a roll from NSEC to |
|---|
| 305 |
NSEC3. |
|---|
| 306 |
|
|---|
| 307 |
|
|---|
| 308 |
Roll states: |
|---|
| 309 |
|
|---|
| 310 |
State 1: Initial state (pre-roll): |
|---|
| 311 |
|
|---|
| 312 |
An NSEC3-capable authoritative server with NSEC-signed zone |
|---|
| 313 |
using key algorithm 5 (RSASHA1) which had three sub-zones. |
|---|
| 314 |
These were: |
|---|
| 315 |
|
|---|
| 316 |
- an unsigned sub-zone [n0.roll.ws.nsec3.org] |
|---|
| 317 |
- a signed sub-zone using NSEC [n1.roll.ws.nsec3.org] |
|---|
| 318 |
- a signed sub-zone using NSEC3 [n3.roll.ws.nsec3.org] |
|---|
| 319 |
|
|---|
| 320 |
State 2: Intermediate state (during roll): |
|---|
| 321 |
|
|---|
| 322 |
We performed a key rollover to an NSEC-signed zone using |
|---|
| 323 |
key algorithm 133 (NSEC3RSASHA1, i.e. RSASHA1 algorithm with |
|---|
| 324 |
code specially assigned to signal possible use of NSEC3). |
|---|
| 325 |
|
|---|
| 326 |
State 3: Final state (post-roll): |
|---|
| 327 |
|
|---|
| 328 |
We then signed the zones, replacing the NSEC chain with an |
|---|
| 329 |
NSEC3 chain -- again using key algorithm 133 -- and reloaded |
|---|
| 330 |
the server. |
|---|
| 331 |
|
|---|
| 332 |
|
|---|
| 333 |
Testing: |
|---|
| 334 |
|
|---|
| 335 |
A number of different resolvers/validators were tested: |
|---|
| 336 |
|
|---|
| 337 |
- two different NSEC3-aware validators: V1 and V7. |
|---|
| 338 |
|
|---|
| 339 |
- two different NSEC-only validators: V3 and V8. |
|---|
| 340 |
|
|---|
| 341 |
- several different resolvers which were either DNSSEC-unaware or |
|---|
| 342 |
had DNSSEC disabled: R3, R4, R5, R10, R11. |
|---|
| 343 |
|
|---|
| 344 |
|
|---|
| 345 |
Result: |
|---|
| 346 |
|
|---|
| 347 |
All resolvers/validators returned expected results throughout all |
|---|
| 348 |
three states of the test. |
|---|
| 349 |
|
|---|
| 350 |
- The NSEC3-aware validators returned consistent authoritative results |
|---|
| 351 |
during all three states. |
|---|
| 352 |
|
|---|
| 353 |
- The NSEC-only-aware validators returned authoritative answers in |
|---|
| 354 |
State 1 and non-authoritative answers in States 2 and 3. |
|---|
| 355 |
|
|---|
| 356 |
- The non-DNSSEC-aware resolvers returned expected answers throughout |
|---|
| 357 |
the test. |
|---|
| 358 |
|
|---|
| 359 |
|
|---|
| 360 |
6. Zone signing |
|---|
| 361 |
|
|---|
| 362 |
Intro: |
|---|
| 363 |
|
|---|
| 364 |
The signing tests used two different zones, in two different modes, |
|---|
| 365 |
without opt-in and with. |
|---|
| 366 |
|
|---|
| 367 |
There where 4 different signers used in this test: |
|---|
| 368 |
jdns_signzone, ldns_signzone, pdns_signzone, Bind dnssec-signzone-9.5-pre |
|---|
| 369 |
|
|---|
| 370 |
In this report the names of the actual signers will be obfuscated, |
|---|
| 371 |
signers will be referred to as S1, S2, S3, S4 (not the same order as |
|---|
| 372 |
above). |
|---|
| 373 |
|
|---|
| 374 |
Structure: |
|---|
| 375 |
|
|---|
| 376 |
In the signing test all signers used the same signing parameters |
|---|
| 377 |
Signature Inception time: 20060919000000 |
|---|
| 378 |
Signature Expiration time: 20061231000000 |
|---|
| 379 |
TTL on all RRsets: 3600 |
|---|
| 380 |
NSEC3 iterations: 10 |
|---|
| 381 |
NSEC3 salt: AFFE (hex value) |
|---|
| 382 |
same DNSKEY's 2 keys of alg 5 |
|---|
| 383 |
2 keys of alg 133 |
|---|
| 384 |
|
|---|
| 385 |
By doing this the resulting zones where "directly" comparable, |
|---|
| 386 |
|
|---|
| 387 |
The first zone used [REF1] had 10 different names including |
|---|
| 388 |
apex, there were single label names, multiple label names and a |
|---|
| 389 |
wild-card at multi-label name. There were delegations in the zone, |
|---|
| 390 |
with and without DS records. |
|---|
| 391 |
|
|---|
| 392 |
The second zone was an empty zone (only data at APEX). |
|---|
| 393 |
|
|---|
| 394 |
Expected Results: |
|---|
| 395 |
David Blacka had written a "zone normalizer" to convert the zones to a |
|---|
| 396 |
standard format that then could be compared by diff to find any |
|---|
| 397 |
discrepancies. |
|---|
| 398 |
|
|---|
| 399 |
Actual Results: |
|---|
| 400 |
The normalizer turned out to have two issues in processing the zones, |
|---|
| 401 |
from various signers. The first issue was mixing of cases in names, |
|---|
| 402 |
the second issue was ordering of RRSIG's covering a RRset. |
|---|
| 403 |
Both issues have been addressed. |
|---|
| 404 |
The initial report from the normalizer was that all zones differed. |
|---|
| 405 |
|
|---|
| 406 |
At this point two humans where assigned to figure out the differences |
|---|
| 407 |
in the zones, and what was correct. |
|---|
| 408 |
|
|---|
| 409 |
John's tests |
|---|
| 410 |
Checked the empty zones first. Visual check that all the signed zones |
|---|
| 411 |
had the same |
|---|
| 412 |
number of each type of RR |
|---|
| 413 |
NSEC3-PARAM |
|---|
| 414 |
hashes in the NSEC3 RR's |
|---|
| 415 |
signatures in the RRSIG's |
|---|
| 416 |
TTL's in all RR's |
|---|
| 417 |
|
|---|
| 418 |
Several of the signatures had been done with incorrect |
|---|
| 419 |
parameters. These were resigned. and the checks repeated. |
|---|
| 420 |
Some signers signed zone with both algorithms and some only with alg |
|---|
| 421 |
133. The room determined that this was an open issue that should not |
|---|
| 422 |
be used to judge the signers validity. |
|---|
| 423 |
|
|---|
| 424 |
|
|---|
| 425 |
Olafur's tests: |
|---|
| 426 |
Started work on the non-empty zones, he wrote scripts to check the |
|---|
| 427 |
consistency of the NSEC3 chains and if the NSEC3's matched the |
|---|
| 428 |
NSEC3PARAM record at the apex. |
|---|
| 429 |
The scripts evolved from simply putting out the NSEC3 records to |
|---|
| 430 |
actually checking the chain no matter what order provided. |
|---|
| 431 |
|
|---|
| 432 |
Errors seen: |
|---|
| 433 |
For the empty zones S2 and S1 were found to agree. S4 was found to use |
|---|
| 434 |
the wrong TTL for DNSKEY's and S3 did not create a NSEC3-PARAM RR or |
|---|
| 435 |
its RRSIG. |
|---|
| 436 |
|
|---|
| 437 |
for the non-empty zones: |
|---|
| 438 |
One implementation S4 did not include an NSEC3PARAM. |
|---|
| 439 |
One implementation S1 had the right number of NSEC3 records but |
|---|
| 440 |
multiple NSEC3's pointed to the same target. |
|---|
| 441 |
|
|---|
| 442 |
|
|---|
| 443 |
Second run: |
|---|
| 444 |
After reporting these results the developers sat down and updated |
|---|
| 445 |
their signers to address the issues. |
|---|
| 446 |
|
|---|
| 447 |
After second round of zone signing 3 of the signers (S1, S2, S3) |
|---|
| 448 |
agree on what should be in the NSEC3PARAM record and in the NSEC3 |
|---|
| 449 |
chain. S4 agrees with the the others on the NSEC3 chain but does not |
|---|
| 450 |
include that NSEC3PARAM record in the zone. |
|---|
| 451 |
|
|---|
| 452 |
At this point the opt-out zones where tested and they all passed, all |
|---|
| 453 |
opted out the same name and had the same NSEC3 chain. |
|---|
| 454 |
|
|---|
| 455 |
Conclusions: |
|---|
| 456 |
(any difference between expected and actual results) |
|---|
| 457 |
|
|---|
| 458 |
Signers agree on what NSEC3 records should be for the same NSEC3 |
|---|
| 459 |
settings. All of the signers generate NSEC3 from input flags or signer |
|---|
| 460 |
configuration file. |
|---|
| 461 |
Most of the issues seen where addressed and fixed at the workshop. S4 |
|---|
| 462 |
addressed their issue after testing completed. |
|---|
| 463 |
|
|---|
| 464 |
Open issues: |
|---|
| 465 |
Signing algorithms used. There is an open issue what to do if there are |
|---|
| 466 |
both algorithm 133 and 5 DNSKEY records present. |
|---|
| 467 |
Some singers sign with both algorithms but do NOT include NSEC chain. |
|---|
| 468 |
One signer (S1) does not include the DNSKEY RR's with algorithm 5 when |
|---|
| 469 |
instructed to generate NSEC3 chain. |
|---|
| 470 |
|
|---|
| 471 |
DNSKEY record with algorithm 5 requires RRSIG's on the zone and/or |
|---|
| 472 |
NSEC chain. What does it mean to have NSEC and NSEC3 specific DNSKEY |
|---|
| 473 |
algorithms listed in the DNSKEY set at the apex? |
|---|
| 474 |
|
|---|
| 475 |
Nit: |
|---|
| 476 |
Some singers put their name and version into the signed zone, others |
|---|
| 477 |
did not. Testers found the presence implementation information useful. |
|---|
| 478 |
|
|---|
| 479 |
|
|---|
| 480 |
7. Zone loading and transfer |
|---|
| 481 |
|
|---|
| 482 |
o Setup |
|---|
| 483 |
|
|---|
| 484 |
We set up a chain of authoritative servers that had master/slave |
|---|
| 485 |
relations to each other. Some of these servers understood NSEC3 (the |
|---|
| 486 |
first one, to read the zone file) and some intermediate servers did |
|---|
| 487 |
not understand NSEC3 (but were RFC 3597 ready). The zone was |
|---|
| 488 |
transferred to the slaves down the chain by means of AXFR. This way |
|---|
| 489 |
the behaviour of NSEC3 unaware servers when presented with an NSEC3 |
|---|
| 490 |
zone became subject to the test. A second objective was to test the |
|---|
| 491 |
behaviour when the NSEC3 parameters were changed and the zone was |
|---|
| 492 |
transferred to the secondaries. The secondaries that were NSEC3 aware |
|---|
| 493 |
were expected to detect the parameter change. The chain of servers is |
|---|
| 494 |
shown below. |
|---|
| 495 |
|
|---|
| 496 |
Tested AXFR down this chain |
|---|
| 497 |
1. A1 |
|---|
| 498 |
2. A2 |
|---|
| 499 |
3. A3 |
|---|
| 500 |
4. A4 |
|---|
| 501 |
5. A5 |
|---|
| 502 |
6. A1 |
|---|
| 503 |
|
|---|
| 504 |
The A1 server implementation was both used at the start and end, so it |
|---|
| 505 |
got to be both a master and a slave in this sequence (as every other |
|---|
| 506 |
server). |
|---|
| 507 |
|
|---|
| 508 |
o Structure of the zones |
|---|
| 509 |
|
|---|
| 510 |
Two zones were used for this test, both originating from the previous |
|---|
| 511 |
signing test. The first zone was "empty", consisting only of the SOA |
|---|
| 512 |
RR, the NS RRs and the necessary DNSSEC RRSets. The second zone was |
|---|
| 513 |
more populated, called "full", and is available for reference at |
|---|
| 514 |
<place URL here?>. |
|---|
| 515 |
|
|---|
| 516 |
This "full" zones contained wildcards, delegations and Empty Non Terminals. |
|---|
| 517 |
|
|---|
| 518 |
Both zones were signed with NSEC3. |
|---|
| 519 |
|
|---|
| 520 |
o Queries we sent |
|---|
| 521 |
|
|---|
| 522 |
The zones at the servers were checked: |
|---|
| 523 |
|
|---|
| 524 |
* We sent AXFR queries to every server in the chain with an NSEC3 |
|---|
| 525 |
aware querying tool, normalized and sorted the output to eventually |
|---|
| 526 |
hash it by MD5. |
|---|
| 527 |
|
|---|
| 528 |
* Also, we sent queries to solicit NXDOMAIN responses to the NSEC3 |
|---|
| 529 |
capable servers in the chain. These servers would only be capable of |
|---|
| 530 |
including the NSEC3 RRs in the response if they had detected the |
|---|
| 531 |
NSEC3 parameters. |
|---|
| 532 |
|
|---|
| 533 |
After some time we updated the "full" zone to a new serial number, and |
|---|
| 534 |
changed the NSEC3 parameter set inside this zone. After sending down |
|---|
| 535 |
this modified zone down the chain of servers, we repeated the tests |
|---|
| 536 |
mentioned above. |
|---|
| 537 |
|
|---|
| 538 |
o Expected results |
|---|
| 539 |
|
|---|
| 540 |
The NSEC3 unaware servers in between should treat the NSEC3 and |
|---|
| 541 |
NSEC3PARAM records as unknown RR data (as of RFC 3597). Direct queries |
|---|
| 542 |
should be answered, including AXFR queries from their slaves. No other |
|---|
| 543 |
special handling is to be expected. This would still enable the NSEC3 |
|---|
| 544 |
aware servers to enable authenticated denial for the zone, even though |
|---|
| 545 |
the zone is transferred to them via the NSEC3 unaware servers. The |
|---|
| 546 |
zone must not change in transit (a.k.a "the telephone game"). |
|---|
| 547 |
|
|---|
| 548 |
The NSEC3 aware servers must detect the parameter change and adapt to |
|---|
| 549 |
give correct NSEC3 RRs in NXDOMAIN responses. |
|---|
| 550 |
|
|---|
| 551 |
o Actual results |
|---|
| 552 |
|
|---|
| 553 |
All the AXFRed zones could be verified to be equal to each other and |
|---|
| 554 |
also matched the original master zone file (after normalization to |
|---|
| 555 |
sort the entries), except that the AXFR responses showed the SOA RR |
|---|
| 556 |
twice, as usual. |
|---|
| 557 |
|
|---|
| 558 |
After the zone update all servers successfully transferred the new |
|---|
| 559 |
zone from their respective masters, and queries were answered |
|---|
| 560 |
correctly with NXDOMAIN and (updated) NSEC3 records. The AXFRs from |
|---|
| 561 |
the servers again showed the correct zone, i.e. same result as after |
|---|
| 562 |
the first distribution down the server chain. |
|---|
| 563 |
|
|---|
| 564 |
o Conclusion/discussion |
|---|
| 565 |
|
|---|
| 566 |
The tested servers are either NSEC3 aware or RFC 3597 compliant and |
|---|
| 567 |
treat NSEC3 and NSEC3PARAM as unknown RR types where necessary. This |
|---|
| 568 |
enables the NSEC3 aware servers to operate correctly, and these NSEC3 |
|---|
| 569 |
aware servers detect the parameter update correctly. In conclusion, |
|---|
| 570 |
the test is passed by all participating implementations. |
|---|
| 571 |
|
|---|
| 572 |
|
|---|
| 573 |
8. Handling brokenness |
|---|
| 574 |
|
|---|
| 575 |
Setup: |
|---|
| 576 |
|
|---|
| 577 |
For the broken packets test we used a secure delegation to |
|---|
| 578 |
'b.ws.nsec3.org' to Packet-server. Packet-server is not an |
|---|
| 579 |
authoritative server in itself, but uses pre-compiled responses to |
|---|
| 580 |
answer requests. The packet-server resides on ns4.infra.ws.nsec3.org. |
|---|
| 581 |
|
|---|
| 582 |
The participants used validators v1, v7 and v9. These were capable of |
|---|
| 583 |
understanding NSEC3, and configured with a trust anchor for |
|---|
| 584 |
ws.nsec3.org. Other implementations were used as well, but since this |
|---|
| 585 |
test focussed on nsec3 validation, we do not include it in this |
|---|
| 586 |
report. |
|---|
| 587 |
|
|---|
| 588 |
Structure of the packets: |
|---|
| 589 |
|
|---|
| 590 |
The packets itself are mostly responses that miss some part of the |
|---|
| 591 |
authenticated denial proof. Exceptions are the packets that are |
|---|
| 592 |
ambiguous, for instance returning a NODATA for type A, while existence |
|---|
| 593 |
of A is reflected in the NSEC3 type list. |
|---|
| 594 |
|
|---|
| 595 |
The broken packets are in 10 different sets, what follows is a general |
|---|
| 596 |
description of the sets |
|---|
| 597 |
|
|---|
| 598 |
Set A. NXDOMAIN |
|---|
| 599 |
|
|---|
| 600 |
An NXDOMAIN response was created containing three NSEC3 records. One |
|---|
| 601 |
showing the Closest Encloser (CE), one proving the Closest Encloser |
|---|
| 602 |
(NC), and one proving the absence of the wildcard at the Closest |
|---|
| 603 |
Encloser (NW). The different responses in this set show none, one, two |
|---|
| 604 |
or all three records. |
|---|
| 605 |
|
|---|
| 606 |
Set B. standard NODATA |
|---|
| 607 |
|
|---|
| 608 |
A standard NODATA response contains one NSEC3, showing the absence of |
|---|
| 609 |
a type for that name. One response is a NODATA, but the NSEC3 shows |
|---|
| 610 |
the presence of the type. One response shows a different NSEC3. One |
|---|
| 611 |
shows the presence of the CNAME type. |
|---|
| 612 |
|
|---|
| 613 |
Set C. Wildcard NODATA |
|---|
| 614 |
|
|---|
| 615 |
A wildcard NODATA response contains thee NSEC3s. The CE, the NC and |
|---|
| 616 |
the NSEC3 at the wildcard showing that the type does not exist for the |
|---|
| 617 |
wildcard. The different responses in this set show none, one, two or |
|---|
| 618 |
all three records |
|---|
| 619 |
|
|---|
| 620 |
Set D. Wildcard expansion |
|---|
| 621 |
|
|---|
| 622 |
A wildcard expansion has two NSEC3s. The CE and the NC. The different |
|---|
| 623 |
responses in this set show none, one or two NSEC3s. |
|---|
| 624 |
|
|---|
| 625 |
set E. Referrals to unsigned zones |
|---|
| 626 |
|
|---|
| 627 |
A delegation to unsigned zones contain an NSEC3 that shows the absence |
|---|
| 628 |
of the DS record. One response shows a missing NSEC3, one response |
|---|
| 629 |
shows an NSEC3 with the DS bit set. |
|---|
| 630 |
|
|---|
| 631 |
set F. Referrals to opted out unsigned zones. |
|---|
| 632 |
|
|---|
| 633 |
An opted out delegation contains two NSEC3s. One shows the CE, the |
|---|
| 634 |
other the NC, with the OO bit set. The responses contain zero or one |
|---|
| 635 |
NSEC3, and one with the OO bit clear. |
|---|
| 636 |
|
|---|
| 637 |
set G. NSEC3s from multiple chains. |
|---|
| 638 |
|
|---|
| 639 |
This is an NXDOMAIN response where the three NSEC3s have different parameters. |
|---|
| 640 |
|
|---|
| 641 |
set H. skewed NSEC3 |
|---|
| 642 |
|
|---|
| 643 |
These responses contain NSEC3s where the ownername sorts after the |
|---|
| 644 |
next hashed ownername. |
|---|
| 645 |
|
|---|
| 646 |
set I. same name |
|---|
| 647 |
|
|---|
| 648 |
These responses contain NSEC3s where the ownername is equal to the |
|---|
| 649 |
next hashed ownername |
|---|
| 650 |
|
|---|
| 651 |
set J. multiple labels NXDOMAIN |
|---|
| 652 |
|
|---|
| 653 |
These responses contain the responses similar to A, but the CE is not |
|---|
| 654 |
the ownername. Furthermore these contain responses with the DNAME bit |
|---|
| 655 |
in the CE, and a combination of other proofs. |
|---|
| 656 |
|
|---|
| 657 |
What follows is a matrix that shows where the actual results differ |
|---|
| 658 |
from the expected results |
|---|
| 659 |
|
|---|
| 660 |
|
|---|
| 661 |
empty fields conform to expected result. |
|---|
| 662 |
|
|---|
| 663 |
name expected result R7 |
|---|
| 664 |
a1.b regular NXDOMAIN |
|---|
| 665 |
a2.b missing CE |
|---|
| 666 |
a3.b missing NC |
|---|
| 667 |
a4.b missing NW |
|---|
| 668 |
a5.b missing CE, NC |
|---|
| 669 |
a6.b missing CE, NW |
|---|
| 670 |
a7.b missing NC, NW |
|---|
| 671 |
a8.b missing NC, NW, NC Can't prove denial, |
|---|
| 672 |
missing dnssec data |
|---|
| 673 |
|
|---|
| 674 |
b1.b regular NODATA |
|---|
| 675 |
b2.b NODATA, but type exists |
|---|
| 676 |
b3.b NODATA, but no matching NSEC3 No CE |
|---|
| 677 |
b4.b NODATA, but CNAME exists |
|---|
| 678 |
|
|---|
| 679 |
c1.b regular NODATA |
|---|
| 680 |
c2.b missing CE |
|---|
| 681 |
c3.b missing NC |
|---|
| 682 |
c4.b missing NW no matching NSEC3 |
|---|
| 683 |
c5.b missing CE, NC |
|---|
| 684 |
c6.b missing CE, NW |
|---|
| 685 |
c7.b missing NC, NW |
|---|
| 686 |
c8.b missing NC, NW, CE Can't prove denial, |
|---|
| 687 |
no dnssec data |
|---|
| 688 |
|
|---|
| 689 |
d1.b regular NODATA |
|---|
| 690 |
d2.b missing CE (result should be OK) |
|---|
| 691 |
d3.b missing NC |
|---|
| 692 |
d4.b missing NW Wildcard exp, no denial |
|---|
| 693 |
of original data |
|---|
| 694 |
|
|---|
| 695 |
ref.e1 DS missing, bit set in DS query gave SERVFAIL |
|---|
| 696 |
ref.e2 missing DS query gave SERVFAIL |
|---|
| 697 |
|
|---|
| 698 |
oo.f1 missing CE Bogus response, |
|---|
| 699 |
probably bug. |
|---|
| 700 |
oo.f2 missing NC SERVFAIL on DS query |
|---|
| 701 |
oo.f3 missing NC, CE SERVFAIL on DS query |
|---|
| 702 |
oo.f4 oo bit not set in NC SERVFAIL on DS query |
|---|
| 703 |
|
|---|
| 704 |
g1.b 'Could not find single |
|---|
| 705 |
set of params' |
|---|
| 706 |
|
|---|
| 707 |
h1 NC skewed |
|---|
| 708 |
h2 CE skewed |
|---|
| 709 |
h3 NW skewed |
|---|
| 710 |
|
|---|
| 711 |
i1 nxdomain, NC same name AD bit set |
|---|
| 712 |
i2 nxdomain, NW same name AD bit set |
|---|
| 713 |
i3 nxdomain, CE same name AD bit set |
|---|
| 714 |
|
|---|
| 715 |
1.a.j.b regular NXDOMAIN |
|---|
| 716 |
2.a.j.b missing CE |
|---|
| 717 |
3.a.j.b missing NC |
|---|
| 718 |
4.a.j.b missing NW |
|---|
| 719 |
5.a.j.b missing CE, NC |
|---|
| 720 |
6.a.j.b missing CE, NW |
|---|
| 721 |
7.a.j.b missing NC, NW |
|---|
| 722 |
8.a.j.b missing NC, NW, CE Can't prove denial, |
|---|
| 723 |
no dnssec data |
|---|
| 724 |
9.a.j.b DNAME bit in CE |
|---|
| 725 |
10.a.j.b NODATA, but is delegation |
|---|
| 726 |
11.a.j.b delegation, but is APEX SERVFAIL on query |
|---|
| 727 |
12.a.j.b delegation, but is NODATA SERVFAIL on query |
|---|
| 728 |
|
|---|
| 729 |
|
|---|
| 730 |
name R1 R10 R9 |
|---|
| 731 |
a1.b |
|---|
| 732 |
a2.b |
|---|
| 733 |
a3.b |
|---|
| 734 |
a4.b |
|---|
| 735 |
a5.b |
|---|
| 736 |
a6.b |
|---|
| 737 |
a7.b |
|---|
| 738 |
a8.b Missing DNSSEC data |
|---|
| 739 |
|
|---|
| 740 |
b1.b |
|---|
| 741 |
b2.b Type does not exist |
|---|
| 742 |
b3.b |
|---|
| 743 |
b4.b No error No error No error |
|---|
| 744 |
|
|---|
| 745 |
c1.b |
|---|
| 746 |
c2.b |
|---|
| 747 |
c3.b |
|---|
| 748 |
c4.b |
|---|
| 749 |
c5.b |
|---|
| 750 |
c6.b |
|---|
| 751 |
c7.b |
|---|
| 752 |
c8.b Missing DNSSEC data |
|---|
| 753 |
|
|---|
| 754 |
d1.b Proof not checked |
|---|
| 755 |
d2.b Proof not checked Error No CE |
|---|
| 756 |
d3.b Proof not checked |
|---|
| 757 |
d4.b Proof not checked |
|---|
| 758 |
|
|---|
| 759 |
ref.e1 Untestable No DNSSEC data |
|---|
| 760 |
ref.e2 Untestable No DNSSEC data |
|---|
| 761 |
|
|---|
| 762 |
oo.f1 Provably unsecured |
|---|
| 763 |
oo.f2 Untestable SERVFAIL on DS |
|---|
| 764 |
oo.f3 Untestable SERVFAIL on DS |
|---|
| 765 |
oo.f4 Untestable SERVFAIL on DS |
|---|
| 766 |
|
|---|
| 767 |
g1.b No CE, no NW |
|---|
| 768 |
|
|---|
| 769 |
h1 Validates OK No CE |
|---|
| 770 |
h2 No CE |
|---|
| 771 |
h3 No NW |
|---|
| 772 |
|
|---|
| 773 |
i1 Validates OK No CE |
|---|
| 774 |
i2 Validates OK No CE |
|---|
| 775 |
i3 Validates OK Validates OK |
|---|
| 776 |
|
|---|
| 777 |
1.a.j Unable to verify |
|---|
| 778 |
2.a.j Unable to verify |
|---|
| 779 |
3.a.j Unable to verify |
|---|
| 780 |
4.a.j Unable to verify |
|---|
| 781 |
5.a.j Unable to verify |
|---|
| 782 |
6.a.j Unable to verify |
|---|
| 783 |
7.a.j Unable to verify |
|---|
| 784 |
8.a.j Unable to verify |
|---|
| 785 |
9.a.j No error No error Unable to verify |
|---|
| 786 |
10.a.j SERVFAIL Unable to verify |
|---|
| 787 |
11.a.j Untestable SERVFAIL Unable to verify |
|---|
| 788 |
12.a.j Untestable SERVFAIL Unable to verify |
|---|