diff --git a/src/dnssec/lib/event/action/zsk_rollover.c b/src/dnssec/lib/event/action/zsk_rollover.c index 5db4348dd9f00d4935af57caf8d9d6ef79ec672f..598e29f2c95e005b536a8e8b56bb5dabd740955b 100644 --- a/src/dnssec/lib/event/action/zsk_rollover.c +++ b/src/dnssec/lib/event/action/zsk_rollover.c @@ -217,6 +217,11 @@ static int exec_remove_old_key(dnssec_event_ctx_t *ctx) if (dnssec_keyusage_is_used(keyusage, retired->id)) { dnssec_keyusage_free(keyusage); free(path); + + dnssec_key_free(retired->key); + free(retired->id); + free(retired); + return dnssec_kasp_zone_save(ctx->kasp, ctx->zone); } dnssec_keyusage_free(keyusage); @@ -224,6 +229,10 @@ static int exec_remove_old_key(dnssec_event_ctx_t *ctx) dnssec_keystore_remove_key(ctx->keystore, retired->id); + dnssec_key_free(retired->key); + free(retired->id); + free(retired); + return dnssec_kasp_zone_save(ctx->kasp, ctx->zone); } diff --git a/tests-extra/tests/dnssec/keyusage/data/keys/keys/712d0d0d57fa0aa006b5e20cd84e23941e5f3ab2.pem b/tests-extra/tests/dnssec/keyusage/data/keys/keys/712d0d0d57fa0aa006b5e20cd84e23941e5f3ab2.pem new file mode 100644 index 0000000000000000000000000000000000000000..c5876ae5bb5f72e075c236e0a4ad67288715ab15 --- /dev/null +++ b/tests-extra/tests/dnssec/keyusage/data/keys/keys/712d0d0d57fa0aa006b5e20cd84e23941e5f3ab2.pem @@ -0,0 +1,10 @@ +-----BEGIN PRIVATE KEY----- +MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAybrKa545nAsfsu9m +RYuyTg0WmUquP2MIwHCCRFHBTX7x9oxuj78yXtCZghZjm+GSl698kMBwm0V/2JbG +pApgDwIDAQABAkB1bfzDZNnYUkljmiSIu2dSNCBBn82LLJU9oMDUEFtcRk7gdyS2 +taDBh6eCZVUsGErDg4kCHIQdrFjD0MuouXIBAiEA6NqaRS0mkuHiO2J+4XTCRzMV +w3Bu+K88BfqFIkDQKoECIQDdyCx66rvJ8YApy7Tt86hM/chNjFg+j4ZknxM3RF2i +jwIgFmJNSjEY8C2+ra6+O7YZpvaGNQ9t24Ic5wY6HhzU5gECIQDRcLIguf/xa3E/ +BzKr7Agp/Rfls/25xsyBxX/eF1/dnQIhAI+z7XQNd/cZUD1TwdziKBuWBDcYp/qH +DmKe/7Xh+MZJ +-----END PRIVATE KEY----- diff --git a/tests-extra/tests/dnssec/keyusage/data/keys/keys/7a3500c7feac3fd99f09a208a83b97f7455fa3e0.pem b/tests-extra/tests/dnssec/keyusage/data/keys/keys/7a3500c7feac3fd99f09a208a83b97f7455fa3e0.pem new file mode 100644 index 0000000000000000000000000000000000000000..76d5e2f63f6bfc0d2260672635fdbb164e68c21a --- /dev/null +++ b/tests-extra/tests/dnssec/keyusage/data/keys/keys/7a3500c7feac3fd99f09a208a83b97f7455fa3e0.pem @@ -0,0 +1,10 @@ +-----BEGIN PRIVATE KEY----- +MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAu9eosHX/Ag8J0r71 +lT9tzQeWbEZRAOZY8w+zC4hqTvtAZeE9SsB+ppoNM8bvdaxLVQNIIKKqOxsteOZY +xMFicQIDAQABAkEAtXq84oeNsRqAXhjaQbB/T8gV31PsLNdfdq1jSTAprVVOmHSk +CfKq30FOdIXnlLum2kypxejpdHGocI1rqZLzBQIhAOoPNuh/k3NeEau2VZt9dENN +JL4ByVpMG2gMjiucHl57AiEAzXNc16CmvEfQ/i3JhEhbb1I8o7QGsOk9v8MP/DEz +pQMCIF8EcCjwaX6DKK9JpPUrd8A+l/TeqswSa2nQ9wIzLYzzAiEAzBl4+DV+rrjh +pEE0WpfPTe3yk+Z6ZzGuyFwt+ymd1qUCIBzE561e4uE5tyPB46ybM/029/GFa89z +0D1ZBKVF7AWi +-----END PRIVATE KEY----- diff --git a/tests-extra/tests/dnssec/keyusage/data/keys/keys/f3b8db9d60fb412d0363dd0c0ac2ea72dc212777.pem b/tests-extra/tests/dnssec/keyusage/data/keys/keys/f3b8db9d60fb412d0363dd0c0ac2ea72dc212777.pem new file mode 100644 index 0000000000000000000000000000000000000000..9dd9a5d61e2a4d80ecb394414150df7f615830e3 --- /dev/null +++ b/tests-extra/tests/dnssec/keyusage/data/keys/keys/f3b8db9d60fb412d0363dd0c0ac2ea72dc212777.pem @@ -0,0 +1,10 @@ +-----BEGIN PRIVATE KEY----- +MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAoQok0evOsKK3EI3P +JrUUyheN9zAQUYQtrVK8kUdgyqy+RoW2mSMG8aw5/bjbreU/+wg0O1xmps9ndn9U +cz+PewIDAQABAkAyHD7y12acjjVawFXKXKSYchXp6hnZ08CG42zr5AMZbYLkhhN5 +9OWULkZ0dLrwOOw/ruhQSpOc9kjrWge2yLpZAiEA0gsSz0cU8A0xQ88aQbHOi3eZ +EXvtoj0LecrbIy+ACI8CIQDERkhiroFvauc2rAMsfsVECmFjzyacpmYxts1KjKPI +VQIhAMBICNkdzkoPGalkvzmip10/iC3cUGd0ELxW+xMT2dZ7AiEAqGnOLq6h7aKD +JsxOJN3aEln92xCihwPY6It8d51Z48kCIGHjbq6UmCZUrhOSHm1Xm8m80XA662aR +w+ZLnqtUjM4N +-----END PRIVATE KEY----- diff --git a/tests-extra/tests/dnssec/keyusage/data/keys/keyusage.json b/tests-extra/tests/dnssec/keyusage/data/keys/keyusage.json new file mode 100644 index 0000000000000000000000000000000000000000..d7ba1b05561b035c4c751f71116366ffd712539a --- /dev/null +++ b/tests-extra/tests/dnssec/keyusage/data/keys/keyusage.json @@ -0,0 +1,14 @@ +[ + { + "key_id": "f3b8db9d60fb412d0363dd0c0ac2ea72dc212777", + "zones": [ + "example.com", "records" + ] + }, + { + "key_id": "712d0d0d57fa0aa006b5e20cd84e23941e5f3ab2", + "zones": [ + "example.com", "records" + ] + } +] diff --git a/tests-extra/tests/dnssec/keyusage/data/keys/zone_example.com.json b/tests-extra/tests/dnssec/keyusage/data/keys/zone_example.com.json new file mode 100644 index 0000000000000000000000000000000000000000..b4877814d31fc5d7bb42f946e2c4abe1a82c485b --- /dev/null +++ b/tests-extra/tests/dnssec/keyusage/data/keys/zone_example.com.json @@ -0,0 +1,31 @@ +{ + "keys": [ + { + "id": "7a3500c7feac3fd99f09a208a83b97f7455fa3e0", + "keytag": 58041, + "algorithm": 7, + "public_key": "AwEAAbvXqLB1/wIPCdK+9ZU/bc0HlmxGUQDmWPMPswuIak77QGXhPUrAfqaaDTPG73WsS1UDSCCiqjsbLXjmWMTBYnE=", + "ksk": true, + "publish": "1970-01-01T00:00:01+0000", + "active": "1970-01-01T00:00:01+0000" + }, + { + "id": "f3b8db9d60fb412d0363dd0c0ac2ea72dc212777", + "keytag": 29654, + "algorithm": 7, + "public_key": "AwEAAaEKJNHrzrCitxCNzya1FMoXjfcwEFGELa1SvJFHYMqsvkaFtpkjBvGsOf24263lP/sINDtcZqbPZ3Z/VHM/j3s=", + "ksk": false, + "publish": "1970-01-01T00:00:01+0000", + "active": "1970-01-01T00:00:01+0000" + }, + { + "id": "712d0d0d57fa0aa006b5e20cd84e23941e5f3ab2", + "keytag": 55574, + "algorithm": 7, + "public_key": "AwEAAcm6ymueOZwLH7LvZkWLsk4NFplKrj9jCMBwgkRRwU1+8faMbo+/Ml7QmYIWY5vhkpevfJDAcJtFf9iWxqQKYA8=", + "ksk": false, + "publish": "2040-01-01T00:00:00+0000", + "active": "2040-01-01T00:00:00+0000" + } + ] +} diff --git a/tests-extra/tests/dnssec/keyusage/data/keys/zone_records.json b/tests-extra/tests/dnssec/keyusage/data/keys/zone_records.json new file mode 100644 index 0000000000000000000000000000000000000000..b4877814d31fc5d7bb42f946e2c4abe1a82c485b --- /dev/null +++ b/tests-extra/tests/dnssec/keyusage/data/keys/zone_records.json @@ -0,0 +1,31 @@ +{ + "keys": [ + { + "id": "7a3500c7feac3fd99f09a208a83b97f7455fa3e0", + "keytag": 58041, + "algorithm": 7, + "public_key": "AwEAAbvXqLB1/wIPCdK+9ZU/bc0HlmxGUQDmWPMPswuIak77QGXhPUrAfqaaDTPG73WsS1UDSCCiqjsbLXjmWMTBYnE=", + "ksk": true, + "publish": "1970-01-01T00:00:01+0000", + "active": "1970-01-01T00:00:01+0000" + }, + { + "id": "f3b8db9d60fb412d0363dd0c0ac2ea72dc212777", + "keytag": 29654, + "algorithm": 7, + "public_key": "AwEAAaEKJNHrzrCitxCNzya1FMoXjfcwEFGELa1SvJFHYMqsvkaFtpkjBvGsOf24263lP/sINDtcZqbPZ3Z/VHM/j3s=", + "ksk": false, + "publish": "1970-01-01T00:00:01+0000", + "active": "1970-01-01T00:00:01+0000" + }, + { + "id": "712d0d0d57fa0aa006b5e20cd84e23941e5f3ab2", + "keytag": 55574, + "algorithm": 7, + "public_key": "AwEAAcm6ymueOZwLH7LvZkWLsk4NFplKrj9jCMBwgkRRwU1+8faMbo+/Ml7QmYIWY5vhkpevfJDAcJtFf9iWxqQKYA8=", + "ksk": false, + "publish": "2040-01-01T00:00:00+0000", + "active": "2040-01-01T00:00:00+0000" + } + ] +} diff --git a/tests-extra/tests/dnssec/keyusage/test.py b/tests-extra/tests/dnssec/keyusage/test.py new file mode 100644 index 0000000000000000000000000000000000000000..47f72ebe360f030679b37139607c3cccc3c328c7 --- /dev/null +++ b/tests-extra/tests/dnssec/keyusage/test.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 + +'''Check if dnssec keys in use are protected from being removed automatically.''' + +import collections +import os +import shutil +import datetime +import time +import subprocess + +from dnstest.utils import * +from dnstest.keys import Keymgr +from dnstest.test import Test + +def key_set(server, zone, key_id, **new_values): + cmd = ["zone", "key", "set", zone, key_id] + for option, value in new_values.items(): + cmd += [option, value] + Keymgr.run_check(server.keydir, *cmd) + +t = Test() + +knot = t.server("knot") +zone1 = t.zone("example.com.") +zone2 = t.zone("records.") +zones = zone1 + zone2; +t.link(zones, knot) + +shutil.copytree(os.path.join(t.data_dir, "keys"), knot.keydir) + +# policy parameters +key_ttl = 10 +zone1_delay = 0 +zone2_delay = 10 +# policy +knot.dnssec(zone1).enable = True +knot.dnssec(zone2).enable = True +knot.dnssec(zone1).dnskey_ttl = key_ttl +knot.dnssec(zone2).dnskey_ttl = key_ttl +knot.dnssec(zone1).zsk_lifetime = 10 +knot.dnssec(zone2).zsk_lifetime = 10 +knot.dnssec(zone1).propagation_delay = zone1_delay +knot.dnssec(zone2).propagation_delay = zone2_delay +knot.dnssec(zone1).rrsig_lifetime = 10 +knot.dnssec(zone2).rrsig_lifetime = 10 +knot.dnssec(zone1).rrsig_refresh = 5 +knot.dnssec(zone2).rrsig_refresh = 5 +knot.dnssec(zone1).alg = "rsasha1-nsec3-sha1" +knot.dnssec(zone2).alg = "rsasha1-nsec3-sha1" + +# parameters +zonename1 = zone1[0].name +zonename2 = zone2[0].name + +KSK = "7a3500c7feac3fd99f09a208a83b97f7455fa3e0" +ACTIVE = "f3b8db9d60fb412d0363dd0c0ac2ea72dc212777" +PUBLISHED = "712d0d0d57fa0aa006b5e20cd84e23941e5f3ab2" + +time = str(round(time.time()) - 10) + +#ksk +key_set(knot, zonename1, KSK, publish=time, active=time) +key_set(knot, zonename2, KSK, publish=time, active=time) +#zsk - active +key_set(knot, zonename1, ACTIVE, publish=time, active=time) +key_set(knot, zonename2, ACTIVE, publish=time, active=time) +#zsk - published +key_set(knot, zonename1, PUBLISHED, publish=time) +key_set(knot, zonename2, PUBLISHED, publish=time) + +# time to rollover - dnskey_ttl + propagation delay +zone1_time = key_ttl + zone1_delay +zone2_time = key_ttl + zone2_delay - zone1_time + +t.start() +t.sleep(zone1_time) +# Key is used by ZONE2 - was key deleted? +if not os.path.exists(os.path.join(knot.keydir, 'keys', ACTIVE + ".pem")): + set_err("MISSING KEY") + check_log("ERROR: Key in use deleted") + +if not os.path.exists(os.path.join(knot.keydir, 'keys', PUBLISHED + ".pem")): + set_err("NEXT KEY") + check_log("ERROR: Published key was deleted") + +t.sleep(zone2_time) +# key is not used anymore - was key deleted? +if os.path.exists(os.path.join(knot.keydir, 'keys', ACTIVE + ".pem")): + set_err("REDUNDANT KEY") + check_log("ERROR: Retired key was not deleted") + +if not os.path.exists(os.path.join(knot.keydir, 'keys', PUBLISHED + ".pem")): + set_err("NEXT KEY") + check_log("ERROR: Published key was deleted") + +t.end() diff --git a/tests-extra/tools/dnstest/server.py b/tests-extra/tools/dnstest/server.py index 2d155ad43842f2a0fc91b46911d9290c4f8f50ce..980be14ce098ad3c6dcac7a49d7b006f51781ea2 100644 --- a/tests-extra/tools/dnstest/server.py +++ b/tests-extra/tools/dnstest/server.py @@ -41,12 +41,15 @@ class ZoneDnssec(object): self.alg = None self.ksk_size = None self.zsk_size = None + self.dnskey_ttl = None + self.zsk_lifetime = None + self.propagation_delay = None + self.rrsig_lifetime = None + self.rrsig_refresh = None self.nsec3 = None self.nsec3_iters = None self.nsec3_salt_lifetime = None self.nsec3_salt_len = None - self.rrsig_lifetime = None - self.rrsig_refresh = None class Zone(object): '''DNS zone description''' @@ -1042,12 +1045,15 @@ class Knot(Server): self._str(s, "algorithm", z.dnssec.alg) self._str(s, "ksk_size", z.dnssec.ksk_size) self._str(s, "zsk_size", z.dnssec.zsk_size) + self._str(s, "dnskey-ttl", z.dnssec.dnskey_ttl) + self._str(s, "zsk-lifetime", z.dnssec.zsk_lifetime) + self._str(s, "propagation-delay", z.dnssec.propagation_delay) + self._str(s, "rrsig-lifetime", z.dnssec.rrsig_lifetime) + self._str(s, "rrsig-refresh", z.dnssec.rrsig_refresh) self._bool(s, "nsec3", z.dnssec.nsec3) self._str(s, "nsec3-iterations", z.dnssec.nsec3_iters) self._str(s, "nsec3-salt-lifetime", z.dnssec.nsec3_salt_lifetime) self._str(s, "nsec3-salt-length", z.dnssec.nsec3_salt_len) - self._str(s, "rrsig-lifetime", z.dnssec.rrsig_lifetime) - self._str(s, "rrsig-refresh", z.dnssec.rrsig_refresh) s.end() s.begin("template")