mirror of
https://gitlab.isc.org/isc-projects/bind9.git
synced 2025-04-18 09:44:09 +03:00
391 lines
14 KiB
Plaintext
391 lines
14 KiB
Plaintext
<!--
|
|
- Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
|
-
|
|
- This Source Code Form is subject to the terms of the Mozilla Public
|
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
-
|
|
- See the COPYRIGHT file distributed with this work for additional
|
|
- information regarding copyright ownership.
|
|
-->
|
|
|
|
<refentry xmlns:db="http://docbook.org/ns/docbook" version="5.0" xml:id="man.dnssec-cds">
|
|
<info>
|
|
<date>2017-10-02</date>
|
|
</info>
|
|
<refentryinfo>
|
|
<corpname>ISC</corpname>
|
|
<corpauthor>Internet Systems Consortium, Inc.</corpauthor>
|
|
<author>
|
|
<personname>Tony Finch</personname>
|
|
<email>dot@dotat.at</email>
|
|
<email>fanf2@cam.ac.uk</email>
|
|
<affiliation>Cambridge University Information Services</affiliation>
|
|
<personblurb></personblurb>
|
|
</author>
|
|
</refentryinfo>
|
|
|
|
<refmeta>
|
|
<refentrytitle><application>dnssec-cds</application></refentrytitle>
|
|
<manvolnum>8</manvolnum>
|
|
<refmiscinfo>BIND9</refmiscinfo>
|
|
</refmeta>
|
|
|
|
<refnamediv>
|
|
<refname><application>dnssec-cds</application></refname>
|
|
<refpurpose>change DS records for a child zone based on CDS/CDNSKEY</refpurpose>
|
|
</refnamediv>
|
|
|
|
<docinfo>
|
|
<copyright>
|
|
<year>2017</year>
|
|
<year>2018</year>
|
|
<year>2019</year>
|
|
<year>2020</year>
|
|
<holder>Internet Systems Consortium, Inc. ("ISC")</holder>
|
|
</copyright>
|
|
</docinfo>
|
|
|
|
<refsynopsisdiv>
|
|
<cmdsynopsis sepchar=" ">
|
|
<command>dnssec-cds</command>
|
|
<arg choice="opt" rep="repeat"><option>-a <replaceable class="parameter">alg</replaceable></option></arg>
|
|
<arg choice="opt" rep="norepeat"><option>-c <replaceable class="parameter">class</replaceable></option></arg>
|
|
<arg choice="opt" rep="norepeat"><option>-D</option></arg>
|
|
<arg choice="req" rep="norepeat"><option>-d <replaceable class="parameter">dsset-file</replaceable></option></arg>
|
|
<arg choice="req" rep="norepeat"><option>-f <replaceable class="parameter">child-file</replaceable></option></arg>
|
|
<arg choice="opt" rep="norepeat"><option>-i</option><arg choice="opt" rep="norepeat"><replaceable class="parameter">extension</replaceable></arg></arg>
|
|
<arg choice="opt" rep="norepeat"><option>-s <replaceable class="parameter">start-time</replaceable></option></arg>
|
|
<arg choice="opt" rep="norepeat"><option>-T <replaceable class="parameter">ttl</replaceable></option></arg>
|
|
<arg choice="opt" rep="norepeat"><option>-u</option></arg>
|
|
<arg choice="opt" rep="norepeat"><option>-v <replaceable class="parameter">level</replaceable></option></arg>
|
|
<arg choice="opt" rep="norepeat"><option>-V</option></arg>
|
|
<arg choice="req" rep="norepeat">domain</arg>
|
|
</cmdsynopsis>
|
|
</refsynopsisdiv>
|
|
|
|
<refsection><info><title>DESCRIPTION</title></info>
|
|
|
|
<para>
|
|
The <command>dnssec-cds</command> command changes DS records at
|
|
a delegation point based on CDS or CDNSKEY records published in
|
|
the child zone. If both CDS and CDNSKEY records are present in
|
|
the child zone, the CDS is preferred. This enables a child zone
|
|
to inform its parent of upcoming changes to its key-signing keys;
|
|
by polling periodically with <command>dnssec-cds</command>, the
|
|
parent can keep the DS records up to date and enable automatic
|
|
rolling of KSKs.
|
|
</para>
|
|
<para>
|
|
Two input files are required. The
|
|
<option>-f <replaceable class="parameter">child-file</replaceable></option>
|
|
option specifies a file containing the child's CDS and/or CDNSKEY
|
|
records, plus RRSIG and DNSKEY records so that they can be
|
|
authenticated. The
|
|
<option>-d <replaceable class="parameter">path</replaceable></option>
|
|
option specifies the location of a file containing the current DS
|
|
records. For example, this could be a <filename>dsset-</filename>
|
|
file generated by <command>dnssec-signzone</command>, or the output of
|
|
<command>dnssec-dsfromkey</command>, or the output of a previous
|
|
run of <command>dnssec-cds</command>.
|
|
</para>
|
|
<para>
|
|
The <command>dnssec-cds</command> command uses special DNSSEC
|
|
validation logic specified by RFC 7344. It requires that the CDS
|
|
and/or CDNSKEY records are validly signed by a key represented in the
|
|
existing DS records. This will typically be the pre-existing
|
|
key-signing key (KSK).
|
|
</para>
|
|
<para>
|
|
For protection against replay attacks, the signatures on the
|
|
child records must not be older than they were on a previous run
|
|
of <command>dnssec-cds</command>. This time is obtained from the
|
|
modification time of the <filename>dsset-</filename> file, or
|
|
from the <option>-s</option> option.
|
|
</para>
|
|
<para>
|
|
To protect against breaking the delegation,
|
|
<command>dnssec-cds</command> ensures that the DNSKEY RRset can be
|
|
verified by every key algorithm in the new DS RRset, and that the
|
|
same set of keys are covered by every DS digest type.
|
|
</para>
|
|
<para>
|
|
By default, replacement DS records are written to the standard
|
|
output; with the <option>-i</option> option the input file is
|
|
overwritten in place. The replacement DS records will be the
|
|
same as the existing records when no change is required. The
|
|
output can be empty if the CDS / CDNSKEY records specify that
|
|
the child zone wants to go insecure.
|
|
</para>
|
|
<para>
|
|
Warning: Be careful not to delete the DS records
|
|
when <command>dnssec-cds</command> fails!
|
|
</para>
|
|
<para>
|
|
Alternatively, <command>dnssec-cds -u</command> writes
|
|
an <command>nsupdate</command> script to the standard output.
|
|
You can use the <option>-u</option> and <option>-i</option>
|
|
options together to maintain a <filename>dsset-</filename> file
|
|
as well as emit an <command>nsupdate</command> script.
|
|
</para>
|
|
|
|
</refsection>
|
|
|
|
<refsection><info><title>OPTIONS</title></info>
|
|
|
|
<variablelist>
|
|
|
|
<varlistentry>
|
|
<term>-a <replaceable class="parameter">algorithm</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Specify a digest algorithm to use when converting CDNSKEY
|
|
records to DS records. This option can be repeated, so
|
|
that multiple DS records are created for each CDNSKEY
|
|
record. This option has no effect when using CDS records.
|
|
</para>
|
|
<para>
|
|
The <replaceable>algorithm</replaceable> must be one of
|
|
SHA-1, SHA-256, or SHA-384. These values are case insensitive,
|
|
and the hyphen may be omitted. If no algorithm is specified,
|
|
the default is SHA-256.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-c <replaceable class="parameter">class</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Specifies the DNS class of the zones.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-D</term>
|
|
<listitem>
|
|
<para>
|
|
Generate DS records from CDNSKEY records if both CDS and
|
|
CDNSKEY records are present in the child zone. By default
|
|
CDS records are preferred.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-d <replaceable class="parameter">path</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Location of the parent DS records.
|
|
The <replaceable>path</replaceable> can be the name of a file
|
|
containing the DS records, or if it is a
|
|
directory, <command>dnssec-cds</command> looks for
|
|
a <filename>dsset-</filename> file for
|
|
the <replaceable>domain</replaceable> inside the directory.
|
|
</para>
|
|
<para>
|
|
To protect against replay attacks, child records are
|
|
rejected if they were signed earlier than the modification
|
|
time of the <filename>dsset-</filename> file. This can be
|
|
adjusted with the <option>-s</option> option.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-f <replaceable class="parameter">child-file</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
File containing the child's CDS and/or CDNSKEY records,
|
|
plus its DNSKEY records and the covering RRSIG records so
|
|
that they can be authenticated.
|
|
</para>
|
|
<para>
|
|
The EXAMPLES below describe how to generate this file.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-i<arg choice="opt" rep="norepeat"><replaceable class="parameter">extension</replaceable></arg></term>
|
|
<listitem>
|
|
<para>
|
|
Update the <filename>dsset-</filename> file in place,
|
|
instead of writing DS records to the standard output.
|
|
</para>
|
|
<para>
|
|
There must be no space between the <option>-i</option> and
|
|
the <replaceable>extension</replaceable>. If you provide
|
|
no <replaceable>extension</replaceable> then the
|
|
old <filename>dsset-</filename> is discarded. If
|
|
an <replaceable>extension</replaceable> is present, a
|
|
backup of the old <filename>dsset-</filename> file is kept
|
|
with the <replaceable>extension</replaceable> appended to
|
|
its filename.
|
|
</para>
|
|
<para>
|
|
To protect against replay attacks, the modification time
|
|
of the <filename>dsset-</filename> file is set to match
|
|
the signature inception time of the child records,
|
|
provided that is later than the file's current
|
|
modification time.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-s <replaceable class="parameter">start-time</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Specify the date and time after which RRSIG records become
|
|
acceptable. This can be either an absolute or relative
|
|
time. An absolute start time is indicated by a number in
|
|
YYYYMMDDHHMMSS notation; 20170827133700 denotes 13:37:00
|
|
UTC on August 27th, 2017. A time relative to
|
|
the <filename>dsset-</filename> file is indicated with -N,
|
|
which is N seconds before the file modification time. A
|
|
time relative to the current time is indicated with now+N.
|
|
</para>
|
|
<para>
|
|
If no <replaceable>start-time</replaceable> is specified, the
|
|
modification time of the <filename>dsset-</filename> file
|
|
is used.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-T <replaceable class="parameter">ttl</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Specifies a TTL to be used for new DS records. If not
|
|
specified, the default is the TTL of the old DS records.
|
|
If they had no explicit TTL then the new DS records also
|
|
have no explicit TTL.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-u</term>
|
|
<listitem>
|
|
<para>
|
|
Write an <command>nsupdate</command> script to the
|
|
standard output, instead of printing the new DS reords.
|
|
The output will be empty if no change is needed.
|
|
</para>
|
|
<para>
|
|
Note: The TTL of new records needs to be specified, either
|
|
in the original <filename>dsset-</filename> file, or with
|
|
the <option>-T</option> option, or using
|
|
the <command>nsupdate</command> <command>ttl</command>
|
|
command.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-V</term>
|
|
<listitem>
|
|
<para>
|
|
Print version information.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>-v <replaceable class="parameter">level</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
Sets the debugging level. Level 1 is intended to be
|
|
usefully verbose for general users; higher levels are
|
|
intended for developers.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term><replaceable>domain</replaceable></term>
|
|
<listitem>
|
|
<para>
|
|
The name of the delegation point / child zone apex.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
</variablelist>
|
|
</refsection>
|
|
|
|
<refsection><info><title>EXIT STATUS</title></info>
|
|
|
|
<para>
|
|
The <command>dnssec-cds</command> command exits 0 on success, or
|
|
non-zero if an error occurred.
|
|
</para>
|
|
<para>
|
|
In the success case, the DS records might or might not need
|
|
to be changed.
|
|
</para>
|
|
|
|
</refsection>
|
|
|
|
<refsection><info><title>EXAMPLES</title></info>
|
|
|
|
<para>
|
|
Before running <command>dnssec-signzone</command>, you can ensure
|
|
that the delegations are up-to-date by running
|
|
<command>dnssec-cds</command> on every <filename>dsset-</filename> file.
|
|
</para>
|
|
<para>
|
|
To fetch the child records required by <command>dnssec-cds</command>
|
|
you can invoke <command>dig</command> as in the script below. It's
|
|
okay if the <command>dig</command> fails since
|
|
<command>dnssec-cds</command> performs all the necessary checking.
|
|
</para>
|
|
<programlisting>for f in dsset-*
|
|
do
|
|
d=${f#dsset-}
|
|
dig +dnssec +noall +answer $d DNSKEY $d CDNSKEY $d CDS |
|
|
dnssec-cds -i -f /dev/stdin -d $f $d
|
|
done
|
|
</programlisting>
|
|
|
|
<para>
|
|
When the parent zone is automatically signed by
|
|
<command>named</command>, you can use <command>dnssec-cds</command>
|
|
with <command>nsupdate</command> to maintain a delegation as follows.
|
|
The <filename>dsset-</filename> file allows the script to avoid
|
|
having to fetch and validate the parent DS records, and it keeps the
|
|
replay attack protection time.
|
|
</para>
|
|
<programlisting>
|
|
dig +dnssec +noall +answer $d DNSKEY $d CDNSKEY $d CDS |
|
|
dnssec-cds -u -i -f /dev/stdin -d $f $d |
|
|
nsupdate -l
|
|
</programlisting>
|
|
</refsection>
|
|
|
|
<refsection><info><title>SEE ALSO</title></info>
|
|
|
|
<para>
|
|
<citerefentry>
|
|
<refentrytitle>dig</refentrytitle><manvolnum>1</manvolnum>
|
|
</citerefentry>,
|
|
<citerefentry>
|
|
<refentrytitle>dnssec-settime</refentrytitle><manvolnum>8</manvolnum>
|
|
</citerefentry>,
|
|
<citerefentry>
|
|
<refentrytitle>dnssec-signzone</refentrytitle><manvolnum>8</manvolnum>
|
|
</citerefentry>,
|
|
<citerefentry>
|
|
<refentrytitle>nsupdate</refentrytitle><manvolnum>1</manvolnum>
|
|
</citerefentry>,
|
|
<citetitle>BIND 9 Administrator Reference Manual</citetitle>,
|
|
<citetitle>RFC 7344</citetitle>.
|
|
</para>
|
|
|
|
</refsection>
|
|
|
|
</refentry>
|