2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-03 16:15:27 +00:00

Fix kasp bug new KSK on restart [#1593]

When you do a restart or reconfig of named, or rndc loadkeys, this
triggers the key manager to run.  The key manager will check if new
keys need to be created. If there is an active key, and key rollover
is scheduled far enough away, no new key needs to be created.

However, there was a bug that when you just start to sign your zone,
it takes a while before the KSK becomes an active key. An active KSK
has its DS submitted or published, but before the key manager allows
that, the DNSKEY needs to be omnipresent. If you restart named
or rndc loadkeys in quick succession when you just started to sign
your zone, new keys will be created because the KSK is not yet
considered active.

Fix is to check for introducing as well as active keys. These keys
all have in common that their goal is to become omnipresent.
This commit is contained in:
Matthijs Mekking
2020-02-06 08:57:13 +01:00
parent a787bc0b14
commit b378d0371f
8 changed files with 65 additions and 3 deletions

View File

@@ -1,3 +1,9 @@
5354. [bug] dnssec-policy created new KSK keys when zone is in
initial stage of signing (the DS is not yet in
rumoured or omnipresent state). Fix by checking
key goals rather than active state when determining
new keys are needed. [GL #1593]
5353. [doc] Document port and dscp parameters in forwarders 5353. [doc] Document port and dscp parameters in forwarders
configuration option. [GL !914] configuration option. [GL !914]

View File

@@ -107,6 +107,16 @@ zone "pregenerated.kasp" {
dnssec-policy "rsasha1"; dnssec-policy "rsasha1";
}; };
/*
* A configured dnssec-policy with one rumoured key.
* Bugfix case for GL #1593.
*/
zone "rumoured.kasp" {
type master;
file "rumoured.kasp.db";
dnssec-policy "rsasha1";
};
/* /*
* Different algorithms. * Different algorithms.
*/ */

View File

@@ -43,7 +43,7 @@ U="UNRETENTIVE"
# Set up zones that will be initially signed. # Set up zones that will be initially signed.
# #
for zn in default rsasha1 dnssec-keygen some-keys legacy-keys pregenerated \ for zn in default rsasha1 dnssec-keygen some-keys legacy-keys pregenerated \
rsasha1-nsec3 rsasha256 rsasha512 ecdsa256 ecdsa384 inherit rumoured rsasha1-nsec3 rsasha256 rsasha512 ecdsa256 ecdsa384 inherit
do do
setup "${zn}.kasp" setup "${zn}.kasp"
cp template.db.in "$zonefile" cp template.db.in "$zonefile"
@@ -72,6 +72,16 @@ zone="pregenerated.kasp"
$KEYGEN -k rsasha1 -l policies/kasp.conf $zone > keygen.out.$zone.1 2>&1 $KEYGEN -k rsasha1 -l policies/kasp.conf $zone > keygen.out.$zone.1 2>&1
$KEYGEN -k rsasha1 -l policies/kasp.conf $zone > keygen.out.$zone.2 2>&1 $KEYGEN -k rsasha1 -l policies/kasp.conf $zone > keygen.out.$zone.2 2>&1
zone="rumoured.kasp"
Tpub="now"
Tact="now+1d"
KSK=$($KEYGEN -a RSASHA1 -f KSK -L 1234 $zone 2> keygen.out.$zone.1)
ZSK1=$($KEYGEN -a RSASHA1 -b 2000 -L 1234 $zone 2> keygen.out.$zone.2)
ZSK2=$($KEYGEN -a RSASHA1 -L 1234 $zone 2> keygen.out.$zone.3)
$SETTIME -s -P $Tpub -A $Tact -g $O -k $R $Tpub -r $R $Tpub -d $H $Tpub "$KSK" > settime.out.$zone.1 2>&1
$SETTIME -s -P $Tpub -A $Tact -g $O -k $R $Tpub -z $R $Tpub "$ZSK1" > settime.out.$zone.2 2>&1
$SETTIME -s -P $Tpub -A $Tact -g $O -k $R $Tpub -z $R $Tpub "$ZSK2" > settime.out.$zone.2 2>&1
# #
# Set up zones that are already signed. # Set up zones that are already signed.
# #

View File

@@ -1056,6 +1056,17 @@ check_apex
check_subdomain check_subdomain
dnssec_verify dnssec_verify
#
# Zone: rumoured.kasp.
#
# There are three keys in rumoured state.
zone_properties "ns3" "rumoured.kasp" "rsasha1" "1234" "3" "10.53.0.3"
# key_properties, key_timings and key_states same as above.
check_keys
check_apex
check_subdomain
dnssec_verify
# #
# Zone: secondary.kasp. # Zone: secondary.kasp.
# #

View File

@@ -2468,7 +2468,6 @@ dst_key_is_active(dst_key_t *key, isc_stdtime_t now)
return ds_ok && zrrsig_ok && time_ok && !inactive; return ds_ok && zrrsig_ok && time_ok && !inactive;
} }
bool bool
dst_key_is_signing(dst_key_t *key, int role, isc_stdtime_t now, isc_stdtime_t *active) dst_key_is_signing(dst_key_t *key, int role, isc_stdtime_t now, isc_stdtime_t *active)
{ {
@@ -2582,6 +2581,19 @@ dst_key_is_removed(dst_key_t *key, isc_stdtime_t now, isc_stdtime_t *remove)
return state_ok && time_ok; return state_ok && time_ok;
} }
dst_key_state_t
dst_key_goal(dst_key_t *key)
{
dst_key_state_t state;
isc_result_t result;
result = dst_key_getstate(key, DST_KEY_GOAL, &state);
if (result == ISC_R_SUCCESS) {
return state;
}
return DST_KEY_STATE_HIDDEN;
}
void void
dst_key_copy_metadata(dst_key_t *to, dst_key_t *from) dst_key_copy_metadata(dst_key_t *to, dst_key_t *from)
{ {

View File

@@ -1166,6 +1166,18 @@ dst_key_is_removed(dst_key_t *key, isc_stdtime_t now, isc_stdtime_t *remove);
* 'key' to be valid. * 'key' to be valid.
*/ */
dst_key_state_t
dst_key_goal(dst_key_t *key);
/*%<
* Get the key goal. Should be OMNIPRESENT or HIDDEN.
* This can be used to determine if the key is being introduced or
* is on its way out.
*
* Requires:
* 'key' to be valid.
*/
void void
dst_key_copy_metadata(dst_key_t *to, dst_key_t *from); dst_key_copy_metadata(dst_key_t *to, dst_key_t *from);
/*%< /*%<

View File

@@ -1358,7 +1358,7 @@ dns_keymgr_run(const dns_name_t *origin, dns_rdataclass_t rdclass,
lifetime); lifetime);
} }
if (dst_key_is_active(dkey->key, now)) { if (dst_key_goal(dkey->key) == OMNIPRESENT) {
if (active_key != NULL) { if (active_key != NULL) {
/* /*
* Multiple signing keys match * Multiple signing keys match

View File

@@ -1432,6 +1432,7 @@ dst_key_getprivateformat
dst_key_getstate dst_key_getstate
dst_key_gettime dst_key_gettime
dst_key_getttl dst_key_getttl
dst_key_goal
dst_key_id dst_key_id
dst_key_is_active dst_key_is_active
dst_key_is_published dst_key_is_published