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.. highlight: console 13 14.. iscman:: dnssec-cds 15.. program:: dnssec-cds 16.. _man_dnssec-cds: 17 18dnssec-cds - change DS records for a child zone based on CDS/CDNSKEY 19-------------------------------------------------------------------- 20 21Synopsis 22~~~~~~~~ 23 24:program:`dnssec-cds` [**-a** alg...] [**-c** class] [**-D**] {**-d** dsset-file} {**-f** child-file} [**-i**[extension]] [**-s** start-time] [**-T** ttl] [**-u**] [**-v** level] [**-V**] {domain} 25 26Description 27~~~~~~~~~~~ 28 29The :program:`dnssec-cds` command changes DS records at a delegation point 30based on CDS or CDNSKEY records published in the child zone. If both CDS 31and CDNSKEY records are present in the child zone, the CDS is preferred. 32This enables a child zone to inform its parent of upcoming changes to 33its key-signing keys (KSKs); by polling periodically with :program:`dnssec-cds`, the 34parent can keep the DS records up-to-date and enable automatic rolling 35of KSKs. 36 37Two input files are required. The :option:`-f child-file <-f>` option specifies a 38file containing the child's CDS and/or CDNSKEY records, plus RRSIG and 39DNSKEY records so that they can be authenticated. The :option:`-d path <-d>` option 40specifies the location of a file containing the current DS records. For 41example, this could be a ``dsset-`` file generated by 42:iscman:`dnssec-signzone`, or the output of :iscman:`dnssec-dsfromkey`, or the 43output of a previous run of :program:`dnssec-cds`. 44 45The :program:`dnssec-cds` command uses special DNSSEC validation logic 46specified by :rfc:`7344`. It requires that the CDS and/or CDNSKEY records 47be validly signed by a key represented in the existing DS records. This 48is typically the pre-existing KSK. 49 50For protection against replay attacks, the signatures on the child 51records must not be older than they were on a previous run of 52:program:`dnssec-cds`. Their age is obtained from the modification time of the 53``dsset-`` file, or from the :option:`-s` option. 54 55To protect against breaking the delegation, :program:`dnssec-cds` ensures that 56the DNSKEY RRset can be verified by every key algorithm in the new DS 57RRset, and that the same set of keys are covered by every DS digest 58type. 59 60By default, replacement DS records are written to the standard output; 61with the :option:`-i` option the input file is overwritten in place. The 62replacement DS records are the same as the existing records, when no 63change is required. The output can be empty if the CDS/CDNSKEY records 64specify that the child zone wants to be insecure. 65 66.. warning:: 67 68 Be careful not to delete the DS records when :program:`dnssec-cds` fails! 69 70Alternatively, :option`dnssec-cds -u` writes an :iscman:`nsupdate` script to the 71standard output. The :option:`-u` and :option:`-i` options can be used together to 72maintain a ``dsset-`` file as well as emit an :iscman:`nsupdate` script. 73 74Options 75~~~~~~~ 76 77.. option:: -a algorithm 78 79 When converting CDS records to DS records, this option specifies 80 the acceptable digest algorithms. This option can be repeated, so 81 that multiple digest types are allowed. If none of the CDS records 82 use an acceptable digest type, :program:`dnssec-cds` will try to use CDNSKEY 83 records instead; if there are no CDNSKEY records, it reports an error. 84 85 When converting CDNSKEY records to DS records, this option specifies the 86 digest algorithm to use. It can be repeated, so that multiple DS records 87 are created for each CDNSKEY records. 88 89 The algorithm must be one of SHA-1, SHA-256, or SHA-384. These values 90 are case-insensitive, and the hyphen may be omitted. If no algorithm 91 is specified, the default is SHA-256 only. 92 93.. option:: -c class 94 95 This option specifies the DNS class of the zones. 96 97.. option:: -D 98 99 This option generates DS records from CDNSKEY records if both CDS and CDNSKEY 100 records are present in the child zone. By default CDS records are 101 preferred. 102 103.. option:: -d path 104 105 This specifies the location of the parent DS records. The path can be the name of a file 106 containing the DS records; if it is a directory, :program:`dnssec-cds` 107 looks for a ``dsset-`` file for the domain inside the directory. 108 109 To protect against replay attacks, child records are rejected if they 110 were signed earlier than the modification time of the ``dsset-`` 111 file. This can be adjusted with the :option:`-s` option. 112 113.. option:: -f child-file 114 115 This option specifies the file containing the child's CDS and/or CDNSKEY records, plus its 116 DNSKEY records and the covering RRSIG records, so that they can be 117 authenticated. 118 119 The examples below describe how to generate this file. 120 121.. option:: -i extension 122 123 This option updates the ``dsset-`` file in place, instead of writing DS records to 124 the standard output. 125 126 There must be no space between the :option:`-i` and the extension. If 127 no extension is provided, the old ``dsset-`` is discarded. If an 128 extension is present, a backup of the old ``dsset-`` file is kept 129 with the extension appended to its filename. 130 131 To protect against replay attacks, the modification time of the 132 ``dsset-`` file is set to match the signature inception time of the 133 child records, provided that it is later than the file's current 134 modification time. 135 136.. option:: -s start-time 137 138 This option specifies the date and time after which RRSIG records become 139 acceptable. This can be either an absolute or a relative time. An 140 absolute start time is indicated by a number in YYYYMMDDHHMMSS 141 notation; 20170827133700 denotes 13:37:00 UTC on August 27th, 2017. A 142 time relative to the ``dsset-`` file is indicated with ``-N``, which is N 143 seconds before the file modification time. A time relative to the 144 current time is indicated with ``now+N``. 145 146 If no start-time is specified, the modification time of the 147 ``dsset-`` file is used. 148 149.. option:: -T ttl 150 151 This option specifies a TTL to be used for new DS records. If not specified, the 152 default is the TTL of the old DS records. If they had no explicit TTL, 153 the new DS records also have no explicit TTL. 154 155.. option:: -u 156 157 This option writes an :iscman:`nsupdate` script to the standard output, instead of 158 printing the new DS reords. The output is empty if no change is 159 needed. 160 161 Note: The TTL of new records needs to be specified: it can be done in the 162 original ``dsset-`` file, with the :option:`-T` option, or using the 163 :iscman:`nsupdate` ``ttl`` command. 164 165.. option:: -V 166 167 This option prints version information. 168 169.. option:: -v level 170 171 This option sets the debugging level. Level 1 is intended to be usefully verbose 172 for general users; higher levels are intended for developers. 173 174``domain`` 175 This indicates the name of the delegation point/child zone apex. 176 177Exit Status 178~~~~~~~~~~~ 179 180The :program:`dnssec-cds` command exits 0 on success, or non-zero if an error 181occurred. 182 183If successful, the DS records may or may not need to be 184changed. 185 186Examples 187~~~~~~~~ 188 189Before running :iscman:`dnssec-signzone`, ensure that the delegations 190are up-to-date by running :program:`dnssec-cds` on every ``dsset-`` file. 191 192To fetch the child records required by :program:`dnssec-cds`, invoke 193:iscman:`dig` as in the script below. It is acceptable if the :iscman:`dig` fails, since 194:program:`dnssec-cds` performs all the necessary checking. 195 196:: 197 198 for f in dsset-* 199 do 200 d=${f#dsset-} 201 dig +dnssec +noall +answer $d DNSKEY $d CDNSKEY $d CDS | 202 dnssec-cds -i -f /dev/stdin -d $f $d 203 done 204 205When the parent zone is automatically signed by :iscman:`named`, 206:program:`dnssec-cds` can be used with :iscman:`nsupdate` to maintain a delegation as follows. 207The ``dsset-`` file allows the script to avoid having to fetch and 208validate the parent DS records, and it maintains the replay attack 209protection time. 210 211:: 212 213 dig +dnssec +noall +answer $d DNSKEY $d CDNSKEY $d CDS | 214 dnssec-cds -u -i -f /dev/stdin -d $f $d | 215 nsupdate -l 216 217See Also 218~~~~~~~~ 219 220:iscman:`dig(1) <dig>`, :iscman:`dnssec-settime(8) <dnssec-settime>`, :iscman:`dnssec-signzone(8) <dnssec-signzone>`, :iscman:`nsupdate(1) <nsupdate>`, BIND 9 Administrator 221Reference Manual, :rfc:`7344`. 222