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_signing: 13 14 Signing 15 ------- 16 17 .. _easy_start_guide_for_authoritative_servers: 18 19 Easy-Start Guide for Signing Authoritative Zones 20 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 21 22 This section provides the basic information needed to set up a 23 DNSSEC-enabled authoritative name server. A DNSSEC-enabled (or 24 "signed") zone contains additional resource records that are used to 25 verify the authenticity of its zone information. 26 27 To convert a traditional (insecure) DNS zone to a secure one, we need to 28 create some additional records (DNSKEY, RRSIG, and NSEC or NSEC3), and 29 upload verifiable information (such as a DS record) to the parent zone to 30 complete the chain of trust. For more information about DNSSEC resource 31 records, please see :ref:`what_does_dnssec_add_to_dns`. 32 33 .. note:: 34 35 In this chapter, we assume all configuration files, key files, and 36 zone files are stored in ``/etc/bind``, and most examples show 37 commands run as the root user. This may not be ideal, but the point is 38 not to distract from what is important here: learning how to sign 39 a zone. There are many best practices for deploying a more secure 40 BIND installation, with techniques such as jailed process and 41 restricted user privileges, but those are not covered 42 in this document. We trust you, a responsible DNS 43 administrator, to take the necessary precautions to secure your 44 system. 45 46 For the examples below, we work with the assumption that 47 there is an existing insecure zone ``example.com`` that we are 48 converting to a secure zone. 49 50 .. _signing_easy_start_policy_enable: 51 52 Enabling Automated DNSSEC Zone Maintenance and Key Generation 53 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 54 55 To sign a zone, add the following statement to its 56 :any:`zone` clause in the BIND 9 configuration file: 57 58 :: 59 60 options { 61 directory "/etc/bind"; 62 recursion no; 63 ... 64 }; 65 66 zone "example.com" in { 67 ... 68 dnssec-policy default; 69 ... 70 }; 71 72 The :any:`dnssec-policy` statement causes the zone to be signed and turns 73 on automatic maintenance for the zone. This includes re-signing the zone 74 as signatures expire and replacing keys on a periodic basis. The value 75 ``default`` selects the default policy, which contains values suitable 76 for most situations. We cover the creation of a custom policy in 77 :ref:`signing_custom_policy`, but for the moment we are accepting the 78 default values. 79 80 Using :any:`dnssec-policy` requires dynamic DNS or :any:`inline-signing` 81 to be enabled. 82 83 When the configuration file is updated, tell :iscman:`named` to 84 reload the configuration file by running :option:`rndc reconfig`: 85 86 :: 87 88 # rndc reconfig 89 90 And that's it - BIND signs your zone. 91 92 At this point, before you go away and merrily add :any:`dnssec-policy` 93 statements to all your zones, we should mention that, like a number of 94 other BIND configuration options, its scope depends on where it is placed. In 95 the example above, we placed it in a :any:`zone` clause, so it applied only 96 to the zone in question. If we had placed it in a :any:`view` clause, it 97 would have applied to all zones in the view; and if we had placed it in 98 the :namedconf:ref:`options` clause, it would have applied to all zones served by 99 this instance of BIND. 100 101 .. _signing_verification: 102 103 Verification 104 ^^^^^^^^^^^^ 105 106 The BIND 9 reconfiguration starts the process of signing the zone. 107 First, it generates a key for the zone and includes it 108 in the published zone. The log file shows messages such as these: 109 110 :: 111 112 07-Apr-2020 16:02:55.045 zone example.com/IN (signed): reconfiguring zone keys 113 07-Apr-2020 16:02:55.045 reloading configuration succeeded 114 07-Apr-2020 16:02:55.046 keymgr: DNSKEY example.com/ECDSAP256SHA256/10376 (CSK) created for policy default 115 07-Apr-2020 16:02:55.046 Fetching example.com/ECDSAP256SHA256/10376 (CSK) from key repository. 116 07-Apr-2020 16:02:55.046 DNSKEY example.com/ECDSAP256SHA256/10376 (CSK) is now published 117 07-Apr-2020 16:02:55.046 DNSKEY example.com/ECDSAP256SHA256/10376 (CSK) is now active 118 07-Apr-2020 16:02:55.048 zone example.com/IN (signed): next key event: 07-Apr-2020 18:07:55.045 119 120 It then starts signing the zone. How long this process takes depends on the 121 size of the zone, the speed of the server, and how much activity is 122 taking place. We can check what is happening by using :iscman:`rndc`, 123 entering the command: 124 125 :: 126 127 # rndc signing -list example.com 128 129 While the signing is in progress, the output is something like: 130 131 :: 132 133 Signing with key 10376/ECDSAP256SHA256 134 135 and when it is finished: 136 137 :: 138 139 Done signing with key 10376/ECDSAP256SHA256 140 141 When the second message appears, the zone is signed. 142 143 Before moving on to the next step of coordinating with the parent zone, 144 let's make sure everything looks good using :iscman:`delv`. We want to 145 simulate what a validating resolver will check, by telling 146 :iscman:`delv` to use a specific trust anchor. 147 148 First, we need to make a copy of the key created by BIND. This 149 is in the directory you set with the :any:`directory` statement in 150 your configuration file's :namedconf:ref:`options` clause, and is named something 151 like ``Kexample.com.+013.10376.key``: 152 153 :: 154 155 # cp /etc/bind/Kexample.com.+013+10376.key /tmp/example.key 156 157 The original key file looks like this (with the actual key shortened for ease of display, 158 and comments omitted): 159 160 :: 161 162 # cat /etc/bind/Kexample.com.+013+10376.key 163 164 ... 165 example.com. 3600 IN DNSKEY 257 3 13 6saiq99qDB...dqp+o0dw== 166 167 We want to edit the copy to be in the :any:`trust-anchors` format, so that 168 it looks like this: 169 170 :: 171 172 # cat /tmp/example.key 173 trust-anchors { 174 example.com. static-key 257 3 13 "6saiq99qDB...dqp+o0dw=="; 175 }; 176 177 Now we can run the :iscman:`delv` command and instruct it to use this 178 trusted-key file to validate the answer it receives from the 179 authoritative name server 192.168.1.13: 180 181 :: 182 183 $ delv @192.168.1.13 -a /tmp/example.key +root=example.com example.com. SOA +multiline 184 ; fully validated 185 example.com. 600 IN SOA ns1.example.com. admin.example.com. ( 186 2020040703 ; serial 187 1800 ; refresh (30 minutes) 188 900 ; retry (15 minutes) 189 2419200 ; expire (4 weeks) 190 300 ; minimum (5 minutes) 191 ) 192 example.com. 600 IN RRSIG SOA 13 2 600 ( 193 20200421150255 20200407140255 10376 example.com. 194 jBsz92zwAcGMNV/yu167aKQZvFyC7BiQe1WEnlogdLTF 195 oq4yBQumOhO5WX61LjA17l1DuLWcd/ASwlUZWFGCYQ== ) 196 197 .. _signing_easy_start_upload_to_parent_zone: 198 199 Uploading Information to the Parent Zone 200 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 201 202 Once everything is complete on our name server, we need to generate some 203 information to be uploaded to the parent zone to complete the chain of 204 trust. The format and the upload methods are actually dictated by your 205 parent zone's administrator, so contact your registrar or parent zone 206 administrator to find out what the actual format should be and how to 207 deliver or upload the information to the parent zone. 208 209 What about your zone between the time you signed it and the time your 210 parent zone accepts the upload? To the rest of the world, your 211 zone still appears to be insecure, because if a validating 212 resolver attempts to validate your domain name via 213 your parent zone, your parent zone will indicate that you are 214 not yet signed (as far as it knows). The validating resolver will then 215 give up attempting to validate your domain name, and will fall back to the 216 insecure DNS. Until you complete this final step with your 217 parent zone, your zone remains insecure. 218 219 .. note:: 220 221 Before uploading to your parent zone, verify that your newly signed 222 zone has propagated to all of your name servers (usually via zone 223 transfers). If some of your name servers still have unsigned zone 224 data while the parent tells the world it should be signed, validating 225 resolvers around the world cannot resolve your domain name. 226 227 Here are some examples of what you may upload to your parent zone, with 228 the DNSKEY/DS data shortened for display. Note that no matter what 229 format may be required, the end result is the parent zone 230 publishing DS record(s) based on the information you upload. Again, 231 contact your parent zone administrator(s) to find out the 232 correct format for their system. 233 234 1. DS record format: 235 236 :: 237 238 example.com. 3600 IN DS 10376 13 2 B92E22CAE0...33B8312EF0 239 240 2. DNSKEY format: 241 242 :: 243 244 example.com. 3600 IN DNSKEY 257 3 13 6saiq99qDB...dqp+o0dw== 245 246 The DS record format may be generated from the DNSKEY using the 247 :iscman:`dnssec-dsfromkey` tool, which is covered in 248 :ref:`parent_ds_record_format`. For more details and examples on how 249 to work with your parent zone, please see 250 :ref:`working_with_parent_zone`. 251 252 .. _signing_easy_start_so_what_now: 253 254 So... What Now? 255 ^^^^^^^^^^^^^^^ 256 257 Congratulations! Your zone is signed, your secondary servers have 258 received the new zone data, and the parent zone has accepted your upload 259 and published your DS record. Your zone is now officially 260 DNSSEC-enabled. What happens next? That is basically it - BIND 261 takes care of everything else. As for updating your zone file, you can 262 continue to update it the same way as prior to signing your 263 zone; the normal work flow of editing a zone file and using the :iscman:`rndc` 264 command to reload the zone still works as usual, and although you are 265 editing the unsigned version of the zone, BIND generates the signed 266 version automatically. 267 268 Curious as to what all these commands did to your zone file? Read on to 269 :ref:`your_zone_before_and_after_dnssec` and find out. If you are 270 interested in how to roll this out to your existing primary and 271 secondary name servers, check out :ref:`recipes_inline_signing` in 272 the :ref:`dnssec_recipes` chapter. 273 274 .. _your_zone_before_and_after_dnssec: 275 276 Your Zone, Before and After DNSSEC 277 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 278 279 When we assigned the default DNSSEC policy to the zone, we provided the 280 minimal amount of information to convert a traditional DNS 281 zone into a DNSSEC-enabled zone. This is what the zone looked like 282 before we started: 283 284 :: 285 286 $ dig @192.168.1.13 example.com. AXFR +multiline +onesoa 287 288 ; <<>> DiG 9.16.0 <<>> @192.168.1.13 example.com AXFR +multiline +onesoa 289 ; (1 server found) 290 ;; global options: +cmd 291 example.com. 600 IN SOA ns1.example.com. admin.example.com. ( 292 2020040700 ; serial 293 1800 ; refresh (30 minutes) 294 900 ; retry (15 minutes) 295 2419200 ; expire (4 weeks) 296 300 ; minimum (5 minutes) 297 ) 298 example.com. 600 IN NS ns1.example.com. 299 ftp.example.com. 600 IN A 192.168.1.200 300 ns1.example.com. 600 IN A 192.168.1.1 301 web.example.com. 600 IN CNAME www.example.com. 302 www.example.com. 600 IN A 192.168.1.100 303 304 Below shows the test zone ``example.com`` after reloading the 305 server configuration. Clearly, the zone grew in size, and the 306 number of records multiplied: 307 308 :: 309 310 # dig @192.168.1.13 example.com. AXFR +multiline +onesoa 311 312 ; <<>> DiG 9.16.0 <<>> @192.168.1.13 example.com AXFR +multiline +onesoa 313 ; (1 server found) 314 ;; global options: +cmd 315 example.com. 600 IN SOA ns1.example.com. admin.example.com. ( 316 2020040703 ; serial 317 1800 ; refresh (30 minutes) 318 900 ; retry (15 minutes) 319 2419200 ; expire (4 weeks) 320 300 ; minimum (5 minutes) 321 ) 322 example.com. 300 IN RRSIG NSEC 13 2 300 ( 323 20200413050536 20200407140255 10376 example.com. 324 drtV1rJbo5OMi65OJtu7Jmg/thgpdTWrzr6O3Pzt12+B 325 oCxMAv3orWWYjfP2n9w5wj0rx2Mt2ev7MOOG8IOUCA== ) 326 example.com. 300 IN NSEC ftp.example.com. NS SOA RRSIG NSEC DNSKEY TYPE65534 327 example.com. 600 IN RRSIG NS 13 2 600 ( 328 20200413130638 20200407140255 10376 example.com. 329 2ipmzm1Ei6vfE9OLowPMsxLBCbjrCpWPgWJ0ekwZBbux 330 MLffZOXn8clt0Ql2U9iCPdyoQryuJCiojHSE2d6nrw== ) 331 example.com. 600 IN RRSIG SOA 13 2 600 ( 332 20200421150255 20200407140255 10376 example.com. 333 jBsz92zwAcGMNV/yu167aKQZvFyC7BiQe1WEnlogdLTF 334 oq4yBQumOhO5WX61LjA17l1DuLWcd/ASwlUZWFGCYQ== ) 335 example.com. 0 IN RRSIG TYPE65534 13 2 0 ( 336 20200413050536 20200407140255 10376 example.com. 337 Xjkom24N6qeCJjg9BMUfuWf+euLeZB169DHvLYZPZNlm 338 GgM2czUDPio6VpQbUw6JE5DSNjuGjgpgXC5SipC42g== ) 339 example.com. 3600 IN RRSIG DNSKEY 13 2 3600 ( 340 20200421150255 20200407140255 10376 example.com. 341 maK75+28oUyDtci3V7wjTsuhgkLUZW+Q++q46Lea6bKn 342 Xj77kXcLNogNdUOr5am/6O6cnPeJKJWsnmTLISm62g== ) 343 example.com. 0 IN TYPE65534 \# 5 ( 0D28880001 ) 344 example.com. 3600 IN DNSKEY 257 3 13 ( 345 6saiq99qDBb5b4G4cx13cPjFTrIvUs3NW44SvbbHorHb 346 kXwOzeGAWyPORN+pwEV/LP9+FHAF/JzAJYdqp+o0dw== 347 ) ; KSK; alg = ECDSAP256SHA256 ; key id = 10376 348 example.com. 600 IN NS ns1.example.com. 349 ftp.example.com. 600 IN RRSIG A 13 3 600 ( 350 20200413130638 20200407140255 10376 example.com. 351 UYo1njeUA49VhKnPSS3JO4G+/Xd2PD4m3Vaacnd191yz 352 BIoouEBAGPcrEM2BNrgR0op1EWSus9tG86SM1ZHGuQ== ) 353 ftp.example.com. 300 IN RRSIG NSEC 13 3 300 ( 354 20200413130638 20200407140255 10376 example.com. 355 rPADrAMAPIPSF3S45OSY8kXBTYMS3nrZg4Awj7qRL+/b 356 sOKy6044MbIbjg+YWL69dBjKoTSeEGSCSt73uIxrYA== ) 357 ftp.example.com. 300 IN NSEC ns1.example.com. A RRSIG NSEC 358 ftp.example.com. 600 IN A 192.168.1.200 359 ns1.example.com. 600 IN RRSIG A 13 3 600 ( 360 20200413130638 20200407140255 10376 example.com. 361 Yeojg7qrJmxL6uLTnALwKU5byNldZ9Ggj5XjcbpPvujQ 362 ocG/ovGBg6pdugXC9UxE39bCDl8dua1frjDcRCCZAA== ) 363 ns1.example.com. 300 IN RRSIG NSEC 13 3 300 ( 364 20200413130638 20200407140255 10376 example.com. 365 vukgQme6k7JwCf/mJOOzHXbE3fKtSro+Kc10T6dHMdsc 366 oM1/oXioZvgBZ9cKrQhIAUt7r1KUnrUwM6Je36wWFA== ) 367 ns1.example.com. 300 IN NSEC web.example.com. A RRSIG NSEC 368 ns1.example.com. 600 IN A 192.168.1.1 369 web.example.com. 600 IN RRSIG CNAME 13 3 600 ( 370 20200413130638 20200407140255 10376 example.com. 371 JXi4WYypofD5geUowVqlqJyHzvcRnsvU/ONhTBaUCw5Y 372 XtifKAXRHWrUL1HIwt37JYPLf5uYu90RfkWLj0GqTQ== ) 373 web.example.com. 300 IN RRSIG NSEC 13 3 300 ( 374 20200413130638 20200407140255 10376 example.com. 375 XF4Hsd58dalL+s6Qu99bG80PQyMf7ZrHEzDiEflRuykP 376 DfBRuf34z27vj70LO1lp2ZiX4BB1ahcEK2ae9ASAmA== ) 377 web.example.com. 300 IN NSEC www.example.com. CNAME RRSIG NSEC 378 web.example.com. 600 IN CNAME www.example.com. 379 www.example.com. 600 IN RRSIG A 13 3 600 ( 380 20200413050536 20200407140255 10376 example.com. 381 mACKXrDOF5JMWqncSiQ3pYWA6abyGDJ4wgGCumjLXhPy 382 0cMzJmKv2s7G6+tW3TsA6BK3UoMfv30oblY2Mnl4/A== ) 383 www.example.com. 300 IN RRSIG NSEC 13 3 300 ( 384 20200413050536 20200407140255 10376 example.com. 385 1YQ22odVt0TeP5gbNJwkvS684ipDmx6sEOsF0eCizhCv 386 x8osuOATdlPjIEztt+rveaErZ2nsoLor5k1nQAHsbQ== ) 387 www.example.com. 300 IN NSEC example.com. A RRSIG NSEC 388 www.example.com. 600 IN A 192.168.1.100 389 390 But this is a really messy way to tell if the zone is set up properly 391 with DNSSEC. Fortunately, there are tools to help us with that. Read on 392 to :ref:`how_to_test_authoritative_server` to learn more. 393 394 .. _how_to_test_authoritative_server: 395 396 How To Test Authoritative Zones 397 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 398 399 So we've activated DNSSEC and uploaded some data to our parent zone. How 400 do we know our zone is signed correctly? Here are a few ways to check. 401 402 .. _signing_verify_key_data: 403 404 Look for Key Data in Your Zone 405 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 406 407 One way to see if your zone is signed is to check for the 408 presence of DNSKEY record types. In our example, we created a single 409 key, and we expect to see it returned when we query for it. 410 411 :: 412 413 $ dig @192.168.1.13 example.com. DNSKEY +multiline 414 415 ; <<>> DiG 9.16.0 <<>> @10.53.0.6 example.com DNSKEY +multiline 416 ; (1 server found) 417 ;; global options: +cmd 418 ;; Got answer: 419 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18637 420 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 421 ;; WARNING: recursion requested but not available 422 423 ;; OPT PSEUDOSECTION: 424 ; EDNS: version: 0, flags:; udp: 4096 425 ; COOKIE: efe186423313fb66010000005e8c997e99864f7d69ed7c11 (good) 426 ;; QUESTION SECTION: 427 ;example.com. IN DNSKEY 428 429 ;; ANSWER SECTION: 430 example.com. 3600 IN DNSKEY 257 3 13 ( 431 6saiq99qDBb5b4G4cx13cPjFTrIvUs3NW44SvbbHorHb 432 kXwOzeGAWyPORN+pwEV/LP9+FHAF/JzAJYdqp+o0dw== 433 ) ; KSK; alg = ECDSAP256SHA256 ; key id = 10376 434 435 436 .. _signing_verify_signature: 437 438 Look for Signatures in Your Zone 439 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 440 441 Another way to see if your zone data is signed is to check for the 442 presence of a signature. With DNSSEC, every record 443 [#every_record_signed]_ now comes with at least one corresponding 444 signature, known as an RRSIG. 445 446 :: 447 448 $ dig @192.168.1.13 example.com. SOA +dnssec +multiline 449 450 ; <<>> DiG 9.16.0 <<>> @10.53.0.6 example.com SOA +dnssec +multiline 451 ; (1 server found) 452 ;; global options: +cmd 453 ;; Got answer: 454 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45219 455 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 456 ;; WARNING: recursion requested but not available 457 458 ;; OPT PSEUDOSECTION: 459 ; EDNS: version: 0, flags: do; udp: 4096 460 ; COOKIE: 75adff4f4ce916b2010000005e8c99c0de47eabb7951b2f5 (good) 461 ;; QUESTION SECTION: 462 ;example.com. IN SOA 463 464 ;; ANSWER SECTION: 465 example.com. 600 IN SOA ns1.example.com. admin.example.com. ( 466 2020040703 ; serial 467 1800 ; refresh (30 minutes) 468 900 ; retry (15 minutes) 469 2419200 ; expire (4 weeks) 470 300 ; minimum (5 minutes) 471 ) 472 example.com. 600 IN RRSIG SOA 13 2 600 ( 473 20200421150255 20200407140255 10376 example.com. 474 jBsz92zwAcGMNV/yu167aKQZvFyC7BiQe1WEnlogdLTF 475 oq4yBQumOhO5WX61LjA17l1DuLWcd/ASwlUZWFGCYQ== ) 476 477 The serial number was automatically incremented from the old, unsigned 478 version. :iscman:`named` keeps track of the serial number of the signed version of 479 the zone independently of the unsigned version. If the unsigned zone is 480 updated with a new serial number that is higher than the one in the 481 signed copy, then the signed copy is increased to match it; 482 otherwise, the two are kept separate. 483 484 .. _signing_verify_zone_file: 485 486 Examine the Zone File 487 ^^^^^^^^^^^^^^^^^^^^^ 488 489 Our original zone file ``example.com.db`` remains untouched, and :iscman:`named` has 490 generated three additional files automatically for us (shown below). The 491 signed DNS data is stored in ``example.com.db.signed`` and in the 492 associated journal file. 493 494 :: 495 496 # cd /etc/bind 497 # ls 498 example.com.db example.com.db.jbk example.com.db.signed example.com.db.signed.jnl 499 500 A quick description of each of the files: 501 502 - ``.jbk``: a transient file used by :iscman:`named` 503 504 - ``.signed``: the signed version of the zone in raw format 505 506 - ``.signed.jnl``: a journal file for the signed version of the zone 507 508 These files are stored in raw (binary) format for faster loading. To 509 reveal the human-readable version, use :iscman:`named-compilezone` 510 as shown below. In the example below, we run the command on the 511 raw format zone ``example.com.db.signed`` to produce a text version of 512 the zone ``example.com.text``: 513 514 :: 515 516 # named-compilezone -f raw -F text -o example.com.text example.com example.com.db.signed 517 zone example.com/IN: loaded serial 2014112008 (DNSSEC signed) 518 dump zone to example.com.text...done 519 OK 520 521 .. _signing_verify_check_parent: 522 523 Check the Parent 524 ^^^^^^^^^^^^^^^^ 525 526 Although this is not strictly related to whether the zone is 527 signed, a critical part of DNSSEC is the trust relationship between the 528 parent and the child. Just because we, the child, have all the correctly 529 signed records in our zone does not mean it can be fully validated by a 530 validating resolver, unless our parent's data agrees with ours. To check 531 if our upload to the parent was successful, ask the parent name server 532 for the DS record of our child zone; we should get back the DS record(s) 533 containing the information we uploaded in 534 :ref:`signing_easy_start_upload_to_parent_zone`: 535 536 :: 537 538 $ dig example.com. DS 539 540 ; <<>> DiG 9.16.0 <<>> example.com DS 541 ; (1 server found) 542 ;; global options: +cmd 543 ;; Got answer: 544 ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16954 545 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 546 547 ;; OPT PSEUDOSECTION: 548 ; EDNS: version: 0, flags:; udp: 4096 549 ; COOKIE: db280d5b52576780010000005e8c9bf5b0d8de103d934e5d (good) 550 ;; QUESTION SECTION: 551 ;example.com. IN DS 552 553 ;; ANSWER SECTION: 554 example.com. 61179 IN DS 10376 13 2 B92E22CAE0B41430EC38D3F7EDF1183C3A94F4D4748569250C15EE33B8312EF0 555 556 .. [#every_record_signed] 557 Well, almost every record: NS records and glue records for 558 delegations do not have RRSIG records. If there are 559 no delegations, then every record in your zone is 560 signed and comes with its own RRSIG. 561 562 .. _signing_verify_external_tools: 563 564 External Testing Tools 565 ^^^^^^^^^^^^^^^^^^^^^^ 566 567 We recommend two tools, below: Verisign DNSSEC Debugger and DNSViz. Others can 568 be found via a simple online search. These excellent online tools are an easy 569 way to verify that your domain name is fully secured. 570 571 .. _signing_verify_external_tools_dnssec_debugger: 572 573 Verisign DNSSEC Debugger 574 ++++++++++++++++++++++++ 575 576 URL: `<https://dnssec-debugger.verisignlabs.com/>`__ 577 578 This tool shows a nice summary of checks performed on your domain name. 579 You can expand it to view more details for each of the items checked, to 580 get a detailed report. 581 582 .. figure:: ../dnssec-guide/img/verisign-dnssec-debugger-example.png 583 :alt: Verisign DNSSEC Debugger 584 585 Verisign DNSSEC Debugger 586 587 .. _signing_verify_external_tools_dnsviz: 588 589 DNSViz 590 ++++++ 591 592 URL: `<https://dnsviz.net/>`__ 593 594 DNSViz provides a visual analysis of the DNSSEC authentication chain for 595 a domain name and its resolution path in the DNS namespace. 596 597 .. figure:: ../dnssec-guide/img/dnsviz-example-small.png 598 :alt: DNSViz 599 :width: 80.0% 600 601 DNSViz 602 603 .. _signing_easy_start_explained: 604 605 Signing Easy Start Explained 606 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 607 608 .. _enable_automatic_maintenance_explained: 609 610 Enable Automatic DNSSEC Maintenance Explained 611 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 612 613 Signing a zone requires a number of separate steps: 614 615 - Generation of the keys to sign the zone. 616 617 - Inclusion of the keys into the zone. 618 619 - Signing of the records in the file (including the generation of the 620 NSEC or NSEC3 records). 621 622 Maintaining a signed zone comprises a set of ongoing tasks: 623 624 - Re-signing the zone as signatures approach expiration. 625 626 - Generation of new keys as the time approaches for a key roll. 627 628 - Inclusion of new keys into the zone when the rollover starts. 629 630 - Transition from signing the zone with the old set of keys to signing 631 the zone with the new set of keys. 632 633 - Waiting the appropriate interval before removing the old keys from 634 the zone. 635 636 - Deleting the old keys. 637 638 That is quite complex, and it is all handled in BIND 9 with the single 639 ``dnssec-policy default`` statement. We will see later on (in the 640 :ref:`signing_custom_policy` section) how these actions can be tuned, by 641 setting up our own DNSSEC policy with customized parameters. However, in many 642 cases the defaults are adequate. 643 644 :any:`dnssec-policy` is the preferred way to run DNSSEC in a zone, but sometimes 645 a more "hands-on" approach to signing and key maintenance is needed. For this 646 reason, we cover manual signing techniques in 647 :ref:`advanced_discussions_manual_signing`. 648 649 .. _working_with_parent_zone: 650 651 Working With the Parent Zone 652 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 654 As mentioned in :ref:`signing_easy_start_upload_to_parent_zone`, 655 the format of the information uploaded to your parent zone is dictated 656 by your parent zone administrator. The two main formats are: 657 658 1. DS record format 659 660 2. DNSKEY format 661 662 Check with your parent zone to see which format they require. 663 664 But how can you get each of the formats from your existing data? 665 666 When :iscman:`named` turned on automatic 667 DNSSEC maintenance, essentially the first thing it did was to create 668 the DNSSEC keys and put them in the directory you specified in the 669 configuration file. If you look in that directory, you will see three 670 files with names like ``Kexample.com.+013+10376.key``, 671 ``Kexample.com.+013+10376.private``, and 672 ``Kexample.com.+013+10376.state``. The one we are interested in is the 673 one with the ``.key`` suffix, which contains the zone's public key. (The 674 other files contain the zone's private key and the DNSSEC state 675 associated with the key.) This public key is used to generate the information we 676 need to pass to the parent. 677 678 .. _parent_ds_record_format: 679 680 DS Record Format 681 ^^^^^^^^^^^^^^^^ 682 683 Below is an example of a DS record format generated from the KSK we 684 created earlier (``Kexample.com.+013+10376.key``): 685 686 :: 687 688 # cd /etc/bind 689 dnssec-dsfromkey Kexample.com.+013+10376.key 690 example.com. IN DS 10376 13 2 B92E22CAE0B41430EC38D3F7EDF1183C3A94F4D4748569250C15EE33B8312EF0 691 692 Some registrars ask their customers to manually specify the types of algorithm 693 and digest used. In this example, 13 represents the algorithm used, and 694 2 represents the digest type (SHA-256). The key tag or key ID is 10376. 695 696 .. _parent_dnskey_format: 697 698 DNSKEY Format 699 ^^^^^^^^^^^^^ 700 701 Below is an example of the same key ID (10376) using DNSKEY format 702 (with the actual key shortened for ease of display): 703 704 :: 705 706 example.com. 3600 IN DNSKEY 257 3 13 (6saiq99qDB...dqp+o0dw==) ; key id = 10376 707 708 The key itself is easy to find (it's difficult to miss that long 709 base64 string) in the file. 710 711 :: 712 713 # cd /etc/bind 714 # cat Kexample.com.+013+10376.key 715 ; This is a key-signing key, keyid 10376, for example.com. 716 ; Created: 20200407150255 (Tue Apr 7 16:02:55 2020) 717 ; Publish: 20200407150255 (Tue Apr 7 16:02:55 2020) 718 ; Activate: 20200407150255 (Tue Apr 7 16:02:55 2020) 719 example.com. 3600 IN DNSKEY 257 3 13 6saiq99qDB...dqp+o0dw== 720 721 .. _signing_custom_policy: 722 723 Creating a Custom DNSSEC Policy 724 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 726 The remainder of this section describes the contents of a custom DNSSEC 727 policy. :ref:`dnssec_advanced_discussions` describes the concepts 728 involved here and the pros and cons of choosing particular values. If 729 you are not already familiar with DNSSEC, it may be worth reading that chapter 730 first. 731 732 Setting up your own DNSSEC policy means that you must include a 733 :any:`dnssec-policy` clause in the zone file. This sets values for the 734 various parameters that affect the signing of zones and the rolling of 735 keys. The following is an example of such a clause: 736 737 :: 738 739 dnssec-policy standard { 740 dnskey-ttl 600; 741 keys { 742 ksk lifetime 365d algorithm ecdsap256sha256; 743 zsk lifetime 60d algorithm ecdsap256sha256; 744 }; 745 max-zone-ttl 600; 746 parent-ds-ttl 600; 747 parent-propagation-delay 2h; 748 publish-safety 7d; 749 retire-safety 7d; 750 signatures-refresh 5d; 751 signatures-validity 15d; 752 signatures-validity-dnskey 15d; 753 zone-propagation-delay 2h; 754 }; 755 756 The policy has multiple parts: 757 758 - The name must be specified. As each zone can use a different policy, 759 :iscman:`named` needs to be able to distinguish between policies. This is 760 done by giving each policy a name, such as ``standard`` in the above 761 example. 762 763 - The :any:`keys` clause lists all keys that should be in the zone, along 764 with their associated parameters. In this example, we are using the 765 conventional KSK/ZSK split, with the KSK changed every year and the 766 ZSK changed every two months (the ``default`` DNSSEC policy sets a 767 CSK that is never changed). Keys are created using the 768 ECDSAPS256SHA256 algorithm; each KSK/ZSK pair must have the same 769 algorithm. A CSK combines the functionality of a ZSK and a KSK. 770 771 - The parameters ending in ``-ttl`` are, as expected, the TTLs of the 772 associated records. Remember that during a key rollover, 773 we have to wait for records to expire from caches? The values 774 here tell BIND 9 the maximum amount of time it has to wait for this to 775 happen. Values can be set for the DNSKEY records in your zone, the 776 non-DNSKEY records in your zone, and the DS records in the parent 777 zone. 778 779 - Another set of time-related parameters are those ending in 780 ``-propagation-delay``. These tell BIND how long it takes for a 781 change in zone contents to become available on all secondary servers. 782 (This may be non-negligible: for example, if a large zone is 783 transferred over a slow link.) 784 785 - The policy also sets values for the various signature parameters: how 786 long the signatures on the DNSKEY and non-DNSKEY records are valid, 787 and how often BIND should re-sign the zone. 788 789 - The parameters ending in ``-safety`` are there to give 790 you a bit of leeway in case a key roll doesn't go to plan. When 791 introduced into the zone, the :any:`publish-safety` time is the amount 792 of additional time, over and above that calculated from the other 793 parameters, during which the new key is in the zone but before BIND starts 794 to sign records with it. Similarly, the :any:`retire-safety` is the 795 amount of additional time, over and above that calculated from the 796 other parameters, during which the old key is retained in the zone before 797 being removed. 798 799 - Finally, the :any:`purge-keys` option allows you to clean up key files 800 automatically after a period of time. If a key has been removed from the 801 zone, this option will determine how long its key files will be retained 802 on disk. 803 804 (You do not have to specify all the items listed above in your policy 805 definition. Any that are not set simply take the default value.) 806 807 Usually, the exact timing of a key roll, or how long a signature remains 808 valid, is not critical. For this reason, err on the side of caution when 809 setting values for the parameters. It is better to have an operation 810 like a key roll take a few days longer than absolutely required, than it 811 is to have a quick key roll but have users get validation failures 812 during the process. 813 814 Having defined a new policy called "standard", we now need to tell 815 :iscman:`named` to use it. We do this by adding a ``dnssec-policy standard;`` 816 statement to the configuration file. Like many other configuration 817 statements, it can be placed in the :namedconf:ref:`options` statement (thus applying 818 to all zones on the server), a :any:`view` statement (applying to all zones 819 in the view), or a :any:`zone` statement (applying only to that zone). In 820 this example, we'll add it to the :any:`zone` statement: 821 822 :: 823 824 zone "example.net" in { 825 ... 826 dnssec-policy standard; 827 ... 828 }; 829 830 Finally, tell :iscman:`named` to use the new policy: 831 832 :: 833 834 # rndc reconfig 835 836 ... and that's it. :iscman:`named` now applies the "standard" policy to 837 your zone. 838 839 .. _signing_maintenance_tasks: 840 841 Maintenance Tasks 842 ~~~~~~~~~~~~~~~~~ 843 844 Zone data is signed and the parent zone has published your DS records: 845 at this point your zone is officially secure. When other 846 validating resolvers look up information in your zone, they are able to 847 follow the 12-step process as described in 848 :ref:`how_does_dnssec_change_dns_lookup_revisited` and verify the 849 authenticity and integrity of the answers. 850 851 There is not that much left for you, as the DNS administrator, to do on 852 an ongoing basis. Whenever you update your zone, BIND automatically 853 re-signs your zone with new RRSIG and NSEC/NSEC3 records, and even 854 increments the serial number for you. If you choose to split your keys 855 into a KSK and ZSK, the rolling of the ZSK is completely automatic. 856 Rolling of a KSK or CSK may require some manual intervention, though, 857 so let's examine two more DNSSEC-related resource records, CDS and CDNSKEY. 858 859 .. _cds_cdnskey: 860 861 The CDS and CDNSKEY Resource Records 862 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 863 864 Passing the DS record to the organization running the parent zone has 865 always been recognized as a bottleneck in the key rollover process. To 866 automate the process, the CDS and CDNSKEY resource records were 867 introduced. 868 869 The CDS and CDNSKEY records are identical to the DS and DNSKEY records, 870 except in the type code and the name. When such a record appears in the 871 child zone, it is a signal to the parent that it should update the DS it 872 has for that zone. In essence, when the parent notices 873 the presence of the CDS and/or CDNSKEY record(s) in the 874 child zone, it checks these records to verify that they are 875 signed by a valid key for the zone. If the record(s) successfully 876 validate, the parent zone's DS RRset for the child zone is changed to 877 correspond to the CDS (or CDNSKEY) records. (For more 878 information on how the signaling works and the issues surrounding it, 879 please refer to :rfc:`7344` and :rfc:`8078`.) 880 881 .. _working_with_the_parent_2: 882 883 Working with the Parent Zone (2) 884 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 885 886 Once the zone is signed, the only required manual tasks are 887 to monitor KSK or CSK key rolls and pass the new DS record to the 888 parent zone. However, if the parent can process CDS or CDNSKEY records, 889 you may not even have to do that. [#parent_zone_security_considerations]_ 890 891 When the time approaches for the roll of a KSK or CSK, BIND adds a 892 CDS and a CDNSKEY record for the key in question to the apex of the 893 zone. If your parent zone supports polling for CDS/CDNSKEY records, they 894 are uploaded and the DS record published in the parent - at least ideally. 895 896 If BIND is configured with :any:`parental-agents`, it will check for the DS 897 presence. Let's look at the following configuration excerpt: 898 899 :: 900 901 remote-servers "net" { 902 10.53.0.11; 10.53.0.12; 903 }; 904 905 zone "example.net" in { 906 ... 907 dnssec-policy standard; 908 parental-agents { "net"; }; 909 checkds explicit; 910 ... 911 }; 912 913 BIND will check for the presence of the DS record in the parent zone by querying 914 its parental agents (defined in :rfc:`7344` to be the entities that the child 915 zone has a relationship with to change its delegation information). In the 916 example above, The zone `example.net` is configured with two parental agents, 917 at the addresses 10.53.0.11 and 10.53.0.12. These addresses are used as an 918 example only. Both addresses will have to respond with a DS RRset that 919 includes the DS record identifying the key that is being rolled. If one or 920 both don't have the DS included yet the rollover is paused, and the check for 921 DS presence is retried after an hour. The same applies for DS withdrawal. 922 923 The example also has :any:`checkds` set to `explicit`. This means that only 924 the addresses defined in :any:`parental-agents` are being queried. If set to 925 `yes`, the parental agents are being looked up by querying for the parent NS 926 records. 927 928 Alternatively, you can use the :iscman:`rndc` tool to tell :iscman:`named` that the DS 929 record has been published or withdrawn. For example: 930 931 :: 932 933 # rndc dnssec -checkds published example.net 934 935 This command should also be used when :any:`checkds` is set to `no`. 936 937 If your parent zone doesn't support CDS/CDNSKEY, you will have to supply 938 the DNSKEY or DS record to the parent zone manually when a new KSK appears in 939 your zone, presumably using the same mechanism you used to upload the 940 records for the first time. Again, you need to use the :iscman:`rndc` tool 941 to tell :iscman:`named` that the DS record has been published. 942 943 .. [#parent_zone_security_considerations] 944 For security reasons, a parent zone that supports CDS/CDNSKEY may require 945 the DS record to be manually uploaded when we first sign the zone. 946 Until our zone is signed, the parent cannot be sure that a CDS or CDNSKEY 947 record it finds by querying our zone really comes from our zone; thus, it 948 needs to use some other form of secure transfer to obtain the information. 949 950 .. _advanced_discussions_manual_signing: 951 952 Manual Signing 953 ~~~~~~~~~~~~~~ 954 955 Manual signing of a zone was the first method of signing introduced into 956 BIND and offers, as the name suggests, no automation. The user must 957 handle everything: create the keys, sign the zone file with them, load 958 the signed zone, periodically re-sign the zone, and manage key rolls, 959 including interaction with the parent. A user certainly can do all this, 960 but why not use one of the automated methods? 961 962 Although use of the automatic :any:`dnssec-policy` is the preferred way to 963 sign zones in BIND, there are occasions where a manual approach may be needed. 964 :any:`dnssec-policy` does not currently support the use of external hardware, 965 so if your security policy requires it, you need to use manual signing. 966 967 BIND 9 ships with several tools that are used in this process, which are 968 explained in more detail below. In all cases, the ``-h`` option prints a full 969 list of parameters. Note that the DNSSEC tools require the keyset files to be 970 in the working directory or the directory specified by the ``-d`` option. 971 972 To convert a traditional (insecure) DNS zone to a secure one, we need to 973 create various additional records (DNSKEY, RRSIG, NSEC/NSEC3) and, as with 974 fully automatic signing, to upload verifiable information (such as a DS 975 record) to the parent zone to complete the chain of trust. 976 977 The first step is to create the keys as described in 978 :ref:`manual_signing_generate_keys`, then using the BIND-provided tools 979 :iscman:`dnssec-keygen` to create the keys and 980 :iscman:`dnssec-signzone` to sign the zone. The signed zone is stored in 981 another file and is the one you tell BIND to load. To update the zone (for 982 example, to add a resource record), you update the unsigned zone, re-sign it, 983 and tell :iscman:`named` to load the updated signed copy. The same goes for 984 refreshing signatures or rolling keys; the user is responsible for providing 985 the signed zone served by :iscman:`named`. (In the case of rolling keys, you 986 are also responsible for ensuring that the keys are added and removed at the 987 correct times.) 988 989 Why would you want to sign your zone this way? You probably wouldn't in the 990 normal course of events, but as there may be circumstances in which it is 991 required, the scripts have been left in the BIND distribution. 992 993 .. note:: 994 995 Again, we assume all configuration files, key files, and zone files are 996 stored in ``/etc/bind``, and most examples show commands run as the root 997 user. This may not be ideal, but the point is not to distract from what is 998 important here: learning how to sign a zone. There are many best practices 999 for deploying a more secure BIND installation, with techniques such as 1000 jailed process and restricted user privileges, but those are not covered 1001 in this document. We trust you, a responsible DNS administrator, to take 1002 the necessary precautions to secure your system. 1003 1004 For our examples below, we work with the assumption that there is an 1005 existing insecure zone ``example.com`` that we are converting to a secure 1006 version. The secure version uses both a KSK and a ZSK. 1007 1008 .. _manual_signing_generate_keys: 1009 1010 Generate Keys 1011 ^^^^^^^^^^^^^ 1012 1013 Everything in DNSSEC centers around keys, so we begin by generating our own 1014 keys. 1015 1016 .. code-block:: console 1017 1018 # cd /etc/bind/keys 1019 # dnssec-keygen -a ECDSAP256SHA256 example.com 1020 Generating key pair...........................+++++ ......................+++++ 1021 Kexample.com.+013+34371 1022 # dnssec-keygen -a ECDSAP256SHA256 -f KSK example.com 1023 Generating key pair........................+++ ..................................+++ 1024 Kexample.com.+013+00472 1025 1026 This command generates four key files in ``/etc/bind/keys``: 1027 1028 - Kexample.com.+013+34371.key 1029 1030 - Kexample.com.+013+34371.private 1031 1032 - Kexample.com.+013+00472.key 1033 1034 - Kexample.com.+013+00472.private 1035 1036 The two files ending in ``.key`` are the public keys. These contain the 1037 DNSKEY resource records that appear in the zone. The two files 1038 ending in ``.private`` are the private keys, and contain the information 1039 that :iscman:`named` actually uses to sign the zone. 1040 1041 Of the two pairs, one is the zone-signing key (ZSK), and one is the 1042 key-signing key (KSK). [#signal_zone_presence]_ We can tell which is 1043 which by looking at the file contents (the actual keys are shortened 1044 here for ease of display): 1045 1046 .. code-block:: console 1047 1048 # cat Kexample.com.+013+34371.key 1049 ; This is a zone-signing key, keyid 34371, for example.com. 1050 ; Created: 20200616104249 (Tue Jun 16 11:42:49 2020) 1051 ; Publish: 20200616104249 (Tue Jun 16 11:42:49 2020) 1052 ; Activate: 20200616104249 (Tue Jun 16 11:42:49 2020) 1053 example.com. IN DNSKEY 256 3 13 AwEAAfel66...LqkA7cvn8= 1054 # cat Kexample.com.+013+00472.key 1055 ; This is a key-signing key, keyid 472, for example.com. 1056 ; Created: 20200616104254 (Tue Jun 16 11:42:54 2020) 1057 ; Publish: 20200616104254 (Tue Jun 16 11:42:54 2020) 1058 ; Activate: 20200616104254 (Tue Jun 16 11:42:54 2020) 1059 example.com. IN DNSKEY 257 3 13 AwEAAbCR6U...l8xPjokVU= 1060 1061 The first line of each file tells us what type of key it is. Also, by 1062 looking at the actual DNSKEY record, we can tell them apart: 256 is 1063 ZSK, and 257 is KSK. 1064 1065 The name of the file also tells us something 1066 about the contents. See chapter :ref:`zone_keys` for more details. 1067 1068 Make sure that these files are readable by :iscman:`named` and that the 1069 ``.private`` files are not readable by anyone else. 1070 1071 Alternativelly, the :iscman:`dnssec-keyfromlabel` program is used to get a key 1072 pair from a crypto hardware device and build the key files. Its usage is 1073 similar to :iscman:`dnssec-keygen`. 1074 1075 .. _manual_signing_key_timing_information: 1076 1077 Setting Key Timing Information 1078 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1079 1080 Key files contain time information related to rolling keys. This is placed 1081 there by :iscman:`dnssec-keygen` when the file is created, and it can be 1082 modified using :iscman:`dnssec-settime`. By default, only a limited amount of 1083 timing information is included in the file, as illustrated in the examples in 1084 the previous section. 1085 1086 Note that :any:`dnssec-policy` does set key timing information, but it uses its 1087 own state machine to determine what actions to perform. 1088 1089 But when performing manual signing the key parameters and the timing 1090 information in the key files, you can implement any DNSSEC policy you want for 1091 your zones. 1092 1093 All the dates are the same, and are the date and time that 1094 :iscman:`dnssec-keygen` created the key. We can use 1095 :iscman:`dnssec-settime` to modify the dates. The dates can also be 1096 modified using an editor, but that is likely to be more error-prone than 1097 using :iscman:`dnssec-settime`. For example, to publish this key in the 1098 zone on 1 July 2020, use it to sign records for a year starting on 15 1099 July 2020, and remove it from the zone at the end of July 2021, we can 1100 use the following command: 1101 1102 .. code-block:: console 1103 1104 # dnssec-settime -P 20200701 -A 20200715 -I 20210715 -D 20210731 Kexample.com.+013+34371.key 1105 ./Kexample.com.+013+34371.key 1106 ./Kexample.com.+013+34371.private 1107 1108 which would set the contents of the key file to: 1109 1110 .. code-block:: none 1111 1112 ; This is a zone-signing key, keyid 34371, for example.com. 1113 ; Created: 20200616104249 (Tue Jun 16 11:42:49 2020) 1114 ; Publish: 20200701000000 (Wed Jul 1 01:00:00 2020) 1115 ; Activate: 20200715000000 (Wed Jul 15 01:00:00 2020) 1116 ; Inactive: 20210715000000 (Thu Jul 15 01:00:00 2021) 1117 ; Delete: 20210731000000 (Sat Jul 31 01:00:00 2021) 1118 example.com. IN DNSKEY 256 3 13 AwEAAfel66...LqkA7cvn8= 1119 1120 (The actual key is truncated here to improve readability.) 1121 1122 Below is a complete list of each of the metadata fields, and how each 1123 one affects the signing of your zone: 1124 1125 1. *Created*: This records the date on which the key was created. It is 1126 not used in calculations; it is useful simply for documentation 1127 purposes. 1128 1129 2. *Publish*: This sets the date on which a key is to be published to the 1130 zone. After that date, the key is included in the zone but is 1131 not used to sign it. This allows validating resolvers to get a 1132 copy of the new key in their cache before there are any resource 1133 records signed with it. By default, if not specified at creation 1134 time, this is set to the current time, meaning the key is 1135 published as soon as :iscman:`named` picks it up. 1136 1137 3. *Activate*: This sets the date on which the key is to be activated. After 1138 that date, resource records are signed with the key. By default, 1139 if not specified during creation time, this is set to the current 1140 time, meaning the key is used to sign data as soon as :iscman:`named` 1141 picks it up. 1142 1143 4. *Revoke:* This sets the date on which the key is to be revoked. After that 1144 date, the key is flagged as revoked, although it is still included in the 1145 zone and used to sign it. This is used to notify validating 1146 resolvers that this key is about to be removed or retired from the 1147 zone. (This state is not used in normal day-to-day operations. See 1148 :rfc:`5011` to understand the circumstances where it may be used.) 1149 1150 5. *Inactive*: This sets the date on which the key is to become inactive. 1151 After that date, the key is still included in the zone, but it 1152 is no longer used to sign it. This sets the "expiration" or "retire" 1153 date for a key. 1154 1155 6. *Delete*: This sets the date on which the key is to be deleted. After that 1156 date, the key is no longer included in the zone, but it 1157 continues to exist on the file system or key repository. 1158 1159 This can be summarized as follows: 1160 1161 .. table:: Key Metadata Comparison 1162 1163 +----------+------------------+------------------+------------------+ 1164 | Metadata | Included in Zone | Used to Sign | Purpose | 1165 | | File? | Data? | | 1166 +==========+==================+==================+==================+ 1167 | Created | No | No | Recording of | 1168 | | | | key creation | 1169 +----------+------------------+------------------+------------------+ 1170 | Publish | Yes | No | Introduction of | 1171 | | | | a key soon to be | 1172 | | | | active | 1173 +----------+------------------+------------------+------------------+ 1174 | Activate | Yes | Yes | Activation date | 1175 | | | | for new key | 1176 +----------+------------------+------------------+------------------+ 1177 | Revoke | Yes | Yes | Notification of | 1178 | | | | a key soon to be | 1179 | | | | retired | 1180 +----------+------------------+------------------+------------------+ 1181 | Inactive | Yes | No | Inactivation or | 1182 | | | | retirement of a | 1183 | | | | key | 1184 +----------+------------------+------------------+------------------+ 1185 | Delete | No | No | Deletion or | 1186 | | | | removal of a key | 1187 | | | | from a zone | 1188 +----------+------------------+------------------+------------------+ 1189 1190 The publication date is the date the key should be introduced into the zone. 1191 The activation date can be used to determine when to sign resource records. 1192 With "Inactive" you signal when the signer should stop generating new 1193 signatures with the given key, and the "Delete" metadata specifies when the key 1194 should be removed from the zone. 1195 1196 Finally, we should note that the :iscman:`dnssec-keygen` command supports the 1197 same set of switches so we could have set the dates 1198 when we created the key. 1199 1200 .. [#signal_zone_presence] 1201 Only one key file - for either a KSK or ZSK - is needed to signal the 1202 presence of the zone. :iscman:`dnssec-keygen` creates files of both 1203 types as needed. 1204 1205 .. _manual_signing_the_zone: 1206 1207 Signing the Zone 1208 ^^^^^^^^^^^^^^^^ 1209 1210 Now, edit the zone file to make sure the proper DNSKEY entries are included. 1211 The public keys should be inserted into the zone file by including the 1212 ``.key`` files using ``$INCLUDE`` statements. 1213 1214 Use the command :iscman:`dnssec-signzone`. Any ``keyset`` files corresponding 1215 to secure sub-zones should be present. The zone signer generates ``NSEC``, 1216 ``NSEC3``, and ``RRSIG`` records for the zone, as well as ``DS`` for the child 1217 zones if :option:`-g <dnssec-signzone -g>` is specified. If 1218 :option:`-g <dnssec-signzone -g>` is not specified, then DS RRsets for the 1219 secure child zones need to be added manually. 1220 1221 The following command signs the zone, assuming it is in a file called 1222 ``zone.child.example``, using manually specified keys: 1223 1224 .. code-block:: console 1225 1226 # cd /etc/bind/keys/example.com/ 1227 # dnssec-signzone -t -N INCREMENT -o example.com -f /etc/bind/db/example.com.signed.db \ 1228 /etc/bind/db/example.com.db Kexample.com.+013+17694.key Kexample.com.+013+06817.key 1229 Verifying the zone using the following algorithms: ECDSAP256SHA256. 1230 Zone fully signed: 1231 Algorithm: ECDSAP256SHA256: KSKs: 1 active, 0 stand-by, 0 revoked 1232 ZSKs: 1 active, 0 stand-by, 0 revoked 1233 /etc/bind/db/example.com.signed.db 1234 Signatures generated: 17 1235 Signatures retained: 0 1236 Signatures dropped: 0 1237 Signatures successfully verified: 0 1238 Signatures unsuccessfully verified: 0 1239 Signing time in seconds: 0.046 1240 Signatures per second: 364.634 1241 Runtime in seconds: 0.055 1242 1243 The :option:`-o <dnssec-signzone -o>` switch explicitly defines the domain name 1244 (``example.com`` in this case), while the :option:`-f <dnssec-signzone -f>` 1245 switch specifies the output file name. The second line has three parameters: 1246 the unsigned zone name (``/etc/bind/db/example.com.db``), the ZSK file name, 1247 and the KSK file name. This also generates a plain-text file 1248 ``/etc/bind/db/example.com.signed.db``, which can be manually verified for correctness. 1249 1250 :iscman:`dnssec-signzone` also produces keyset and dsset files. These are used 1251 to provide the parent zone administrators with the ``DNSKEY`` records (or their 1252 corresponding ``DS`` records) that are the secure entry point to the zone. 1253 1254 By default, all zone keys which have an available private key are used 1255 to generate signatures. You can use the :option:`-S <dnssec-signzone -S>` to 1256 only include keys that have the "Activate" timing metadata in the past and 1257 the "Inactive" timing metadata in the future (or not present). 1258 1259 .. _manual_signing_reloading_zone: 1260 1261 Reloading the Zone 1262 ^^^^^^^^^^^^^^^^^^ 1263 1264 Now it is time to inform BIND that a new signed zonefile is available. We can 1265 do this with the :option:`rndc reload example.com <rndc reload>` command. 1266 1267 .. _manual_signing_verification: 1268 1269 Verifying That the Zone Is Signed Correctly 1270 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1271 1272 You should now check that the zone is signed. Follow the steps in 1273 :ref:`signing_verification`. 1274 1275 .. _manual_signing_upload_ds: 1276 1277 Uploading the DS Record to the Parent 1278 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1279 1280 As described in :ref:`signing_easy_start_upload_to_parent_zone`, we must now 1281 upload the new information to the parent zone. The format of the information 1282 and how to generate it is described in :ref:`working_with_parent_zone`, 1283 although it is important to remember that you must use the contents of the 1284 KSK file that you generated above as part of the process. 1285 1286 The file ``dsset-example.com`` (created by :iscman:`dnssec-signzone` when it 1287 signed the ``example.com`` zone) contains the DS record for the zone's KSK. 1288 1289 If not yet done so, you will need to pass that to the administrator of the 1290 parent zone, to be placed in the zone. When the DS record is published in the 1291 parent zone, your zone is fully signed. 1292 1293 .. _manual_signing_validation: 1294 1295 Checking That Your Zone Can Be Validated 1296 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1297 1298 Finally, follow the steps in :ref:`how_to_test_authoritative_server` 1299 to confirm that a query recognizes the zone as properly signed and 1300 vouched for by the parent zone. 1301 1302 .. _manual_signing_resigning: 1303 1304 Re-signing the Zone 1305 ^^^^^^^^^^^^^^^^^^^ 1306 1307 Since this is a manual process, you will need to re-sign periodically, 1308 as well as every time the zone data changes. You will also need to manually 1309 roll the keys by adding and removing DNSKEY records (and interacting with the 1310 parent) at the appropriate times. 1311 1312 So... What Now? 1313 ^^^^^^^^^^^^^^^ 1314 1315 Once the zone is signed, it must be monitored as described in 1316 :ref:`signing_maintenance_tasks`. However, as the time approaches for a key 1317 roll, you must create the new key. Of course, it is possible to create keys 1318 for the next fifty years all at once and set the key times appropriately. 1319 Whether the increased risk in having the private key files for future keys 1320 available on disk offsets the overhead of having to remember to create a new 1321 key before a rollover depends on your organization's security policy. 1322 1323 .. _advanced_discussions_offline_ksk: 1324 1325 Offline KSK 1326 ~~~~~~~~~~~ 1327 1328 For operational reasons, it is possible to keep the KSK offline. Doing so 1329 minimizes the risk of the key being compromised through theft or loss. 1330 1331 This effectively means that the private keys of the KSKs and the ZSKs are 1332 located in two physically separate places. The KSK is kept completely offline, 1333 and the ZSK is used in the primary DNS server to sign the zone data. The 1334 DNSKEY, CDS, and CDNSKEY RRsets are signed separately by the KSK. 1335 1336 Because of this, CSKs are incompatible with Offline KSK. 1337 1338 To enable Offline KSK in BIND 9, add the following to the :any:`dnssec-policy` 1339 configuration: 1340 1341 :: 1342 1343 dnssec-policy "offline-ksk" { 1344 ... 1345 offline-ksk yes; 1346 }; 1347 1348 With this configuration, BIND 9 will no longer generate signatures for the 1349 DNSKEY, CDS, and CDNSKEY RRsets, nor will it generate keys for rollovers. 1350 1351 Before enabling Offline KSK, the keys and signed RRsets must be pregenerated. 1352 This can be done with the :iscman:`dnssec-ksr` program, which is used to 1353 create Signed Key Response (SKR) files that can be imported into BIND 9. 1354 1355 Creating SKR files is a four-step process. First, the ZSKs must be 1356 pregenerated; then, a Key Signing Request (KSR) is created. This file is 1357 presented to the KSK operators to be signed. The result is a SKR file that 1358 is returned to the ZSK operators, to be imported into the DNS server. 1359 1360 Pregenerating ZSKs 1361 ^^^^^^^^^^^^^^^^^^ 1362 1363 First we need to pregenerate ZSKs for the future. Let's say we want to 1364 generate enough keys for the next two years; this will create several key 1365 files, depending on the :any:`dnssec-policy` used. If the ZSK lifetime 1366 is six months, this will create about four keys (other timing metadata may 1367 cause an extra key to be generated). 1368 1369 This can be done with the :iscman:`dnssec-ksr` program: 1370 1371 .. code-block:: none 1372 1373 # dnssec-ksr -i now -e +2y -k offline-ksk -l named.conf keygen example.net 1374 Kexample.net.+013+63278 1375 Kexample.net.+013+13211 1376 Kexample.net.+013+50958 1377 Kexample.net.+013+12403 1378 1379 The timing metadata is set accordingly in the key files. Keys that already 1380 exist in the :any:`key-directory` are taken into consideration when 1381 pregenerating keys; if the above command is run multiple times quickly in 1382 succession, no additional keys are generated. 1383 1384 Key Signing Request 1385 ^^^^^^^^^^^^^^^^^^^ 1386 1387 Now that we have keys that can be published in the zone, we need to get 1388 signatures for the DNSKEY RRset to be used in the future. For that, 1389 we generate a Key Signing Request (KSR). In this example, we are using the 1390 same DNSSEC policy and interval. 1391 1392 .. code-block:: none 1393 1394 # dnssec-ksr -i now -e +2y -k offline-ksk -l named.conf request example.net 1395 ;; KeySigningRequest 1.0 20240813133035 (Tue Aug 13 15:30:35 2024) 1396 example.net. 3600 IN DNSKEY 256 3 13 Z8WRuXJr9v7cSUZpJuQKN/1pZuLPEgoWx4eQOhVI8Edz49F7xpbxnGar aLelIIIlWuRyjdvUtsnitAfWvyGjqQ== 1397 ;; KeySigningRequest 1.0 20250215111826 (Sat Feb 15 12:18:26 2025) 1398 example.net. 3600 IN DNSKEY 256 3 13 ph7zZ/QgvwHuq2U1aYoMT3MqPUZYEq6y4qNwOb8uzurVISxL0XyhYH+Q ngEOV2ECgndMjn8e1ujH/d0H3cPX8A== 1399 example.net. 3600 IN DNSKEY 256 3 13 Z8WRuXJr9v7cSUZpJuQKN/1pZuLPEgoWx4eQOhVI8Edz49F7xpbxnGar aLelIIIlWuRyjdvUtsnitAfWvyGjqQ== 1400 ;; KeySigningRequest 1.0 20250225142826 (Tue Feb 25 15:28:26 2025) 1401 example.net. 3600 IN DNSKEY 256 3 13 ph7zZ/QgvwHuq2U1aYoMT3MqPUZYEq6y4qNwOb8uzurVISxL0XyhYH+Q ngEOV2ECgndMjn8e1ujH/d0H3cPX8A== 1402 ... 1403 1404 The output shows that the ZSK rollovers are pre-planned, which will result 1405 in a number of key bundles. Each bundle contains a start time and the ZSKs that 1406 need to be published from that time. 1407 1408 The data needs to be stored in a file and can be handed over to the KSK 1409 operators, and can be secured by encryption and/or digital signature. 1410 1411 Signed Key Response 1412 ^^^^^^^^^^^^^^^^^^^ 1413 1414 The KSK operators receive a KSR file that contain ZSK sets for a given 1415 interval. By signing the KSR, a Signed Key Response (SKR) is created that 1416 consists of numerous response bundles; for each bundle, the DNSKEY RRset 1417 needs to be constructed by combining the records of the KSK and ZSKs. Then, 1418 a signature is generated for the constructed RRset. In addition, the signed 1419 CDS and CDNSKEY RRsets are added. 1420 1421 Again the same interval and DNSSEC policy should be used. Below is the command 1422 for signing a KSR file "example.net.ksr". 1423 1424 .. code-block:: none 1425 1426 # dnssec-ksr -i now -e +2y -k offline-ksk -l named.conf -K ksk -f example.net.ksr sign example.net 1427 ;; SignedKeyResponse 1.0 20240813134020 (Tue Aug 13 15:40:20 2024) 1428 example.net. 3600 IN DNSKEY 257 3 13 vV2+6W+cFd3nn8eLrswUnhrPIxdgmslFWwF45MlCPIhjXIp6PpvaHC8k Y2RH46UrbWINDEo7k5wqvUncakKhJw== 1429 example.net. 3600 IN DNSKEY 256 3 13 Z8WRuXJr9v7cSUZpJuQKN/1pZuLPEgoWx4eQOhVI8Edz49F7xpbxnGar aLelIIIlWuRyjdvUtsnitAfWvyGjqQ== 1430 example.net. 3600 IN RRSIG DNSKEY 13 2 3600 20240827134020 20240813124020 6221 example.net. gkiw6M72Gi8XDu8XEAnPVR+AF4K7j1fApt2puLWgChayvaWrMPIbG2jP gvd/RJiJSsdGBx4P3GYdNqfFskNKIA== 1431 example.net. 3600 IN CDNSKEY 257 3 13 vV2+6W+cFd3nn8eLrswUnhrPIxdgmslFWwF45MlCPIhjXIp6PpvaHC8k Y2RH46UrbWINDEo7k5wqvUncakKhJw== 1432 example.net. 3600 IN RRSIG CDNSKEY 13 2 3600 20240827134020 20240813124020 6221 example.net. 1hAwRv2Nbkwfv8KWXdM9eBedgFZapECZJN4iTKj/yb50mjrPjK9JiQ92 m/xSFUC6gRxMkoPnaULYs+3Qc/XqDA== 1433 example.net. 3600 IN CDS 6221 13 2 A9EEDE51FA154B90259A1B8788D26C53C20AFE759D3B5FEA0349675A EEC0479D 1434 example.net. 3600 IN RRSIG CDS 13 2 3600 20240827134020 20240813124020 6221 example.net. TtbCbxTP4WEm5W8ZOdD3DgVlDSz0sdimm5YO28Bi+kP2ZVEM72A0B9QP pCiXKrRjCLN2aguqNlRzupWiwb22cA== 1435 ;; SignedKeyResponse 1.0 20240822134020 (Thu Aug 22 15:40:20 2024) 1436 example.net. 3600 IN DNSKEY 257 3 13 vV2+6W+cFd3nn8eLrswUnhrPIxdgmslFWwF45MlCPIhjXIp6PpvaHC8k Y2RH46UrbWINDEo7k5wqvUncakKhJw== 1437 example.net. 3600 IN DNSKEY 256 3 13 Z8WRuXJr9v7cSUZpJuQKN/1pZuLPEgoWx4eQOhVI8Edz49F7xpbxnGar aLelIIIlWuRyjdvUtsnitAfWvyGjqQ== 1438 ... 1439 1440 The output is stored in a file and can be given back to the ZSK operators. 1441 1442 Importing the SKR 1443 ^^^^^^^^^^^^^^^^^ 1444 1445 Now that we have an SKR file, it needs to be imported into the DNS server, 1446 via the :option:`rndc skr` command. Let's say the SKR is stored 1447 in a file "example.net.skr": 1448 1449 .. code-block:: none 1450 1451 # rndc skr -import example.net.skr example.net 1452 1453 From now on, when it is time for a new signature for the DNSKEY, CDS, or CDNSKEY 1454 RRset, instead of it being generated, it will be looked up in the SKR data. 1455 1456 When the SKR data is nearing the end of its lifetime, simply repeat the 1457 four-step process for the next period. 1458