1 .. Copyright (C) Internet Systems Consortium, Inc. ("ISC") 2 .. 3 .. SPDX-License-Identifier: MPL-2.0 4 .. 5 .. This Source Code Form is subject to the terms of the Mozilla Public 6 .. License, v. 2.0. If a copy of the MPL was not distributed with this 7 .. file, you can obtain one at https://mozilla.org/MPL/2.0/. 8 .. 9 .. See the COPYRIGHT file distributed with this work for additional 10 .. information regarding copyright ownership. 11 12 .. _dnssec_recipes: 13 14 Recipes 15 ------- 16 17 This chapter provides step-by-step "recipes" for some common 18 DNSSEC configurations. 19 20 .. _recipes_inline_signing: 21 22 DNSSEC Signing 23 ~~~~~~~~~~~~~~ 24 25 There are two recipes here: the first shows an example using DNSSEC 26 signing on the primary server, which has been covered in this 27 guide; the second shows how to setup a "bump in the 28 wire" between a hidden primary and the secondary servers to seamlessly 29 sign the zone "on the fly." 30 31 .. _recipes_inline_signing_primary: 32 33 Primary Server DNSSEC Signing 34 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 35 36 In this recipe, our servers are illustrated as shown in 37 :ref:`dnssec-signing-1`: we have a primary server 38 (192.168.1.1) and three secondary servers (192.168.1.2, 192.168.1.3, and 39 192.168.1.4) that receive zone transfers. To get the zone 40 signed, we need to reconfigure the primary server. Once reconfigured, a 41 signed version of the zone is generated on the fly; 42 zone transfers take care of synchronizing the signed zone data 43 to all secondary name servers, without configuration or software changes 44 on them. 45 46 .. _dnssec-signing-1: 47 48 .. figure:: ../dnssec-guide/img/dnssec-inline-signing-1.png 49 :alt: DNSSEC Signing Recipe #1 50 :width: 80.0% 51 52 DNSSEC Signing Recipe #1 53 54 Using the method described in 55 :ref:`easy_start_guide_for_authoritative_servers`, we just need to 56 add a :any:`dnssec-policy` statement to the relevant zone clause. This is 57 what the :iscman:`named.conf` zone statement looks like on the primary server, 192.168.1.1: 58 59 :: 60 61 zone "example.com" IN { 62 type primary; 63 file "db/example.com.db"; 64 key-directory "keys/example.com"; 65 dnssec-policy default; 66 allow-transfer { 192.168.1.2; 192.168.1.3; 192.168.1.4; }; 67 }; 68 69 We have chosen to use the default policy, storing the keys generated for 70 the zone in the directory ``keys/example.com``. To use a 71 custom policy, define the policy in the configuration 72 file and select it in the zone statement (as described in 73 :ref:`signing_custom_policy`). 74 75 On the secondary servers, :iscman:`named.conf` does not need to be updated, 76 and it looks like this: 77 78 :: 79 80 zone "example.com" IN { 81 type secondary; 82 file "db/example.com.db"; 83 primaries { 192.168.1.1; }; 84 }; 85 86 In fact, the secondary servers do not even need to be running BIND; they 87 can run any DNS product that supports DNSSEC. 88 89 .. _recipes_inline_signing_bump_in_the_wire: 90 91 "Bump in the Wire" Signing 92 ^^^^^^^^^^^^^^^^^^^^^^^^^^ 93 94 In this recipe, we take advantage of the power of automated signing 95 by placing an additional name server (192.168.1.5) between the hidden 96 primary (192.168.1.1) and the DNS secondaries (192.168.1.2, 192.168.1.3, 97 and 192.168.1.4). The additional name server, 192.168.1.5, acts as a "bump 98 in the wire," taking an unsigned zone from the hidden primary, 99 and sending out signed data on the other end to the secondary name 100 servers. The steps described in this recipe may be used as part of a 101 DNSSEC deployment strategy, since it requires only minimal changes made to 102 the existing hidden DNS primary and DNS secondaries. 103 104 .. _dnssec-signing-2: 105 106 .. figure:: ../dnssec-guide/img/dnssec-inline-signing-2.png 107 :alt: DNSSEC Signing Recipe #2 108 :width: 100.0% 109 110 DNSSEC Signing Recipe #2 111 112 It is important to remember that 192.168.1.1 in this case is a hidden 113 primary not exposed to the world, and it must not be listed in the NS RRset. 114 Otherwise the world will get conflicting answers: unsigned answers from 115 the hidden primary and signed answers from the other name servers. 116 117 The only configuration change needed on the hidden primary, 192.168.1.1, 118 is to make sure it allows our middle box to perform a zone transfer: 119 120 :: 121 122 zone "example.com" IN { 123 ... 124 allow-transfer { 192.168.1.5; }; 125 ... 126 }; 127 128 On the middle box, 192.168.1.5, all the tasks described in 129 :ref:`easy_start_guide_for_authoritative_servers` still need to be 130 performed, such as generating key pairs and uploading information to 131 the parent zone. This server is configured as secondary to the hidden 132 primary 192.168.1.1 to receive the unsigned data; then, using keys 133 accessible to this middle box, to sign data on the fly; and finally, to send out the 134 signed data via zone transfer to the other three DNS secondaries. Its 135 :iscman:`named.conf` zone statement looks like this: 136 137 :: 138 139 zone example.com { 140 type secondary; 141 primaries { 192.168.1.1; }; 142 file "db/example.com.db"; 143 key-directory "keys/example.com"; 144 dnssec-policy default; 145 allow-transfer { 192.168.1.2; 192.168.1.3; 192.168.1.4; }; 146 }; 147 148 (As before, the default policy has been selected here. See 149 :ref:`signing_custom_policy` for instructions on how to define 150 and use a custom policy.) 151 152 Finally, on the three secondary servers, the configuration should be updated 153 to receive a zone transfer from 192.168.1.5 (the middle box) instead of 154 from 192.168.1.1 (the hidden primary). If using BIND, the :iscman:`named.conf` file looks 155 like this: 156 157 :: 158 159 zone "example.com" IN { 160 type secondary; 161 file "db/example.com.db"; 162 primaries { 192.168.1.5; }; # this was 192.168.1.1 before! 163 }; 164 165 .. _recipes_rollovers: 166 167 Rollovers 168 ~~~~~~~~~ 169 170 If you are signing your zone using a :any:`dnssec-policy` statement, this 171 section is not really relevant to you. In the policy statement, you set how long 172 you want your keys to be valid for, the time 173 taken for information to propagate through your zone, the time it takes 174 for your parent zone to register a new DS record, etc., and that's more 175 or less it. :iscman:`named` implements everything for you automatically, apart from 176 uploading the new DS records to your parent zone - which is covered in 177 :ref:`signing_easy_start_upload_to_parent_zone`. (Some 178 screenshots from a session where a KSK is uploaded to the parent zone 179 are presented here for convenience.) However, these recipes may be useful 180 in describing what happens 181 through the rollover process and what you should be monitoring. 182 183 .. _recipes_zsk_rollover: 184 185 ZSK Rollover 186 ^^^^^^^^^^^^ 187 188 This recipe covers how to perform a ZSK rollover using what is known as 189 the Pre-Publication method. For other ZSK rolling methods, please see 190 :ref:`zsk_rollover_methods` in :ref:`dnssec_advanced_discussions`. 191 192 Below is a sample timeline for a ZSK rollover to occur on January 1, 2021: 193 194 1. December 1, 2020 (one month before rollover) 195 196 - Generate new ZSK 197 198 - Add DNSKEY for new ZSK to zone 199 200 2. January 1, 2021 (day of rollover) 201 202 - New ZSK used to replace RRSIGs for the bulk of the zone 203 204 3. February 1, 2021 (one month after rollover) 205 206 - Remove old ZSK DNSKEY RRset from zone 207 208 - DNSKEY signatures made with KSK are changed 209 210 The current active ZSK has the ID 17694 in the example below. For more 211 information on key management and rollovers, please see 212 :ref:`advanced_discussions_key_management`. 213 214 One Month Before ZSK Rollover 215 +++++++++++++++++++++++++++++ 216 217 On December 1, 2020, a month before the example rollover, you (as administrator) 218 should change the parameters on the current key (17694). Set it to become inactive on 219 January 1, 2021 and be deleted from the zone on February 1, 2021; also, 220 generate a successor key (51623): 221 222 :: 223 224 # cd /etc/bind/keys/example.com/ 225 # dnssec-settime -I 20210101 -D 20210201 Kexample.com.+008+17694 226 ./Kexample.com.+008+17694.key/GoDaddy 227 228 ./Kexample.com.+008+17694.private 229 # dnssec-keygen -S Kexample.com.+008+17694 230 Generating key pair..++++++ ...........++++++ 231 Kexample.com.+008+51623 232 233 The first command gets us into the key directory 234 ``/etc/bind/keys/example.com/``, where keys for ``example.com`` are 235 stored. 236 237 The second, :iscman:`dnssec-settime`, sets an inactive (:option:`-I <dnssec-settime -I>`) date of January 1, 238 2021, and a deletion (:option:`-D <dnssec-settime -D>`) date of February 1, 2021, for the current ZSK 239 (``Kexample.com.+008+17694``). 240 241 The third command, :iscman:`dnssec-keygen`, creates a successor key, using 242 the exact same parameters (algorithms, key sizes, etc.) as the current 243 ZSK. The new ZSK created in our example is ``Kexample.com.+008+51623``. 244 245 Make sure the successor keys are readable by :iscman:`named`. 246 247 :iscman:`named`'s logging messages indicate when the next 248 key checking event is scheduled to occur, the frequency of which can be 249 controlled by :any:`dnssec-loadkeys-interval`. The log message looks like 250 this: 251 252 :: 253 254 zone example.com/IN (signed): next key event: 01-Dec-2020 00:13:05.385 255 256 And you can check the publish date of the key by looking at the key 257 file: 258 259 :: 260 261 # cd /etc/bind/keys/example.com 262 # cat Kexample.com.+008+51623.key 263 ; This is a zone-signing key, keyid 51623, for example.com. 264 ; Created: 20201130160024 (Mon Dec 1 00:00:24 2020) 265 ; Publish: 20201202000000 (Fri Dec 2 08:00:00 2020) 266 ; Activate: 20210101000000 (Sun Jan 1 08:00:00 2021) 267 ... 268 269 Since the publish date is set to the morning of December 2, and our example 270 scenario takes place on December 1, the next 271 morning you will notice that your zone has gained a new DNSKEY record, 272 but the new ZSK is not yet being used to generate signatures. Below is 273 the abbreviated output - with shortened DNSKEY and RRSIG - when querying the 274 authoritative name server, 192.168.1.13: 275 276 :: 277 278 $ dig @192.168.1.13 example.com. DNSKEY +dnssec +multiline 279 280 ... 281 ;; ANSWER SECTION: 282 example.com. 600 IN DNSKEY 257 3 8 ( 283 AwEAAcWDps...lM3NRn/G/R 284 ) ; KSK; alg = RSASHA256; key id = 6817 285 example.com. 600 IN DNSKEY 256 3 8 ( 286 AwEAAbi6Vo...qBW5+iAqNz 287 ) ; ZSK; alg = RSASHA256; key id = 51623 288 example.com. 600 IN DNSKEY 256 3 8 ( 289 AwEAAcjGaU...0rzuu55If5 290 ) ; ZSK; alg = RSASHA256; key id = 17694 291 example.com. 600 IN RRSIG DNSKEY 8 2 600 ( 292 20210101000000 20201201230000 6817 example.com. 293 LAiaJM26T7...FU9syh/TQ= ) 294 example.com. 600 IN RRSIG DNSKEY 8 2 600 ( 295 20210101000000 20201201230000 17694 example.com. 296 HK4EBbbOpj...n5V6nvAkI= ) 297 ... 298 299 For good measure, let's take a look at the SOA record and its 300 signature for this zone. Notice the RRSIG is signed by the current ZSK, 301 17694. This will come in handy later when you want to verify whether 302 the new ZSK is in effect: 303 304 :: 305 306 $ dig @192.168.1.13 example.com. SOA +dnssec +multiline 307 308 ... 309 ;; ANSWER SECTION: 310 example.com. 600 IN SOA ns1.example.com. admin.example.com. ( 311 2020120102 ; serial 312 1800 ; refresh (30 minutes) 313 900 ; retry (15 minutes) 314 2419200 ; expire (4 weeks) 315 300 ; minimum (5 minutes) 316 ) 317 example.com. 600 IN RRSIG SOA 8 2 600 ( 318 20201230160109 20201130150109 17694 example.com. 319 YUTC8rFULaWbW+nAHzbfGwNqzARHevpryzRIJMvZBYPo 320 NAeejNk9saNAoCYKWxGJ0YBc2k+r5fYq1Mg4ll2JkBF5 321 buAsAYLw8vEOIxVpXwlArY+oSp9T1w2wfTZ0vhVIxaYX 322 6dkcz4I3wbDx2xmG0yngtA6A8lAchERx2EGy0RM= ) 323 324 These are all the manual tasks you need to perform for a ZSK rollover. 325 If you have followed the configuration examples in this guide of using 326 :any:`inline-signing` and :any:`dnssec-policy`, everything else is automated for 327 you by BIND. 328 329 Day of ZSK Rollover 330 +++++++++++++++++++ 331 332 On the actual day of the rollover, although there is technically nothing 333 for you to do, you should still keep an eye on the zone to make sure new 334 signatures are being generated by the new ZSK (51623 in this example). 335 The easiest way is to query the authoritative name server 192.168.1.13 336 for the SOA record as you did a month ago: 337 338 :: 339 340 $ dig @192.168.1.13 example.com. SOA +dnssec +multiline 341 342 ... 343 ;; ANSWER SECTION: 344 example.com. 600 IN SOA ns1.example.com. admin.example.com. ( 345 2020112011 ; serial 346 1800 ; refresh (30 minutes) 347 900 ; retry (15 minutes) 348 2419200 ; expire (4 weeks) 349 300 ; minimum (5 minutes) 350 ) 351 example.com. 600 IN RRSIG SOA 8 2 600 ( 352 20210131000000 20201231230000 51623 example.com. 353 J4RMNpJPOmMidElyBugJp0RLqXoNqfvo/2AT6yAAvx9X 354 zZRL1cuhkRcyCSLZ9Z+zZ2y4u2lvQGrNiondaKdQCor7 355 uTqH5WCPoqalOCBjqU7c7vlAM27O9RD11nzPNpVQ7xPs 356 y5nkGqf83OXTK26IfnjU1jqiUKSzg6QR7+XpLk0= ) 357 ... 358 359 As you can see, the signature generated by the old ZSK (17694) has 360 disappeared, replaced by a new signature generated from the new ZSK 361 (51623). 362 363 .. note:: 364 365 Not all signatures will disappear magically on the same day; 366 it depends on when each one was generated. In the worst-case scenario, 367 a new signature could have been signed by the old ZSK (17694) moments 368 before it was deactivated, meaning that the signature could live for almost 369 30 more days, until just before February 1. 370 371 This is why it is important to keep the old ZSK in the 372 zone and not delete it right away. 373 374 One Month After ZSK Rollover 375 ++++++++++++++++++++++++++++ 376 377 Again, technically there is nothing you need to do on this day, 378 but it doesn't hurt to verify that the old ZSK (17694) is now completely 379 gone from your zone. :iscman:`named` will not touch 380 ``Kexample.com.+008+17694.private`` and ``Kexample.com.+008+17694.key`` 381 on your file system. Running the same :iscman:`dig` command for DNSKEY should 382 suffice: 383 384 :: 385 386 $ dig @192.168.1.13 example.com. DNSKEY +multiline +dnssec 387 388 ... 389 ;; ANSWER SECTION: 390 example.com. 600 IN DNSKEY 257 3 8 ( 391 AwEAAcWDps...lM3NRn/G/R 392 ) ; KSK; alg = RSASHA256; key id = 6817 393 example.com. 600 IN DNSKEY 256 3 8 ( 394 AwEAAdeCGr...1DnEfX+Xzn 395 ) ; ZSK; alg = RSASHA256; key id = 51623 396 example.com. 600 IN RRSIG DNSKEY 8 2 600 ( 397 20170203000000 20170102230000 6817 example.com. 398 KHY8P0zE21...Y3szrmjAM= ) 399 example.com. 600 IN RRSIG DNSKEY 8 2 600 ( 400 20170203000000 20170102230000 51623 example.com. 401 G2g3crN17h...Oe4gw6gH8= ) 402 ... 403 404 Congratulations, the ZSK rollover is complete! As for the actual key 405 files (the files ending in ``.key`` and ``.private``), they may be deleted at this 406 point, but they do not have to be. 407 408 .. _recipes_ksk_rollover: 409 410 KSK Rollover 411 ^^^^^^^^^^^^ 412 413 This recipe describes how to perform KSK rollover using the Double-DS 414 method. For other KSK rolling methods, please see 415 :ref:`ksk_rollover_methods` in 416 :ref:`dnssec_advanced_discussions`. The registrar used in this 417 recipe is `GoDaddy <https://www.godaddy.com>`__. Also for this recipe, 418 we are keeping the number of DS records down to just one per active set 419 using just SHA-1, for the sake of better clarity, although in practice 420 most zone operators choose to upload two DS records as shown in 421 :ref:`working_with_parent_zone`. For more information on key 422 management and rollovers, 423 please see :ref:`advanced_discussions_key_management`. 424 425 Below is a sample timeline for a KSK rollover to occur on January 1, 2021: 426 427 1. December 1, 2020 (one month before rollover) 428 429 - Change timer on the current KSK 430 431 - Generate new KSK and DS records 432 433 - Add DNSKEY for the new KSK to zone 434 435 - Upload new DS records to parent zone 436 437 2. January 1, 2021 (day of rollover) 438 439 - Use the new KSK to sign all DNSKEY RRsets, which generates new 440 RRSIGs 441 442 - Add new RRSIGs to the zone 443 444 - Remove RRSIG for the old ZSK from zone 445 446 - Start using the new KSK to sign DNSKEY 447 448 3. February 1, 2021 (one month after rollover) 449 450 - Remove the old KSK DNSKEY from zone 451 452 - Remove old DS records from parent zone 453 454 The current active KSK has the ID 24828, and this is the DS record that 455 has already been published by the parent zone: 456 457 :: 458 459 # dnssec-dsfromkey -a SHA-1 Kexample.com.+007+24828.key 460 example.com. IN DS 24828 7 1 D4A33E8DD550A9567B4C4971A34AD6C4B80A6AD3 461 462 .. _one_month_before_ksk_rollover: 463 464 One Month Before KSK Rollover 465 +++++++++++++++++++++++++++++ 466 467 On December 1, 2020, a month before the planned rollover, you (as 468 administrator) should 469 change the parameters on the current key. Set it to become inactive on January 470 1, 2021, and be deleted from the zone on February 1st, 2021; 471 also generate a successor key (23550). Finally, generate a new 472 DS record based on the new key, 23550: 473 474 :: 475 476 # cd /etc/bind/keys/example.com/ 477 # dnssec-settime -I 20210101 -D 20210201 Kexample.com.+007+24828 478 ./Kexample.com.+007+24828.key 479 ./Kexample.com.+007+24828.private 480 # dnssec-keygen -S Kexample.com.+007+24828 481 Generating key pair.......................................................................................++ ...................................++ 482 Kexample.com.+007+23550 483 # dnssec-dsfromkey -a SHA-1 Kexample.com.+007+23550.key 484 example.com. IN DS 23550 7 1 54FCF030AA1C79C0088FDEC1BD1C37DAA2E70DFB 485 486 The first command gets us into the key directory 487 ``/etc/bind/keys/example.com/``, where keys for ``example.com`` are 488 stored. 489 490 The second, :iscman:`dnssec-settime`, sets an inactive (:option:`-I <dnssec-settime -I>`) date of January 1, 491 2021, and a deletion (:option:`-D <dnssec-settime -D>`) date of February 1, 2021 for the current KSK 492 (``Kexample.com.+007+24828``). 493 494 The third command, :iscman:`dnssec-keygen`, creates a successor key, using 495 the exact same parameters (algorithms, key sizes, etc.) as the current 496 KSK. The new key pair created in our example is ``Kexample.com.+007+23550``. 497 498 The fourth and final command, :iscman:`dnssec-dsfromkey`, creates a DS record 499 from the new KSK (23550), using SHA-1 as the digest type. Again, in 500 practice most people generate two DS records for both supported digest 501 types (SHA-1 and SHA-256), but for our example here we are only using 502 one to keep the output small and hopefully clearer. 503 504 Make sure the successor keys are readable by :iscman:`named`. 505 506 The :any:`syslog` message indicates when the next key 507 checking event is. The log message looks like this: 508 509 :: 510 511 zone example.com/IN (signed): next key event: 01-Dec-2020 00:13:05.385 512 513 You can check the publish date of the key by looking at the key 514 file: 515 516 :: 517 518 # cd /etc/bind/keys/example.com 519 # cat Kexample.com.+007+23550.key 520 ; This is a key-signing key, keyid 23550, for example.com. 521 ; Created: 20201130160024 (Thu Dec 1 00:00:24 2020) 522 ; Publish: 20201202000000 (Fri Dec 2 08:00:00 2020) 523 ; Activate: 20210101000000 (Sun Jan 1 08:00:00 2021) 524 ... 525 526 Since the publish date is set to the morning of December 2, and our example 527 scenario takes place on December 1, the next 528 morning you will notice that your zone has gained a new DNSKEY record 529 based on your new KSK, but with no corresponding RRSIG yet. Below is the 530 abbreviated output - with shortened DNSKEY and RRSIG - when querying the 531 authoritative name server, 192.168.1.13: 532 533 :: 534 535 $ dig @192.168.1.13 example.com. DNSKEY +dnssec +multiline 536 537 ... 538 ;; ANSWER SECTION: 539 example.com. 300 IN DNSKEY 256 3 7 ( 540 AwEAAdYqAc...TiSlrma6Ef 541 ) ; ZSK; alg = NSEC3RSASHA1; key id = 29747 542 example.com. 300 IN DNSKEY 257 3 7 ( 543 AwEAAeTJ+w...O+Zy9j0m63 544 ) ; KSK; alg = NSEC3RSASHA1; key id = 24828 545 example.com. 300 IN DNSKEY 257 3 7 ( 546 AwEAAc1BQN...Wdc0qoH21H 547 ) ; KSK; alg = NSEC3RSASHA1; key id = 23550 548 example.com. 300 IN RRSIG DNSKEY 7 2 300 ( 549 20201206125617 20201107115617 24828 example.com. 550 4y1iPVJOrK...aC3iF9vgc= ) 551 example.com. 300 IN RRSIG DNSKEY 7 2 300 ( 552 20201206125617 20201107115617 29747 example.com. 553 g/gfmPjr+y...rt/S/xjPo= ) 554 555 ... 556 557 Anytime after generating the DS record, you can upload it; 558 it is not necessary to wait for the DNSKEY to be published in your zone, 559 since this new KSK is not active yet. You can do it 560 immediately after the new DS record has been generated on December 1, 561 or you can wait until the next day after you have verified that the 562 new DNSKEY record is added to the zone. Below are some screenshots from 563 GoDaddy's web-based interface, used to add a new DS record. 564 [#godaddy_iface_note]_ 565 566 1. After logging in, click the green "Launch" button next to the domain 567 name you want to manage. 568 569 .. _add-ds-1: 570 571 .. figure:: ../dnssec-guide/img/add-ds-1.png 572 :alt: Upload DS Record Step #1 573 :width: 70.0% 574 575 Upload DS Record Step #1 576 577 2. Scroll down to the "DS Records" section and click "Manage." 578 579 .. _add-ds-2: 580 581 .. figure:: ../dnssec-guide/img/add-ds-2.png 582 :alt: Upload DS Record Step #2 583 :width: 40.0% 584 585 Upload DS Record Step #2 586 587 3. A dialog appears, displaying the current key (24828). Click "Add DS 588 Record." 589 590 .. _add-ds-3: 591 592 .. figure:: ../dnssec-guide/img/add-ds-3.png 593 :alt: Upload DS Record Step #3 594 :width: 80.0% 595 596 Upload DS Record Step #3 597 598 4. Enter the Key ID, algorithm, digest type, and the digest, then click 599 "Next." 600 601 .. _add-ds-4: 602 603 .. figure:: ../dnssec-guide/img/add-ds-4.png 604 :alt: Upload DS Record Step #4 605 :width: 80.0% 606 607 Upload DS Record Step #4 608 609 5. Address any errors and click "Finish." 610 611 .. _add-ds-5: 612 613 .. figure:: ../dnssec-guide/img/add-ds-5.png 614 :alt: Upload DS Record Step #5 615 :width: 80.0% 616 617 Upload DS Record Step #5 618 619 6. Both DS records are shown. Click "Save." 620 621 .. _add-ds-6: 622 623 .. figure:: ../dnssec-guide/img/add-ds-6.png 624 :alt: Upload DS Record Step #6 625 :width: 80.0% 626 627 Upload DS Record Step #6 628 629 Finally, let's verify that the registrar has published the new DS 630 record. This may take anywhere from a few minutes to a few days, 631 depending on your parent zone. You can verify whether your 632 parent zone has published the new DS record by querying for the DS 633 record of your zone. In the example below, the Google public DNS server 634 8.8.8.8 is used: 635 636 :: 637 638 $ dig @8.8.8.8 example.com. DS 639 640 ... 641 ;; ANSWER SECTION: 642 example.com. 21552 IN DS 24828 7 1 D4A33E8DD550A9567B4C4971A34AD6C4B80A6AD3 643 example.com. 21552 IN DS 23550 7 1 54FCF030AA1C79C0088FDEC1BD1C37DAA2E70DFB 644 645 You can also query your parent zone's authoritative name servers 646 directly to see if these records have been published. DS records will 647 not show up on your own authoritative zone, so you cannot query your own 648 name servers for them. In this recipe, the parent zone is ``.com``, so 649 querying a few of the ``.com`` name servers is another appropriate 650 verification. 651 652 Day of KSK Rollover 653 +++++++++++++++++++ 654 655 If you have followed the examples in this document, as described in 656 :ref:`easy_start_guide_for_authoritative_servers`, there is 657 technically nothing you need to do manually on the actual day of the 658 rollover. However, you should still keep an eye on the zone to make sure 659 new signature(s) are being generated by the new KSK (23550 in this 660 example). The easiest way is to query the authoritative name server 661 192.168.1.13 for the same DNSKEY and signatures, as you did a month 662 ago: 663 664 :: 665 666 $ dig @192.168.1.13 example.com. DNSKEY +dnssec +multiline 667 668 ... 669 ;; ANSWER SECTION: 670 example.com. 300 IN DNSKEY 256 3 7 ( 671 AwEAAdYqAc...TiSlrma6Ef 672 ) ; ZSK; alg = NSEC3RSASHA1; key id = 29747 673 example.com. 300 IN DNSKEY 257 3 7 ( 674 AwEAAeTJ+w...O+Zy9j0m63 675 ) ; KSK; alg = NSEC3RSASHA1; key id = 24828 676 example.com. 300 IN DNSKEY 257 3 7 ( 677 AwEAAc1BQN...Wdc0qoH21H 678 ) ; KSK; alg = NSEC3RSASHA1; key id = 23550 679 example.com. 300 IN RRSIG DNSKEY 7 2 300 ( 680 20210201074900 20210101064900 23550 mydnssecgood.org. 681 S6zTbBTfvU...Ib5eXkbtE= ) 682 example.com. 300 IN RRSIG DNSKEY 7 2 300 ( 683 20210105074900 20201206064900 29747 mydnssecgood.org. 684 VY5URQA2/d...OVKr1+KX8= ) 685 ... 686 687 As you can see, the signature generated by the old KSK (24828) has 688 disappeared, replaced by a new signature generated from the new KSK 689 (23550). 690 691 One Month After KSK Rollover 692 ++++++++++++++++++++++++++++ 693 694 While the removal of the old DNSKEY from the zone should be automated by 695 :iscman:`named`, the removal of the DS record is manual. You should make sure 696 the old DNSKEY record is gone from your zone first, by querying for the 697 DNSKEY records of the zone; this time we expect not to see 698 the key with an ID of 24828: 699 700 :: 701 702 $ dig @192.168.1.13 example.com. DNSKEY +dnssec +multiline 703 704 ... 705 ;; ANSWER SECTION: 706 example.com. 300 IN DNSKEY 256 3 7 ( 707 AwEAAdYqAc...TiSlrma6Ef 708 ) ; ZSK; alg = NSEC3RSASHA1; key id = 29747 709 example.com. 300 IN DNSKEY 257 3 7 ( 710 AwEAAc1BQN...Wdc0qoH21H 711 ) ; KSK; alg = NSEC3RSASHA1; key id = 23550 712 example.com. 300 IN RRSIG DNSKEY 7 2 300 ( 713 20210208000000 20210105230000 23550 mydnssecgood.org. 714 Qw9Em3dDok...bNCS7KISw= ) 715 example.com. 300 IN RRSIG DNSKEY 7 2 300 ( 716 20210208000000 20210105230000 29747 mydnssecgood.org. 717 OuelpIlpY9...XfsKupQgc= ) 718 ... 719 720 Since the key with the ID 24828 is gone, you can now remove the old DS 721 record for that key from our parent zone. 722 Be careful to remove the correct DS record. If you accidentally remove 723 the new DS record(s) with key ID 23550, it could lead to a problem called 724 "security lameness," as discussed in 725 :ref:`troubleshooting_security_lameness`, and may cause users to be unable 726 to resolve any names in the zone. 727 728 1. After logging in (again, GoDaddy.com in our example) and launching the domain, scroll down to the "DS 729 Records" section and click Manage. 730 731 .. _remove-ds-1: 732 733 .. figure:: ../dnssec-guide/img/remove-ds-1.png 734 :alt: Remove DS Record Step #1 735 :width: 40.0% 736 737 Remove DS Record Step #1 738 739 2. A dialog appears, displaying both keys (24828 and 23550). Use the far 740 right-hand X button to remove key 24828. 741 742 .. _remove-ds-2: 743 744 .. figure:: ../dnssec-guide/img/remove-ds-2.png 745 :alt: Remove DS Record Step #2 746 :width: 80.0% 747 748 Remove DS Record Step #2 749 750 3. Key 24828 now appears crossed out; click "Save" to complete the 751 removal. 752 753 .. _remove-ds-3: 754 755 .. figure:: ../dnssec-guide/img/remove-ds-3.png 756 :alt: Remove DS Record Step #3 757 :width: 80.0% 758 759 Remove DS Record Step #3 760 761 Congratulations, the KSK rollover is complete! As for the actual key 762 files (ending in ``.key`` and ``.private``), they may be deleted at this 763 point, but they do not have to be. 764 765 .. [#godaddy_iface_note] 766 The screenshots were taken from GoDaddy's interface at the time the 767 original version of this guide was published (2015). It may have 768 changed since then. 769 770 .. _recipes_nsec3: 771 772 NSEC and NSEC3 773 ~~~~~~~~~~~~~~ 774 775 .. _recipes_nsec_to_nsec3: 776 777 Migrating from NSEC to NSEC3 778 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 779 780 This recipe describes how to transition from using NSEC to NSEC3, as described 781 in :ref:`advanced_discussions_proof_of_nonexistence`. This recipe 782 assumes that the zones are already signed, and that :iscman:`named` is configured 783 according to the steps described in 784 :ref:`easy_start_guide_for_authoritative_servers`. 785 786 .. warning:: 787 788 If your zone is signed with RSASHA1 (algorithm 5), you cannot migrate 789 to NSEC3 without also performing an 790 algorithm rollover 791 to RSASHA1-NSEC3-SHA1 (algorithm 7), as described in 792 :ref:`advanced_discussions_DNSKEY_algorithm_rollovers`. This 793 ensures that older validating resolvers that do not understand 794 NSEC3 will fall back to treating the zone as unsecured (rather than 795 "bogus"), as described in Section 2 of :rfc:`5155`. 796 797 To enable NSEC3, update your :any:`dnssec-policy` and add the desired NSEC3 798 parameters. The example below enables NSEC3 for zones with the ``standard`` 799 DNSSEC policy, using 0 additional iterations, no opt-out, and a zero-length salt: 800 801 :: 802 803 dnssec-policy "standard" { 804 nsec3param iterations 0 optout no salt-length 0; 805 }; 806 807 Then reconfigure the server with :iscman:`rndc`. You can tell that it worked if you 808 see the following debug log messages: 809 810 :: 811 812 Oct 21 13:47:21 received control channel command 'reconfig' 813 Oct 21 13:47:21 zone example.com/IN (signed): zone_addnsec3chain(1,CREATE,0,-) 814 815 You can also verify that it worked by querying for a name that you know 816 does not exist, and checking for the presence of the NSEC3 record. 817 For example: 818 819 :: 820 821 $ dig @192.168.1.13 thereisnowaythisexists.example.com. A +dnssec +multiline 822 823 ... 824 5A03TL362CS8VSIH69CVA4MJIKRHFQH3.example.com. 300 IN NSEC3 1 0 0 - ( 825 TQ9QBEGA6CROHEOC8KIH1A2C06IVQ5ER 826 NS SOA RRSIG DNSKEY NSEC3PARAM ) 827 ... 828 829 Our example used four parameters: 1, 0, 0, and -, in 830 order. 1 represents the algorithm, 0 represents the 831 opt-out flag, 0 represents the number of additional iterations, and 832 - denotes no salt is used. To learn more about each of these 833 parameters, please see :ref:`advanced_discussions_nsec3param`. 834 835 .. _recipes_nsec3_to_nsec: 836 837 Migrating from NSEC3 to NSEC 838 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 839 840 Migrating from NSEC3 back to NSEC is easy; just remove the :any:`nsec3param` 841 configuration option from your :any:`dnssec-policy` and reconfigure the name 842 server. You can tell that it worked if you see these messages in the log: 843 844 :: 845 846 named[14093]: received control channel command 'reconfig' 847 named[14093]: zone example.com/IN: zone_addnsec3chain(1,REMOVE,0,-) 848 849 You can also query for a name that you know does not exist, 850 and you should no longer see any traces of NSEC3 records. 851 852 :: 853 854 $ dig @192.168.1.13 reieiergiuhewhiouwe.example.com. A +dnssec +multiline 855 856 ... 857 example.com. 300 IN NSEC aaa.example.com. NS SOA RRSIG NSEC DNSKEY 858 ... 859 ns1.example.com. 300 IN NSEC web.example.com. A RRSIG NSEC 860 ... 861 862 .. _recipes_nsec3_optout: 863 864 NSEC3 Opt-Out 865 ^^^^^^^^^^^^^ 866 867 This recipe discusses how to enable and disable NSEC3 opt-out, and how to show 868 the results of each action. As discussed in 869 :ref:`advanced_discussions_nsec3_optout`, NSEC3 opt-out is a feature 870 that can help conserve resources on parent zones with many 871 delegations that have not yet been signed. 872 873 .. warning:: 874 NSEC3 Opt-Out feature brings benefit only to _extremely_ large zones with lots 875 of insecure delegations. It's use is counterproductive in all other cases as 876 it decreases tamper-resistance of the zone and also decreases efficiency of 877 resolver cache (see :rfc:`8198`). 878 879 In other words, don't enable Opt-Out unless you are serving an equivalent of 880 ``com.`` zone. 881 882 Because the NSEC3PARAM record does not keep track of whether opt-out is used, 883 it is hard to check whether changes need to be made to the NSEC3 chain if the flag 884 is changed. Similar to changing the NSEC3 salt, your best option is to change 885 the value of ``optout`` together with another NSEC3 parameter, like 886 ``iterations``, and in a following step restore the ``iterations`` value. 887 888 For this recipe we assume the zone ``example.com`` 889 has the following four entries (for this example, it is not relevant what 890 record types these entries are): 891 892 - ``ns1.example.com`` 893 894 - ``ftp.example.com`` 895 896 - ``www.example.com`` 897 898 - ``web.example.com`` 899 900 And the zone ``example.com`` has five delegations to five subdomains, only one of 901 which is signed and has a valid DS RRset: 902 903 - ``aaa.example.com``, not signed 904 905 - ``bbb.example.com``, signed 906 907 - ``ccc.example.com``, not signed 908 909 - ``ddd.example.com``, not signed 910 911 - ``eee.example.com``, not signed 912 913 Before enabling NSEC3 opt-out, the zone ``example.com`` contains ten 914 NSEC3 records; below is the list with the plain text name before the actual 915 NSEC3 record: 916 917 - *aaa.example.com*: IFA1I3IE7EKCTPHM6R58URO3Q846I52M.example.com 918 919 - *bbb.example.com*: ROJUF3VJSJO6LQ2LC1DNSJ5GBAUJPVHE.example.com 920 921 - *ccc.example.com*: 0VPUT696LUVDPDS5NIHSHBH9KLV20V5K.example.com 922 923 - *ddd.example.com*: UHPBD5U4HRGB84MLC2NQOVEFNAKJU0CA.example.com 924 925 - *eee.example.com*: NF7I61FA4C2UEKPMEDSOC25FE0UJIMKT.example.com 926 927 - *ftp.example.com*: 8P15KCUAT1RHCSDN46HBQVPI5T532IN1.example.com 928 929 - *ns1.example.com*: GUFVRA2SFIO8RSFP7UO41E8AD1KR41FH.example.com 930 931 - *web.example.com*: CVQ4LA4ALPQIAO2H3N2RB6IR8UHM91E7.example.com 932 933 - *www.example.com*: MIFDNDT3NFF3OD53O7TLA1HRFF95JKUK.example.com 934 935 - *example.com*: ONIB9MGUB9H0RML3CDF5BGRJ59DKJHVK.example.com 936 937 We can enable NSEC3 opt-out with the following configuration, changing 938 the ``optout`` configuration value from ``no`` to ``yes``: 939 940 :: 941 942 dnssec-policy "standard" { 943 nsec3param iterations 0 optout yes salt-length 0; 944 }; 945 946 After NSEC3 opt-out is enabled, the number of NSEC3 records is reduced. 947 Notice that the unsigned delegations ``aaa``, ``ccc``, ``ddd``, and 948 ``eee`` no longer have corresponding NSEC3 records. 949 950 - *bbb.example.com*: ROJUF3VJSJO6LQ2LC1DNSJ5GBAUJPVHE.example.com 951 952 - *ftp.example.com*: 8P15KCUAT1RHCSDN46HBQVPI5T532IN1.example.com 953 954 - *ns1.example.com*: GUFVRA2SFIO8RSFP7UO41E8AD1KR41FH.example.com 955 956 - *web.example.com*: CVQ4LA4ALPQIAO2H3N2RB6IR8UHM91E7.example.com 957 958 - *www.example.com*: MIFDNDT3NFF3OD53O7TLA1HRFF95JKUK.example.com 959 960 - *example.com*: ONIB9MGUB9H0RML3CDF5BGRJ59DKJHVK.example.com 961 962 To undo NSEC3 opt-out, change the configuration again: 963 964 :: 965 966 dnssec-policy "standard" { 967 nsec3param iterations 0 optout no salt-length 0; 968 }; 969 970 .. note:: 971 972 NSEC3 hashes the plain text domain name, and we can compute our own 973 hashes using the tool :iscman:`nsec3hash`. For example, to compute the 974 hashed name for ``www.example.com`` using the parameters we listed 975 above, we can execute this command: 976 977 :: 978 979 # nsec3hash - 1 0 www.example.com. 980 MIFDNDT3NFF3OD53O7TLA1HRFF95JKUK (salt=-, hash=1, iterations=0) 981 982 .. _revert_to_unsigned: 983 984 Reverting to Unsigned 985 ~~~~~~~~~~~~~~~~~~~~~ 986 987 This recipe describes how to revert from a signed zone (DNSSEC) back to 988 an unsigned (DNS) zone. 989 990 Here is what :iscman:`named.conf` looks like when it is signed: 991 992 .. code-block:: none 993 :emphasize-lines: 4 994 995 zone "example.com" IN { 996 type primary; 997 file "db/example.com.db"; 998 dnssec-policy "default"; 999 }; 1000 1001 To indicate the reversion to unsigned, change the :any:`dnssec-policy` line: 1002 1003 .. code-block:: none 1004 :emphasize-lines: 4 1005 1006 zone "example.com" IN { 1007 type primary; 1008 file "db/example.com.db"; 1009 dnssec-policy "insecure"; 1010 }; 1011 1012 Then use :option:`rndc reload` to reload the zone. 1013 1014 The "insecure" policy is a built-in policy (like "default"). It makes sure 1015 the zone is still DNSSEC-maintained, to allow for a graceful transition to 1016 unsigned. It also publishes the CDS and CDNSKEY DELETE records automatically 1017 at the appropriate time. 1018 1019 If the parent zone allows management of DS records via CDS/CDNSKEY, as described in 1020 :rfc:`8078`, the DS record should be removed from the parent automatically. 1021 1022 Otherwise, DS records can be removed via the registrar. Below is an example 1023 showing how to remove DS records using the 1024 `GoDaddy <https://www.godaddy.com>`__ web-based interface: 1025 1026 1. After logging in, click the green "Launch" button next to the domain 1027 name you want to manage. 1028 1029 .. _unsign-1: 1030 1031 .. figure:: ../dnssec-guide/img/unsign-1.png 1032 :alt: Revert to Unsigned Step #1 1033 :width: 60.0% 1034 1035 Revert to Unsigned Step #1 1036 1037 2. Scroll down to the "DS Records" section and click Manage. 1038 1039 .. _unsign-2: 1040 1041 .. figure:: ../dnssec-guide/img/unsign-2.png 1042 :alt: Revert to Unsigned Step #2 1043 :width: 40.0% 1044 1045 Revert to Unsigned Step #2 1046 1047 3. A dialog appears, displaying all current keys. Use the far right-hand 1048 X button to remove each key. 1049 1050 .. _unsign-3: 1051 1052 .. figure:: ../dnssec-guide/img/unsign-3.png 1053 :alt: Revert to Unsigned Step #3 1054 :width: 70.0% 1055 1056 Revert to Unsigned Step #3 1057 1058 4. Click Save. 1059 1060 .. _unsign-4: 1061 1062 .. figure:: ../dnssec-guide/img/unsign-4.png 1063 :alt: Revert to Unsigned Step #4 1064 :width: 70.0% 1065 1066 Revert to Unsigned Step #4 1067 1068 When the DS records have been removed from the parent zone, use 1069 :option:`rndc dnssec -checkds -key id withdrawn example.com <rndc dnssec>` to tell :iscman:`named` that 1070 the DS is removed, and the remaining DNSSEC records will be removed in a timely 1071 manner. Or, if parental agents are configured, the DNSSEC records will be 1072 automatically removed after BIND has seen that the parental agents no longer 1073 serve the DS RRset for this zone. 1074 1075 After a while, the zone is reverted back to the traditional, insecure DNS 1076 format. This can be verified by checking that all DNSKEY and RRSIG records have been 1077 removed from the zone. 1078 1079 The :any:`dnssec-policy` line can then be removed from :iscman:`named.conf` and 1080 the zone reloaded. The zone will no longer be subject to any DNSSEC 1081 maintenance. 1082