feat: add full Zonemaster stack with Docker and Spanish UI
- Clone all 5 Zonemaster component repos (LDNS, Engine, CLI, Backend, GUI) - Dockerfile.backend: 8-stage multi-stage build LDNS→Engine→CLI→Backend - Dockerfile.gui: Astro static build served via nginx - docker-compose.yml: backend (internal) + frontend (port 5353) - nginx.conf: root redirects to /es/, /api/ proxied to backend - zonemaster-gui/config.ts: defaultLanguage set to 'es' (Spanish) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
# DNSSEC Test Plan
|
||||
|
||||
These are the DNSSEC tests for a domain.
|
||||
|
||||
This document uses the terminology defined in the [Master Test Plan].
|
||||
|
||||
|
||||
## Default DNS query flags for all DNSSEC tests
|
||||
|
||||
* Transport: UDP
|
||||
* Bufsize: EDNS0 buffer size (512)
|
||||
* Flags -- query flags
|
||||
* do -- DNSSEC ok (1)
|
||||
* cd -- Checking Disabled (1)
|
||||
* rd -- Recursion Desired (0)
|
||||
* ad -- Authenticated Data (0)
|
||||
|
||||
See section 3.2 of [RFC 4035]
|
||||
for a description of the flags used by a recursive name server.
|
||||
|
||||
## Key, hash and signature algorithms
|
||||
|
||||
There are many algorithms defined for doing DNSSEC, not all of them are
|
||||
mandatory to implement. This test case should strive not only to implement
|
||||
all mandatory algorithms, but also most of those that are in use on the
|
||||
internet today as well.
|
||||
|
||||
If any algorithm in a DNSSEC record type is not recognized by the test
|
||||
system, the test system should emit a notice about this.
|
||||
|
||||
|
||||
[Master Test Plan]: ../MasterTestPlan.md
|
||||
[RFC 4035]: https://datatracker.ietf.org/doc/html/rfc4035#section-3.2
|
||||
[Test Case README]: ../README.md
|
||||
|
||||
<!-- Content until EOF generated by script updateTestPlanReadme.pl from Zonemaster/Zonemaster utils directory -->
|
||||
|
||||
## Test cases list
|
||||
|
||||
|Test Case |Test Case Description|
|
||||
|:---------|:--------------------|
|
||||
|[DNSSEC01](dnssec01.md)|Legal values for the DS hash digest algorithm|
|
||||
|[DNSSEC02](dnssec02.md)|DS must match a valid DNSKEY in the child zone|
|
||||
|[DNSSEC03](dnssec03.md)|Verify NSEC3 parameters|
|
||||
|[DNSSEC04](dnssec04.md)|Check for too short or too long RRSIG lifetimes|
|
||||
|[DNSSEC05](dnssec05.md)|Check for invalid DNSKEY algorithms|
|
||||
|[DNSSEC06](dnssec06.md)|Verify DNSSEC additional processing|
|
||||
|[DNSSEC07](dnssec07.md)|DNSSEC signed zone and DS in parent for signed zone|
|
||||
|[DNSSEC08](dnssec08.md)|Valid RRSIG for DNSKEY|
|
||||
|[DNSSEC09](dnssec09.md)|RRSIG(SOA) must be valid and created by a valid DNSKEY|
|
||||
|[DNSSEC10](dnssec10.md)|Zone contains NSEC or NSEC3 records|
|
||||
|[DNSSEC11](dnssec11.md)|DS in delegation requires signed zone|
|
||||
|[DNSSEC12](dnssec12.md)|Test for DNSSEC Algorithm Completeness|
|
||||
|[DNSSEC13](dnssec13.md)|All DNSKEY algorithms used to sign the zone|
|
||||
|[DNSSEC14](dnssec14.md)|Check for valid RSA DNSKEY key size|
|
||||
|[DNSSEC15](dnssec15.md)|Existence of CDS and CDNSKEY|
|
||||
|[DNSSEC16](dnssec16.md)|Validate CDS|
|
||||
|[DNSSEC17](dnssec17.md)|Validate CDNSKEY|
|
||||
|[DNSSEC18](dnssec18.md)|Validate trust from DS to CDS and CDNSKEY|
|
||||
@@ -0,0 +1,314 @@
|
||||
# DNSSEC01: Legal values for the DS hash digest algorithm
|
||||
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC01**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#objective)
|
||||
* [Scope](#scope)
|
||||
* [Classification of algorithms]
|
||||
* [Inputs](#inputs)
|
||||
* [Summary]
|
||||
* [Test procedure](#test-procedure)
|
||||
* [Outcome(s)](#outcomes)
|
||||
* [Special procedural requirements](#special-procedural-requirements)
|
||||
* [Intercase dependencies](#intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
A parent zone should only use digest algorithms for DS records that are
|
||||
specified by specified by [RFC 8624][RFC 8624#3.3], section 3.3 (including the
|
||||
update in [RFC 9157][RFC 9157#upd-8624]), and is published in the [IANA
|
||||
registry][IANA registry on DS Digest Algorithm] of *DS RR Type Digest
|
||||
Algorithms*. No DS Digest Algorithm values, other than those specified in the
|
||||
RFC and allocated by IANA, should be used in public DNS.
|
||||
|
||||
A DS record for a public domain name (zone) should not use private digestet
|
||||
algorithms.
|
||||
|
||||
Both [RFC 8624][RFC 8624#3.3] and [IANA registry][IANA registry on DS Digest
|
||||
Algorithm] recommends digest algorithm 2 (SHA-256) to be used, and if there is a
|
||||
DS record for a DNSKEY, but no DS record based on that digest algorithm, a
|
||||
message is outputted as a NOTICE.
|
||||
|
||||
|
||||
## Scope
|
||||
|
||||
This test case will query the name servers of the parent zone, and will just
|
||||
ignore non-responsive name servers or name servers not giving a correct DNS
|
||||
response for an authoritative name server, unless all such names servers fail in
|
||||
which case a message is outputted.
|
||||
|
||||
The RDATA of a DS record consists of four fields. The third field specifies the
|
||||
digest algorithm number of the data in the fourth field. This test case will
|
||||
only check what the algorithm is used by checking the third field. It will not
|
||||
verify that the key is matching the algorithm.
|
||||
|
||||
This test case does not report if the parent servers give inconsistent
|
||||
responses.
|
||||
|
||||
If the *Child Zone* is the root zone, then it has no parent zone, and no DS
|
||||
records can be fetch, but DS can be provided as *Undelegated DS*.
|
||||
|
||||
If *Undelegated DS* or *Undelegated NS* has been submitted, parent zone is not
|
||||
queried for DS. *Undelegated DS*, if any, is used instead.
|
||||
|
||||
|
||||
## Classification of algorithms
|
||||
|
||||
In the table below, the first two columns are copied from the [IANA
|
||||
registry][IANA registry on DS Digest Algorithm], where the complete IANA table
|
||||
can be found. The third column is for Zonemaster classification and it holds the
|
||||
the relevant message tags listed in the "[Summary]" section below.
|
||||
|
||||
The "Zonemaster classification" is based on the "Use for DNSSEC delegation" in
|
||||
the [IANA registry][IANA registry on DS Digest Algorithm] of *DS Digest
|
||||
Algorithms*.
|
||||
|
||||
| Algorithm number | Algorithm (or description) | Zonemaster classification |
|
||||
|:-----------------|:---------------------------|:--------------------------|
|
||||
| 0 | Reserved | DS01_DS_ALGO_NOT_DS |
|
||||
| 1 | SHA-1 | DS01_DS_ALGO_DEPRECATED |
|
||||
| 2 | SHA-256 | DS01_DS_ALGO_OK |
|
||||
| 3 | GOST R 34.11-94 | DS01_DS_ALGO_DEPRECATED |
|
||||
| 4 | SHA-384 | DS01_DS_ALGO_OK |
|
||||
| 5 | GOST R 34.11-2012 | DS01_DS_ALGO_OK |
|
||||
| 6 | SM3 | DS01_DS_ALGO_OK |
|
||||
| 7-127 | Unassigned | DS01_DS_ALGO_UNASSIGNED |
|
||||
| 128-252 | Reserved | DS01_DS_ALGO_RESERVED |
|
||||
| 253-254 | Reserved for Private Use | DS01_DS_ALGO_PRIVATE |
|
||||
| 255 | Unassigned | DS01_DS_ALGO_UNASSIGNED |
|
||||
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
* The table in section "[Classification of algorithms]" above.
|
||||
* "Undelegated DS" - The DS record or records submitted. Empty unless submitted.
|
||||
* "Undelegated Test" - TRUE if undelegated NS has been provided for the test.
|
||||
|
||||
## Summary
|
||||
|
||||
| Message Tag | Level | Arguments | Message ID for message tag |
|
||||
|:-------------------------|:--------|:--------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| DS01_DS_ALGO_2_MISSING | NOTICE | ns_list, keytag | There is a DS record with keytag {keytag}. A DS record using digest algorithm 2 (SHA-256) is missing. Fetched from parent name servers "{ns_list}". |
|
||||
| DS01_DS_ALGO_DEPRECATED | ERROR | ns_list, keytag, ds_algo_num, ds_algo_descr | The DS record with keytag {keytag} uses a deprecated digest algorithm {ds_algo_num} ({ds_algo_descr}). Fetched from parent name servers "{ns_list}". |
|
||||
| DS01_DS_ALGO_NOT_DS | ERROR | ns_list, keytag, ds_algo_num, ds_algo_descr | The DS record with keytag {keytag} uses a digest algorithm {ds_algo_num} ({ds_algo_descr}) not meant for DS records. Fetched from parent name servers "{ns_list}". |
|
||||
| DS01_DS_ALGO_OK | INFO | ns_list, keytag, ds_algo_num, ds_algo_descr | The DS record with keytag {keytag} uses digest algorithm {ds_algo_num} ({ds_algo_descr}), which is OK. Fetch from parent name servers "{ns_list}". |
|
||||
| DS01_DS_ALGO_PRIVATE | ERROR | ns_list, keytag, ds_algo_num | The DS record with keytag {keytag} uses a digest algorithm {ds_algo_num} for private use. Fetched from parent name servers "{ns_list}". |
|
||||
| DS01_DS_ALGO_RESERVED | ERROR | ns_list, keytag, ds_algo_num | The DS record with keytag {keytag} uses a reserved digest algorithm {ds_algo_num} on name servers "{ns_list}". |
|
||||
| DS01_DS_ALGO_UNASSIGNED | ERROR | ns_list, keytag, ds_algo_num | The DS record with keytag {keytag} uses an unassigned digest algorithm {ds_algo_num} on parent name servers "{ns_list}". |
|
||||
| DS01_NO_RESPONSE | WARNING | ns_list | No response or error in response from all parent name servers on the DS query. Name servers are "{ns_list}". |
|
||||
| DS01_PARENT_SERVER_NO_DS | ERROR | ns_list | The following name servers do not provide DS record or have not been properly configured. Fetched from parent name servers "{ns_list}". |
|
||||
| DS01_PARENT_ZONE_NO_DS | NOTICE | ns_list | The parent zone provides no DS records for the child zone. Fetched from parent name servers "{ns_list}". |
|
||||
| DS01_ROOT_N_NO_UNDEL_DS | INFO | | Tested zone is the root zone, but no undelegated DS has been provided. DS is not tested. |
|
||||
| DS01_UNDEL_N_NO_UNDEL_DS | INFO | | Tested zone is undelegated, but no undelegated DS has been provided. DS is not tested. |
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be changed in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
|
||||
## Test procedure
|
||||
|
||||
In this section and unless otherwise specified below, the term "[DNSSEC Query]"
|
||||
follows the specification for DNS queries as specified in
|
||||
[DNS Query and Response Defaults]. The handling of the DNS responses on the DNS
|
||||
queries follow, unless otherwise specified below, what is specified for
|
||||
[DNSSEC Response] in the same specification.
|
||||
|
||||
1. Create a [DNSSEC Query] with query type DS and query name *Child Zone*
|
||||
("DS Query").
|
||||
|
||||
2. Retrieve all name server names and IP addresses for the parent zone of
|
||||
*Child Zone* using method [Get-Parent-NS-Names-and-IPs]
|
||||
("Parent Name and IP"). If the method returns an empty list, then create
|
||||
*Parent Name and IP* as an empty set.
|
||||
|
||||
3. The name server names are assumed to be available at the time when a `msgid`
|
||||
listed above in [Summary] is created. If the argument name is "ns" or
|
||||
"ns_list" the name server name is extracted from *Parent Name and IP* even
|
||||
though it is only referred to the IP address of the name servers in the steps
|
||||
below. Furthermore, if there are more than one name server names for the same
|
||||
IP address, one entry is created for each name.
|
||||
|
||||
4. If the IP address below is represented as "-" it means that there is no IP
|
||||
address for that instance, and when a `msgid` listed above in [Summary] is
|
||||
created with an argument name "ns" or "ns_list" then that name server is
|
||||
entried as just "-".
|
||||
|
||||
5. Create the following empty sets:
|
||||
|
||||
1. Name server IP address ("Ignored Parent NS IP")
|
||||
2. Name server IP address ("Responds Without Valid DS")
|
||||
3. Name server IP address ("Responds With DS")
|
||||
4. Name server IP address and key tag ("Non-Algo 2 DS")
|
||||
5. Name server IP address and key tag ("Algo 2 DS")
|
||||
6. Name server IP address, key tag and digest algorithm code ("DS01_DS_ALGO_DEPRECATED")
|
||||
7. Name server IP address, key tag and digest algorithm code ("DS01_DS_ALGO_RESERVED")
|
||||
8. Name server IP address, key tag and digest algorithm code ("DS01_DS_ALGO_UNASSIGNED")
|
||||
9. Name server IP address, key tag and digest algorithm code ("DS01_DS_ALGO_PRIVATE")
|
||||
10. Name server IP address, key tag and digest algorithm code ("DS01_DS_ALGO_NOT_DS")
|
||||
11. Name server IP address, key tag and digest algorithm code ("DS01_DS_ALGO_OK")
|
||||
|
||||
6. If *Undelegated DS* is non-empty then do:
|
||||
|
||||
1. For each DS record in *Undelegated DS* do:
|
||||
1. Extract the digest algorithm code and key tag from the DS record.
|
||||
2. From section "[Classification of algorithms]" retrieve the table and
|
||||
extract the row matching the algorithm number.
|
||||
3. From the row extract the message tag from column "Zonemaster
|
||||
classification"
|
||||
4. Add name server IP as "-", key tag and the algorithm code to the set
|
||||
with the same name as the extracted message tag.
|
||||
5. If the digest algorithm code is 2 add IP address as "-" and the key tag
|
||||
to the *Algo 2 DS* set, else add IP address as "-" and the key tag to
|
||||
the *Non-Algo 2 DS* set.
|
||||
2. Add name server IP as "-" to the *Responds With DS* set.
|
||||
3. Make *Parent Name and IP* an empty set.
|
||||
|
||||
> Note: The *Parent Name and IP* set will be empty if *Undelegated test* is
|
||||
> TRUE, if *Undelegated DS* is non-empty or if *Child Zone* is ".", i.e. root
|
||||
> zone.
|
||||
|
||||
7. For each unique name server IP in the *Parent Name and IP* set do:
|
||||
1. Send *DS Query* to the name server IP.
|
||||
2. If at least one of the following criteria is met, then add name server IP
|
||||
to *Ignored Parent NS IP* and go to next parent name server:
|
||||
1. There is no [DNSSEC Response].
|
||||
2. The RCODE in the [DNSSEC Response] is not "NoError"
|
||||
([IANA RCODE List]).
|
||||
3. The OPT record is absent in the [DNSSEC Response].
|
||||
4. The DO flag is unset in the [DNSSEC Response].
|
||||
5. The AA flag is not set in the [DNSSEC Response].
|
||||
3. If there is no valid DS record with matching owner name in the answer
|
||||
section of the [DNSSEC Response], then do:
|
||||
1. Add name server IP to *Responds Without Valid DS*.
|
||||
2. Go to next parent name server.
|
||||
4. Add name server IP to the *Responds With DS* set.
|
||||
5. For each DS record in the answer section of the [DNSSEC Response] do:
|
||||
1. Extract the digest algorithm code and key tag from the DS record.
|
||||
2. From section "[Classification of algorithms]" retrieve the table and
|
||||
extract the row matching the algorithm number.
|
||||
3. From the row extract the message tag from column "Zonemaster
|
||||
classification"
|
||||
4. Add name server IP, key tag and the algorithm code to the set
|
||||
with the same name as the extracted message tag.
|
||||
5. If the digest algorithm code is 2 add IP address and the key tag to
|
||||
the *Algo 2 DS* set.
|
||||
6. Else, add IP address and the key tag to the *Non-Algo 2 DS* set.
|
||||
|
||||
8. For each of the sets matching each of the following message tags do if the set
|
||||
is non-empty:
|
||||
* For each combination of key tag and digest algorithm code do:
|
||||
* Output the message tag matching the set name with the list of name
|
||||
servers IP from the subset (key tag and code) plus the key tag, the
|
||||
algorithm number and algorithm description from the table in section
|
||||
"[Classification of algorithms]". Exclude the algorithm description if
|
||||
not listed for the tag in [Summary].
|
||||
* Sets:
|
||||
* *[DS01_DS_ALGO_DEPRECATED]*
|
||||
* *[DS01_DS_ALGO_RESERVED]*
|
||||
* *[DS01_DS_ALGO_UNASSIGNED]*
|
||||
* *[DS01_DS_ALGO_PRIVATE]*
|
||||
* *[DS01_DS_ALGO_NOT_DS]*
|
||||
* *[DS01_DS_ALGO_OK]*
|
||||
|
||||
9. If the *Non-Algo 2 DS* set is non-empty do:
|
||||
1. For each pair of IP address and key tag in the *Algo 2 DS* set remove the
|
||||
same pair from the *Non-Algo 2 DS* set.
|
||||
2. For each key tag from the *Non-Algo 2 DS* set extract all IP addresses for
|
||||
the key tag and output [DS01_DS_ALGO_2_MISSING] with key tag and the
|
||||
extracted list of IP addresses.
|
||||
|
||||
10. If the *Responds Without Valid DS* is empty, the *Responds With DS* set is
|
||||
empty and the *Ignored Parent NS IP* set is non-empty, then output
|
||||
*[DS01_NO_RESPONSE]* with the name server IP from the *Ignored Parent NS IP*
|
||||
set.
|
||||
|
||||
11. If *Child Zone* is "." (i.e. root zone) and *Undelegated DS* is empty then
|
||||
output *[DS01_ROOT_N_NO_UNDEL_DS]*.
|
||||
|
||||
12. If *Child Zone* is not ".", *Undelegated Test* is TRUE and *Undelegated DS*
|
||||
is empty then output *[DS01_UNDEL_N_NO_UNDEL_DS]*.
|
||||
|
||||
13. If the *Responds Without Valid DS* is non-empty then do:
|
||||
1. If the *Responds With DS* set is empty then output
|
||||
*[DS01_PARENT_ZONE_NO_DS]* with name server IP from the *Responds Without
|
||||
Valid DS* set.
|
||||
2. Else, output *[DS01_PARENT_SERVER_NO_DS]* with name server IP from the
|
||||
*Responds Without Valid DS* set.
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
on the ignored result.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
No special terminology for this test case.
|
||||
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[Classification of algorithms]: #classification-of-algorithms
|
||||
[DNS Query and Response Defaults]: ../DNSQueryAndResponseDefaults.md
|
||||
[DNSSEC Query]: ../DNSQueryAndResponseDefaults.md#default-setting-in-dnssec-query
|
||||
[DNSSEC README]: README.md
|
||||
[DNSSEC Response]: ../DNSQueryAndResponseDefaults.md#default-handling-of-a-dnssec-response
|
||||
[DS01_DS_ALGO_2_MISSING]: #summary
|
||||
[DS01_DS_ALGO_DEPRECATED]: #summary
|
||||
[DS01_DS_ALGO_NOT_DS]: #summary
|
||||
[DS01_DS_ALGO_OK]: #summary
|
||||
[DS01_DS_ALGO_PRIVATE]: #summary
|
||||
[DS01_DS_ALGO_RESERVED]: #summary
|
||||
[DS01_DS_ALGO_UNASSIGNED]: #summary
|
||||
[DS01_NO_RESPONSE]: #summary
|
||||
[DS01_PARENT_SERVER_NO_DS]: #summary
|
||||
[DS01_PARENT_ZONE_NO_DS]: #summary
|
||||
[DS01_ROOT_N_NO_UNDEL_DS]: #summary
|
||||
[DS01_UNDEL_N_NO_UNDEL_DS]: #summary
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[Get-Parent-NS-Names-and-IPs]: ../MethodsV2.md#method-get-parent-ns-names-and-ip-addresses
|
||||
[IANA RCODE List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[IANA registry on DS Digest Algorithm]: https://www.iana.org/assignments/ds-rr-types/ds-rr-types.xml
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 8624#3.3]: https://datatracker.ietf.org/doc/html/rfc8624#section-3.3
|
||||
[RFC 9157#upd-8624]: https://www.rfc-editor.org/rfc/rfc9157#name-update-to-rfc-8624
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[Summary]: #summary
|
||||
[Undelegated]: ../../test-types/undelegated-test.md
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
@@ -0,0 +1,309 @@
|
||||
# DNSSEC02: DS must match a valid DNSKEY in the child zone
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC02**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#objective)
|
||||
* [Scope](#scope)
|
||||
* [Inputs](#inputs)
|
||||
* [Summary](#summary)
|
||||
* [Test procedure](#test-procedure)
|
||||
* [Outcome(s)](#outcomes)
|
||||
* [Special procedural requirements](#special-procedural-requirements)
|
||||
* [Intercase dependencies](#intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
DNS delegations from a parent to a child are secured with DNSSEC by
|
||||
publishing one or several Delegation Signer (DS) records in the parent
|
||||
zone, along with the NS records for the delegation.
|
||||
|
||||
For the secure delegation to work, at least one DS record must match a
|
||||
DNSKEY record in the child zone ([RFC 4035][RFC 4035#section-5], section 5).
|
||||
Each DS record should match a DNSKEY record in the child zone. More
|
||||
than one DS may match the same DNSKEY. The DNSKEY that the DS record
|
||||
refer to must be used to sign the DNSKEY RRset in the child zone
|
||||
([RFC 4035][RFC 4035#section-5], section 5).
|
||||
|
||||
The DNSKEY record that the DS record refer to must have bit 7
|
||||
("Zone Key flag") set in the DNSKEY RR Flags ([RFC 4034][RFC 4034#section-5.2],
|
||||
section 5.2).
|
||||
|
||||
Bit 15 ("Secure Entry Point flag") on a DNSKEY record signals that it
|
||||
is meant to be a KSK and pointed out by a DS record. It is noted if
|
||||
the DNSKEY record that the DS points at does not have that flag set
|
||||
([RFC 4034][RFC 4034#section-2.1.1], section 2.1.1).
|
||||
|
||||
## Scope
|
||||
|
||||
This test case will just ignore non-responsive name servers or name servers not
|
||||
giving a correct DNS response for an authoritative name server (handled by
|
||||
[Connectivity01]).
|
||||
|
||||
If no DS record is found in the parent zone or no DNSKEY record is found in the
|
||||
*Child Zone* then this test case will be terminated (also see [DNSSEC11]).
|
||||
|
||||
This test case does not report if the parent servers are unresponsive or
|
||||
inconsistent.
|
||||
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
* "Test Type" - The test type with value "undelegated" or "normal".
|
||||
* "Undelegated DS" - The DS record or records submitted
|
||||
(only if *Test Type* is [undelegated]).
|
||||
|
||||
|
||||
## Summary
|
||||
|
||||
* Both DS record and DNSKEY record must be found, or else no further
|
||||
investigation will be done and no messages will be outputted.
|
||||
* No messages will be outputted due to errors in the responses from the parent
|
||||
name servers.
|
||||
|
||||
Message Tag outputted | Level | Arguments | Description of when message tag is outputted
|
||||
:----------------------------------|:--------|:---------------------------------------|:-----------------------------------------------------------------------
|
||||
DS02_ALGO_NOT_SUPPORTED_BY_ZM | NOTICE |ns_ip_list, algo_mnemo, algo_num, keytag| DNSKEY with tag {keytag} uses unsupported algorithm {algo_num} ({algo_mnemo}) by this installation of Zonemaster. Fetched from the nameservers with IP addresses "{ns_ip_list}".
|
||||
DS02_DNSKEY_NOT_FOR_ZONE_SIGNING | ERROR | ns_ip_list, keytag | Flags field of DNSKEY record with tag {keytag} does not have ZONE bit set although DS with same tag is present in parent. Fetched from the nameservers with IP addresses "{ns_ip_list}".
|
||||
DS02_DNSKEY_NOT_SEP | NOTICE | ns_ip_list, keytag | Flags field of DNSKEY record with tag {keytag} does not have SEP bit set although DS with same tag is present in parent. Fetched from the nameservers with IP addresses "{ns_ip_list}".
|
||||
DS02_DNSKEY_NOT_SIGNED_BY_ANY_DS | ERROR | ns_ip_list | The DNSKEY RRset has not been signed by any DNSKEY matched by a DS record. Fetched from the nameservers with IP addresses "{ns_ip_list}".
|
||||
DS02_NO_DNSKEY_FOR_DS | WARNING | ns_ip_list, keytag | The DNSKEY record with tag {keytag} that the DS refers to does not exist in the DNSKEY RRset. Fetched from the nameservers with IP "{ns_ip_list}".
|
||||
DS02_NO_MATCHING_DNSKEY_RRSIG | WARNING | ns_ip_list, keytag | The DNSKEY RRset is not signed by the DNSKEY with tag {keytag} that the DS record refers to. Fetched from the nameservers with IP "{ns_ip_list}".
|
||||
DS02_NO_MATCH_DS_DNSKEY | ERROR | ns_ip_list, keytag | The DS record does not match the DNSKEY with tag {keytag} by algorithm or digest. Fetched from the nameservers with IP "{ns_ip_list}".
|
||||
DS02_NO_VALID_DNSKEY_FOR_ANY_DS | ERROR | ns_ip_list | There is no valid DNSKEY matched by any of the DS records. Fetched from the nameservers with IP addresses "{ns_ip_list}".
|
||||
DS02_RRSIG_NOT_VALID_BY_DNSKEY | ERROR | ns_ip_list, keytag | The DNSKEY RRset is signed with an RRSIG with tag {keytag} which cannot be validated by the matching DNSKEY. Fetched from the nameservers with IP addresses "{ns_ip_list}".
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be overridden in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
|
||||
## Test procedure
|
||||
|
||||
In this section and unless otherwise specified below, the term "[DNSSEC Query]"
|
||||
follows the specification for DNS queries as specified in
|
||||
[DNS Query and Response Defaults]. The handling of the DNS responses on the DNS
|
||||
queries follow, unless otherwise specified below, what is specified for
|
||||
[DNSSEC Response] in the same specification.
|
||||
|
||||
1. Create the following empty sets:
|
||||
1. DS record RDATA ("DS Record").
|
||||
2. Name server IP and key tag from DS record ("No DNSKEY for DS").
|
||||
3. Name server IP and key tag from DS record ("No Match DS DNSKEY").
|
||||
4. Name server IP and DNSKEY record key tag ("DNSKEY Not for Zone Signing").
|
||||
5. Name server IP and DNSKEY record key tag ("DNSKEY not SEP").
|
||||
6. Name server IP and DNSKEY record key tag ("No Matching DNSKEY RRSIG").
|
||||
7. Name server IP address, DNSKEY record key tag and DNSKEY algorithm code
|
||||
("Algo Not Supported By ZM").
|
||||
8. Name server IP and key tag from RRSIG record ("RRSIG Not Valid by DNSKEY").
|
||||
9. Name server IP ("Responding Child Name Servers").
|
||||
10. DNSKEY record and key tag ("DNSKEY Matching DS").
|
||||
11. Name server IP ("Has DNSKEY Match DS").
|
||||
12. Name server IP ("Has DNSKEY RRSIG Match DS").
|
||||
|
||||
2. If the *Test Type* is "[undelegated]" do:
|
||||
1. If *Undelegated DS* is empty then do terminate this test case.
|
||||
2. Else add *Undelegated DS* as DS records to the *DS Record* set.
|
||||
|
||||
3. If *Test Type* is "normal", then:
|
||||
1. Create a [DNSSEC Query] with query type DS and query name *Child Zone*
|
||||
("DS Query").
|
||||
2. Retrieve all name server IP addresses for the parent zone of
|
||||
*Child Zone* using [Method1] (store as "Parent NS IP").
|
||||
3. For each parent name server in *Parent NS IP* do:
|
||||
1. Send *DS Query* to the name server IP.
|
||||
2. If at least one of the following criteria is met, then go to next
|
||||
parent name server:
|
||||
1. There is no [DNSSEC Response].
|
||||
2. The RCODE in the [DNSSEC Response] is not "NoError"
|
||||
([IANA RCODE List]).
|
||||
3. The OPT record is absent in the [DNSSEC Response].
|
||||
4. The DO flag is unset in the [DNSSEC Response].
|
||||
5. The AA flag is not set in the [DNSSEC Response].
|
||||
6. There is no DS record with matching owner name in the answer
|
||||
section of the [DNSSEC Response].
|
||||
3. Retrieve the DS records from the [DNSSEC Response] and add them to the
|
||||
*DS Record* set.
|
||||
4. If the *DS Record* set is empty exit this test case.
|
||||
|
||||
4. Create a [DNSSEC Query] with query type DNSKEY and query name *Child Zone*
|
||||
("DNSKEY Query").
|
||||
|
||||
5. Obtain the set of child name server IP addresses using [Method4] and
|
||||
[Method5] (store as "Child NS IP").
|
||||
|
||||
6. For each child name server in *Child NS IP* do:
|
||||
1. Send *DNSKEY Query* to the name server IP and collect the response.
|
||||
2. If at least one of the following criteria is met, then go to next
|
||||
child name server:
|
||||
1. There is no [DNSSEC Response].
|
||||
2. The RCODE in the [DNSSEC Response] is not "NoError"
|
||||
([IANA RCODE List]).
|
||||
3. The OPT record is absent in the [DNSSEC Response].
|
||||
4. The DO flag is unset in the [DNSSEC Response].
|
||||
5. The AA flag is not set in the [DNSSEC Response].
|
||||
6. There is no DNSKEY record with matching owner name in the answer
|
||||
section of the [DNSSEC Response].
|
||||
3. Add the name server IP address to the *Responding Child Name Servers* set.
|
||||
4. Retrieve the DNSKEY RRset (store as "DNSKEY RRs") from the
|
||||
[DNSSEC Response].
|
||||
5. Retrieve the RRSIG records covering the DNSKEY RRset, possibly
|
||||
none (store as "DNSKEY RRSIG") from the [DNSSEC Response].
|
||||
6. Empty the *DNSKEY Matching DS* set.
|
||||
7. For each DS in *DS Records*, do:
|
||||
1. Find the equivalent DNSKEY in *DNSKEY RRs* by key ID (key tag). If
|
||||
there is more than one such DNSKEY, select the correct one.
|
||||
2. If matching DNSKEY is not found add DS key tag and name server IP to
|
||||
the *No DNSKEY for DS* set and go to next DS.
|
||||
3. Verify if the Zonemaster installation has support for the digest
|
||||
algorithm that created the DS:
|
||||
1. If no support, then ignore the following test if the DS matches
|
||||
the DNSKEY.
|
||||
2. Else, if the DS values (algorithm and digest) do not match the
|
||||
DNSKEY record then add DS key tag and name server IP to the
|
||||
*No Match DS DNSKEY* set.
|
||||
4. If bit 7 of the DNSKEY flags field is unset (value 0), then do:
|
||||
1. Add DS key tag and name server IP to the
|
||||
*DNSKEY Not for Zone Signing* set.
|
||||
2. Go to next DS.
|
||||
5. If bit 15 of the DNSKEY flags field is unset (value 0), then add the
|
||||
DNSKEY record key tag and name server IP to the *DNSKEY not SEP*
|
||||
set.
|
||||
6. Add the DNSKEY record and key tag to the *DNSKEY Matching DS*
|
||||
set.
|
||||
7. Add the name server IP to the *Has DNSKEY Match DS*
|
||||
set.
|
||||
8. For each DNSKEY in the *DNSKEY Matching DS* set, do:
|
||||
1. Look for an RRSIG record created by the DNSKEY in *DNSKEY RRSIG*.
|
||||
* Use key ID (key tag) to identify the corresponding RRSIG record.
|
||||
* If there is more than one such RRSIG record, select the correct one
|
||||
by verifying the signature against the DNSKEY.
|
||||
2. If a matching RRSIG is not found, add DNSKEY record key tag and name
|
||||
server IP to the *No Matching DNSKEY RRSIG* set.
|
||||
3. Else, if the Zonemaster installation does not have support for the
|
||||
DNSKEY algorithm that created the RRSIG, then add name server IP,
|
||||
DNSKEY algorithm and DNSKEY key tag to the *Algo Not Supported By ZM*
|
||||
set.
|
||||
4. Else, if the RRSIG values (algorithm and signature) do not match
|
||||
the DNSKEY then add the key tag from the RRSIG record and name server
|
||||
IP to the *RRSIG Not Valid by DNSKEY* set.
|
||||
5. Else add the name server IP address to the *Has DNSKEY RRSIG Match DS*
|
||||
set.
|
||||
|
||||
7. If the *No DNSKEY for DS* set is non-empty, then for each key tag from the DS
|
||||
record from the set output *[DS02_NO_DNSKEY_FOR_DS]* with the key tag and the
|
||||
name servers IP addresses from the set.
|
||||
|
||||
8. If the *No Match DS DNSKEY* set is non-empty, then for each key tag from the
|
||||
DS record from the set output *[DS02_NO_MATCH_DS_DNSKEY]* with the key tag
|
||||
and the name servers IP addresses from the set.
|
||||
|
||||
9. If the *DNSKEY Not for Zone Signing* set is non-empty, then for each DNSKEY
|
||||
key tag from the set output *[DS02_DNSKEY_NOT_FOR_ZONE_SIGNING]* with the key
|
||||
tag and the name servers IP addresses from the set.
|
||||
|
||||
10. If the *DNSKEY not SEP* set is non-empty, then for each DNSKEY key tag from
|
||||
the set output *[DS02_DNSKEY_NOT_SEP]* with the key tag and the name servers
|
||||
IP addresses from the set.
|
||||
|
||||
11. If the *No Matching DNSKEY RRSIG* set is non-empty, then for each DNSKEY key
|
||||
tag from the set output *[DS02_NO_MATCHING_DNSKEY_RRSIG]* with the key tag
|
||||
and the name servers IP addresses from the set.
|
||||
|
||||
12. If the *Algo Not Supported By ZM* set is non-empty, then output
|
||||
*[DS02_ALGO_NOT_SUPPORTED_BY_ZM]* for each DNSKEY key tag with the name
|
||||
server IP addresses, the key tag and the algorithm code from the set.
|
||||
|
||||
13. If the *RRSIG Not Valid by DNSKEY* set is non-empty, then for each key tag
|
||||
from the RRSIG record from the set output *[DS02_RRSIG_NOT_VALID_BY_DNSKEY]*
|
||||
with the key tag and the name servers IP addresses from the set.
|
||||
|
||||
14. Extract the name server IP addresses that are members of
|
||||
*Responding Child Name Servers* but are not members of *Has DNSKEY Match DS*
|
||||
set.
|
||||
|
||||
15. If the subset from previous step is non-empty, then output
|
||||
*[DS02_NO_VALID_DNSKEY_FOR_ANY_DS]* with the subset of name server IP
|
||||
addresses.
|
||||
|
||||
16. Else do:
|
||||
1. Extract the name server IP addresses that are members of
|
||||
*Responding Child Name Servers* but are not members of
|
||||
*Has DNSKEY RRSIG Match DS* set.
|
||||
2. If that subset is non-empty, then output
|
||||
*[DS02_DNSKEY_NOT_SIGNED_BY_ANY_DS]* with the subset of name server IP
|
||||
addresses.
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, skip sending queries over that
|
||||
transport protocol. Output a message reporting that the transport protocol has
|
||||
been disabled.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
No special terminology for this test case.
|
||||
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[DNS Query and Response Defaults]: ../DNSQueryAndResponseDefaults.md
|
||||
[DNSSEC Query]: ../DNSQueryAndResponseDefaults.md#default-setting-in-dnssec-query
|
||||
[DNSSEC README]: README.md
|
||||
[DNSSEC Response]: ../DNSQueryAndResponseDefaults.md#default-handling-of-a-dnssec-response
|
||||
[DNSSEC11]: dnssec11.md
|
||||
[DS02_ALGO_NOT_SUPPORTED_BY_ZM]: #summary
|
||||
[DS02_DNSKEY_NOT_FOR_ZONE_SIGNING]: #summary
|
||||
[DS02_DNSKEY_NOT_SEP]: #summary
|
||||
[DS02_DNSKEY_NOT_SIGNED_BY_ANY_DS]: #summary
|
||||
[DS02_NO_DNSKEY_FOR_DS]: #summary
|
||||
[DS02_NO_MATCHING_DNSKEY_RRSIG]: #summary
|
||||
[DS02_NO_MATCH_DS_DNSKEY]: #summary
|
||||
[DS02_NO_VALID_DNSKEY_FOR_ANY_DS]: #summary
|
||||
[DS02_RRSIG_NOT_VALID_BY_DNSKEY]: #summary
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[IANA RCODE List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Method1]: ../Methods.md#method-1-obtain-the-parent-domain
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 4034#section-2.1.1]: https://datatracker.ietf.org/doc/html/rfc4034#section-2.1.1
|
||||
[RFC 4034#section-5.2]: https://datatracker.ietf.org/doc/html/rfc4034#section-5.2
|
||||
[RFC 4035#section-5]: https://datatracker.ietf.org/doc/html/rfc4035#section-5
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[Undelegated]: ../../test-types/undelegated-test.md
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
@@ -0,0 +1,337 @@
|
||||
## DNSSEC03: Verify NSEC3 parameters
|
||||
|
||||
|
||||
### Test case identifier
|
||||
**DNSSEC03**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#objective)
|
||||
* [Scope](#scope)
|
||||
* [Inputs](#inputs)
|
||||
* [Summary](#summary)
|
||||
* [Test procedure]
|
||||
* [Outcome(s)](#outcomes)
|
||||
* [Special procedural requirements](#special-procedural-requirements)
|
||||
* [Intercase dependencies](#intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
The NSEC3 record type and its parameters are defined in [RFC 5155]. The
|
||||
recommended values of the parameters have been updated by [RFC 9276].
|
||||
|
||||
For NSEC3 there are four fields that determine how the NSEC3 record are created
|
||||
and interpreted ([RFC 5155][RFC 5155#section-3], section 3):
|
||||
|
||||
* Hash algorithm
|
||||
* Flags
|
||||
* Iterations
|
||||
* Salt
|
||||
|
||||
**Hash algorithm:** The only legal value of the hash algorithm is value 1
|
||||
(SHA-1). See ([RFC 5155][RFC 5155#section-11], section 11 and
|
||||
[IANA NSEC3 Parameters registry]).
|
||||
|
||||
**Flags:** The only defined flags in the flag field is bit 7 (the least
|
||||
significant bit), "opt-out". It may only be set in the NSEC record, not in the
|
||||
NSEC3PARAM record ([RFC 5155][RFC 5155#section-11], section 11 and
|
||||
[IANA NSEC3 Parameters registry]). "For small zones, the use of opt-out-based
|
||||
NSEC3 records is NOT RECOMMENDED. For very large and sparsely signed zones, where
|
||||
the majority of the records are insecure delegations, opt-out MAY be used"
|
||||
([RFC 9276][RFC 9276#section-3.1], section 3.1). This means that unless the zone
|
||||
is a TLD or a TLD like domain found in the [Public Suffix List] it should
|
||||
not have the opt-out bit set.
|
||||
|
||||
**Iterations:** For a name server an increased number of NSEC3 iterations have a
|
||||
negative impact on performance. The recommendation is to have 0 iterations. "If
|
||||
NSEC3 must be used, then an iterations count of 0 MUST be used to alleviate
|
||||
computational burdens" ([RFC 9276][RFC 9276#section-3.1], section 3.1).
|
||||
|
||||
**Salt:** The salt parameter has been seen as a security feature but
|
||||
[RFC 9276][RFC 9276#section-3.1], section 3.1, states that zones "SHOULD NOT use
|
||||
a salt by indicating a zero-length salt value instead". The justification for
|
||||
the recommendation is found in [RFC 9276][RFC 9276#section-2.4], section 2.4.
|
||||
|
||||
|
||||
## Scope
|
||||
|
||||
This test case will just ignore non-responsive name servers or name servers not
|
||||
giving a correct DNS response for an authoritative name server (covered by
|
||||
[Connectivity01]).
|
||||
|
||||
This test case is only relevant if the zone has been DNSSEC signed.
|
||||
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
* "Public Suffix List Data" - The list or a copy of the list found at
|
||||
[Public Suffix List data].
|
||||
|
||||
|
||||
## Summary
|
||||
|
||||
* If no DNSKEY records are found, no further investigation will be done.
|
||||
|
||||
Message Tag outputted | Level |Arguments| Message ID for message tag
|
||||
:----------------------------------|:--------|:--------|:--------------------------------------------
|
||||
DS03_ERROR_RESPONSE_NSEC_QUERY | ERROR | ns_list | The following servers give erroneous response to NSEC query. Fetched from name servers "{ns_list}".
|
||||
DS03_ERR_MULT_NSEC3 | ERROR | ns_list | Multiple NSEC3 records when one is expected. Fetched from name servers "{ns_list}".
|
||||
DS03_ILLEGAL_HASH_ALGO | ERROR | ns_list, algo_num | The following servers respond with an illegal hash algorithm for NSEC3 ({algo_num}). Fetched from name servers "{ns_list}".
|
||||
DS03_ILLEGAL_ITERATION_VALUE | WARNING | ns_list, int | The following servers respond with the NSEC3 iteration value {int}. The recommended practice is to set this value to 0. Fetched from name servers "{ns_list}".
|
||||
DS03_ILLEGAL_SALT_LENGTH | WARNING | ns_list, int | The following servers respond with a non-empty salt in NSEC3 ({int} octets). The recommended practice is to use an empty salt. Fetched from name servers "{ns_list}".
|
||||
DS03_INCONSISTENT_HASH_ALGO | ERROR | | Inconsistent hash algorithm in NSEC3 in responses for the child zone from different name servers.
|
||||
DS03_INCONSISTENT_ITERATION | ERROR | | Inconsistent NSEC3 iteration value in responses for the child zone from different name servers.
|
||||
DS03_INCONSISTENT_NSEC3_FLAGS | ERROR | | Inconsistent NSEC3 flag list in responses for the child zone from different name servers.
|
||||
DS03_INCONSISTENT_SALT_LENGTH | ERROR | | Inconsistent salt length in NSEC3 in responses for the child zone from different name servers.
|
||||
DS03_LEGAL_EMPTY_SALT | INFO | ns_list | The following servers respond with a legal empty salt in NSEC3. Fetched from name servers "{ns_list}".
|
||||
DS03_LEGAL_HASH_ALGO | INFO | ns_list | The following servers respond with a legal hash algorithm in NSEC3. Fetched from name servers "{ns_list}".
|
||||
DS03_LEGAL_ITERATION_VALUE | INFO | ns_list | The following servers respond with NSEC3 iteration value set to zero (as recommended). Fetched from name servers "{ns_list}".
|
||||
DS03_NO_DNSSEC_SUPPORT | NOTICE | ns_list | The zone is not DNSSEC signed or not properly DNSSEC signed. Testing for NSEC3 has been skipped. Fetched from name servers "{ns_list}".
|
||||
DS03_NO_NSEC3 | INFO | ns_list | The zone does not use NSEC3. Testing for NSEC3 has been skipped. Fetched from name servers "{ns_list}".
|
||||
DS03_NO_RESPONSE_NSEC_QUERY | ERROR | ns_list | The following servers do not respond to NSEC query. Fetched from name servers "{ns_list}".
|
||||
DS03_NSEC3_OPT_OUT_DISABLED | INFO | ns_list | The following servers respond with NSEC3 opt-out disabled (as recommended). Fetched from name servers "{ns_list}".
|
||||
DS03_NSEC3_OPT_OUT_ENABLED_NON_TLD | NOTICE | ns_list | The following servers respond with NSEC3 opt-out enabled. The recommended practice is to disable opt-out. Fetched from name servers "{ns_list}".
|
||||
DS03_NSEC3_OPT_OUT_ENABLED_TLD | INFO | ns_list | The following servers respond with NSEC3 opt-out enabled. Fetched from name servers "{ns_list}".
|
||||
DS03_SERVER_NO_DNSSEC_SUPPORT | ERROR | ns_list | The following name servers do not support DNSSEC or have not been properly configured. Testing for NSEC3 has been skipped on those servers. Fetched from name servers "{ns_list}".
|
||||
DS03_SERVER_NO_NSEC3 | ERROR | ns_list | The following name servers do not use NSEC3, but others do. Testing for NSEC3 has been skipped on the following servers. Fetched from name servers "{ns_list}".
|
||||
DS03_UNASSIGNED_FLAG_USED | ERROR | ns_list, int | The following servers respond with an NSEC3 record where an unassigned flag is used (bit {int}). Fetched from name servers "{ns_list}".
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be changed in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
The name server names are assumed to be available at the time when the msgid
|
||||
is created, if the argument name is "ns" or "ns_list" even when in the
|
||||
"[Test procedure]" below it is only referred to the IP address of the name
|
||||
servers.
|
||||
|
||||
|
||||
## Test procedure
|
||||
|
||||
In this section and unless otherwise specified below, the term "[DNSSEC Query]"
|
||||
follows the specification for DNS queries as specified in
|
||||
[DNS Query and Response Defaults]. The handling of the DNS responses on the DNS
|
||||
queries follow, unless otherwise specified below, what is specified for
|
||||
[DNSSEC Response] in the same specification.
|
||||
|
||||
A complete list of all DNS Resource Record types can be found in the
|
||||
[IANA RR Type List].
|
||||
|
||||
1. Create a [DNSSEC Query] with query type DNSKEY and query name *Child Zone*
|
||||
("DNSKEY Query").
|
||||
|
||||
2. Create a [DNSSEC Query] with query type NSEC and query name *Child Zone*
|
||||
("NSEC Query").
|
||||
|
||||
3. Retrieve all name server names and IP addresses for the
|
||||
*Child Zone* using [Method4] and [Method5] ("NS IP").
|
||||
|
||||
3. Create the following empty sets:
|
||||
|
||||
1. Name server IP address ("Responds Without DNSKEY").
|
||||
2. Name server IP address ("Responds With DNSKEY").
|
||||
3. Name server IP address ("Responds Without NSEC3").
|
||||
4. Name server IP address ("Responds With NSEC3").
|
||||
5. Name server IP address ("Multiple NSEC3").
|
||||
6. Name server IP address and NSEC3 hash algorithm ("Hash Algorithm").
|
||||
7. Name server IP address and NSEC3 flags ("NSEC3 Flags").
|
||||
8. Name server IP address and NSEC3 iterations value ("NSEC3 Iterations").
|
||||
9. Name server IP address and NSEC3 salt length ("NSEC3 Salt Length").
|
||||
10. Name server IP address ("No Response NSEC Query")
|
||||
11. Name server IP address ("Error Response NSEC Query")
|
||||
|
||||
6. For each name server IP address in *NS IP* do:
|
||||
|
||||
1. Send *DNSKEY Query* to the name server IP.
|
||||
2. If at least one of the following criteria is met, then go to next name
|
||||
server IP:
|
||||
1. There is no DNS response.
|
||||
2. The [RCODE Name] in the response is not "NoError".
|
||||
3. The AA flag is not set in the response.
|
||||
3. If the response does not contain any DNSKEY record with owner name
|
||||
matching *Child Zone* in the answer section, add name server IP to the
|
||||
*Responds Without DNSKEY* set and go to next name server.
|
||||
4. Add name server IP to the *Responds With DNSKEY* set.
|
||||
5. Send *NSEC Query* to the name server IP.
|
||||
6. If there is no DNS response do:
|
||||
1. Add name server IP to the *No Response NSEC Query* set.
|
||||
2. Go to next name server IP.
|
||||
7. If the [RCODE Name] in the response is not "NoError" or if the AA flag is
|
||||
not set in the response (or both) then do:
|
||||
1. Add name server IP to the *Error Response NSEC Query* set.
|
||||
2. Go to next name server IP.
|
||||
8. If the authority section contains no NSEC3 record then add the name server
|
||||
IP to the *Responds Without NSEC3* set and go to next name server.
|
||||
9. Else do:
|
||||
1. If there are more than one NSEC3 record in the authority section then
|
||||
add name server IP to the *Multiple NSEC3* set and use the first one
|
||||
for the following steps.
|
||||
2. Add name server IP to the *Responds With NSEC3* set.
|
||||
3. Extract the NSEC3 hash algorithm and add it and the name server IP to
|
||||
the *Hash Algorithm* set.
|
||||
4. Extract the NSEC3 flags and add them and the name server IP to the
|
||||
*NSEC3 flags* set.
|
||||
5. Extract the NSEC3 hash iterations value and add it and the name server
|
||||
IP to the *NSEC3 Iterations* set.
|
||||
6. Extract the NSEC3 salt length and add it and the name server IP to the
|
||||
*NSEC3 Salt Length* set.
|
||||
|
||||
7. If the *Responds With DNSKEY* set is empty and the *Responds Without DNSKEY*
|
||||
is non-empty then output *[DS03_NO_DNSSEC_SUPPORT]* with the name server IP
|
||||
addresses from the *Responds Without DNSKEY* set.
|
||||
|
||||
8. If both the *Responds With DNSKEY* set and the *Responds Without DNSKEY* set
|
||||
are non-empty then output *[DS03_SERVER_NO_DNSSEC_SUPPORT]* with the name
|
||||
server IP addresses from the *Responds Without DNSKEY* set.
|
||||
|
||||
9. If the *Responds With NSEC3* set is empty and the *Responds Without NSEC3*
|
||||
is non-empty then output *[DS03_NO_NSEC3]* with the name server IP
|
||||
addresses from the *Responds Without NSEC3* set.
|
||||
|
||||
10. If both the *Responds With NSEC3* set and the *Responds Without NSEC3*
|
||||
are non-empty then output *[DS03_SERVER_NO_NSEC3]* with the name server IP
|
||||
addresses from the *Responds Without NSEC3* set.
|
||||
|
||||
11. If the *Multiple NSEC3* set is non-empty then output *[DS03_ERR_MULT_NSEC3]*
|
||||
with the name server IP addresses from the set.
|
||||
|
||||
12. If the *Hash Algorithm* set is non-empty then do:
|
||||
1. If the set has more than one hash algorithm value then output
|
||||
*[DS03_INCONSISTENT_HASH_ALGO]*.
|
||||
2. For each algorithm value do:
|
||||
1. If the value is 1 output *[DS03_LEGAL_HASH_ALGO]* with the name servers
|
||||
IP addresses from the set with that value.
|
||||
2. Else, output *[DS03_ILLEGAL_HASH_ALGO]* with the hash algorithm value
|
||||
and the name servers IP addresses from the set with that value.
|
||||
|
||||
13. If the *NSEC3 Flags* set is non-empty then do:
|
||||
1. If the set has more than one flag list value then output
|
||||
*[DS03_INCONSISTENT_NSEC3_FLAGS]*.
|
||||
2. For each flag list value do:
|
||||
1. If any flag 0-6 (bits 0-6) is set then for each such flag output
|
||||
*[DS03_UNASSIGNED_FLAG_USED]* with the flag (bit) number and the name
|
||||
server IP addresses from the flag list value where the bit is set.
|
||||
2. If flag 7 (bit 7) is set, then do:
|
||||
1. If *Child Zone* is the root zone, a TLD zone or a zone matching
|
||||
*Public Suffix List Data* then output
|
||||
*[DS03_NSEC3_OPT_OUT_ENABLED_TLD]* with the name servers IP
|
||||
addresses from the set with that flag list value.
|
||||
2. Else, output *[DS03_NSEC3_OPT_OUT_ENABLED_NON_TLD]* with the name
|
||||
servers IP addresses from the set with that flag list value.
|
||||
3. If flag 7 (bit 7) is unset, then output
|
||||
*[DS03_NSEC3_OPT_OUT_DISABLED]* with the name servers IP addresses from
|
||||
the set with that flag list value.
|
||||
|
||||
14. If the *NSEC3 Iterations* set is non-empty then do:
|
||||
1. If the set has more than one iteration value then output
|
||||
*[DS03_INCONSISTENT_ITERATION]*.
|
||||
2. For each iteration value do:
|
||||
1. If the value is 0 output *[DS03_LEGAL_ITERATION_VALUE]* with the name
|
||||
servers IP addresses from the set with that iteration value.
|
||||
2. Else, output *[DS03_ILLEGAL_ITERATION_VALUE]* with the value and the
|
||||
name servers IP addresses from the set with that iteration value.
|
||||
|
||||
15. If the *NSEC3 Salt Length* set is non-empty then do:
|
||||
1. If the set has more than one salt length then output
|
||||
*[DS03_INCONSISTENT_SALT_LENGTH]*.
|
||||
2. For each iteration value do:
|
||||
1. If the length is 0 output *[DS03_LEGAL_EMPTY_SALT]* with the name
|
||||
servers IP addresses from the set with that salt length.
|
||||
2. Else, output *[DS03_ILLEGAL_SALT_LENGTH]* with the length and the
|
||||
name servers IP addresses from the set with that salt length.
|
||||
|
||||
16. If the *No Response NSEC Query* set is non-empty then output
|
||||
*[DS03_NO_RESPONSE_NSEC_QUERY]* with the name server IP addresses from the
|
||||
set.
|
||||
|
||||
17. If the *Error Response NSEC Query* set is non-empty then output
|
||||
*[DS03_ERROR_RESPONSE_NSEC_QUERY]* with the name server IP addresses from the
|
||||
set.
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, skip sending queries over that
|
||||
transport protocol. A message will be outputted reporting that the transport
|
||||
protocol has been skipped.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
No special terminology for this Test Case.
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[DNS Query and Response Defaults]: ../DNSQueryAndResponseDefaults.md
|
||||
[DNSSEC Query]: ../DNSQueryAndResponseDefaults.md#default-setting-in-dnssec-query
|
||||
[DNSSEC README]: README.md
|
||||
[DNSSEC Response]: ../DNSQueryAndResponseDefaults.md#default-handling-of-a-dnssec-response
|
||||
[DS03_ERROR_RESPONSE_NSEC_QUERY]: #summary
|
||||
[DS03_ERR_MULT_NSEC3]: #summary
|
||||
[DS03_ILLEGAL_HASH_ALGO]: #summary
|
||||
[DS03_ILLEGAL_ITERATION_VALUE]: #summary
|
||||
[DS03_ILLEGAL_SALT_LENGTH]: #summary
|
||||
[DS03_INCONSISTENT_HASH_ALGO]: #summary
|
||||
[DS03_INCONSISTENT_ITERATION]: #summary
|
||||
[DS03_INCONSISTENT_NSEC3_FLAGS]: #summary
|
||||
[DS03_INCONSISTENT_SALT_LENGTH]: #summary
|
||||
[DS03_LEGAL_EMPTY_SALT]: #summary
|
||||
[DS03_LEGAL_HASH_ALGO]: #summary
|
||||
[DS03_LEGAL_ITERATION_VALUE]: #summary
|
||||
[DS03_NO_DNSSEC_SUPPORT]: #summary
|
||||
[DS03_NO_NSEC3]: #summary
|
||||
[DS03_NO_RESPONSE_NSEC_QUERY]: #summary
|
||||
[DS03_NSEC3_OPT_OUT_DISABLED]: #summary
|
||||
[DS03_NSEC3_OPT_OUT_ENABLED_NON_TLD]: #summary
|
||||
[DS03_NSEC3_OPT_OUT_ENABLED_TLD]: #summary
|
||||
[DS03_SERVER_NO_DNSSEC_SUPPORT]: #summary
|
||||
[DS03_SERVER_NO_NSEC3]: #summary
|
||||
[DS03_UNASSIGNED_FLAG_USED]: #summary
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[IANA NSEC3 Parameters registry]: https://www.iana.org/assignments/dnssec-nsec3-parameters/dnssec-nsec3-parameters.xhtml
|
||||
[IANA RR Type List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[Public Suffix List data]: https://publicsuffix.org/list/public_suffix_list.dat
|
||||
[Public Suffix List]: https://publicsuffix.org/list/
|
||||
[RCODE Name]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[RFC 5155#section-11]: https://www.rfc-editor.org/rfc/rfc5155.html#section-11
|
||||
[RFC 5155#section-3]: https://www.rfc-editor.org/rfc/rfc5155.html#section-3
|
||||
[RFC 5155]: https://www.rfc-editor.org/rfc/rfc5155.html
|
||||
[RFC 9276#section-2.4]: https://www.rfc-editor.org/rfc/rfc9276.html#section-2.4
|
||||
[RFC 9276#section-3.1]: https://www.rfc-editor.org/rfc/rfc9276.html#section-3.1
|
||||
[RFC 9276]: https://www.rfc-editor.org/rfc/rfc9276.html
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[Test procedure]: #test-procedure
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
@@ -0,0 +1,57 @@
|
||||
## DNSSEC04: Check for too short or too long RRSIG lifetimes
|
||||
|
||||
### Test case identifier
|
||||
**DNSSEC04** Check for too short or too long RRSIG lifetimes
|
||||
|
||||
### Objective
|
||||
|
||||
Having RRSIG signature lifetimes last for too long opens up for DNS replay
|
||||
attacks. Having too short RRSIG signature lifetimes is likely to have
|
||||
a major operational impact if the master name server is down for that long.
|
||||
|
||||
There is no clear recommendation of the exact validity periods to use with
|
||||
DNSSEC. Shorter validity than 12 hours until expiration will give a serious
|
||||
operational problem just in case of temporary network problems, and longer
|
||||
than 180 days will create wide open holes for replay attacks.
|
||||
|
||||
The considerations are described in [RFC6781](
|
||||
https://datatracker.ietf.org/doc/html/rfc6781).
|
||||
|
||||
### Inputs
|
||||
|
||||
The domain name to be tested.
|
||||
|
||||
### Ordered description of steps to be taken to execute the test case
|
||||
|
||||
1. Obtain a set of name server IP addresses using [Method4] and [Method5].
|
||||
2. Create a DNSKEY query with DO flag set for the apex of the child zone.
|
||||
3. Create a SOA query with DO flag set for the apex of the child zone.
|
||||
4. Send the DNSKEY query over UDP to each name server IP address until
|
||||
a response is received or until the set is exhausted.
|
||||
5. Send the SOA query over UDP to each name server IP address until
|
||||
a response is received or until the set is exhausted.
|
||||
6. If any RRSIG validity is found where the expiration time already has
|
||||
passed, this test case fails.
|
||||
7. If any RRSIG validity time is shorter than 12 hours (from "now"),
|
||||
this test case fails.
|
||||
8. If any RRSIG validity time is longer than 180 days (from "now"), this
|
||||
test fails.
|
||||
9. If any RRSIG validity from inception to expiration is longer than 180
|
||||
days, this test case fails.
|
||||
|
||||
### Outcome(s)
|
||||
|
||||
If any of the signature expirations time is either shorter than 12 hours or
|
||||
longer than 180 days, this test case fails.
|
||||
|
||||
### Special procedural requirements
|
||||
|
||||
Test case is only performed if RRSIG RRs are found in the answers.
|
||||
|
||||
### Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
-------
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
@@ -0,0 +1,275 @@
|
||||
# DNSSEC05: Check for invalid DNSKEY algorithms
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC05**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#Objective)
|
||||
* [Scope](#Scope)
|
||||
* [Classification of algorithms]
|
||||
* [Inputs](#Inputs)
|
||||
* [Summary]
|
||||
* [Test procedure]
|
||||
* [Outcome(s)](#Outcomes)
|
||||
* [Special procedural requirements](#Special-procedural-requirements)
|
||||
* [Intercase dependencies](#Intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
A domain name (zone) should only use DNSKEY algorithms that are specified by
|
||||
[RFC 8624][RFC 8624#3.1], section 3.1 (including the update in
|
||||
[RFC 9157][RFC 9157#upd-8624]) and the [IANA registry][IANA DNSSEC algo num] of
|
||||
*DNSSEC Algorithm Numbers* to be used for DNSSEC signing. A public domain name
|
||||
(zone) should not use private algorithms.
|
||||
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is also tested by [Connectivity01]. This test
|
||||
case will just ignore non-responsive name servers or name servers not giving a
|
||||
correct DNS response for an authoritative name server unless all such name
|
||||
servers fail, in which case a message is outputted.
|
||||
|
||||
The RDATA of a DNSKEY record consists of four fields. The third field specifies
|
||||
the algorithm number of the public key in the fourth field. This test case will only
|
||||
check which algorithm is used by checking the third field. It will not verify
|
||||
that the key is matching the algorithm.
|
||||
|
||||
|
||||
## Classification of algorithms
|
||||
|
||||
In the table below, the first three columns are copied from the
|
||||
[IANA registry][IANA DNSSEC algo num]. The fourth column is for Zonemaster
|
||||
classification and it holds the relevant message tags listed in the
|
||||
"[Summary]" section below. In the table below "mnemonic" is defined by Zonemaster
|
||||
when undefined in the IANA table, which is available at
|
||||
[IANA registry][IANA DNSSEC algo num].
|
||||
|
||||
The "Zonemaster classification" is based on the "Use for DNSSEC signing" in the
|
||||
[IANA registry][IANA DNSSEC algo num] of *DNSSEC Algorithm Numbers*.
|
||||
|
||||
| Algorithm no | Algorithm (or description) | Mnemonic | Zonemaster classification | Note |
|
||||
|:-------------|:---------------------------------|:-------------------|:--------------------------|:-----|
|
||||
| 0 | Delete DS | DELETE | DS05_ALGO_NOT_ZONE_SIGN | |
|
||||
| 1 | RSA/MD5 | RSAMD5 | DS05_ALGO_DEPRECATED | |
|
||||
| 2 | Diffie-Hellman | DH | DS05_ALGO_NOT_ZONE_SIGN | |
|
||||
| 3 | DSA/SHA1 | DSA | DS05_ALGO_DEPRECATED | |
|
||||
| 4 | Reserved | RESERVED | DS05_ALGO_RESERVED | (1) |
|
||||
| 5 | RSA/SHA-1 | RSASHA1 | DS05_ALGO_DEPRECATED | |
|
||||
| 6 | DSA-NSEC3-SHA1 | DSA-NSEC3-SHA1 | DS05_ALGO_DEPRECATED | |
|
||||
| 7 | RSASHA1-NSEC3-SHA1 | RSASHA1-NSEC3-SHA1 | DS05_ALGO_DEPRECATED | |
|
||||
| 8 | RSA/SHA-256 | RSASHA256 | DS05_ALGO_OK | |
|
||||
| 9 | Reserved | RESERVED | DS05_ALGO_RESERVED | (1) |
|
||||
| 10 | RSA/SHA-512 | RSASHA512 | DS05_ALGO_NOT_RECOMMENDED | |
|
||||
| 11 | Reserved | RESERVED | DS05_ALGO_RESERVED | (1) |
|
||||
| 12 | GOST R 34.10-2001 | ECC-GOST | DS05_ALGO_DEPRECATED | |
|
||||
| 13 | ECDSA Curve P-256 with SHA-256 | ECDSAP256SHA256 | DS05_ALGO_OK | |
|
||||
| 14 | ECDSA Curve P-384 with SHA-384 | ECDSAP384SHA384 | DS05_ALGO_OK | |
|
||||
| 15 | Ed25519 | ED25519 | DS05_ALGO_OK | |
|
||||
| 16 | Ed448 | ED448 | DS05_ALGO_OK | |
|
||||
| 17 | SM2 signing algo w SM3 hash algo | SM2SM3 | DS05_ALGO_OK | |
|
||||
| 18-22 | Unassigned | UNASSIGNED | DS05_ALGO_UNASSIGNED | (1) |
|
||||
| 23 | GOST R 34.10-2012 | ECC-GOST12 | DS05_ALGO_OK | |
|
||||
| 24-122 | Unassigned | UNASSIGNED | DS05_ALGO_UNASSIGNED | (1) |
|
||||
| 123-251 | Reserved | RESERVED | DS05_ALGO_RESERVED | (1) |
|
||||
| 252 | Reserved for Indirect Keys | INDIRECT | DS05_ALGO_NOT_ZONE_SIGN | |
|
||||
| 253 | private algorithm | PRIVATEDNS | DS05_ALGO_PRIVATE | |
|
||||
| 254 | private algorithm OID | PRIVATEOID | DS05_ALGO_PRIVATE | |
|
||||
| 255 | Reserved | RESERVED | DS05_ALGO_RESERVED | (1) |
|
||||
|
||||
(1) Mnemonic defined for Zonemaster usage when undefined in the IANA table.
|
||||
|
||||
|
||||
## Inputs
|
||||
|
||||
* The domain name to be tested ("Child Zone").
|
||||
* The table in section "[Classification of algorithms]" above.
|
||||
|
||||
|
||||
## Summary
|
||||
|
||||
| Message Tag | Level | Arguments | Message ID for message tag |
|
||||
|:--------------------------|:--------|:--------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| DS05_ALGO_DEPRECATED | ERROR | ns_list, keytag, algo_num, algo_descr, algo_mnemo | The DNSKEY with tag {keytag} uses deprecated algorithm number {algo_num} ("{algo_descr}", {algo_mnemo}). Fetched from name servers "{ns_list}". |
|
||||
| DS05_ALGO_NOT_RECOMMENDED | WARNING | ns_list, keytag, algo_num, algo_descr, algo_mnemo | The DNSKEY with tag {keytag} uses unrecommended algorithm number {algo_num} ("{algo_descr}", {algo_mnemo}). Fetched from name servers "{ns_list}". |
|
||||
| DS05_ALGO_NOT_ZONE_SIGN | ERROR | ns_list, keytag, algo_num, algo_descr, algo_mnemo | The DNSKEY with tag {keytag} uses algorithm number {algo_num} ("{algo_descr}", {algo_mnemo}) which is not meant for zone signing. Fetched from name servers "{ns_list}". |
|
||||
| DS05_ALGO_OK | INFO | ns_list, keytag, algo_num, algo_descr, algo_mnemo | The DNSKEY with tag {keytag} uses algorithm number {algo_num} ("{algo_descr}", {algo_mnemo}). Fetched from name servers "{ns_list}". |
|
||||
| DS05_ALGO_PRIVATE | ERROR | ns_list, keytag, algo_num | The DNSKEY with tag {keytag} uses algorithm number {algo_num} which is reserved for private use. Fetched from name servers "{ns_list}". |
|
||||
| DS05_ALGO_RESERVED | ERROR | ns_list, keytag, algo_num | The DNSKEY with tag {keytag} uses reserved algorithm number {algo_num}. Fetched from name servers "{ns_list}". |
|
||||
| DS05_ALGO_UNASSIGNED | ERROR | ns_list, keytag, algo_num | The DNSKEY with tag {keytag} uses unassigned algorithm number {algo_num}. Fetched from name servers "{ns_list}". |
|
||||
| DS05_NO_RESPONSE | WARNING | ns_list | No response or error in response from all name servers on the DNSKEY query. Failing name servers: "{ns_list}". |
|
||||
| DS05_SERVER_NO_DNSSEC | ERROR | ns_list | Some name servers do not support DNSSEC or have not been properly configured. DNSKEY cannot be tested on those servers. Fetched from name servers "{ns_list}". |
|
||||
| DS05_ZONE_NO_DNSSEC | NOTICE | ns_list | The zone is not DNSSEC signed or not properly DNSSEC signed. DNSKEY cannot be tested. Fetched from name servers "{ns_list}". |
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be changed in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
The name server names are assumed to be available at the time when the msgid
|
||||
is created, if the argument name is "ns" or "ns_list" even when in the
|
||||
"[Test procedure]" below it is only referred to the IP address of the name
|
||||
servers.
|
||||
|
||||
|
||||
## Test procedure
|
||||
|
||||
In this section and unless otherwise specified below, the term "[DNSSEC Query]"
|
||||
follows the specification for DNS queries as specified in
|
||||
[DNS Query and Response Defaults]. The handling of the DNS responses on the DNS
|
||||
queries follow, unless otherwise specified below, what is specified for
|
||||
[DNSSEC Response] in the same specification.
|
||||
|
||||
A complete list of all DNS Resource Record types can be found in the
|
||||
[IANA RR Type List].
|
||||
|
||||
1. Create a [DNSSEC Query] with query type DNSKEY and query name *Child Zone*
|
||||
("DNSKEY Query").
|
||||
|
||||
2. Retrieve all name server names and IP addresses for *Child Zone* using
|
||||
methods [Get-Del-NS-Names-and-IPs] and [Get-Zone-NS-Names-and-IPs]
|
||||
("NS Name and IP").
|
||||
|
||||
3. The name server names are assumed to be available at the time when a `msgid`
|
||||
listed above in [Summary] is created. If the argument name is "ns" or
|
||||
"ns_list" the name server name is extracted from *NS Name and IP* even
|
||||
though it is only referred to the IP address of the name servers in the steps
|
||||
below. Furthermore, if there are more than one name server names for the same
|
||||
IP address, one entry is created for each name.
|
||||
|
||||
4. Create the following empty sets:
|
||||
|
||||
1. Name server IP address ("Ignored NS IP")
|
||||
2. Name server IP address ("Responds without valid DNSKEY")
|
||||
3. Name server IP address ("Responds with DNSKEY")
|
||||
4. Name server IP address, key tag and DNSKEY algorithm code ("DS05_ALGO_DEPRECATED")
|
||||
5. Name server IP address, key tag and DNSKEY algorithm code ("DS05_ALGO_RESERVED")
|
||||
6. Name server IP address, key tag and DNSKEY algorithm code ("DS05_ALGO_UNASSIGNED")
|
||||
7. Name server IP address, key tag and DNSKEY algorithm code ("DS05_ALGO_NOT_RECOMMENDED")
|
||||
8. Name server IP address, key tag and DNSKEY algorithm code ("DS05_ALGO_PRIVATE")
|
||||
9. Name server IP address, key tag and DNSKEY algorithm code ("DS05_ALGO_NOT_ZONE_SIGN")
|
||||
10. Name server IP address, key tag and DNSKEY algorithm code ("DS05_ALGO_OK")
|
||||
|
||||
5. For each unique name server IP address in *NS Name and IP* do:
|
||||
|
||||
1. Send *DNSKEY Query* to the name server IP.
|
||||
2. Add the name server IP to the *Ignored NS IP* set and go to next name
|
||||
server IP if at least one of the following criteria is met:
|
||||
1. There is no DNS response.
|
||||
2. The [RCODE Name] in the response is not "NoError".
|
||||
3. The AA flag is not set in the response.
|
||||
3. If the response does not contain any valid DNSKEY record with owner name
|
||||
matching *Child Zone* in the answer section, add name server IP to the
|
||||
*Responds without valid DNSKEY* set and go to next server.
|
||||
4. Else, add name server IP to the *Responds with DNSKEY* set and retrieve
|
||||
valid DNSKEY records from the answer section.
|
||||
5. For each DNSKEY record retrieved do:
|
||||
1. Extract algorithm number from the third field of RDATA of the DNSKEY
|
||||
record.
|
||||
2. Calculate the key tag for the DNSKEY record.
|
||||
3. From section "[Classification of algorithms]" retrieve the table and
|
||||
extract the row matching the algorithm number.
|
||||
4. From the row extract the message tag from column "Zonemaster
|
||||
classification".
|
||||
5. Add name server IP, key tag and the algorithm code to the set with the
|
||||
same name as the extracted message tag.
|
||||
|
||||
6. For each of the sets matching each of the following message tags do if the set
|
||||
is non-empty:
|
||||
* For each combination of key tag and algorithm code do:
|
||||
* Output the message tag matching the set name with the list of name server
|
||||
IP from the subset (key tag and code) plus the key tag, the algorithm
|
||||
number, algorithm description and algorithm mnemonic from the table in
|
||||
section "[Classification of algorithms]". Exclude algorithm description
|
||||
and algorithm mnemonic if not listed for the tag in [Summary].
|
||||
* Sets:
|
||||
* *[DS05_ALGO_DEPRECATED]*
|
||||
* *[DS05_ALGO_RESERVED]*
|
||||
* *[DS05_ALGO_UNASSIGNED]*
|
||||
* *[DS05_ALGO_NOT_RECOMMENDED]*
|
||||
* *[DS05_ALGO_PRIVATE]*
|
||||
* *[DS05_ALGO_NOT_ZONE_SIGN]*
|
||||
* *[DS05_ALGO_OK]*
|
||||
|
||||
7. If the *Responds without valid DNSKEY* and *Responds with DNSKEY* sets are empty
|
||||
then output *[DS05_NO_RESPONSE]* with the list of name server IP addresses from
|
||||
the *Ignored NS IP* set.
|
||||
|
||||
8. If the *Responds without valid DNSKEY* is non-empty then do:
|
||||
1. If *Responds with DNSKEY* sets is empty then output *[DS05_ZONE_NO_DNSSEC]*
|
||||
with name server IP from the *Responds without valid DNSKEY* set.
|
||||
2. Else, output *[DS05_SERVER_NO_DNSSEC]* with name server IP from the
|
||||
*Responds without valid DNSKEY* set.
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message with
|
||||
the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message with
|
||||
the severity level *[WARNING]*, but no message with severity level *ERROR* or
|
||||
*CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level *[INFO]* or
|
||||
*[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, skip sending queries over that
|
||||
transport protocol. A message will be outputted reporting that the transport
|
||||
protocol has been skipped.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
No special terminology for this Test Case.
|
||||
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[Classification of algorithms]: #classification-of-algorithms
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[DNS Query and Response Defaults]: ../DNSQueryAndResponseDefaults.md
|
||||
[DNSSEC Query]: ../DNSQueryAndResponseDefaults.md#default-setting-in-dnssec-query
|
||||
[DNSSEC README]: ./README.md
|
||||
[DNSSEC Response]: ../DNSQueryAndResponseDefaults.md#default-handling-of-a-dnssec-response
|
||||
[DS05_ALGO_DEPRECATED]: #outcomes
|
||||
[DS05_ALGO_NOT_RECOMMENDED]: #outcomes
|
||||
[DS05_ALGO_NOT_ZONE_SIGN]: #outcomes
|
||||
[DS05_ALGO_OK]: #outcomes
|
||||
[DS05_ALGO_PRIVATE]: #outcomes
|
||||
[DS05_ALGO_RESERVED]: #outcomes
|
||||
[DS05_ALGO_UNASSIGNED]: #outcomes
|
||||
[DS05_NO_RESPONSE]: #outcomes
|
||||
[DS05_SERVER_NO_DNSSEC]: #outcomes
|
||||
[DS05_ZONE_NO_DNSSEC]: #outcomes
|
||||
[Get-Del-NS-Names-and-IPs]: ../MethodsV2.md#method-get-delegation-ns-names-and-ip-addresses
|
||||
[Get-Zone-NS-Names-and-IPs]: ../MethodsV2.md#method-get-zone-ns-names-and-ip-addresses
|
||||
[IANA DNSSEC algo num]: https://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xml
|
||||
[IANA RR Type List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4
|
||||
[RCODE Name]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[RFC 8624#3.1]: https://www.rfc-editor.org/rfc/rfc8624.html#section-3.1
|
||||
[RFC 9157#upd-8624]: https://www.rfc-editor.org/rfc/rfc9157#name-update-to-rfc-8624
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[Summary]: #Summary
|
||||
[Test procedure]: #Test-procedure
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
@@ -0,0 +1,38 @@
|
||||
## DNSSEC06: Verify DNSSEC additional processing
|
||||
|
||||
### Test case identifier
|
||||
**DNSSEC06** Verify DNSSEC additional processing
|
||||
|
||||
### Objective
|
||||
|
||||
In order for an authoritative name server to be DNSSEC compliant,
|
||||
it must serve DNSSEC signatures (RRSIG) as additional data in a DNS answer.
|
||||
This additional processing is described in section 3.1 of [RFC 4035](
|
||||
https://datatracker.ietf.org/doc/html/rfc4035#section-3.1).
|
||||
|
||||
### Inputs
|
||||
|
||||
The domain name to be tested.
|
||||
|
||||
### Ordered description of steps to be taken to execute the test case
|
||||
|
||||
1. For each name server configured for the domain:
|
||||
2. Retrieve the DNSKEY RR set from the child zone.
|
||||
3. If the answer from the query does contain a DNSKEY _and_ RRSIG, this
|
||||
test case passes.
|
||||
4. If there is no DNSKEY RR or RRSIG RR in the answer and the RCODE is
|
||||
NOERROR, this test case fails.
|
||||
|
||||
### Outcome(s)
|
||||
|
||||
If any of the name servers configured for the domains fail to answer with
|
||||
DNSSEC data, this test case fails.
|
||||
|
||||
### Special procedural requirements
|
||||
|
||||
None.
|
||||
|
||||
### Intercase dependencies
|
||||
|
||||
This test should only run if [DNSSEC07](dnssec07.md) has been successful
|
||||
in finding a DNSKEY for the domain.
|
||||
@@ -0,0 +1,340 @@
|
||||
# DNSSEC07: DNSSEC signed zone and DS in parent for signed zone
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC07**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#objective)
|
||||
* [Scope](#scope)
|
||||
* [Inputs](#inputs)
|
||||
* [Summary](#summary)
|
||||
* [Restrictions on combinations of the message tags](#restrictions-on-combinations-of-the-message-tags)
|
||||
* [Test procedure]
|
||||
* [Outcome(s)](#outcomes)
|
||||
* [Special procedural requirements](#special-procedural-requirements)
|
||||
* [Intercase dependencies](#intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
DNSSEC is the security upgrade of DNS, just as TLS is the security upgrade of
|
||||
HTTP (but done in very different ways). If a zone is upgraded to DNSSEC it means
|
||||
that it is signed by DNSSEC keys. This test case will verify if the zone has been
|
||||
DNSSEC signed, and if so, also verify that there is at least one DS record in the
|
||||
parent zone for the tested zone.
|
||||
|
||||
The public half of the DNSSEC keys are stored in the zone. For a zone to be
|
||||
correctly signed it is not enough to have DNSKEY records, but this test case
|
||||
assumes that the existence of at least one DNSKEY record with at least one RRSIG
|
||||
record [covering] the DNSKEY RRset means that the zone is signed.
|
||||
|
||||
It is not enough to have a signed zone. The parent zone must have a DS record to
|
||||
create a chain of trust from root. If the zone is signed (i.e. has at least one
|
||||
DNSKEY record) this test case will check if the parent zone has any DS records
|
||||
for the zone.
|
||||
|
||||
The method for authentication a DNS response is described in section 5 of
|
||||
[RFC 4035][RFC 4035#section-5]. The DNSKEY record is defined in section 2 of
|
||||
[RFC 4034][RFC 4034#section-2], and the DS record is defined in section 5 of
|
||||
[RFC 4034][RFC 4034#section-5].
|
||||
|
||||
While DNSSEC is an optional feature of the DNS protocol, not signing a zone
|
||||
with DNSSEC is deemed to be a deviation from best practices that should
|
||||
trigger an alert. A WARNING is therefore raised if the zone is not signed, or
|
||||
if DS records are absent for a signed zone.
|
||||
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
* "Undelegated DS" - The DS record or records submitted. Empty unless submitted.
|
||||
* "Undelegated Test" - TRUE if undelegated NS has been provided for the test.
|
||||
|
||||
|
||||
## Summary
|
||||
|
||||
* If no DNSKEY records are found, then further investigation will not be done
|
||||
and no messages will be outputted.
|
||||
|
||||
| Message Tag outputted | Level | Arguments | Message ID for message tag |
|
||||
|:------------------------------|:--------|:---------------|:--------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| DS07_DS_FOR_SIGNED_ZONE | INFO | | The parent zone has DS record or records for the signed child zone. |
|
||||
| DS07_DS_ON_PARENT_SERVER | INFO | ns_list | The following parent name servers respond with DS record or records for the child zone. Name servers: "{ns_list}". |
|
||||
| DS07_INCONSISTENT_DS | ERROR | | Inconsistent responses from parent name servers. Some include DS, others do not. |
|
||||
| DS07_INCONSISTENT_SIGNED | ERROR | | Inconsistent responses from name servers. Some include signed responses, others do not. |
|
||||
| DS07_NON_AUTH_RESPONSE_DNSKEY | WARNING | ns_list | The following name servers give a non authoritative response on DNSKEY query with DO bit set. Name servers: "{ns_list}". |
|
||||
| DS07_NOT_SIGNED | WARNING | | The zone is not signed. |
|
||||
| DS07_NOT_SIGNED_ON_SERVER | WARNING | ns_list | The following name servers respond with no DNSKEY (unsigned child zone). Name servers: "{ns_list}". |
|
||||
| DS07_NO_DS_ON_PARENT_SERVER | WARNING | ns_list | The following parent name servers respond without DS record for the child zone. Name servers: "{ns_list}". |
|
||||
| DS07_NO_DS_FOR_SIGNED_ZONE | WARNING | | The parent zone has no DS record for the signed child zone. |
|
||||
| DS07_NO_RESPONSE_DNSKEY | WARNING | ns_list | The following name servers do not respond on DNSKEY query with DO bit set. Name servers: "{ns_list}". |
|
||||
| DS07_SIGNED | INFO | | The zone is signed. |
|
||||
| DS07_SIGNED_ON_SERVER | INFO | ns_list | The following name servers respond with DNSKEY (signed child zone). Name servers: "{ns_list}". |
|
||||
| DS07_UNEXP_RCODE_RESP_DNSKEY | WARNING | ns_list, rcode | The following name servers respond with RCODE "{rcode}" instead of expected "NOERROR" on DNSKEY query with DO bit set. Name servers: "{ns_list}". |
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be changed in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
The name server names are assumed to be available at the time when the msgid
|
||||
is created, if the argument name is "ns" or "ns_list" even when in the
|
||||
"[Test procedure]" below it is only referred to the IP address of the name
|
||||
servers.
|
||||
|
||||
|
||||
### Restrictions on combinations of the message tags
|
||||
|
||||
Below are some restrictions on how some of the message tags, defined above, can
|
||||
be combined.
|
||||
|
||||
* For each test exactly one of either *DS07_INCONSISTENT_SIGNED*, *DS07_SIGNED* and
|
||||
*DS07_NOT_SIGNED* is outputted.
|
||||
* For each test only one of *DS07_INCONSISTENT_DS*, *DS07_DS_FOR_SIGNED_ZONE* and
|
||||
*DS07_NO_DS_FOR_SIGNED_ZONE* can be outputted.
|
||||
* If *DS07_NOT_SIGNED* is outputted, then none of *DS07_INCONSISTENT_DS*,
|
||||
*DS07_DS_FOR_SIGNED_ZONE* and *DS07_NO_DS_FOR_SIGNED_ZONE* is outputted.
|
||||
|
||||
## Test procedure
|
||||
|
||||
In this section and unless otherwise specified below, the terms "[DNS Query]"
|
||||
and "[DNSSEC Query]", respectively, follow the specification for DNS queries as
|
||||
specified in [DNS Query and Response Defaults]. The handling of the DNS responses
|
||||
on the DNS queries follow, unless otherwise specified below, what is specified
|
||||
for [DNS Response] and [DNSSEC Response], respectively, in the same
|
||||
specification.
|
||||
|
||||
A complete list of all DNS Resource Record types can be found in the
|
||||
[IANA RR Type List].
|
||||
|
||||
1. Create a [DNS Query] with query type SOA and query name *Child Zone*
|
||||
("SOA Query").
|
||||
|
||||
2. Create a [DNSSEC Query] with query type DNSKEY and query name *Child Zone*
|
||||
("DNSKEY Query").
|
||||
|
||||
3. Create a [DNSSEC Query] with query type DS and query name *Child Zone*
|
||||
("DS Query") (for the parent name servers).
|
||||
|
||||
4. Retrieve all name server names and IP addresses for *Child Zone* using methods
|
||||
[Get-Del-NS-Names-and-IPs] and [Get-Zone-NS-Names-and-IPs] ("Child NS IP").
|
||||
|
||||
5. Create the following empty sets:
|
||||
|
||||
1. Name server IP address ("Ignored Child NS").
|
||||
2. Name server IP address ("No Response DNSKEY Query").
|
||||
3. Name server IP address ("No Auth DNSKEY Response").
|
||||
4. Name server IP address and [RCODE Name] ("Error RCODE DNSKEY Response").
|
||||
5. Name server IP address ("No DNSKEY").
|
||||
6. Name server IP address ("Signed Response").
|
||||
7. Name server IP address ("Ignored Parent NS IP").
|
||||
8. Name server IP address ("No DS").
|
||||
9. Name server IP address ("DS in Response").
|
||||
|
||||
6. For each name server IP address in *Child NS IP* do:
|
||||
|
||||
1. Send *SOA Query* to the name server IP.
|
||||
2. Add the name server IP to the *Ignored Child NS* set and go to next name
|
||||
server IP if at least one of the following criteria is met:
|
||||
1. There is no DNS response.
|
||||
2. The [RCODE Name] in the response is not "NoError".
|
||||
3. The AA flag is not set in the response.
|
||||
4. The SOA record is missing in the answer section.
|
||||
3. Send *DNSKEY Query* to the name server IP.
|
||||
4. Add the name server IP to the *No Response DNSKEY Query* set and go to
|
||||
next name server IP if there is no DNS response to the query.
|
||||
5. Add the name server IP to the *No Auth DNSKEY Response* set and go to
|
||||
next name server IP if the AA bit is not set in the response.
|
||||
6. Add the name server IP and the [RCODE Name] to the
|
||||
*Error RCODE DNSKEY Response* set and go to next name server IP if the
|
||||
[RCODE Name] is not NOERROR.
|
||||
7. Add the name server IP to the *Signed Response* set and go to next name
|
||||
server IP if the answer section contains the following DNS records:
|
||||
* At least one DNSKEY record.
|
||||
* At least one RRSIG record [covering] the DNSKEY RRset.
|
||||
8. Else add the name server IP to the *No DNSKEY* set and go to
|
||||
next name server IP.
|
||||
|
||||
7. Retrieve all name server names and IP addresses for the parent zone of
|
||||
*Child Zone* using method [Get-Parent-NS-Names-and-IPs]
|
||||
("Parent NS Names and IPs").
|
||||
|
||||
8. If *Undelegated DS* is non-empty then do:
|
||||
|
||||
1. Add name server IP as "-" to the *DS in Response* set.
|
||||
2. Make *Parent NS Names and IPs* an empty set.
|
||||
|
||||
9. If the *Signed Response* set is empty, make *Parent NS Names and IPs* and
|
||||
*DS in Response* empty sets.
|
||||
|
||||
> Note: *Parent NS Names and IPs* will be empty if any of the following is true:
|
||||
> * *Undelegated test* is TRUE.
|
||||
> * *Undelegated DS* is non-empty.
|
||||
> * *Child Zone* is ".", i.e. root zone.
|
||||
> * The *Signed Response* set is empty.
|
||||
|
||||
10. For each unique parent name server IP in *Parent NS Names and IPs* do:
|
||||
1. Send *DS Query* to the name server IP.
|
||||
2. If at least one of the following criteria is met, then add name server IP
|
||||
to the "Ignored Parent NS IP" set and go to next parent name server:
|
||||
1. There is no [DNSSEC Response].
|
||||
2. The [RCODE Name] in the [DNSSEC Response] is not "NoError".
|
||||
3. The OPT record is absent in the [DNSSEC Response].
|
||||
4. The DO flag is unset in the [DNSSEC Response].
|
||||
5. The AA flag is not set in the [DNSSEC Response].
|
||||
3. Add the parent name server IP to the *DS in Response* set and go to the
|
||||
next parent name server IP if the answer section contains the following
|
||||
DNS records:
|
||||
* At least one DS record with *Child Zone* as owner name.
|
||||
* At least one RRSIG [covering] the DS RRset.
|
||||
4. Else add the parent name server IP to the *No DS* set and go
|
||||
to next parent name server IP.
|
||||
|
||||
11. The name server names are assumed to be available at the time when the msgid
|
||||
is created, if the argument name is "ns" or "ns_list" even when below it is
|
||||
only referred to the IP address of the name servers. For child zone name
|
||||
servers refer to the *Child NS IP* set, and for the parent name servers refer
|
||||
to the *Parent NS Names and IPs* set. In both sets more than one name server
|
||||
name may be connected to the same IP address. In such a case, multiple "ns"
|
||||
or multiple entries in the "ns_list" should be created.
|
||||
|
||||
12. If the following sets combined (i.e. the union of the sets) is identical to
|
||||
the *Child NS IP* set, output *[DS07_NOT_SIGNED]*.
|
||||
* *Ignored Child NS*
|
||||
* *No Response DNSKEY Query*
|
||||
* *No Auth DNSKEY Response*
|
||||
* *Error RCODE DNSKEY Response*
|
||||
|
||||
13. If the *No Response DNSKEY Query* set is non-empty then output
|
||||
*[DS07_NO_RESPONSE_DNSKEY]* with the list of name servers from the
|
||||
*No Response DNSKEY Query* set.
|
||||
|
||||
14. If the *No Auth DNSKEY Response* set is non-empty then output
|
||||
*[DS07_NON_AUTH_RESPONSE_DNSKEY]* with the list of name servers from the
|
||||
*No Auth DNSKEY Response* set.
|
||||
|
||||
15. If the *Error RCODE DNSKEY Response* set is non-empty then for each
|
||||
[RCODE Name] in the set output *[DS07_UNEXP_RCODE_RESP_DNSKEY]* with the
|
||||
[RCODE Name] and list of name servers from the *Error RCODE DNSKEY Response*
|
||||
set.
|
||||
|
||||
16. If the *Signed Response* set is non-empty then output
|
||||
*[DS07_SIGNED_ON_SERVER]* with the list of name servers from the
|
||||
*Signed Response* set.
|
||||
|
||||
17. If the *No DNSKEY* set is non-empty then output *[DS07_NOT_SIGNED_ON_SERVER]*
|
||||
with the list of name servers from the *No DNSKEY* set.
|
||||
|
||||
18. If both the *Signed Response* and *No DNSKEY* sets are non-empty then output
|
||||
*[DS07_INCONSISTENT_SIGNED]*.
|
||||
|
||||
19. If the *Signed Response* is non-empty and the *No DNSKEY* set is empty then
|
||||
output *[DS07_SIGNED]*.
|
||||
|
||||
20. If the *Signed Response* is empty and the *No DNSKEY* set is non-empty then
|
||||
output *[DS07_NOT_SIGNED]*.
|
||||
|
||||
21. If the *No DS* sets is non-empty, then output *[DS07_NO_DS_ON_PARENT_SERVER]*
|
||||
with the list of name servers from the *No DS* set.
|
||||
|
||||
22. If the *DS in Response* sets non-empty, then output
|
||||
*[DS07_DS_ON_PARENT_SERVER]* with the list of name servers from the
|
||||
*DS in Response* set.
|
||||
|
||||
22. If both the *No DS* and the *DS in Response* sets are non-empty, then output
|
||||
*[DS07_INCONSISTENT_DS]*.
|
||||
|
||||
24. If the *No DNSKEY* set is empty and the *Signed Response* set is non-empty,
|
||||
then do:
|
||||
1. If the *No DS* is non-empty and the *DS in Response* set is empty, then
|
||||
output *[DS07_NO_DS_FOR_SIGNED_ZONE]*.
|
||||
2. If the *No DS* is empty and the *DS in Response* set is non-empty, then
|
||||
output *[DS07_DS_FOR_SIGNED_ZONE]*.
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
on the ignored result.
|
||||
|
||||
This test case should always be the first test case to be run in the DNSSEC
|
||||
Module. The second test case to be run is [DNSSEC11]. If this test case outputs
|
||||
*[DS07_NOT_SIGNED]* for a test, then no other
|
||||
[test case of the DNSSEC module][DNSSEC#test-case-list] besides [DNSSEC11]
|
||||
should be run.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
"Covering" -- the term is used in this test case to describe the relation of an
|
||||
RRSIG to the signed RRset as described in the first four bullets in section 5.3.1
|
||||
in [RFC 4035][RFC 4035#section-5.3.1]. The verification described in the
|
||||
following four bullets and the actual verification against the DNSKEY is not
|
||||
included for this test case.
|
||||
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[Covering]: #terminology
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[DNS Query and Response Defaults]: ../DNSQueryAndResponseDefaults.md
|
||||
[DNS Query]: ../DNSQueryAndResponseDefaults.md#default-setting-in-dns-query
|
||||
[DNS Response]: ../DNSQueryAndResponseDefaults.md#default-handling-of-a-dns-response
|
||||
[DNSSEC Query]: ../DNSQueryAndResponseDefaults.md#default-setting-in-dnssec-query
|
||||
[DNSSEC README]: README.md
|
||||
[DNSSEC#test-case-list]: README.md#test-case-list
|
||||
[DNSSEC Response]: ../DNSQueryAndResponseDefaults.md#default-handling-of-a-dnssec-response
|
||||
[DNSSEC11]: dnssec11.md
|
||||
[DS07_DS_FOR_SIGNED_ZONE]: #summary
|
||||
[DS07_DS_ON_PARENT_SERVER]: #summary
|
||||
[DS07_INCONSISTENT_DS]: #summary
|
||||
[DS07_INCONSISTENT_SIGNED]: #summary
|
||||
[DS07_NON_AUTH_RESPONSE_DNSKEY]: #summary
|
||||
[DS07_NOT_SIGNED]: #summary
|
||||
[DS07_NOT_SIGNED_ON_SERVER]: #summary
|
||||
[DS07_NO_DS_ON_PARENT_SERVER]: #summary
|
||||
[DS07_NO_DS_FOR_SIGNED_ZONE]: #summary
|
||||
[DS07_NO_RESPONSE_DNSKEY]: #summary
|
||||
[DS07_SIGNED]: #summary
|
||||
[DS07_SIGNED_ON_SERVER]: #summary
|
||||
[DS07_UNEXP_RCODE_RESP_DNSKEY]: #summary
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[Get-Del-NS-Names-and-IPs]: ../MethodsV2.md#method-get-delegation-ns-names-and-ip-addresses
|
||||
[Get-Parent-NS-Names-and-IPs]: ../MethodsV2.md#method-get-parent-ns-names-and-ip-addresses
|
||||
[Get-Zone-NS-Names-and-IPs]: ../MethodsV2.md#method-get-zone-ns-names-and-ip-addresses
|
||||
[IANA RR Type List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RCODE Name]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[RFC 4034#section-2]: https://datatracker.ietf.org/doc/html/rfc4034#section-2
|
||||
[RFC 4034#section-5]: https://datatracker.ietf.org/doc/html/rfc4034#section-5
|
||||
[RFC 4035#section-5.3.1]: https://datatracker.ietf.org/doc/html/rfc4035#section-5.3.1
|
||||
[RFC 4035#section-5]: https://datatracker.ietf.org/doc/html/rfc4035#section-5
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[Test procedure]: #test-procedure
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
@@ -0,0 +1,192 @@
|
||||
# DNSSEC08: Valid RRSIG for DNSKEY
|
||||
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC08**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#objective)
|
||||
* [Scope](#scope)
|
||||
* [Inputs](#inputs)
|
||||
* [Summary](#summary)
|
||||
* [Test procedure](#test-procedure)
|
||||
* [Outcome(s)](#outcomes)
|
||||
* [Special procedural requirements](#special-procedural-requirements)
|
||||
* [Intercase dependencies](#intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
A DNSSEC signed zone should have a DNSKEY RRset in the zone apex
|
||||
([RFC 4035][RFC 4035#section-2.1], section 2.1) and that RRset
|
||||
should be signed by a key that matches one of the records in the
|
||||
DNSKEY RRset ([RFC 4035][RFC 4035#section-2.2], section 2.2).
|
||||
|
||||
This test case will verify if the *Child Zone* meets that
|
||||
requirement.
|
||||
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is tested and reported by [Connectivity01]. This test
|
||||
case will just ignore non-responsive name servers or name servers not giving a
|
||||
correct DNS response for an authoritative name server.
|
||||
|
||||
This test case is only relevant if the zone has been DNSSEC signed.
|
||||
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
|
||||
|
||||
## Summary
|
||||
|
||||
* If no DNSKEY records are found, then further investigation will not be done
|
||||
and no messages will be outputted.
|
||||
|
||||
Message Tag outputted | Level | Arguments | Description of when message tag is outputted
|
||||
:----------------------------------|:--------|:-------------------|:--------------------------------------------
|
||||
DS08_ALGO_NOT_SUPPORTED_BY_ZM | NOTICE | ns_ip_list, algo_mnemo, algo_num, keytag | This installation of Zonemaster does not support the DNSKEY algorithm.
|
||||
DS08_DNSKEY_RRSIG_EXPIRED | ERROR | ns_ip_list, keytag | DNSKEY RRset is signed with an RRSIG that has expired.
|
||||
DS08_DNSKEY_RRSIG_NOT_YET_VALID | ERROR | ns_ip_list, keytag | DNSKEY RRset is signed with a not yet valid RRSIG.
|
||||
DS08_MISSING_RRSIG_IN_RESPONSE | ERROR | ns_ip_list | DNSKEY is unsigned which is against expectation.
|
||||
DS08_NO_MATCHING_DNSKEY | ERROR | ns_ip_list, keytag | DNSKEY RRset is signed with an RRSIG that does not match any DNSKEY.
|
||||
DS08_RRSIG_NOT_VALID_BY_DNSKEY | ERROR | ns_ip_list, keytag | DNSKEY RRset is signed with an RRSIG that cannot be validated by the matching DNSKEY.
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be changed in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
|
||||
## Test procedure
|
||||
|
||||
1. Create a DNSKEY query with DO flag set for *Child Zone* ("DNSKEY Query").
|
||||
|
||||
2. Retrieve all name server IP addresses for the
|
||||
*Child Zone* using [Method4] and [Method5] ("NS IP").
|
||||
|
||||
3. Create the following empty sets:
|
||||
1. Name server IP address ("DNSKEY without RRSIG").
|
||||
2. Name server IP address and RRSIG key tag ("DNSKEY RRSIG not yet valid").
|
||||
3. Name server IP address and RRSIG key tag ("DNSKEY RRSIG expired").
|
||||
4. Name server IP address and RRSIG key tag ("No matching DNSKEY").
|
||||
5. Name server IP address and RRSIG key tag ("RRSIG not valid by DNSKEY").
|
||||
6. Name server IP address, DNSKEY record key tag and DNSKEY algorithm code
|
||||
("Algo Not Supported By ZM").
|
||||
|
||||
4. For each name server IP address in *NS IP* do:
|
||||
|
||||
1. Send *DNSKEY Query* to the name server IP.
|
||||
2. If at least one of the following criteria is met, then go to next name
|
||||
server IP:
|
||||
1. There is no DNS response.
|
||||
2. The RCODE of response is not "NoError" ([IANA RCODE List]).
|
||||
3. The AA flag is not set in the response.
|
||||
4. There is no DNSKEY record with matching owner name in the answer
|
||||
section.
|
||||
3. Retrieve the DNSKEY records and its RRSIG records from the answer section.
|
||||
4. If there is no RRSIG for the DNSKEY record, then add the name server IP
|
||||
address to the *DNSKEY without RRSIG* set and go to next name server IP.
|
||||
8. Else, for each DNSKEY RRSIG record do:
|
||||
1. If the RRSIG record start of validity is after the time of the
|
||||
test, then add name server IP and RRSIG key tag to the
|
||||
*DNSKEY RRSIG not yet valid* set.
|
||||
2. Else, if the RRSIG record end of validity is before the time of the
|
||||
test, then add name server IP and RRSIG key tag to the
|
||||
*DNSKEY RRSIG expired* set.
|
||||
3. Else, if the Zonemaster installation does not have support for the
|
||||
DNSKEY algorithm that created the RRSIG, then add name server IP,
|
||||
DNSKEY algorithm and DNSKEY key tag to the *Algo Not Supported By ZM*
|
||||
set.
|
||||
4. Else, if the RRSIG does not match any DNSKEY, then add the name server
|
||||
IP and the RRSIG key tag to the *No matching DNSKEY* set.
|
||||
5. Else, if the RRSIG cannot be validated by the matching DNSKEY record,
|
||||
then add the name server
|
||||
IP and the RRSIG key tag to the *RRSIG not valid by DNSKEY* set.
|
||||
|
||||
6. If the *DNSKEY without RRSIG* set is non-empty, then output
|
||||
*[DS08_MISSING_RRSIG_IN_RESPONSE]* with the name servers IP addresses from
|
||||
the set.
|
||||
|
||||
7. If the *DNSKEY RRSIG not yet valid* set is non-empty, then for each RRSIG key tag
|
||||
from the set output *[DS08_DNSKEY_RRSIG_NOT_YET_VALID]* with the key tag and the
|
||||
name servers IP addresses from the set.
|
||||
|
||||
8. If the *DNSKEY RRSIG expired* set is non-empty, then for each RRSIG key tag
|
||||
from the set output *[DS08_DNSKEY_RRSIG_EXPIRED]* with the key tag and the
|
||||
name servers IP addresses from the set.
|
||||
|
||||
9. If the *No matching DNSKEY* set is non-empty, then for each RRSIG key tag
|
||||
from the set output *[DS08_NO_MATCHING_DNSKEY]* with the key tag and the
|
||||
name servers IP addresses from the set.
|
||||
|
||||
10. If the *RRSIG not valid by DNSKEY* set is non-empty, then for each RRSIG key
|
||||
ID from the set output *[DS08_RRSIG_NOT_VALID_BY_DNSKEY]* with the key tag and
|
||||
the name servers IP addresses from the set.
|
||||
|
||||
11. If the *Algo Not Supported By ZM* set is non-empty, then output
|
||||
*[DS08_ALGO_NOT_SUPPORTED_BY_ZM]* for each DNSKEY key tag with the name
|
||||
server IP addresses, the key tag and the algorithm name and code from the set.
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
on the ignored result.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
No special terminology for this test case.
|
||||
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[DNSSEC README]: ./README.md
|
||||
[DNSSEC README]: README.md
|
||||
[DS08_ALGO_NOT_SUPPORTED_BY_ZM]: #summary
|
||||
[DS08_DNSKEY_RRSIG_EXPIRED]: #summary
|
||||
[DS08_DNSKEY_RRSIG_NOT_YET_VALID]: #summary
|
||||
[DS08_MISSING_RRSIG_IN_RESPONSE]: #summary
|
||||
[DS08_NO_MATCHING_DNSKEY]: #summary
|
||||
[DS08_RRSIG_NOT_VALID_BY_DNSKEY]: #summary
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[IANA RCODE List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 4035#section-2.1]: https://datatracker.ietf.org/doc/html/rfc4035#section-2.1
|
||||
[RFC 4035#section-2.2]: https://datatracker.ietf.org/doc/html/rfc4035#section-2.2
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
@@ -0,0 +1,212 @@
|
||||
# DNSSEC09: RRSIG(SOA) must be valid and created by a valid DNSKEY
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC09**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#objective)
|
||||
* [Scope](#scope)
|
||||
* [Inputs](#inputs)
|
||||
* [Summary](#summary)
|
||||
* [Test procedure](#test-procedure)
|
||||
* [Outcome(s)](#outcomes)
|
||||
* [Special procedural requirements](#special-procedural-requirements)
|
||||
* [Intercase dependencies](#intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
If the zone is signed, the SOA RR should be signed with a valid RRSIG
|
||||
using a DNSKEY from the DNSKEY RR set. This is described
|
||||
in [RFC 4035][RFC 4035#section-2.2], section 2.2.
|
||||
|
||||
This test case will verify if the *Child Zone* meets that
|
||||
requirement.
|
||||
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is tested and reported by [Connectivity01]. This test
|
||||
case will just ignore non-responsive name servers or name servers not giving a
|
||||
correct DNS response for an authoritative name server.
|
||||
|
||||
Inconsistencies in the SOA record are expected to be caught by [Consistency01],
|
||||
[Consistency02], [Consistency03] and [Consistency06].
|
||||
|
||||
Inconsistencies in the DNSKEY RRset are expected to be caught by [DNSSEC08].
|
||||
|
||||
This test case is only relevant if the zone has been DNSSEC signed.
|
||||
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
|
||||
|
||||
## Summary
|
||||
|
||||
* If no DNSKEY records are found, then further investigation will not be done
|
||||
and no messages will be outputted.
|
||||
|
||||
Message Tag outputted | Level | Arguments | Description of when message tag is outputted
|
||||
:----------------------------------|:--------|:-------------------|:--------------------------------------------
|
||||
DS09_ALGO_NOT_SUPPORTED_BY_ZM | NOTICE | ns_ip_list, algo_mnemo, algo_num, keytag | This installation of Zonemaster does not support the DNSKEY algorithm.
|
||||
DS09_MISSING_RRSIG_IN_RESPONSE | ERROR | ns_ip_list | SOA is unsigned which is against expectation
|
||||
DS09_NO_MATCHING_DNSKEY | ERROR | ns_ip_list, keytag | SOA is signed with an RRSIG that does not match any DNSKEY
|
||||
DS09_RRSIG_NOT_VALID_BY_DNSKEY | ERROR | ns_ip_list, keytag | SOA is signed with an RRSIG that cannot be validated by the matching DNSKEY
|
||||
DS09_SOA_RRSIG_EXPIRED | ERROR | ns_ip_list, keytag | SOA is signed with an RRSIG that has expired
|
||||
DS09_SOA_RRSIG_NOT_YET_VALID | ERROR | ns_ip_list, keytag | SOA is signed with a not yet valid RRSIG
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be changed in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
|
||||
## Test procedure
|
||||
|
||||
1. Create a DNSKEY query with DO flag set for *Child Zone* ("DNSKEY Query").
|
||||
|
||||
2. Create an SOA query with DO flag set for *Child Zone* ("SOA Query").
|
||||
|
||||
3. Retrieve all name server IP addresses for the
|
||||
*Child Zone* using [Method4] and [Method5] ("NS IP").
|
||||
|
||||
4. Create the following empty sets:
|
||||
1. Name server IP address ("SOA without RRSIG").
|
||||
2. Name server IP address and RRSIG key tag ("SOA RRSIG not yet valid").
|
||||
3. Name server IP address and RRSIG key tag ("SOA RRSIG expired").
|
||||
4. Name server IP address and RRSIG key tag ("No matching DNSKEY").
|
||||
5. Name server IP address and RRSIG key tag ("RRSIG not valid by DNSKEY").
|
||||
6. Name server IP address, DNSKEY record key tag and DNSKEY algorithm code
|
||||
("Algo Not Supported By ZM").
|
||||
|
||||
5. For each name server IP address in *NS IP* do:
|
||||
|
||||
1. Send *DNSKEY Query* to the name server IP.
|
||||
2. If at least one of the following criteria is met, then go to next name
|
||||
server IP:
|
||||
1. There is no DNS response.
|
||||
2. The RCODE of response is not "NoError" ([IANA RCODE List]).
|
||||
3. The AA flag is not set in the response.
|
||||
4. There is no DNSKEY record with matching owner name in the answer
|
||||
section.
|
||||
3. Retrieve the DNSKEY records with matching owner name from the answer
|
||||
section (any DNSKEY records with non-matching owner name are ignored).
|
||||
4. Send *SOA Query* over UDP to the name server IP.
|
||||
5. If at least one of the following criteria is met, then go to next name
|
||||
server IP:
|
||||
1. There is no DNS response.
|
||||
2. The RCODE of response is not "NoError" ([IANA RCODE List]).
|
||||
3. The AA flag is not set in the response.
|
||||
4. There is no SOA record with matching owner name in the answer
|
||||
section.
|
||||
6. Retrieve the SOA record with matching owner name and its RRSIG record.
|
||||
* Retrieve only one SOA record if there are multiple records. Any SOA
|
||||
records with non-matching owner name are ignored.
|
||||
7. If there is no RRSIG for the SOA record, then add the name server IP
|
||||
address to the *SOA without RRSIG* set and go to next name server IP.
|
||||
8. Else, for each SOA RRSIG record do:
|
||||
1. If the RRSIG record start of validity is after the time of the
|
||||
test, then add name server IP and RRSIG key tag to the
|
||||
*SOA RRSIG not yet valid* set.
|
||||
2. Else, if the RRSIG record end of validity is before the time of the
|
||||
test, then add name server IP and RRSIG key tag to the
|
||||
*SOA RRSIG expired* set.
|
||||
3. Else, if the Zonemaster installation does not have support for the
|
||||
DNSKEY algorithm that created the RRSIG, then add name server IP,
|
||||
DNSKEY algorithm and DNSKEY key tag to the *Algo Not Supported By ZM*
|
||||
set.
|
||||
4. Else, if the RRSIG does not match any DNSKEY, then add the name server
|
||||
IP and the RRSIG key tag to the *No matching DNSKEY* set.
|
||||
5. Else, if the RRSIG cannot be validated by the matching DNSKEY record,
|
||||
then add the name server
|
||||
IP and the RRSIG key tag to the *RRSIG not valid by DNSKEY* set.
|
||||
|
||||
6. If the *SOA without RRSIG* set is non-empty, then output
|
||||
*[DS09_MISSING_RRSIG_IN_RESPONSE]* with the name servers IP addresses from
|
||||
the set.
|
||||
|
||||
7. If the *SOA RRSIG not yet valid* set is non-empty, then for each RRSIG key tag
|
||||
from the set output *[DS09_SOA_RRSIG_NOT_YET_VALID]* with the key tag and the
|
||||
name servers IP addresses from the set.
|
||||
|
||||
8. If the *SOA RRSIG expired* set is non-empty, then for each RRSIG key tag
|
||||
from the set output *[DS09_SOA_RRSIG_EXPIRED]* with the key tag and the
|
||||
name servers IP addresses from the set.
|
||||
|
||||
9. If the *No matching DNSKEY* set is non-empty, then for each RRSIG key tag
|
||||
from the set output *[DS09_NO_MATCHING_DNSKEY]* with the key tag and the
|
||||
name servers IP addresses from the set.
|
||||
|
||||
10. If the *RRSIG not valid by DNSKEY* set is non-empty, then for each RRSIG key
|
||||
ID from the set output *[DS09_RRSIG_NOT_VALID_BY_DNSKEY]* with the key tag and
|
||||
the name servers IP addresses from the set.
|
||||
|
||||
11. If the *Algo Not Supported By ZM* set is non-empty, then output
|
||||
*[DS09_ALGO_NOT_SUPPORTED_BY_ZM]* for each DNSKEY key tag with the name
|
||||
server IP addresses, the key tag and the algorithm name and code from the set.
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
on the ignored result.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
No special terminology for this test case.
|
||||
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[Consistency01]: ../Consistency-TP/consistency01.md
|
||||
[Consistency02]: ../Consistency-TP/consistency02.md
|
||||
[Consistency03]: ../Consistency-TP/consistency03.md
|
||||
[Consistency06]: ../Consistency-TP/consistency06.md
|
||||
[DNSSEC README]: ./README.md
|
||||
[DNSSEC08]: ../DNSSEC-TP/dnssec08.md
|
||||
[DS09_ALGO_NOT_SUPPORTED_BY_ZM]: #summary
|
||||
[DS09_MISSING_RRSIG_IN_RESPONSE]: #summary
|
||||
[DS09_NO_MATCHING_DNSKEY]: #summary
|
||||
[DS09_RRSIG_NOT_VALID_BY_DNSKEY]: #summary
|
||||
[DS09_SOA_RRSIG_EXPIRED]: #summary
|
||||
[DS09_SOA_RRSIG_NOT_YET_VALID]: #summary
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[IANA RCODE List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 4035#section-2.2]: https://datatracker.ietf.org/doc/html/rfc4035#section-2.2
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
@@ -0,0 +1,617 @@
|
||||
# DNSSEC10: Zone contains NSEC or NSEC3 records
|
||||
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC10**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#objective)
|
||||
* [Scope](#scope)
|
||||
* [Inputs](#inputs)
|
||||
* [Summary](#summary)
|
||||
* [Comments on mixing of NSEC and NSEC3](#comments-on-mixing-of-nsec-and-nsec3)
|
||||
* [Test procedure]
|
||||
* [Outcome(s)](#outcomes)
|
||||
* [Special procedural requirements](#special-procedural-requirements)
|
||||
* [Intercase dependencies](#intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
When DNSSEC is enabled, NSEC or NSEC3 records provide a secure denial of
|
||||
existence for records not present in the zone. This Test Case verifies that
|
||||
correct NSEC or NSEC3 records with valid signatures are returned for a query for
|
||||
an RR type that does not exist for that specific name (node in the DNS tree).
|
||||
The existing RR types are listed in the [IANA RR Type List].
|
||||
|
||||
Furthermore, it is verified that the name servers for the zone are consistent
|
||||
about NSEC and NSEC3, i.e. either all servers should use NSEC or all servers
|
||||
should use NSEC3. It is never permitted to serve both NSEC and NSEC3 for the
|
||||
same zone.
|
||||
|
||||
The NSEC3PARAM RR that must exist in the zone (in apex, and apex only) if NSEC3
|
||||
is used, but must not exist in a zone using NSEC.
|
||||
|
||||
The use of the NSEC RR type is described in [RFC 4035][RFC 4035#section-3.1.3],
|
||||
section 3.1.3, and the description of the NSEC RR itself is in
|
||||
[RFC 4034][RFC 4034#section-4], section 4.
|
||||
|
||||
The description of the NSEC3 and NSEC3PARAM RRs are found in
|
||||
[RFC 5155][RFC 5155#section-3], section 3, and [RFC 5155][RFC 5155#section-4],
|
||||
section 4, respectively. The use of NSEC3 in the DNS response is described in
|
||||
[RFC 5155][RFC 5155#section-7.2], section 7.2.
|
||||
|
||||
|
||||
## Scope
|
||||
|
||||
This test case will just ignore non-responsive name servers or name servers not
|
||||
giving a correct DNS response for an authoritative name server (covered by
|
||||
[Connectivity01]).
|
||||
|
||||
This test case is only relevant if the zone has been DNSSEC signed.
|
||||
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
|
||||
|
||||
## Summary
|
||||
|
||||
* If no DNSKEY records are found, then further investigation will not be done
|
||||
and no messages will be outputted.
|
||||
|
||||
Message Tag outputted | Level | Arguments | Message ID for message tag
|
||||
:----------------------------------|:--------|:-----------|:--------------------------------------------
|
||||
DS10_ALGO_NOT_SUPPORTED_BY_ZM | NOTICE | ns_list, algo_mnemo, algo_num, keytag | DNSKEY with tag {keytag} uses unsupported algorithm {algo_num} ({algo_mnemo}) by this installation of Zonemaster. Fetched from name servers "{ns_list}".
|
||||
DS10_ERR_MULT_NSEC | ERROR | ns_list | Multiple NSEC records when one is expected. Fetched from name servers "{ns_list}".
|
||||
DS10_ERR_MULT_NSEC3 | ERROR | ns_list | Multiple NSEC3 records when one is expected. Fetched from name servers "{ns_list}".
|
||||
DS10_ERR_MULT_NSEC3PARAM | ERROR | ns_list | Multiple NSEC3PARAM records when one is expected. Fetched from name servers "{ns_list}".
|
||||
DS10_EXPECTED_NSEC_NSEC3_MISSING | ERROR | ns_list | The server responded with DNSKEY but not with expected NSEC or NSEC3. Fetched from name servers "{ns_list}".
|
||||
DS10_HAS_NSEC | INFO | ns_list | The zone has NSEC records. Fetched from name servers "{ns_list}".
|
||||
DS10_HAS_NSEC3 | INFO | ns_list | The zone has NSEC3 records. Fetched from name servers "{ns_list}".
|
||||
DS10_INCONSISTENT_NSEC | ERROR | ns_list | Inconsistent responses from zone with NSEC. Fetched from name servers "{ns_list}".
|
||||
DS10_INCONSISTENT_NSEC3 | ERROR | ns_list | Inconsistent responses from zone with NSEC3. Fetched from name servers "{ns_list}".
|
||||
DS10_INCONSISTENT_NSEC_NSEC3 | ERROR |ns_list_nsec, ns_list_nsec3| The zone is inconsistent on NSEC and NSEC3. NSEC is fetched from name servers "{ns_list_nsec}". NSEC3 is fetched from name servers "{ns_list_nsec3}".
|
||||
DS10_MIXED_NSEC_NSEC3 | ERROR | ns_list | The zone responds with both NSEC and NSEC3, where only one of them is expected. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3PARAM_GIVES_ERR_ANSWER | ERROR | ns_list | Unexpected DNS record in the answer section on an NSEC3PARAM query. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3PARAM_MISMATCHES_APEX | ERROR | ns_list | The returned NSEC3PARAM record has an unexpected non-apex owner name. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3PARAM_QUERY_RESPONSE_ERR | ERROR | ns_list | No response or error in response on query for NSEC3PARAM. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_ERR_TYPE_LIST | ERROR | ns_list | NSEC3 record for the zone apex with incorrect type list. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_MISMATCHES_APEX | ERROR | ns_list | The returned NSEC3 record unexpectedly does not match the zone name. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_MISSING_SIGNATURE | ERROR | ns_list | Missing RRSIG (signature) for the NSEC3 record or records. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_NODATA_MISSING_SOA | ERROR | ns_list | Missing SOA record in NODATA response with NSEC3. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_NODATA_WRONG_SOA | ERROR | ns_list, domain | Wrong owner name ("{domain}") on SOA record in NODATA response with NSEC3. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_NO_VERIFIED_SIGNATURE | ERROR | ns_list | The RRSIG (signature) for the NSEC3 record cannot be verified. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_RRSIG_EXPIRED | ERROR | ns_list, keytag | The RRSIG (signature) with tag {keytag} for the NSEC3 record has expired. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_RRSIG_NOT_YET_VALID | ERROR | ns_list, keytag | The RRSIG (signature) with tag {keytag} for the NSEC3 record it not yet valid. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_RRSIG_NO_DNSKEY | WARNING | ns_list, keytag | There is no DNSKEY record matching the RRSIG (signature) with tag {keytag} for the NSEC3 record. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC3_RRSIG_VERIFY_ERROR | ERROR | ns_list, keytag | The RRSIG (signature) with tag {keytag} for the NSEC3 record cannot be verified. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_ERR_TYPE_LIST | ERROR | ns_list | NSEC record for the zone apex with incorrect type list. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_GIVES_ERR_ANSWER | ERROR | ns_list | Unexpected DNS record in the answer section on an NSEC query. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_MISMATCHES_APEX | ERROR | ns_list | The returned NSEC record has an unexpected non-apex owner name. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_MISSING_SIGNATURE | ERROR | ns_list | Missing RRSIG (signature) for the NSEC record or records. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_NODATA_MISSING_SOA | ERROR | ns_list | Missing SOA record in NODATA response with NSEC. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_NODATA_WRONG_SOA | ERROR | ns_list, domain | Wrong owner name ("{domain}") on SOA record in NODATA response with NSEC. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_NO_VERIFIED_SIGNATURE | ERROR | ns_list | There is no RRSIG (signature) for the NSEC record that can be verified. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_QUERY_RESPONSE_ERR | ERROR | ns_list | No response or error in response on query for NSEC. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_RRSIG_EXPIRED | ERROR | ns_list, keytag | The RRSIG (signature) with tag {keytag} for the NSEC record has expired. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_RRSIG_NOT_YET_VALID | ERROR | ns_list, keytag | The RRSIG (signature) with tag {keytag} for the NSEC record it not yet valid. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_RRSIG_NO_DNSKEY | WARNING | ns_list, keytag | There is no DNSKEY record matching the RRSIG (signature) with tag {keytag} for the NSEC record. Fetched from name servers "{ns_list}".
|
||||
DS10_NSEC_RRSIG_VERIFY_ERROR | ERROR | ns_list, keytag | The RRSIG (signature) with tag {keytag} for the NSEC record cannot be verified. Fetched from name servers "{ns_list}".
|
||||
DS10_SERVER_NO_DNSSEC | ERROR | ns_list | The following name servers do not support DNSSEC or have not been properly configured. Testing for NSEC and NSEC3 has been skipped on these servers. Fetched from name servers "{ns_list}".
|
||||
DS10_ZONE_NO_DNSSEC | NOTICE | ns_list | The zone is not DNSSEC signed or not properly DNSSEC signed. Testing for NSEC and NSEC3 has been skipped. Fetched from name servers "{ns_list}".
|
||||
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be changed in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
The name server names are assumed to be available at the time when the msgid
|
||||
is created, if the argument name is "ns" or "ns_list" even when in the
|
||||
"[Test procedure]" below it is only referred to the IP address of the name
|
||||
servers.
|
||||
|
||||
For the Zonemaster definition of the mnemonics for DNSKEY algorithms, see the
|
||||
algorithm table in the "Objective" section in [DNSSEC05][DNSSEC05#objective].
|
||||
|
||||
### Comments on mixing of NSEC and NSEC3
|
||||
|
||||
In section "[Test procedure]" below, if the server returns an NSEC record (either
|
||||
in the answer section when querying for NSEC or on the authority section when
|
||||
querying for NSEC3PARAM) it is considered to be "NSEC type" for the zone.
|
||||
|
||||
If the server returns an NSEC3PARAM record in the answer section when querying for
|
||||
it or an NSEC3 record in the authority section when querying for NSEC, it is
|
||||
considered to be "NSEC3 type" for the zone.
|
||||
|
||||
*[DS10_MIXED_NSEC_NSEC3]* means that one or several name servers have been
|
||||
identified as both "NSEC type" and "NSEC3 type".
|
||||
|
||||
*[DS10_INCONSISTENT_NSEC_NSEC3]* means that some name servers are non-mixed
|
||||
"NSEC type" and others are non-mixed "NSEC3 type" for the same zone.
|
||||
|
||||
|
||||
## Test procedure
|
||||
|
||||
In this section and unless otherwise specified below, the term "[DNSSEC Query]"
|
||||
follow the specification for DNS queries as specified in
|
||||
[DNS Query and Response Defaults]. The handling of the DNS responses on the DNS
|
||||
queries follow, unless otherwise specified below, what is specified for
|
||||
[DNSSEC Response] in the same specification.
|
||||
|
||||
A complete list of all DNS Resource Record types can be found in the
|
||||
[IANA RR Type List].
|
||||
|
||||
1. Create a [DNSSEC Query] with query type DNSKEY and query name *Child Zone*
|
||||
("DNSKEY Query").
|
||||
|
||||
2. Create a [DNSSEC Query] with query type NSEC and query name *Child Zone*
|
||||
("NSEC Query").
|
||||
|
||||
3. Create a [DNSSEC Query] with query type NSEC3PARAM and query name *Child Zone*
|
||||
("NSEC3PARAM Query").
|
||||
|
||||
4. Retrieve all name server names and IP addresses for *Child Zone* using
|
||||
methods [Get-Del-NS-Names-and-IPs] and [Get-Zone-NS-Names-and-IPs] ("NS IP").
|
||||
|
||||
5. Create the following empty sets:
|
||||
|
||||
1. Name server IP address, DNSKEY record key tag and DNSKEY algorithm code
|
||||
("Algo Not Supported By ZM").
|
||||
2. Name server IP address ("Erroneous Multiple NSEC").
|
||||
3. Name server IP address ("Erroneous Multiple NSEC3").
|
||||
4. Name server IP address ("Erroneous Multiple NSEC3PARAM").
|
||||
5. Name server IP address ("Ignored NS IP").
|
||||
6. Name server IP address ("NSEC In Answer").
|
||||
7. Name server IP address ("NSEC Incorrect Type List").
|
||||
8. Name server IP address ("NSEC Mismatches Apex").
|
||||
9. Name server IP address ("NSEC Missing Signature").
|
||||
10. Name server IP address and owner name (domain name data)
|
||||
("NSEC NODATA Wrong SOA").
|
||||
11. Name server IP address ("NSEC NODATA Missing SOA").
|
||||
12. Name server IP address ("NSEC Query Gives Erroneous Answer").
|
||||
13. Name server IP address ("NSEC Query Gives NSEC3 NODATA").
|
||||
14. Name server IP address and key tag ("NSEC RRSIG Verify Error").
|
||||
15. Name server IP address and key tag ("NSEC RRSIG Expired").
|
||||
16. Name server IP address and key tag ("NSEC RRSIG Not Yet Valid").
|
||||
17. Name server IP address and key tag ("NSEC RRSIG No DNSKEY").
|
||||
18. Name server IP address ("NSEC RRSIG Verified").
|
||||
19. Name server IP address ("NSEC Query Response Error").
|
||||
20. Name server IP address ("NSEC3 Incorrect Type List").
|
||||
21. Name server IP address ("NSEC3 Mismatches Apex").
|
||||
22. Name server IP address ("NSEC3 Missing Signature").
|
||||
23. Name server IP address and owner name (domain name data)
|
||||
("NSEC3 NODATA Wrong SOA").
|
||||
24. Name server IP address ("NSEC3 NODATA Missing SOA").
|
||||
25. Name server IP address and key tag ("NSEC3 RRSIG Verify Error").
|
||||
26. Name server IP address and key tag ("NSEC3 RRSIG Expired").
|
||||
27. Name server IP address and key tag ("NSEC3 RRSIG Not Yet Valid").
|
||||
28. Name server IP address and key tag ("NSEC3 RRSIG No DNSKEY").
|
||||
29. Name server IP address ("NSEC3 RRSIG Verified").
|
||||
30. Name server IP address ("NSEC3PARAM In Answer").
|
||||
31. Name server IP address ("NSEC3PARAM Mismatches Apex").
|
||||
32. Name server IP address ("NSEC3PARAM Query Gives Erroneous Answer").
|
||||
33. Name server IP address ("NSEC3PARAM Query Gives NSEC NODATA").
|
||||
34. Name server IP address ("NSEC3PARAM Query Response Error").
|
||||
35. Name server IP address ("Responds without DNSKEY").
|
||||
36. Name server IP address ("Responds with DNSKEY").
|
||||
|
||||
6. For each name server IP address in *NS IP* do:
|
||||
|
||||
1. Send *DNSKEY Query* to the name server IP.
|
||||
2. Add the name server IP to the *Ignored NS IP* set and go to next name
|
||||
server IP if at least one of the following criteria is met:
|
||||
1. There is no DNS response.
|
||||
2. The [RCODE Name] in the response is not "NoError".
|
||||
3. The AA flag is not set in the response.
|
||||
3. If the response does not contain any DNSKEY record with owner name
|
||||
matching *Child Zone* in the answer section, add name server name and IP
|
||||
to the *Responds without DNSKEY* set and go to next server.
|
||||
4. Else, add name server IP to the *Responds with DNSKEY* set and retrieve
|
||||
the DNSKEY records from the answer section to be used in validation below.
|
||||
5. Send *NSEC Query* to the name server IP and do:
|
||||
1. If at least one of the following criteria is met, then add the name
|
||||
server IP to the *NSEC Query Response Error* set:
|
||||
1. There is no DNS response.
|
||||
2. The [RCODE Name] in the response is not "NoError".
|
||||
3. The AA flag is not set in the response.
|
||||
2. Else if the answer section is non-empty, then do:
|
||||
1. If the answer section has at least one NSEC RR then do:
|
||||
1. Add the name server IP to the *NSEC In Answer* set.
|
||||
2. If the number of NSEC records is greater than one then add name
|
||||
server IP to the *Erroneous Multiple NSEC* set.
|
||||
3. Else, if the owner name of the NSEC record is not *Child Zone*
|
||||
then add name server IP to the *NSEC Mismatches Apex* set.
|
||||
2. Else add the name server IP to the
|
||||
*NSEC Query Gives Erroneous Answer* set.
|
||||
3. Else if the answer section is empty and the authority section contains
|
||||
an NSEC3 record then do:
|
||||
1. Add the name server IP to the *NSEC Query Gives NSEC3 NODATA*
|
||||
set.
|
||||
2. If the SOA record is missing from the authority section then add name
|
||||
server IP to the *NSEC3 NODATA Missing SOA* set.
|
||||
3. Else if the owner name of SOA record is not *Child Zone* then
|
||||
add name server IP and owner name to the *NSEC3 NODATA Wrong SOA*
|
||||
set.
|
||||
4. If the authority section contains more than one NSEC3 record then
|
||||
add name server IP to the *Erroneous Multiple NSEC3* set.
|
||||
5. Else do:
|
||||
1. If the hash owner name of the NSEC3 record does not match apex
|
||||
of *Child Zone* then add name server IP to the
|
||||
*NSEC3 Mismatches Apex* set.
|
||||
2. Else if the type list in the NSEC3 record matches at least one
|
||||
of the following criteria then add name server IP to the
|
||||
*NSEC3 Incorrect Type List* set:
|
||||
1. At least one of SOA, NS, DNSKEY, NSEC3PARAM or RRSIG is
|
||||
missing.
|
||||
2. At least one of NSEC or NSEC3 is included.
|
||||
3. Retrieve the NSEC3 record from the response.
|
||||
4. Retrieve the RRSIG records for the retrieved NSEC3 record.
|
||||
5. If the NSEC3 record do not have a matching RRSIG
|
||||
record, then add the name server IP to the
|
||||
*NSEC3 Missing Signature* set.
|
||||
6. Else do:
|
||||
1. Use the DNSKEY records retrieved above.
|
||||
2. For each NSEC3 RRSIG do:
|
||||
1. Verify the RRSIG record by the DNSKEY records.
|
||||
2. If there is no DNSKEY that matches RRSIG by key tag,
|
||||
then add the name server IP and RRSIG key ID to the
|
||||
*NSEC3 RRSIG No DNSKEY* set.
|
||||
3. Else, if the RRSIG record has a validity period that ends
|
||||
before the time of test execution, then add the name
|
||||
server IP and RRSIG key ID to the
|
||||
*NSEC3 RRSIG Expired* set.
|
||||
4. Else, if the RRSIG record has a validity period that starts
|
||||
after the time of test execution, then add the name
|
||||
server IP and RRSIG key ID to the
|
||||
*NSEC3 RRSIG Not Yet Valid* set.
|
||||
5. Else, if the Zonemaster installation does not have support
|
||||
for the DNSKEY algorithm that created the RRSIG, then add
|
||||
name server IP, DNSKEY algorithm and DNSKEY key tag to
|
||||
the *Algo Not Supported By ZM* set.
|
||||
6. Else, if the RRSIG cannot be validated by the DNSKEY record
|
||||
appointed, then add name server IP and DNSKEY key tag
|
||||
to the *NSEC3 RRSIG Verify Error* set.
|
||||
7. Else, add the name server IP to the
|
||||
*NSEC3 RRSIG Verified* set.
|
||||
|
||||
6. Send *NSEC3PARAM Query* to the name server IP and do:
|
||||
1. If at least one of the following criteria is met, then add the name
|
||||
server IP to the *NSEC3PARAM Query Response Errors* set:
|
||||
1. There is no DNS response.
|
||||
2. The [RCODE Name] in the response is not "NoError".
|
||||
3. The AA flag is not set in the response.
|
||||
2. Else if the answer section is non-empty, then do:
|
||||
1. If the answer section has at least one NSEC3PARAM RR then do:
|
||||
1. Add the name server IP to the *NSEC3PARAM In Answer* set.
|
||||
2. If the number of NSEC3PARAM records is greater than one then add
|
||||
name server IP to the *Erroneous Multiple NSEC3PARAM* set.
|
||||
3. Else, if the owner name of the NSEC3PARAM record is not
|
||||
*Child Zone* then add name server IP to the
|
||||
*NSEC3PARAM Mismatches Apex* set.
|
||||
2. Else add the name server IP to the
|
||||
*NSEC3PARAM Query Gives Erroneous Answer* set.
|
||||
3. Else if the answer section is empty and the authority section contains
|
||||
an NSEC record then do:
|
||||
1. Add the name server IP to the *NSEC3PARAM Query Gives NSEC NODATA* set.
|
||||
2. If the SOA record is missing the authority section then add the
|
||||
name server IP to the *NSEC NODATA Missing SOA* set.
|
||||
3. Else if the owner name of the SOA record is not *Child Zone* then
|
||||
add name server IP and the owner name to the
|
||||
*NSEC NODATA Wrong SOA* set.
|
||||
4. If the authority section contains more than one NSEC record then
|
||||
add name server IP to the *Erroneous Multiple NSEC* set.
|
||||
5. Else do:
|
||||
1. If the owner name of the NSEC record is not *Child Zone* then
|
||||
add name server IP to the *NSEC Mismatches Apex* set.
|
||||
2. Else if the type list in the NSEC record matches at least one
|
||||
of the following criteria then add name server IP to the
|
||||
*NSEC Incorrect Type List* set:
|
||||
1. At least one of SOA, NS, DNSKEY, NSEC or RRSIG is missing.
|
||||
2. At least one of NSEC3PARAM or NSEC3 is included.
|
||||
3. Retrieve the NSEC record from the response.
|
||||
4. Retrieve the RRSIG records for the retrieved NSEC record.
|
||||
5. If the NSEC record does not have a matching RRSIG
|
||||
record, then add the name server IP to the
|
||||
*NSEC Missing Signature* set.
|
||||
6. Else do:
|
||||
1. Use the DNSKEY records retrieved above.
|
||||
2. For each NSEC RRSIG do:
|
||||
1. Verify the RRSIG record by the DNSKEY records.
|
||||
2. If there is no DNSKEY that matches RRSIG by key tag,
|
||||
then add the name server IP and RRSIG key ID to the
|
||||
*NSEC RRSIG No DNSKEY* set.
|
||||
3. Else, if the RRSIG record has a validity period that ends
|
||||
before the time of test execution, then add the name
|
||||
server IP and RRSIG key ID to the
|
||||
*NSEC RRSIG Expired* set.
|
||||
4. Else, if the RRSIG record has a validity period that starts
|
||||
after the time of test execution, then add the name
|
||||
server IP and RRSIG key ID to the
|
||||
*NSEC RRSIG Not Yet Valid* set.
|
||||
5. Else, if the Zonemaster installation does not have support
|
||||
for the DNSKEY algorithm that created the RRSIG, then add
|
||||
name server IP, DNSKEY algorithm and DNSKEY key tag to
|
||||
the *Algo Not Supported By ZM* set.
|
||||
6. Else, if the RRSIG cannot be validated by the DNSKEY record
|
||||
appointed, then add name server IP and DNSKEY key tag
|
||||
to the *NSEC RRSIG Verify Error* set.
|
||||
7. Else, add the name server IP to the
|
||||
*NSEC RRSIG Verified* set (unless it is already a member
|
||||
of the set).
|
||||
|
||||
7. If the *Erroneous Multiple NSEC* set is non-empty then output
|
||||
*[DS10_ERR_MULT_NSEC]* with the name server IP addresses from the
|
||||
set.
|
||||
|
||||
8. If the *Erroneous Multiple NSEC3* set is non-empty then output
|
||||
*[DS10_ERR_MULT_NSEC3]* with the name server IP addresses from the
|
||||
set.
|
||||
|
||||
9. If the *Erroneous Multiple NSEC3PARAM* set is non-empty then output
|
||||
*[DS10_ERR_MULT_NSEC3PARAM]* with the name server IP addresses from the
|
||||
set.
|
||||
|
||||
10. Create a list of those name server IP included in the *NSEC In Answer* set
|
||||
but not in the *NSEC3PARAM Query Gives NSEC NODATA* set, or the other way
|
||||
around. From that list remove any name server IP included in the
|
||||
*NSEC3PARAM In Answer* set or in the *NSEC Query Gives NSEC3 NODATA* set.
|
||||
Output *[DS10_INCONSISTENT_NSEC]* with the resulting list of name server
|
||||
IP addresses.
|
||||
|
||||
11. Create a list of those name server IP included in the *NSEC3PARAM In Answer*
|
||||
set but not in the *NSEC Query Gives NSEC3 NODATA* set, or the other way
|
||||
around. From that list remove any name server IP included in the
|
||||
*NSEC In Answer* set or the *NSEC3PARAM Query Gives NSEC NODATA* set.
|
||||
Output *[DS10_INCONSISTENT_NSEC3]* with the resulting list of name server
|
||||
IP addresses.
|
||||
|
||||
12. Create a list of those name server IP included in the *NSEC3PARAM In Answer*
|
||||
set or in the *NSEC Query Gives NSEC3 NODATA* set, and also included in the
|
||||
*NSEC In Answer* set or the *NSEC3PARAM Query Gives NSEC NODATA* set. Output
|
||||
*[DS10_MIXED_NSEC_NSEC3]* with the resulting list of name server IP
|
||||
addresses.
|
||||
|
||||
13. If the *NSEC In Answer* set or the *NSEC3PARAM Query Gives NSEC NODATA* set
|
||||
(or both) is non-empty and both the *NSEC3PARAM In Answer* set and the
|
||||
*NSEC Query Gives NSEC3 NODATA* set are empty, then output *[DS10_HAS_NSEC]*
|
||||
with the name server IP addresses from the sets.
|
||||
|
||||
14. If the *NSEC3PARAM In Answer* set or the *NSEC Query Gives NSEC3 NODATA* set
|
||||
(or both) is non-empty and both the *NSEC In Answer* set and the
|
||||
*NSEC3PARAM Query Gives NSEC NODATA* set are empty, then output
|
||||
*[DS10_HAS_NSEC3]* with the name server IP addresses from the sets.
|
||||
|
||||
15. Create a list of the name server IP in the *NSEC3PARAM In Answer* set or in
|
||||
the *NSEC Query Gives NSEC3 NODATA* set (or both), but neither in
|
||||
the *NSEC In Answer* set or the *NSEC3PARAM Query Gives NSEC NODATA* set.
|
||||
Create a second list of the name server IP in the *NSEC In Answer* set or in
|
||||
the *NSEC3PARAM Query Gives NSEC NODATA* set (or both), but neither in the
|
||||
*NSEC3PARAM In Answer* set or the *NSEC Query Gives NSEC3 NODATA* set.
|
||||
If both lists are non-empty then output *[DS10_INCONSISTENT_NSEC_NSEC3]* with
|
||||
both the lists.
|
||||
|
||||
16. If the *NSEC Incorrect Type List* set is non-empty, then output
|
||||
*[DS10_NSEC_ERR_TYPE_LIST] with the list of name server IP in the set.
|
||||
|
||||
17. If the *NSEC Mismatches Apex* set is non-empty, then output
|
||||
*[DS10_NSEC_MISMATCHES_APEX] with the list of name server IP in the set.
|
||||
|
||||
18. If the *NSEC NODATA Wrong SOA* set is non-empty, then for each owner name
|
||||
in the set output *[DS10_NSEC_NODATA_WRONG_SOA]* with the owner name and the
|
||||
list of name server IP in the set for that owner name.
|
||||
|
||||
19. If the *NSEC NODATA Missing SOA* set is non-empty, then output
|
||||
*[DS10_NSEC_NODATA_MISSING_SOA]* with the list of name server IP in the set.
|
||||
|
||||
20. If the *NSEC Query Gives Erroneous Answer* set is non-empty, then output
|
||||
*[DS10_NSEC_GIVES_ERR_ANSWER]* with the list of name server IP in the
|
||||
set.
|
||||
|
||||
21. If the *NSEC Query Response Error* set is non-empty, then output
|
||||
*[DS10_NSEC_QUERY_RESPONSE_ERR]* with the list of name server IP in the set.
|
||||
|
||||
22. If the *NSEC3 Incorrect Type List* set is non-empty, then output
|
||||
*[DS10_NSEC3_ERR_TYPE_LIST]* with the list of name server IP in the set.
|
||||
|
||||
23. If the *NSEC3 Mismatches Apex* set is non-empty, then output
|
||||
*[DS10_NSEC3_MISMATCHES_APEX]* with the list of name server IP in the set.
|
||||
|
||||
24. If the *NSEC3 NODATA Wrong SOA* set is non-empty, then for each owner name
|
||||
in the set output *[DS10_NSEC3_NODATA_WRONG_SOA]* with the owner name and the
|
||||
list of name server IP in the set for that owner name.
|
||||
|
||||
25. If the *NSEC3 NODATA Missing SOA* set is non-empty, then output
|
||||
*[DS10_NSEC3_NODATA_MISSING_SOA]* with the list of name server IP in the set.
|
||||
|
||||
26. If the *NSEC3PARAM Query Gives Erroneous Answer* set is non-empty, then
|
||||
output *[DS10_NSEC3PARAM_GIVES_ERR_ANSWER]* with the list of name server IP
|
||||
in the set.
|
||||
|
||||
27. If the *NSEC3PARAM Mismatches Apex* set is non-empty, then output
|
||||
*[DS10_NSEC3PARAM_MISMATCHES_APEX]* with the list of name server IP in the set.
|
||||
|
||||
28. If the *NSEC3PARAM Query Response Error* set is non-empty, then output
|
||||
*[DS10_NSEC3PARAM_QUERY_RESPONSE_ERR]* with the list of name server IP in the
|
||||
set.
|
||||
|
||||
29. If the *NSEC Missing Signature* set is non-empty then output
|
||||
*[DS10_NSEC_MISSING_SIGNATURE]* with the name server IP addresses from the
|
||||
set.
|
||||
|
||||
30. If the *NSEC3 Missing Signature* set is non-empty then output
|
||||
*[DS10_NSEC3_MISSING_SIGNATURE]* with the name server IP addresses from the
|
||||
set.
|
||||
|
||||
31. If the *NSEC RRSIG No DNSKEY* set is non-empty, then for each key ID
|
||||
output *[DS10_NSEC_RRSIG_NO_DNSKEY]* with the key ID and the name server
|
||||
IP addresses from the set for the key ID.
|
||||
|
||||
32. If the *NSEC RRSIG Expired* set is non-empty, then for each key ID
|
||||
output *[DS10_NSEC_RRSIG_EXPIRED]* with the key ID and the name server
|
||||
IP addresses from the set for the key ID.
|
||||
|
||||
33. If the *NSEC RRSIG Not Yet Valid* set is non-empty, then for each key ID
|
||||
output *[DS10_NSEC_RRSIG_NOT_YET_VALID]* with the key ID and the name server
|
||||
IP addresses from the set for the key ID.
|
||||
|
||||
34. If the *NSEC RRSIG Verify Error* set is non-empty, then for each key ID
|
||||
output *[DS10_NSEC_RRSIG_VERIFY_ERROR]* with the key ID and the name server
|
||||
IP addresses from the set for the key ID.
|
||||
|
||||
35. If the combined set of the unique name server IP addresses of the
|
||||
*NSEC RRSIG No DNSKEY*, *NSEC RRSIG Expired*, *NSEC RRSIG Not Yet Valid* and
|
||||
*NSEC RRSIG Verify Error* sets is non-empty, then do:
|
||||
1. For each name server IP address in the combined set store the IP address
|
||||
in a temporary set for the next step if the IP address is not a member of
|
||||
the *NSEC RRSIG Verified* set.
|
||||
2. If the temporary set is non-empty then output
|
||||
*[DS10_NSEC_NO_VERIFIED_SIGNATURE]* with the name server IP addresses from
|
||||
the set.
|
||||
|
||||
36. If the *NSEC3 RRSIG No DNSKEY* set is non-empty, then for each key ID
|
||||
output *[DS10_NSEC3_RRSIG_NO_DNSKEY]* with the key ID and the name server
|
||||
IP addresses from the set for the key ID.
|
||||
|
||||
37. If the *NSEC3 RRSIG Expired* set is non-empty, then for each key ID
|
||||
output *[DS10_NSEC3_RRSIG_EXPIRED]* with the key ID and the name server
|
||||
IP addresses from the set for the key ID.
|
||||
|
||||
38. If the *NSEC3 RRSIG Not Yet Valid* set is non-empty, then for each key ID
|
||||
output *[DS10_NSEC3_RRSIG_NOT_YET_VALID]* with the key ID and the name server
|
||||
IP addresses from the set for the key ID.
|
||||
|
||||
39. If the *NSEC3 RRSIG Verify Error* set is non-empty, then for each key ID
|
||||
output *[DS10_NSEC3_RRSIG_VERIFY_ERROR]* with the key ID and the name server
|
||||
IP addresses from the set for the key ID.
|
||||
|
||||
40. If the combined set of the *NSEC3 RRSIG No DNSKEY*, *NSEC3 RRSIG Expired*,
|
||||
*NSEC3 RRSIG Not Yet Valid* and *NSEC3 RRSIG Verify Error* sets is non-empty,
|
||||
then do:
|
||||
1. Extract all unique name server IP address in the combined set that are
|
||||
not members the *NSEC3 RRSIG Verified* set.
|
||||
2. If the extracted name server IP addresses is a non-empty set then output
|
||||
*[DS10_NSEC3_NO_VERIFIED_SIGNATURE]* with the extracted name server IP
|
||||
addresses.
|
||||
|
||||
41. If the *Algo Not Supported By ZM* set is non-empty, then output
|
||||
*[DS10_ALGO_NOT_SUPPORTED_BY_ZM]* for each DNSKEY key tag with the name
|
||||
server IP addresses, the key tag and the algorithm name and code from the
|
||||
set.
|
||||
|
||||
42. If the *Responds with DNSKEY* set is empty and the *Responds without DNSKEY*
|
||||
is non-empty then output *[DS10_ZONE_NO_DNSSEC]* with the name server IP
|
||||
addresses from the *Responds without DNSKEY* set.
|
||||
|
||||
43. If both the *Responds with DNSKEY* set and the *Responds without DNSKEY* set
|
||||
are non-empty then output *[DS10_SERVER_NO_DNSSEC]* with the name server IP
|
||||
addresses from the *Responds without DNSKEY* set.
|
||||
|
||||
44. Extract all members of the *NS IP* set that is not also a member of
|
||||
the *Ignored NS IP* set, the *Responds without DNSKEY* set, the
|
||||
*NSEC In Answer* set, the *NSEC3PARAM Query Gives NSEC NODATA* set, the
|
||||
*NSEC3PARAM In Answer* set or the *NSEC Query Gives NSEC3 NODATA* set. If the
|
||||
extracted set is non-empty, then output *[DS10_EXPECTED_NSEC_NSEC3_MISSING]*
|
||||
with the extracted list of name server IP addresses.
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, skip sending queries over that
|
||||
transport protocol. A message will be outputted reporting that the transport
|
||||
protocol has been skipped.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
No special terminology for this Test Case.
|
||||
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[DNS Query and Response Defaults]: ../DNSQueryAndResponseDefaults.md
|
||||
[DNSSEC Query]: ../DNSQueryAndResponseDefaults.md#default-setting-in-dnssec-query
|
||||
[DNSSEC README]: README.md
|
||||
[DNSSEC Response]: ../DNSQueryAndResponseDefaults.md#default-handling-of-a-dnssec-response
|
||||
[DNSSEC05#objective]: ../DNSSEC-TP/dnssec05.md#objective
|
||||
[DS10_ALGO_NOT_SUPPORTED_BY_ZM]: #summary
|
||||
[DS10_ERR_MULT_NSEC3PARAM]: #summary
|
||||
[DS10_ERR_MULT_NSEC3]: #summary
|
||||
[DS10_ERR_MULT_NSEC]: #summary
|
||||
[DS10_EXPECTED_NSEC_NSEC3_MISSING]: #summary
|
||||
[DS10_HAS_NSEC3]: #summary
|
||||
[DS10_HAS_NSEC]: #summary
|
||||
[DS10_INCONSISTENT_NSEC3]: #summary
|
||||
[DS10_INCONSISTENT_NSEC]: #summary
|
||||
[DS10_INCONSISTENT_NSEC_NSEC3]: #summary
|
||||
[DS10_MIXED_NSEC_NSEC3]: #summary
|
||||
[DS10_NSEC3PARAM_GIVES_ERR_ANSWER]: #summary
|
||||
[DS10_NSEC3PARAM_MISMATCHES_APEX]: #summary
|
||||
[DS10_NSEC3PARAM_QUERY_RESPONSE_ERR]: #summary
|
||||
[DS10_NSEC3_ERR_TYPE_LIST]: #summary
|
||||
[DS10_NSEC3_MISMATCHES_APEX]: #summary
|
||||
[DS10_NSEC3_MISSING_SIGNATURE]: #summary
|
||||
[DS10_NSEC3_NODATA_MISSING_SOA]: #summary
|
||||
[DS10_NSEC3_NODATA_WRONG_SOA]: #summary
|
||||
[DS10_NSEC3_NO_VERIFIED_SIGNATURE]: #summary
|
||||
[DS10_NSEC3_RRSIG_EXPIRED]: #summary
|
||||
[DS10_NSEC3_RRSIG_NOT_YET_VALID]: #summary
|
||||
[DS10_NSEC3_RRSIG_NO_DNSKEY]: #summary
|
||||
[DS10_NSEC3_RRSIG_VERIFY_ERROR]: #summary
|
||||
[DS10_NSEC_ERR_TYPE_LIST]: #summary
|
||||
[DS10_NSEC_GIVES_ERR_ANSWER]: #summary
|
||||
[DS10_NSEC_MISMATCHES_APEX]: #summary
|
||||
[DS10_NSEC_MISSING_SIGNATURE]: #summary
|
||||
[DS10_NSEC_NODATA_MISSING_SOA]: #summary
|
||||
[DS10_NSEC_NODATA_WRONG_SOA]: #summary
|
||||
[DS10_NSEC_NO_VERIFIED_SIGNATURE]: #summary
|
||||
[DS10_NSEC_QUERY_RESPONSE_ERR]: #summary
|
||||
[DS10_NSEC_RRSIG_EXPIRED]: #summary
|
||||
[DS10_NSEC_RRSIG_NOT_YET_VALID]: #summary
|
||||
[DS10_NSEC_RRSIG_NO_DNSKEY]: #summary
|
||||
[DS10_NSEC_RRSIG_VERIFY_ERROR]: #summary
|
||||
[DS10_SERVER_NO_DNSSEC]: #summary
|
||||
[DS10_ZONE_NO_DNSSEC]: #summary
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[Get-Del-NS-Names-and-IPs]: ../MethodsV2.md#method-get-delegation-ns-names-and-ip-addresses
|
||||
[Get-Zone-NS-Names-and-IPs]: ../MethodsV2.md#method-get-zone-ns-names-and-ip-addresses
|
||||
[IANA RR Type List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RCODE Name]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[RFC 4034#section-4]: https://datatracker.ietf.org/doc/html/rfc4034#section-4
|
||||
[RFC 4035#section-3.1.3]: https://datatracker.ietf.org/doc/html/rfc4035#section-3.1.3
|
||||
[RFC 5155#section-3]: https://datatracker.ietf.org/doc/html/rfc5155#section-3
|
||||
[RFC 5155#section-4]: https://datatracker.ietf.org/doc/html/rfc5155#section-4
|
||||
[RFC 5155#section-7.2]: https://datatracker.ietf.org/doc/html/rfc5155#section-7.2
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[Test procedure]: #test-procedure
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
@@ -0,0 +1,245 @@
|
||||
# DNSSEC11: DS in delegation requires signed zone
|
||||
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC11**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#objective)
|
||||
* [Scope](#scope)
|
||||
* [Inputs](#inputs)
|
||||
* [Summary](#summary)
|
||||
* [Test procedure](#test-procedure)
|
||||
* [Outcome(s)](#outcomes)
|
||||
* [Special procedural requirements](#special-procedural-requirements)
|
||||
* [Intercase dependencies](#intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
If the delegation of the zone contains DS records, i.e. if the parent
|
||||
zone has DS records with the same owner name as the apex of the zone,
|
||||
then the zone must be signed. If not, a DNSSEC aware resolver should
|
||||
consider the zone to be "bogus" (see [RFC 4033][RFC 4033#section-5], section 5),
|
||||
and the zone will be unavailable.
|
||||
|
||||
This test case will verify that a zone with DS in delegation from
|
||||
parent is also signed. Here we just verify that it has DNSKEY in apex.
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is tested and reported by other test cases:
|
||||
|
||||
* This test case will ignore non-responsive name servers or name servers not
|
||||
giving a correct DNS response for an authoritative name server (covered
|
||||
by [Connectivity01]).
|
||||
* This test case will ignore any irregularities in fetching the DS record from
|
||||
parent zone (covered by [DNSSEC02]).
|
||||
* This test case will ignore if the DNSKEY and SOA RRsets are not signed
|
||||
(covered by [DNSSEC08] and [DNSSEC09], respectively).
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
* "Test Type" - The test type with value "[undelegated]" or "normal".
|
||||
* "Undelegated DS" - The DS record or records submitted
|
||||
(only if *Test Type* is [undelegated]).
|
||||
|
||||
|
||||
## Summary
|
||||
|
||||
* If there are no DS records in the parent zone, this test case will terminate
|
||||
without outputting any message.
|
||||
|
||||
Message Tag outputted | Level | Arguments | Description of when message tag is outputted
|
||||
:-----------------------------|:--------|:-----------|:--------------------------------------------
|
||||
DS11_INCONSISTENT_DS | WARNING | | Parent name servers are inconsistent on the existence of DS.
|
||||
DS11_INCONSISTENT_SIGNED_ZONE | ERROR | | Name servers for the child zone are inconsistent on whether the zone is signed or not.
|
||||
DS11_UNDETERMINED_DS | ERROR | | It cannot be determined if the parent zone has DS for the child zone or not.
|
||||
DS11_UNDETERMINED_SIGNED_ZONE | ERROR | | It cannot be determined if the child zone is signed or not.
|
||||
DS11_PARENT_WITHOUT_DS | NOTICE | ns_ip_list | List of parent name servers without DS for the child zone.
|
||||
DS11_PARENT_WITH_DS | NOTICE | ns_ip_list | List of parent name servers with DS for the child zone.
|
||||
DS11_NS_WITH_SIGNED_ZONE | NOTICE | ns_ip_list | List of child name servers with signed child zone.
|
||||
DS11_NS_WITH_UNSIGNED_ZONE | WARNING | ns_ip_list | List of child name servers with unsigned child zone.
|
||||
DS11_DS_BUT_UNSIGNED_ZONE | ERROR | | The child zone is unsigned, but the parent zone has DS record.
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be changed in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
|
||||
## Test procedure
|
||||
|
||||
1. Create the following empty sets:
|
||||
1. Parent name server IP address ("Undetermined DS").
|
||||
2. Parent name server IP address ("No DS Record").
|
||||
3. Parent name server IP address ("Has DS Record").
|
||||
4. Child name server IP address ("Undetermined DNSKEY")
|
||||
5. Child name server IP address ("No DNSKEY Record").
|
||||
6. Child name server IP address ("Has DNSKEY Record").
|
||||
|
||||
2. If the *Test Type* is "[undelegated]" and if *Undelegated DS* is empty,
|
||||
then do exit this test case.
|
||||
|
||||
3. If *Test Type* is "normal", then:
|
||||
|
||||
1. Create a DS query with the DO flag set for the name of the *Child Zone*
|
||||
("DS Query").
|
||||
|
||||
2. Retrieve all name server IP addresses for the parent zone of
|
||||
*Child Zone* using [Method1] ("Parent NS IP").
|
||||
|
||||
3. For each name server IP in *Parent NS IP* do:
|
||||
|
||||
1. Send *DS Query* to the name server IP.
|
||||
2. If the response has the TC flag set, re-query over TCP and use that
|
||||
response instead.
|
||||
3. Add the name server (IP) to the *Undetermined DS* set if at least one
|
||||
of the following criteria matches:
|
||||
1. There is no DNS response.
|
||||
2. The RCODE of response is not "NoError" ([IANA RCODE List]).
|
||||
3. The AA flag is not set in the response.
|
||||
4. If there is no DS record with matching owner name in the
|
||||
answer section, then add the name server (IP) to the
|
||||
*No DS Record* set.
|
||||
5. Else add the name server (IP) to the *Has DS Record* set.
|
||||
|
||||
4. If the *Undetermined DS* set is non-empty and both the
|
||||
*No DS Record* and *Has DS Record* sets are empty then do:
|
||||
1. Output *[DS11_UNDETERMINED_DS]*.
|
||||
2. Exit this test case.
|
||||
|
||||
5. If the *No DS Record* set is non-empty and the *Has DS Record* set is
|
||||
empty then exit this test case.
|
||||
|
||||
6. If both the *No DS Record* and *Has DS Record* sets are non-empty,
|
||||
then do:
|
||||
1. Output *[DS11_INCONSISTENT_DS]*.
|
||||
2. Output *[DS11_PARENT_WITHOUT_DS]* and list parent name servers in
|
||||
*No DS Record*.
|
||||
3. Output *[DS11_PARENT_WITH_DS]* and list parent name servers in
|
||||
*Has DS Record*.
|
||||
|
||||
4. Create DNS queries for the child zone:
|
||||
|
||||
1. SOA query for the *Child Zone* without any OPT record (no EDNS)
|
||||
("SOA Query").
|
||||
2. DNSKEY query for the *Child Zone* with the DO flag set ("DNSKEY Query").
|
||||
|
||||
5. Obtain the set of child name server IP addresses using [Method4] and
|
||||
[Method5] ("Child NS IP").
|
||||
|
||||
7. For each name server IP in *Child NS IP* do:
|
||||
|
||||
1. Send *SOA Query* over UDP to the name server IP and collect the response.
|
||||
2. Go to next name server if
|
||||
1. there is no DNS response on the SOA query, or
|
||||
2. the RCODE of the response is not "NoError" ([IANA RCODE List]), or
|
||||
3. the AA flag is not set in the response, or
|
||||
4. there is no SOA record with owner name matching the query in the
|
||||
answer section.
|
||||
|
||||
3. Send *DNSKEY Query* over UDP to the name server IP and collect the
|
||||
response.
|
||||
4. If the response has the TC flag set, re-query over TCP and use that
|
||||
response instead.
|
||||
5. Add the name server (IP) to the *Undetermined DNSKEY* set if at least one
|
||||
of the following criteria matches:
|
||||
1. There is no DNS response.
|
||||
2. The RCODE of response is not "NoError" ([IANA RCODE List]).
|
||||
3. The AA flag is not set in the response.
|
||||
6. If there is no DNSKEY record with matching owner name in the answer
|
||||
section, then add the name server (IP) to the *No DNSKEY Record* set.
|
||||
7. Else add the name server (IP) to the *Has DNSKEY Record* set.
|
||||
|
||||
8. If the *Undetermined DNSKEY* set is non-empty and both the
|
||||
*No DNSKEY Record* and *Has DNSKEY Record* sets are empty then output
|
||||
*[DS11_UNDETERMINED_SIGNED_ZONE]*.
|
||||
|
||||
9. Else, if the *No DNSKEY Record* set is non-empty and the
|
||||
*Has DNSKEY Record* set is empty then output
|
||||
*[DS11_DS_BUT_UNSIGNED_ZONE]*.
|
||||
|
||||
10. Else, if both the *No DNSKEY Record* and *Has DNSKEY Record* sets
|
||||
are non-empty, then do:
|
||||
1. Output *[DS11_INCONSISTENT_SIGNED_ZONE]*.
|
||||
2. Output *[DS11_NS_WITH_UNSIGNED_ZONE]* and list name servers in
|
||||
*No DNSKEY Record*.
|
||||
3. Output *[DS11_NS_WITH_SIGNED_ZONE]* and list name servers in
|
||||
*Has DNSKEY Record*.
|
||||
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
on the ignored result.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
This test case is always performed.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
No special terminology for this test case.
|
||||
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[DNSSEC README]: README.md
|
||||
[DNSSEC02]: dnssec02.md
|
||||
[DNSSEC08]: dnssec08.md
|
||||
[DNSSEC09]: dnssec09.md
|
||||
[DS11_DS_BUT_UNSIGNED_ZONE]: #summary
|
||||
[DS11_INCONSISTENT_DS]: #summary
|
||||
[DS11_INCONSISTENT_SIGNED_ZONE]: #summary
|
||||
[DS11_UNDETERMINED_DS]: #summary
|
||||
[DS11_UNDETERMINED_SIGNED_ZONE]: #summary
|
||||
[DS11_NS_WITH_SIGNED_ZONE]: #summary
|
||||
[DS11_NS_WITH_UNSIGNED_ZONE]: #summary
|
||||
[DS11_PARENT_WITHOUT_DS]: #summary
|
||||
[DS11_PARENT_WITH_DS]: #summary
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[IANA RCODE List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Method1]: ../Methods.md#method-1-obtain-the-parent-domain
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 4033#section-5]: https://datatracker.ietf.org/doc/html/rfc4033#section-5
|
||||
[RFC 8499#section-11]: https://datatracker.ietf.org/doc/html/rfc8499#section-11
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[Severity Level]: ../SeverityLevelDefinitions.md
|
||||
[Terminology]: #terminology
|
||||
[Undelegated]: ../../test-types/undelegated-test.md
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
## DNSSEC12: Test for DNSSEC Algorithm Completeness
|
||||
|
||||
### Test case identifier
|
||||
**DNSSEC12** Test for DNSSEC Algorithm Completeness
|
||||
|
||||
### Objective
|
||||
|
||||
The objectives for this Test Case has yet to be defined. This is a
|
||||
placeholder for a complete definition of the Test Case. The Test Case
|
||||
is not yet implemented.
|
||||
|
||||
Test for DNSSEC Algorithm Completeness (DS->DNSKEY->RRSIG)
|
||||
|
||||
See issues [#588], [#528], [#529] and [#231].
|
||||
|
||||
[#588]: https://github.com/zonemaster/zonemaster/issues/588
|
||||
[#528]: https://github.com/zonemaster/zonemaster/issues/528
|
||||
[#529]: https://github.com/zonemaster/zonemaster/issues/529
|
||||
[#231]: https://github.com/zonemaster/zonemaster/issues/231
|
||||
|
||||
|
||||
### Inputs
|
||||
|
||||
TBD.
|
||||
|
||||
### Ordered description of steps to be taken to execute the test case
|
||||
|
||||
TBD.
|
||||
|
||||
### Outcome(s)
|
||||
|
||||
TBD.
|
||||
|
||||
### Special procedural requirements
|
||||
|
||||
TBD.
|
||||
|
||||
### Intercase dependencies
|
||||
|
||||
TBD.
|
||||
@@ -0,0 +1,210 @@
|
||||
# DNSSEC13: All DNSKEY algorithms used to sign the zone
|
||||
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC13**
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Objective](#objective)
|
||||
* [Scope](#scope)
|
||||
* [Inputs](#inputs)
|
||||
* [Summary](#summary)
|
||||
* [Test procedure](#test-procedure)
|
||||
* [Outcome(s)](#outcomes)
|
||||
* [Special procedural requirements](#special-procedural-requirements)
|
||||
* [Intercase dependencies](#intercase-dependencies)
|
||||
* [Terminology](#terminology)
|
||||
|
||||
|
||||
## Objective
|
||||
|
||||
From [RFC 6840][RFC 6840#section-5.11], section 5.11:
|
||||
|
||||
> The DS RRset and DNSKEY RRset are used to signal which algorithms are used to
|
||||
> sign a zone. \[...] The zone MUST also be signed with each algorithm (though
|
||||
> not each key) present in the DNSKEY RRset. \[...]
|
||||
|
||||
To verify that the whole zone is signed with all algorithms require access to the
|
||||
complete zone, which is generally not possible for public zones. This test case
|
||||
is limited to three RRsets that must be present in a signed zone, the SOA RRset,
|
||||
the NS RRset and the DNSKEY RRset.
|
||||
|
||||
This test case will verify that for each DNSKEY algorithm, there is a RRSIG of
|
||||
that algorithm for the three selected RRsets.
|
||||
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is also tested by [Connectivity01], [DNSSEC08] and
|
||||
[DNSSEC09]. Issues covered by [Connectivity01] (basic name server issues), [DNSSEC08]
|
||||
(signing of DNSKEY RRset) and [DNSSEC09] (signing of SOA RRset) will not result
|
||||
in messages from this test case.
|
||||
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
|
||||
|
||||
## Summary
|
||||
|
||||
* If the name server reports no DNSKEY RRset, then this test case will not test
|
||||
or report anything.
|
||||
* This test case will not report anything unless there is an issue to report.
|
||||
|
||||
Message Tag outputted | Level | Arguments | Description of when message tag is outputted
|
||||
:-----------------------------|:--------|:---------------------------------|:--------------------------------------------
|
||||
DS13_ALGO_NOT_SIGNED_DNSKEY | WARNING | ns_ip_list, algo_mnemo, algo_num | The DNSKEY RRset is not signed with an algorithm present in the DNSKEY RRset
|
||||
DS13_ALGO_NOT_SIGNED_NS | WARNING | ns_ip_list, algo_mnemo, algo_num | The NS RRset is not signed with an algorithm present in the DNSKEY RRset
|
||||
DS13_ALGO_NOT_SIGNED_SOA | WARNING | ns_ip_list, algo_mnemo, algo_num | The SOA RRset is not signed with an algorithm present in the DNSKEY RRset
|
||||
|
||||
The value in the Level column is the default severity level of the message. The
|
||||
severity level can be changed in the [Zonemaster-Engine profile]. Also see the
|
||||
[Severity Level Definitions] document.
|
||||
|
||||
The argument names in the Arguments column lists the arguments used in the
|
||||
message. The argument names are defined in the [argument list].
|
||||
|
||||
|
||||
## Test procedure
|
||||
|
||||
1. Create a DNSKEY query with DO flag set for the apex of the
|
||||
*Child Zone* ("DNSKEY Query").
|
||||
|
||||
2. Create a SOA query with DO flag set for the apex of the
|
||||
*Child Zone* ("SOA Query").
|
||||
|
||||
3. Create a NS query with DO flag set for the apex of the
|
||||
*Child Zone* ("NS Query").
|
||||
|
||||
4. Retrieve all name server IP addresses for the
|
||||
*Child Zone* using [Method4] and [Method5] ("NS IP").
|
||||
|
||||
5. Create the following empty sets:
|
||||
|
||||
1. Name server IP address and associated DNSKEY algorithm
|
||||
("Algo not signed DNSKEY").
|
||||
2. Name server IP address and associated DNSKEY algorithm
|
||||
("Algo not signed SOA").
|
||||
3. Name server IP address and associated DNSKEY algorithm
|
||||
("Algo not signed NS").
|
||||
|
||||
6. For each name server IP in the *NS IP* set do:
|
||||
|
||||
1. Create an empty set of DNSKEY algorithms ("DNSKEY Algorithm").
|
||||
2. Send *DNSKEY Query* over UDP and do:
|
||||
1. Go to next name server IP if any of the following criteria is met:
|
||||
1. No DNS response is returned.
|
||||
2. The RCODE value of the DNS response is not "NoError"
|
||||
([IANA RCODE List]).
|
||||
3. The AA flag of the response is unset.
|
||||
4. The DNS response contains no DNSKEY record in the answer section.
|
||||
5. The DNS response contains no RRSIG for the DNSKEY RRset.
|
||||
2. Extract all DNSKEY records from the answer section.
|
||||
3. Extract the algorithm numbers from each DNSKEY record and add them to
|
||||
the *DNSKEY Algorithm* set.
|
||||
4. Extract all RRSIG records for the DNSKEY RRset from the response.
|
||||
5. For each algorithm in *DNSKEY Algorithm* do:
|
||||
* If there is no RRSIG for the DNSKEY RRset created by the algorithm
|
||||
then add name server IP and DNSKEY algorithm to the
|
||||
*Algo not signed DNSKEY* set.
|
||||
|
||||
3. Send *SOA Query* over UDP and do:
|
||||
1. Go to next name server IP if any of the following criteria is met:
|
||||
1. No DNS response is returned.
|
||||
2. The RCODE value of the DNS response is not "NoError"
|
||||
([IANA RCODE List]).
|
||||
3. The AA flag of the response is unset.
|
||||
4. The DNS response contains no SOA record in the answer section.
|
||||
5. The DNS response contains no RRSIG for the SOA RRset.
|
||||
2. Extract the SOA record from the answer section (ignore additional SOA
|
||||
records, if any).
|
||||
3. Extract all RRSIG records for the SOA RRset from the response.
|
||||
4. For each algorithm in *DNSKEY Algorithm* do:
|
||||
* If there is no RRSIG for the SOA RRset created by the algorithm then
|
||||
add name server IP and DNSKEY algorithm to the
|
||||
*Algo not signed SOA* set.
|
||||
|
||||
4. Send *NS Query* over UDP.
|
||||
1. Go to next name server IP if any of the following criteria is met:
|
||||
1. No DNS response is returned.
|
||||
2. The RCODE value of the DNS response is not "NoError"
|
||||
([IANA RCODE List]).
|
||||
3. The AA flag of the response is unset.
|
||||
4. The DNS response contains no NS record in the answer section.
|
||||
5. The DNS response contains no RRSIG for the NS RRset.
|
||||
2. Extract all NS records from the answer section.
|
||||
3. Extract all RRSIG records for the NS RRset from the response.
|
||||
4. For each algorithm in *DNSKEY Algorithm* do:
|
||||
* If there is no RRSIG for the NS RRset created by the algorithm then
|
||||
add name server IP and DNSKEY algorithm to the
|
||||
*Algo not signed NS* set.
|
||||
|
||||
7. If the *Algo not signed DNSKEY* set is non-empty, then for each DNSKEY
|
||||
algorithm in the set output *[DS13_ALGO_NOT_SIGNED_DNSKEY]* with the name
|
||||
server IP addresses from the set and the DNSKEY algorithm.
|
||||
|
||||
8. If the *Algo not signed SOA* set is non-empty, then for each DNSKEY
|
||||
algorithm in the set output *[DS13_ALGO_NOT_SIGNED_SOA]* with the name
|
||||
server IP addresses from the set and the SOA algorithm.
|
||||
|
||||
9. If the *Algo not signed NS* set is non-empty, then for each DNSKEY
|
||||
algorithm in the set output *[DS13_ALGO_NOT_SIGNED_NS]* with the name
|
||||
server IP addresses from the set and the NS algorithm.
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
on the ignored result.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
Test case is only performed if DNSKEY records are found.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
## Terminology
|
||||
|
||||
No special terminology for this test case.
|
||||
|
||||
|
||||
[Argument list]: ../ArgumentsForTestCaseMessages.md
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[DNSSEC README]: README.md
|
||||
[DNSSEC08]: dnssec08.md
|
||||
[DNSSEC09]: dnssec09.md
|
||||
[DS13_ALGO_NOT_SIGNED_DNSKEY]: #summary
|
||||
[DS13_ALGO_NOT_SIGNED_NS]: #summary
|
||||
[DS13_ALGO_NOT_SIGNED_SOA]: #summary
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[IANA RCODE List]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 6840#section-5.11]: https://datatracker.ietf.org/doc/html/rfc6840#section-5.11
|
||||
[Severity Level Definitions]: ../SeverityLevelDefinitions.md
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
[Zonemaster-Engine profile]: ../../../configuration/profiles.md
|
||||
@@ -0,0 +1,135 @@
|
||||
# DNSSEC14: Check for valid RSA DNSKEY key size
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC14**
|
||||
|
||||
## Objective
|
||||
|
||||
The DNSKEYs based on RSA have different minimum and maximum key sizes,
|
||||
which must be followed. This test case will validate the keys size of
|
||||
such keys. RSA based algorithms that are deprecated or else not suitable
|
||||
for DNSKEY ([RFC 8624] and [IANA registry]) are just ignored. See test
|
||||
case [DNSSEC05] for test of algorithm.
|
||||
|
||||
The table 1 below specify the maximum and minimum key size,
|
||||
respectively. Algorithm number can be found in [IANA registry].
|
||||
|
||||
Table 1: Minimum and maximum RSA key sizes in bits
|
||||
|
||||
Algorithm | Min size | Max size | Reference
|
||||
:---------|:----------|:---------|:----------------
|
||||
5 | 512 | 4096 | [RFC 3110]
|
||||
7 | 512 | 4096 | [RFC 5155]
|
||||
8 | 512 | 4096 | [RFC 5702]
|
||||
10 | 1024 | 4096 | [RFC 5702]
|
||||
|
||||
It is also recommended that an RSA based algorithm has a key length
|
||||
of at least 2048 bit as stated in [NIST SP 800-57 Part 1 Rev. 4],
|
||||
table 2 on page 53 in section 5.6.1 and table 4 on page 55 in
|
||||
section 5.6.2.
|
||||
|
||||
This test case verifies that RSA DNSKEYs follows the stated key lengths
|
||||
from the RFCs and also the NIST recommended shortest key length.
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is also tested by [Connectivity01]. This test
|
||||
case will set DEBUG level on messages for non-responsive name servers.
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
* "Key Size Table" - The table above.
|
||||
|
||||
## Ordered description of steps to be taken to execute the test case
|
||||
|
||||
1. Create a DNSKEY query with DO flag set for the apex of the
|
||||
*Child Zone*.
|
||||
|
||||
2. Retrieve all name server IP addresses for the
|
||||
*Child Zone* using [Method4] and [Method5] ("NS IP").
|
||||
|
||||
3. Create an empty set "DNSKEY RRs".
|
||||
|
||||
4. For each name server IP address in *NS IP* do:
|
||||
|
||||
1. Send the DNSKEY query over UDP.
|
||||
2. If no DNS response is returned, then output *[NO_RESPONSE]*.
|
||||
3. Else, if the DNS response does not contain an DNSKEY RRset,
|
||||
then output *[NO_RESPONSE_DNSKEY]*.
|
||||
4. Else, retrieve the DNSKEY RRs and add them to *DNSKEY RRs*.
|
||||
|
||||
5. For each DNSKEY from the *DNSKEY RRs* do:
|
||||
1. If the algorithm of the DNSKEY is not listed in *Key Size
|
||||
Table*, go to next DNSKEY.
|
||||
2. Else, if the algorithm is listed in *Key Size Table* and the
|
||||
key size is smaller than specified, then output
|
||||
*[DNSKEY_TOO_SMALL_FOR_ALGO]*.
|
||||
3. Else, if the algorithm is listed in *Key Size Table* and the
|
||||
key size is smaller than 2048 bits, then output
|
||||
*[DNSKEY_SMALLER_THAN_REC]*.
|
||||
3. Else, if the algorithm is listed in *Key Size Table* and the
|
||||
key size is larger than specified, then output
|
||||
*[DNSKEY_TOO_LARGE_FOR_ALGO]*.
|
||||
|
||||
6. If *DNSKEY RRs* is non-empty and no messages, except for any
|
||||
*[NO_RESPONSE]*, has been outputted, then output
|
||||
*[KEY_SIZE_OK]*.
|
||||
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *ERROR* or *CRITICAL*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *WARNING*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases the outcome of this Test Case is "pass".
|
||||
|
||||
Message | Default severity level
|
||||
:-----------------------------|:-----------------------------------
|
||||
NO_RESPONSE | DEBUG
|
||||
NO_RESPONSE_DNSKEY | WARNING
|
||||
DNSKEY_SMALLER_THAN_REC | WARNING
|
||||
DNSKEY_TOO_SMALL_FOR_ALGO | ERROR
|
||||
DNSKEY_TOO_LARGE_FOR_ALGO | ERROR
|
||||
KEY_SIZE_OK | INFO
|
||||
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
on the ignored result.
|
||||
|
||||
See the [DNSSEC README] document about DNSSEC algorithms.
|
||||
|
||||
The test case is only performed if some DNSKEY record is found in the
|
||||
*Child Zone*.
|
||||
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[DNSKEY_SMALLER_THAN_REC]: #outcomes
|
||||
[DNSKEY_TOO_LARGE_FOR_ALGO]: #outcomes
|
||||
[DNSKEY_TOO_SMALL_FOR_ALGO]: #outcomes
|
||||
[DNSSEC README]: ./README.md
|
||||
[DNSSEC05]: ./dnssec05.md
|
||||
[IANA registry]: https://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xml
|
||||
[KEY_SIZE_OK]: #outcomes
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NIST SP 800-57 Part 1 Rev. 4]: https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-4/archive/2016-01-28
|
||||
[NO_RESPONSE]: #outcomes
|
||||
[NO_RESPONSE_DNSKEY]: #outcomes
|
||||
[RFC 3110]: https://datatracker.ietf.org/doc/html/rfc3110
|
||||
[RFC 5155]: https://datatracker.ietf.org/doc/html/rfc5155
|
||||
[RFC 5702]: https://datatracker.ietf.org/doc/html/rfc5702#section-2
|
||||
[RFC 8624]: https://www.rfc-editor.org/rfc/rfc8624.html#section-3.1
|
||||
[Recommendation for key Management, part 1, revision 4]: https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
# DNSSEC15: Existence of CDS and CDNSKEY
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC15**
|
||||
|
||||
## Objective
|
||||
|
||||
CDS and CDNSKEY record types are defined in [RFC 7344] and [RFC 8078].
|
||||
Both record types are optional in a zone. The objective of this test
|
||||
case is to verify that they are correctly set-up, if included in the
|
||||
zone.
|
||||
|
||||
If a CDS record is included in the zone, the corresponding CDNSKEY
|
||||
record should also be included ([RFC 7344][RFC 7344#4], section 4).
|
||||
|
||||
The CDS and CDNSKEY RRsets should be consistent between all name
|
||||
servers for the zone in question.
|
||||
|
||||
If there are both CDS RRs and CDNSKEY RRs in the zone they must match in
|
||||
content ([RFC 7344][RFC 7344#4], section 4). It means that both
|
||||
must be derived from the same DNSKEY or both being "delete" CDS and
|
||||
CDNSKEY.
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is also tested by [Connectivity01]. This test
|
||||
case will just ignore non-responsive name servers or name servers not
|
||||
giving a correct DNS response for an authoritative name server.
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
|
||||
## Summary
|
||||
|
||||
Message Tag outputted | [Default level] | Description of when message tag is outputted
|
||||
:-------------------------|:----------------|:-----------------------------------------
|
||||
DS15_HAS_CDNSKEY_NO_CDS | NOTICE | CDNSKEY RRset is found, but no CDS RRset.
|
||||
DS15_HAS_CDS_AND_CDNSKEY | INFO | CDNSKEY and CDS RRsets are found.
|
||||
DS15_HAS_CDS_NO_CDNSKEY | NOTICE | CDS RRset is found, but no CDNSKEY RRset.
|
||||
DS15_INCONSISTENT_CDNSKEY | ERROR | All servers do not have the same CDNSKEY RRset.
|
||||
DS15_INCONSISTENT_CDS | ERROR | All servers do not have the same CDS RRset.
|
||||
DS15_MISMATCH_CDS_CDNSKEY | ERROR | Both CDS and CDNSKEY RRsets are found but they do not match.
|
||||
DS15_NO_CDS_CDNSKEY | INFO | No CDS or CDNSKEY RRsets are found on any name server.
|
||||
|
||||
## Ordered description of steps to be taken to execute the test case
|
||||
|
||||
1. Create the following empty sets:
|
||||
1. Name server IP address and associated CDS RRset ("CDS RRsets"). A
|
||||
name server IP can hold an empty RRset.
|
||||
2. Name server IP address and associated CDNSKEY RRset ("CDNSKEY RRsets").
|
||||
A name server IP can hold an empty RRset.
|
||||
3. Name server IP address set ("Mismatch CDS/CDNSKEY").
|
||||
4. Name server IP address set ("Has CDS No CDNSKEY").
|
||||
5. Name server IP address set ("Has CDNSKEY No CDS").
|
||||
6. Name server IP address set ("Has CDS And CDNSKEY").
|
||||
|
||||
2. Retrieve all name server IP addresses for the *Child Zone* using
|
||||
[Method4] and [Method5] ("NS IP").
|
||||
|
||||
3. Create a CDS query with EDNS enabled with the DO bit set for the
|
||||
apex of the *Child Zone*.
|
||||
|
||||
4. Create a CDNSKEY query with EDNS enabled with the DO bit set for
|
||||
the apex of the *Child Zone*.
|
||||
|
||||
5. For each name server IP in the *NS IP* set do:
|
||||
|
||||
1. Send the CDS query over UDP to the name server IP address.
|
||||
1. If no DNS response is returned, then go to next name server IP.
|
||||
2. Else, if AA bit is not set in the DNS response, then go to next
|
||||
name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then go to
|
||||
next name server IP.
|
||||
4. Else, if the DNS response contains no CDS record in the
|
||||
answer section, then add the name server IP and an empty RRset to
|
||||
the *CDS RRsets* set.
|
||||
5. Else, add the name server IP and the CDS RRset from the answer
|
||||
section to the *CDS RRsets* set.
|
||||
2. Send the CDNSKEY query over UDP to the name server IP address.
|
||||
1. If no DNS response is returned, then go to next name server IP.
|
||||
2. Else, if AA bit is not set in the DNS response, then go to next
|
||||
name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then go to
|
||||
next name server IP.
|
||||
4. Else, if the DNS response contains no CDNSKEY record in the
|
||||
answer section, then add the name server IP and an empty RRset to
|
||||
the *CDNSKEY RRsets* set.
|
||||
5. Else, add the name server IP and the CDNSKEY RRset from the answer
|
||||
section to the *CDNSKEY RRsets* set.
|
||||
3. Go to next name server IP.
|
||||
|
||||
6. If the *CDS RRsets* set and the *CDNSKEY RRsets* set are empty
|
||||
then output *[DS15_NO_CDS_CDNSKEY]* and terminate this
|
||||
test case.
|
||||
|
||||
7. For each name server IP in the *CDS RRsets* set do:
|
||||
|
||||
1. If the name server IP is not listed in *CDNSKEY RRsets*, go to next name
|
||||
server IP.
|
||||
2. If the name server IP address has a non-empty RRset in the
|
||||
*CDS RRsets* set, but an empty RRset in the *CDNSKEY RRsets*
|
||||
set, then add the name server IP address to *Has CDS No CDNSKEY*.
|
||||
3. If the name server IP address has a non-empty RRset in the
|
||||
*CDNSKEY RRsets* set, but an empty RRset in the *CDS RRsets*
|
||||
set, then add the name server IP address to *Has CDNSKEY No CDS*.
|
||||
4. If the name server IP address has a non-empty RRset in both
|
||||
sets, *CDNSKEY RRsets* and *CDS RRsets*, then add the name
|
||||
server IP address to *Has CDS And CDNSKEY*.
|
||||
5. Go to next name server IP.
|
||||
|
||||
8. For each name server IP in the *CDS RRsets* set do:
|
||||
|
||||
1. If the name server IP is not listed in *CDNSKEY RRsets*, go to next name
|
||||
server IP.
|
||||
2. Extract the CDS RRset (possibly empty) for the IP in the *CDS RRsets* set.
|
||||
3. Extract the CDNSKEY RRset (possibly empty) for the same IP from
|
||||
the *CDNSKEY RRsets* set.
|
||||
4. If both RRsets are non-empty then do:
|
||||
1. For each CDS RR verify that there is a matching CDNSKEY (derived
|
||||
from the same DNSKEY or both being "delete").
|
||||
2. For each CDNSKEY RR verify that there is a matching CDS (derived
|
||||
from the same DNSKEY or both being "delete").
|
||||
3. If one or both of the verifications fail then add the name server
|
||||
IP to the *Mismatch CDS/CDNSKEY* set.
|
||||
4. Go to next name sever IP.
|
||||
|
||||
|
||||
9. If the *Has CDS No CDNSKEY* set is non-empty then output
|
||||
*[DS15_HAS_CDS_NO_CDNSKEY]* with the name server IP addresses from
|
||||
the set.
|
||||
|
||||
10. If the *Has CDNSKEY No CDS* set is non-empty then output
|
||||
*[DS15_HAS_CDNSKEY_NO_CDS]* with the name server IP addresses from
|
||||
the set.
|
||||
|
||||
11. If the *Has CDS And CDNSKEY* set is non-empty then output
|
||||
*[DS15_HAS_CDS_AND_CDNSKEY]* with the name server IP addresses from
|
||||
the set.
|
||||
|
||||
12. If not all CDS RRsets in the *CDS RRsets* set are identical, where
|
||||
a non-empty RRset is considered to be different from an empty
|
||||
RRset, then output *[DS15_INCONSISTENT_CDS]*.
|
||||
|
||||
13. If not all CDNSKEY RRsets in the *CDNSKEY RRsets* set are identical,
|
||||
where a non-empty RRset is considered to be different from an
|
||||
empty RRset, then output *[DS15_INCONSISTENT_CDNSKEY]*.
|
||||
|
||||
14. If the *Mismatch CDS/CDNSKEY* set is non-empty, then output
|
||||
*[DS15_MISMATCH_CDS_CDNSKEY]* and list the name server IPs from
|
||||
the set.
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
the ignored protocol.
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[DS15_HAS_CDNSKEY_NO_CDS]: #summary
|
||||
[DS15_HAS_CDS_AND_CDNSKEY]: #summary
|
||||
[DS15_HAS_CDS_NO_CDNSKEY]: #summary
|
||||
[DS15_INCONSISTENT_CDNSKEY]: #summary
|
||||
[DS15_INCONSISTENT_CDS]: #summary
|
||||
[DS15_MISMATCH_CDS_CDNSKEY]: #summary
|
||||
[DS15_NO_CDS_CDNSKEY]: #summary
|
||||
[Default level]: ../SeverityLevelDefinitions.md
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 7344#4]: https://datatracker.ietf.org/doc/html/rfc7344#section-4
|
||||
[RFC 7344]: https://datatracker.ietf.org/doc/html/rfc7344
|
||||
[RFC 8078]: https://datatracker.ietf.org/doc/html/rfc8078
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
@@ -0,0 +1,264 @@
|
||||
# DNSSEC16: Validate CDS
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC16**
|
||||
|
||||
## Objective
|
||||
|
||||
CDS and CDNSKEY record types are defined in [RFC 7344] and [RFC 8078].
|
||||
Both record types are optional in a zone. The objective of this test
|
||||
case is to verify that the CDS RRset is valid. This test case is
|
||||
only relevant if the zone has at least one CDS record. For tests of the
|
||||
CDNSKEY, see test case [DNSSEC17].
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is also tested by [Connectivity01]. This test
|
||||
case will just ignore non-responsive name servers or name servers not
|
||||
giving a correct DNS response for an authoritative name server.
|
||||
|
||||
It is assumed that *Child Zone* has been tested or will be tested by
|
||||
[DNSSEC15] and [DNSSEC17] and that the servers give the same responses.
|
||||
Running this test case without running [DNSSEC15] and [DNSSEC17] can
|
||||
give an incomplete report of the CDS and CDNSKEY status of
|
||||
*Child Zone*.
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
|
||||
## Summary
|
||||
|
||||
* If no CDS record is found, the test case will terminate early
|
||||
with no message tag outputted.
|
||||
* If a CDS record is of "delete" type, then it can by definition not
|
||||
match or point at any DNSKEY record.
|
||||
|
||||
Message Tag outputted | [Default level] | Description of when message tag is outputted
|
||||
:------------------------------------|:--------|:-----------------------------------------
|
||||
DS16_CDS_INVALID_RRSIG | ERROR | CDS RRset is signed with an invalid RRSIG.
|
||||
DS16_CDS_MATCHES_NON_SEP_DNSKEY | NOTICE | CDS record matches a DNSKEY with SEP bit (bit 15) unset.
|
||||
DS16_CDS_MATCHES_NON_ZONE_DNSKEY | ERROR | CDS record matches a DNSKEY with zone bit (bit 7) unset.
|
||||
DS16_CDS_MATCHES_NO_DNSKEY | WARNING | CDS record does not match any DNSKEY in DNSKEY RRset.
|
||||
DS16_CDS_NOT_SIGNED_BY_CDS | NOTICE | CDS RRset is not signed by the key that the CDS record points to.
|
||||
DS16_CDS_SIGNED_BY_UNKNOWN_DNSKEY | ERROR | CDS RRset is signed by a key not in DNSKEY RRset.
|
||||
DS16_CDS_UNSIGNED | ERROR | CDS RRset is unsigned.
|
||||
DS16_CDS_WITHOUT_DNSKEY | ERROR | CDS RRset exists, but there is no DNSKEY RRset.
|
||||
DS16_DELETE_CDS | INFO | CDS RRset has a "delete" CDS record as a single record.
|
||||
DS16_DNSKEY_NOT_SIGNED_BY_CDS | WARNING | DNSKEY RRset is not signed by the key or keys that the CDS records point to.
|
||||
DS16_MIXED_DELETE_CDS | ERROR | "Delete" CDS record is mixed with normal CDS record.
|
||||
|
||||
## Ordered description of steps to be taken to execute the test case
|
||||
|
||||
1. Create the following empty sets:
|
||||
1. Name server IP address and associated CDS RRset and its RRSIG
|
||||
records ("CDS RRsets"). The set of RRSIG records may be empty.
|
||||
2. Name server IP address and associated DNSKEY RRset and its
|
||||
RRSIG records ("DNSKEY RRsets"). The set of RRSIG records may be empty.
|
||||
3. Name server IP address ("No DNSKEY RRset").
|
||||
4. Name server IP address ("Mixed Delete CDS").
|
||||
5. Name server IP address ("Delete CDS").
|
||||
6. Name server IP address and associated CDS key tag
|
||||
("No Match CDS With DNSKEY").
|
||||
7. Name server IP address and associated CDS key tag
|
||||
("CDS points to non-zone DNSKEY").
|
||||
8. Name server IP address and associated CDS key tag
|
||||
("CDS points to non-SEP DNSKEY").
|
||||
9. Name server IP address and associated CDS key tag
|
||||
("DNSKEY Not Signed By CDS").
|
||||
10. Name server IP address and associated CDS key tag
|
||||
("CDS Not Signed By CDS").
|
||||
11. Name server IP address ("CDS Not Signed").
|
||||
12. Name server IP address and key tag
|
||||
("CDS Signed By Unknown DNSKEY").
|
||||
13. Name server IP address and key tag ("CDS Invalid RRSIG").
|
||||
|
||||
2. Create a CDS query with EDNS enabled and the DO bit set for the
|
||||
apex of the *Child Zone*.
|
||||
|
||||
3. Create a DNSKEY query with EDNS enabled and the DO bit set for
|
||||
the apex of the *Child Zone*.
|
||||
|
||||
4. Retrieve all name server IP addresses for the *Child Zone* using
|
||||
[Method4] and [Method5] ("NS IP").
|
||||
|
||||
5. Repeat the following steps for each name server IP address in
|
||||
*NS IP*:
|
||||
|
||||
1. Send the CDS query over UDP to the name server IP address.
|
||||
1. If no DNS response is returned, then go to next name server
|
||||
IP.
|
||||
2. Else, if AA bit is not set in the DNS response, then go to
|
||||
next name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then
|
||||
go to next name server IP.
|
||||
4. Else, if the answer section has no CDS records, go to next
|
||||
name server IP.
|
||||
5. Add the name server IP and the CDS RRset from the answer
|
||||
section to the *CDS RRsets* set. Also include any associated
|
||||
RRSIG records in the answer section.
|
||||
2. Send the DNSKEY query over UDP to the name server IP address.
|
||||
1. If no DNS response is returned, then go to next name server
|
||||
IP.
|
||||
2. Else, if AA bit is not set in the DNS response, then go to
|
||||
next name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then
|
||||
go to next name server IP.
|
||||
4. Else, if the DNS response contains at least one DNSKEY
|
||||
record in the answer section, then add the name server IP and
|
||||
the DNSKEY RRset from the answer section to the
|
||||
*DNSKEY RRsets* set. Also include any associated RRSIG
|
||||
records in the answer section.
|
||||
3. Go to next name server IP.
|
||||
|
||||
6. If the *CDS RRsets* set is empty then terminate this test case.
|
||||
|
||||
7. For each name server IP in the *CDS RRsets* set do:
|
||||
|
||||
1. If the CDS RRset is empty go to next name server IP address.
|
||||
2. Get the CDS RRset and the associated RRSIG records, if any, from the
|
||||
*CDS RRsets* set for the name server IP.
|
||||
3. If any CDS record is a "delete" CDS, then do:
|
||||
1. If there is more than a single CDS record then add the name
|
||||
server IP to the *Mixed Delete CDS* set.
|
||||
2. Else, add the name server IP address to the *Delete CDS*
|
||||
set.
|
||||
4. Get the DNSKEY RRset and the associated RRSIG records, if any, from the
|
||||
*DNSKEY RRsets* for the same name server IP.
|
||||
5. If there are no DNSKEY records, then do:
|
||||
1. Add name server IP address to the *No DNSKEY RRset* set.
|
||||
2. Go to next name server IP.
|
||||
6. Repeat the following steps for each CDS record unless it is a "delete"
|
||||
CDS record:
|
||||
1. Compare the key tag from the CDS record with the
|
||||
[calculated key tags][Key Tag Calculation] for the DNSKEY records.
|
||||
2. If the CDS record does not match any DNSKEY record then add
|
||||
the name server IP address and CDS record key tag to the
|
||||
*No Match CDS With DNSKEY* set.
|
||||
3. Else, if bit 7 of the flags field of the DNSKEY that the DS record
|
||||
points to is unset (value 0) then add the name server IP address and
|
||||
CDS record key tag to the *CDS points to non-zone DNSKEY* set.
|
||||
4. Else, do:
|
||||
1. If the DNSKEY RRset has not been signed by the DNSKEY record that
|
||||
the CDS record points at then add the name server IP address and
|
||||
key tag of CDS record to the *DNSKEY Not Signed By CDS* set.
|
||||
2. If the CDS RRset has not been signed by the DNSKEY record that
|
||||
the CDS record points at then add the name server IP address and
|
||||
key tag of CDS record to the *CDS Not Signed By CDS* set.
|
||||
3. If bit 15 of the flags field of the DNSKEY that the CDS record
|
||||
points at is unset (value 0) then add the name server IP address
|
||||
and the key tag of the CDS record to the
|
||||
*CDS points to non-SEP DNSKEY* set.
|
||||
7. If CDS RRset is not signed, then add the name server IP address to the
|
||||
*CDS Not Signed* set.
|
||||
8. Else, for each RRSIG for the CDS RRset do:
|
||||
1. If the key tag of the RRSIG does not match any DNSKEY record in the
|
||||
DNSKEY RRset then add the name server IP address and key tag to the
|
||||
*CDS Signed By Unknown DNSKEY* set.
|
||||
2. Else, if the RRSIG cannot be validated by the DNSKEY it
|
||||
refers to by key tag, then add the name server IP and RRSIG
|
||||
key tag to the *CDS Invalid RRSIG* set.
|
||||
9. Go to next name server IP address.
|
||||
|
||||
8. If the *No DNSKEY RRset* set is non-empty, then output
|
||||
*[DS16_CDS_WITHOUT_DNSKEY]* with all name server IP addresses
|
||||
in the set.
|
||||
|
||||
9. If the *Mixed Delete CDS* set is
|
||||
non-empty, then output *[DS16_MIXED_DELETE_CDS]* with all
|
||||
name server IP addresses in the set.
|
||||
|
||||
10. If the *Delete CDS* set is non-empty, then output
|
||||
*[DS16_DELETE_CDS]* with all name server IP addresses.
|
||||
|
||||
11. If the *No Match CDS With DNSKEY* set is non-empty then do:
|
||||
* For each CDS key tag in the set do:
|
||||
* Output *[DS16_CDS_MATCHES_NO_DNSKEY]* with the CDS key tag
|
||||
and the name server IP addresses in the set for that key
|
||||
tag.
|
||||
|
||||
12. If the *CDS points to non-zone DNSKEY* set is non-empty then do:
|
||||
* For each CDS key tag in the set do:
|
||||
* Output *[DS16_CDS_MATCHES_NON_ZONE_DNSKEY]* with the CDS key tag
|
||||
and the name server IP addresses in the set for that key
|
||||
tag.
|
||||
|
||||
13. If the *CDS points to non-SEP DNSKEY* set is non-empty then do:
|
||||
* For each CDS key tag in the set do:
|
||||
* Output *[DS16_CDS_MATCHES_NON_SEP_DNSKEY]* with the CDS key tag
|
||||
and the name server IP addresses in the set for that key
|
||||
tag.
|
||||
|
||||
14. If the *DNSKEY Not Signed By CDS* set is non-empty then do:
|
||||
* For each CDS key tag in the set do:
|
||||
* Output *[DS16_DNSKEY_NOT_SIGNED_BY_CDS]* with the CDS key
|
||||
tag and the name server IP addresses in the set for that
|
||||
key tag.
|
||||
|
||||
15. If the *CDS Not Signed By CDS* set is non-empty then do:
|
||||
* For each CDS key tag in the set do:
|
||||
* Output *[DS16_CDS_NOT_SIGNED_BY_CDS]* with the CDS key
|
||||
tag and the name server IP addresses in the set for that
|
||||
key tag.
|
||||
|
||||
16. If the *CDS Invalid RRSIG* set is non-empty then do:
|
||||
* For each RRSIG key tag in the set do:
|
||||
* Output *[DS16_CDS_INVALID_RRSIG]* with the RRSIG key tag and
|
||||
the name server IP addresses in the set for that key tag.
|
||||
|
||||
17. If the *CDS Not Signed* set is non-empty then output
|
||||
*[DS16_CDS_UNSIGNED]* with all name server IP addresses in the set.
|
||||
|
||||
18. If the *CDS Signed By Unknown DNSKEY* set is non-empty then output
|
||||
*[DS16_CDS_SIGNED_BY_UNKNOWN_DNSKEY]* with the name server IP
|
||||
addresses in the set.
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
the ignored protocol.
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[DNSSEC15]: dnssec15.md
|
||||
[DNSSEC17]: dnssec17.md
|
||||
[DS16_CDS_INVALID_RRSIG]: #summary
|
||||
[DS16_CDS_MATCHES_NON_SEP_DNSKEY]: #summary
|
||||
[DS16_CDS_MATCHES_NON_ZONE_DNSKEY]: #summary
|
||||
[DS16_CDS_MATCHES_NO_DNSKEY]: #summary
|
||||
[DS16_CDS_NOT_SIGNED_BY_CDS]: #summary
|
||||
[DS16_CDS_SIGNED_BY_UNKNOWN_DNSKEY]: #summary
|
||||
[DS16_CDS_UNSIGNED]: #summary
|
||||
[DS16_CDS_WITHOUT_DNSKEY]: #summary
|
||||
[DS16_DELETE_CDS]: #summary
|
||||
[DS16_DNSKEY_NOT_SIGNED_BY_CDS]: #summary
|
||||
[DS16_MIXED_DELETE_CDS]: #summary
|
||||
[Default level]: ../SeverityLevelDefinitions.md
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Key Tag Calculation]: https://datatracker.ietf.org/doc/html/rfc4034#appendix-B
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 7344, section 4]: https://datatracker.ietf.org/doc/html/rfc7344#section-4
|
||||
[RFC 7344]: https://datatracker.ietf.org/doc/html/rfc7344
|
||||
[RFC 8078]: https://datatracker.ietf.org/doc/html/rfc8078
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
@@ -0,0 +1,269 @@
|
||||
# DNSSEC17: Validate CDNSKEY
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC17**
|
||||
|
||||
## Objective
|
||||
|
||||
CDS and CDNSKEY record types are defined in [RFC 7344] and [RFC 8078].
|
||||
Both record types are optional in a zone. The objective of this test
|
||||
case is to verify that the CDNSKEY RRset is valid. This test case is
|
||||
only relevant if the zone has at least one CDNSKEY record. For tests of the
|
||||
CDS, see test case [DNSSEC16].
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is also tested by [Connectivity01]. This test
|
||||
case will just ignore non-responsive name servers or name servers not
|
||||
giving a correct DNS response for an authoritative name server.
|
||||
|
||||
It is assumed that *Child Zone* has been tested or will be tested by
|
||||
[DNSSEC15] and [DNSSEC16] and that the servers give the same responses.
|
||||
Running this test case without running [DNSSEC15] and [DNSSEC16] can
|
||||
give an incomplete report of the CDS and CDNSKEY status of
|
||||
*Child Zone*.
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
|
||||
## Summary
|
||||
|
||||
* If no CDNSKEY record is found, the test case will terminate early
|
||||
with no message tag outputted.
|
||||
* If a CDNSKEY record is of "delete" type, then it can by
|
||||
definition not match or point at any DNSKEY record.
|
||||
|
||||
Message Tag outputted | [Default level] | Description of when message tag is outputted
|
||||
:------------------------------------|:--------|:-----------------------------------------
|
||||
DS17_CDNSKEY_INVALID_RRSIG | ERROR | CDNSKEY RRset signed with an invalid RRSIG.
|
||||
DS17_CDNSKEY_IS_NON_SEP | NOTICE | CDNSKEY record has the SEP bit (bit 15) unset.
|
||||
DS17_CDNSKEY_IS_NON_ZONE | ERROR | CDNSKEY record has the zone bit (bit 7) unset.
|
||||
DS17_CDNSKEY_MATCHES_NO_DNSKEY | WARNING | CDNSKEY record does not match any DNSKEY in DNSKEY RRset.
|
||||
DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY | NOTICE | CDNSKEY RRset is not signed by the key that the CDNSKEY record points to.
|
||||
DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY| ERROR | CDNSKEY RRset is signed by a key not in DNSKEY RRset.
|
||||
DS17_CDNSKEY_UNSIGNED | ERROR | CDNSKEY RRset is unsigned.
|
||||
DS17_CDNSKEY_WITHOUT_DNSKEY | ERROR | CDNSKEY RRset exists, but there is no DNSKEY RRset.
|
||||
DS17_DELETE_CDNSKEY | INFO | CDNSKEY RRset has a "delete" CDNSKEY record as a single record.
|
||||
DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY | WARNING | DNSKEY RRset is not signed by the key or keys that the CDNSKEY records point to.
|
||||
DS17_MIXED_DELETE_CDNSKEY | ERROR | "Delete" CDNSKEY record is mixed with normal CDNSKEY record.
|
||||
|
||||
## Ordered description of steps to be taken to execute the test case
|
||||
|
||||
1. Create the following empty sets:
|
||||
1. Name server IP address and associated CDNSKEY RRset and its
|
||||
RRSIG records ("CDNSKEY RRsets"). The set of RRSIG records may be empty
|
||||
2. Name server IP address and associated DNSKEY RRset and its
|
||||
RRSIG records ("DNSKEY RRsets"). The set of RRSIG records may be empty.
|
||||
3. Name server IP address ("No DNSKEY RRset").
|
||||
4. Name server IP address ("Mixed Delete CDNSKEY").
|
||||
5. Name server IP address ("Delete CDNSKEY").
|
||||
6. Name server IP address and associated CDNSKEY key tag
|
||||
("No Match CDNSKEY With DNSKEY").
|
||||
7. Name server IP address and associated CDNSKEY key tag
|
||||
("CDNSKEY is non-zone key").
|
||||
8. Name server IP address and associated CDNSKEY key tag
|
||||
("CDNSKEY is non-SEP key").
|
||||
9. Name server IP address and key tag
|
||||
("DNSKEY Not Signed By CDNSKEY").
|
||||
10. Name server IP address and key tag
|
||||
("CDNSKEY Not Signed By CDNSKEY").
|
||||
11. Name server IP address ("CDNSKEY Not Signed").
|
||||
12. Name server IP address and key tag
|
||||
("CDNSKEY Signed By Unknown DNSKEY").
|
||||
13. Name server IP address and key tag ("CDNSKEY Invalid RRSIG").
|
||||
|
||||
2. Create a CDNSKEY query with EDNS enabled and the DO bit set for
|
||||
the apex of the *Child Zone*.
|
||||
|
||||
3. Create a DNSKEY query with EDNS enabled and the DO bit set for
|
||||
the apex of the *Child Zone*.
|
||||
|
||||
4. Retrieve all name server IP addresses for the *Child Zone* using
|
||||
[Method4] and [Method5] ("NS IP").
|
||||
|
||||
5. Repeat the following steps for each name server IP address in
|
||||
*NS IP*:
|
||||
|
||||
1. Send the CDNSKEY query over UDP to the name server IP address.
|
||||
1. If no DNS response is returned, then go to next name server
|
||||
IP.
|
||||
2. Else, if AA bit is not set in the DNS response, then go to
|
||||
next name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then
|
||||
go to next name server IP.
|
||||
4. Else, if the answer section has no CDNSKEY records, go to
|
||||
next name server IP.
|
||||
5. Add the name server IP and the CDNSKEY RRset from the answer
|
||||
section to the *CDNSKEY RRsets* set. Also include any
|
||||
associated RRSIG records in the answer section.
|
||||
2. Send the DNSKEY query over UDP to the name server IP address.
|
||||
1. If no DNS response is returned, then go to next name server
|
||||
IP.
|
||||
2. Else, if AA bit is not set in the DNS response, then go to
|
||||
next name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then
|
||||
go to next name server IP.
|
||||
4. Else, if the DNS response contains at least one DNSKEY
|
||||
record in the answer section, then add the name server IP and
|
||||
the DNSKEY RRset from the answer section to the
|
||||
*DNSKEY RRsets* set. Also include any associated RRSIG records
|
||||
in the answer section.
|
||||
3. Go to next name server IP.
|
||||
|
||||
6. If the *CDNSKEY RRsets* set is empty then terminate this test case.
|
||||
|
||||
7. For each name server IP in the *CDNSKEY RRsets* set do:
|
||||
|
||||
1. If the CDNSKEY RRset is empty go to next name server IP address.
|
||||
2. Get the CDNSKEY RRset and the associated RRSIG records, if any, from the
|
||||
*CDNSKEY RRsets* set for the name server IP.
|
||||
3. If any CDNSKEY record is a "delete" CDNSKEY, then do:
|
||||
1. If there is more than a single CDNSKEY record then add the
|
||||
name server IP to the *Mixed Delete CDNSKEY* set.
|
||||
2. Else, add the name server IP address to the *Delete CDNSKEY*
|
||||
set.
|
||||
4. Get the DNSKEY RRset and the associated RRSIG records, if any, from the
|
||||
*DNSKEY RRsets* for the same name server IP.
|
||||
5. If there are no DNSKEY records, then do:
|
||||
1. Add name server IP address to the *No DNSKEY RRset* set
|
||||
(duplicates not possible).
|
||||
2. Go to next name server IP.
|
||||
6. Repeat the following steps for each CDNSKEY record unless it is a "delete"
|
||||
CDNSKEY record:
|
||||
1. If bit 7 of the flags field of the CDNSKEY record is unset (value 0)
|
||||
then add the name server IP address and the
|
||||
[key tag calculated][Key Tag Calculation] from the CDNSKEY record to
|
||||
the *CDNSKEY is non-zone key* set.
|
||||
2. Else, do:
|
||||
1. If bit 15 of the flags field of the CDNSKEY is unset (value 0) then
|
||||
add the name server IP address and the
|
||||
[key tag calculated][Key Tag Calculation] from the CDNSKEY to the
|
||||
*CDNSKEY is non-SEP key* set.
|
||||
2. Compare the CDNSKEY record with the DNSKEY records.
|
||||
3. If the CDNSKEY record does not match any DNSKEY record then
|
||||
add the name server IP address and the
|
||||
[key tag calculated][Key Tag Calculation] from the CDNSKEY record
|
||||
to the *No Match CDNSKEY With DNSKEY* set.
|
||||
4. Else, do:
|
||||
1. If the DNSKEY RRset is not signed by the DNSKEY record that
|
||||
corresponds to the CDNSKEY record then add the name server IP
|
||||
address and [key tag calculated][Key Tag Calculation] from
|
||||
CDNSKEY record to the *DNSKEY Not Signed By CDNSKEY* set.
|
||||
2. If the CDNSKEY RRset is not signed by the DNSKEY record that
|
||||
corresponds to the CDNSKEY record then add the name server IP
|
||||
address and [key tag calculated][Key Tag Calculation] from
|
||||
CDNSKEY record to the *CDNSKEY Not Signed By CDNSKEY* set.
|
||||
|
||||
7. If the CDNSKEY RRset is not signed, then add the name server IP address to
|
||||
the *CDNSKEY Not Signed* set.
|
||||
8. Else, for each RRSIG for the CDNSKEY RRset do:
|
||||
1. If the key tag of the RRSIG does not match any DNSKEY record in the
|
||||
DNSKEY RRset then add the name server IP address and key tag to the
|
||||
*CDNSKEY Signed By Unknown DNSKEY* set.
|
||||
2. Else, if the RRSIG cannot be validated by the DNSKEY it
|
||||
refers to by key tag, then add the name server IP and RRSIG
|
||||
key tag to the *CDNSKEY Invalid RRSIG* set.
|
||||
9. Go to next name server IP address.
|
||||
|
||||
8. If the *No DNSKEY RRset* set is non-empty, then output
|
||||
*[DS17_CDNSKEY_WITHOUT_DNSKEY]* with all name server IP addresses
|
||||
in the set.
|
||||
|
||||
9. If the *Mixed Delete CDNSKEY* set is
|
||||
non-empty, then output *[DS17_MIXED_DELETE_CDNSKEY]* with all
|
||||
name server IP addresses in the set.
|
||||
|
||||
10. If the *Delete CDNSKEY* set is non-empty then output
|
||||
*[DS17_DELETE_CDNSKEY]* with all name server IP addresses.
|
||||
|
||||
11. If the *No Match CDNSKEY With DNSKEY* set is non-empty then do:
|
||||
* For each CDNSKEY key tag in the set do:
|
||||
* Output *[DS17_CDNSKEY_MATCHES_NO_DNSKEY]* with the CDNSKEY
|
||||
key tag and the name server IP addresses in the set for that
|
||||
key tag.
|
||||
|
||||
12. If the *CDNSKEY is non-zone key* set is non-empty then do:
|
||||
* For each CDNSKEY key tag in the set do:
|
||||
* Output *[DS17_CDNSKEY_IS_NON_ZONE]* with the CDNSKEY key tag
|
||||
and the name server IP addresses in the set for that key tag.
|
||||
|
||||
13. If the *CDNSKEY is non-SEP key* set is non-empty then do:
|
||||
* For each CDNSKEY key tag in the set do:
|
||||
* Output *[DS17_CDNSKEY_IS_NON_SEP]* with the CDNSKEY key tag
|
||||
and the name server IP addresses in the set for that key tag.
|
||||
|
||||
14. If the *DNSKEY Not Signed By CDNSKEY* set is non-empty then do:
|
||||
* For each CDNSKEY key tag in the set do:
|
||||
* Output *[DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY]* with the CDNSKEY
|
||||
key tag and the name server IP addresses in the set for that
|
||||
key tag.
|
||||
|
||||
15. If the *CDNSKEY Not Signed By CDNSKEY* set is non-empty then do:
|
||||
* For each CDNSKEY key tag in the set do:
|
||||
* Output *[DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY]* with the CDNSKEY key tag
|
||||
and the name server IP addresses in the set for that key tag.
|
||||
|
||||
16. If the *CDNSKEY Invalid RRSIG* set is non-empty then do:
|
||||
* For each RRSIG key tag in the set do:
|
||||
* Output *[DS17_CDNSKEY_INVALID_RRSIG]* with the RRSIG key tag
|
||||
and the name server IP addresses in the set for that key tag.
|
||||
|
||||
17. If the *CDNSKEY Not Signed* set is
|
||||
non-empty then output *[DS17_CDNSKEY_UNSIGNED]* with all
|
||||
name server IP addresses in the set.
|
||||
|
||||
18. If the *CDNSKEY Signed By Unknown DNSKEY* set is non-empty then
|
||||
output *[DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY]* with the name server
|
||||
IP addresses in the set.
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
the ignored protocol.
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[DNSSEC15]: dnssec15.md
|
||||
[DNSSEC16]: dnssec16.md
|
||||
[DS17_CDNSKEY_INVALID_RRSIG]: #summary
|
||||
[DS17_CDNSKEY_IS_NON_SEP]: #summary
|
||||
[DS17_CDNSKEY_IS_NON_ZONE]: #summary
|
||||
[DS17_CDNSKEY_MATCHES_NO_DNSKEY]: #summary
|
||||
[DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY]: #summary
|
||||
[DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY]: #summary
|
||||
[DS17_CDNSKEY_UNSIGNED]: #summary
|
||||
[DS17_CDNSKEY_WITHOUT_DNSKEY]: #summary
|
||||
[DS17_DELETE_CDNSKEY]: #summary
|
||||
[DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY]: #summary
|
||||
[DS17_MIXED_DELETE_CDNSKEY]: #summary
|
||||
[Default level]: ../SeverityLevelDefinitions.md
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Key Tag Calculation]: https://datatracker.ietf.org/doc/html/rfc4034#appendix-B
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 7344, section 4]: https://datatracker.ietf.org/doc/html/rfc7344#section-4
|
||||
[RFC 7344]: https://datatracker.ietf.org/doc/html/rfc7344
|
||||
[RFC 8078]: https://datatracker.ietf.org/doc/html/rfc8078
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
|
||||
@@ -0,0 +1,229 @@
|
||||
# DNSSEC18: Validate trust from DS to CDS and CDNSKEY
|
||||
|
||||
## Test case identifier
|
||||
**DNSSEC18**
|
||||
|
||||
## Objective
|
||||
|
||||
CDS and CDNSKEY record types are defined in [RFC 7344] and [RFC 8078]. Both
|
||||
record types are optional in a zone. The objective of this test case is to verify
|
||||
that there is a correct chain of trust from DS, in the parent zone to the CDS and
|
||||
CDNSKEY RRsets ([RFC 7344][RFC 7344#4.1], section 4.1).
|
||||
|
||||
As stated in [RFC 4035][RFC 4035#2.4], section 2.4:
|
||||
> A DS RR SHOULD point to a DNSKEY RR that is present in the child's
|
||||
> apex DNSKEY RRset, and the child's apex DNSKEY RRset SHOULD be
|
||||
> signed by the corresponding private key.
|
||||
|
||||
This Test case is only relevant if
|
||||
* The *Child Zone* has either CDS or CDNSKEY record or both, and
|
||||
* The parent zone has a DS RRset for the *Child Zone*.
|
||||
|
||||
## Scope
|
||||
|
||||
It is assumed that *Child Zone* is also tested by [Connectivity01]. This test
|
||||
case will just ignore non-responsive name servers or name servers not
|
||||
giving a correct DNS response for an authoritative name server.
|
||||
|
||||
It is assumed that *Child Zone* has been tested or will be tested by
|
||||
[DNSSEC15], [DNSSEC16] and [DNSSEC17] and that the servers give the
|
||||
same responses. Running this test case without running [DNSSEC15],
|
||||
[DNSSEC16] and [DNSSEC17] can give an incomplete report of the CDS and
|
||||
CDNSKEY status of *Child Zone*.
|
||||
|
||||
## Summary
|
||||
|
||||
* If no CDS or CDNSKEY records are found, this test case is not run
|
||||
and no message will be outputted.
|
||||
* If no DS records are found at parent, this test case is not run
|
||||
and no message will be outputted.
|
||||
|
||||
Message Tag outputted | [Default level] | Description of when message tag is outputted
|
||||
:------------------------------|:------|:-----------------------------------------
|
||||
DS18_NO_MATCH_CDS_RRSIG_DS | ERROR | The CDS RRset is not signed with a DNSKEY record that a DS record points to.
|
||||
DS18_NO_MATCH_CDNSKEY_RRSIG_DS | ERROR | CDNSKEY RRset is not signed with a DNSKEY record that a DS record points to.
|
||||
|
||||
## Inputs
|
||||
|
||||
* "Child Zone" - The domain name to be tested.
|
||||
* "Test Type" - The test type with value "undelegated" or "normal".
|
||||
* "Undelegated DS" - The DS record or records submitted (only if
|
||||
Test Type is undelegated).
|
||||
|
||||
## Ordered description of steps to be taken to execute the test case
|
||||
|
||||
1. Create a CDS query with EDNS enabled and the DO bit set for the
|
||||
apex of the *Child Zone*.
|
||||
|
||||
2. Create a CDNSKEY query with EDNS enabled and the DO bit set for
|
||||
the apex of the *Child Zone*.
|
||||
|
||||
3. Create a DNSKEY query with EDNS enabled and the DO bit set for
|
||||
the apex of the *Child Zone*.
|
||||
|
||||
4. Create a DS query with EDNS enabled and DO flag set for the name of
|
||||
the *Child Zone*.
|
||||
|
||||
5. Create the following empty sets:
|
||||
1. Name server IP address and associated CDS RRset and its RRSIG
|
||||
records ("CDS RRsets"). A name server IP can hold an empty
|
||||
RRset or no RRSIG records.
|
||||
2. Name server IP address and associated CDNSKEY RRset and its
|
||||
RRSIG records ("CDNSKEY RRsets"). A name server IP can hold an
|
||||
empty RRset or no RRSIG records.
|
||||
3. Name server IP address and associated DNSKEY RRset
|
||||
("DNSKEY RRsets"). A name server IP can hold an empty RRset.
|
||||
4. DS record set ("DS Records").
|
||||
5. Name server IP ("DS No Match CDS RRSIG").
|
||||
6. Name server IP ("DS No Match CDNSKEY RRSIG").
|
||||
|
||||
6. If the *Test Type* is "undelegated", then:
|
||||
1. Add *Undelegated DS* set to *DS Records*.
|
||||
|
||||
7. Else, do (*Test Type* is "normal"):
|
||||
1. Retrieve all name server IP addresses for the parent zone of
|
||||
*Child Zone* using [Get-Parent-NS-IPs] ("Parent NS IP").
|
||||
2. For each IP address in *Parent NS IP* do:
|
||||
1. Send the DS query over UDP to the name server IP.
|
||||
2. If no DNS response is returned, then go to next name server
|
||||
IP.
|
||||
3. Else, if AA bit is not set in the DNS response, then go to
|
||||
next name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then
|
||||
go to next name server IP.
|
||||
4. Else, if the DNS response contains at least one DS record
|
||||
add all DS records to *DS Records*.
|
||||
|
||||
8. If *DS Records* is empty, terminate this test case.
|
||||
|
||||
9. Retrieve all name server IP addresses for the *Child Zone* using
|
||||
[Method4] and [Method5] ("NS IP").
|
||||
|
||||
10. Repeat the following steps for each name server IP address in
|
||||
*NS IP*:
|
||||
|
||||
1. Send the CDS query over UDP to the name server IP address.
|
||||
1. If no DNS response is returned, then go to next name server
|
||||
IP.
|
||||
2. Else, if AA bit is not set in the DNS response, then go to
|
||||
next name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then
|
||||
go to next name server IP.
|
||||
4. Else, if the DNS response contains at least one CDS record
|
||||
in the answer section, then add the name server IP and the
|
||||
CDS RRset to the *CDS RRsets* set. Also include any associated
|
||||
RRSIG records.
|
||||
2. Send the CDNSKEY query over UDP to the name server IP address.
|
||||
1. If no DNS response is returned, then go to next name server
|
||||
IP.
|
||||
2. Else, if AA bit is not set in the DNS response, then go to
|
||||
next name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then
|
||||
go to next name server IP.
|
||||
4. Else, if the DNS response contains at least one CDNSKEY
|
||||
record in the answer section, then add the name server IP and
|
||||
the CDNSKEY RRset from the answer section to the
|
||||
*CDNSKEY RRsets* set. Also include any associated RRSIG records.
|
||||
3. Send the DNSKEY query over UDP to the name server IP address.
|
||||
1. If no DNS response is returned, then go to next name server
|
||||
IP.
|
||||
2. Else, if AA bit is not set in the DNS response, then go to
|
||||
next name server IP.
|
||||
3. Else, if the RCODE in the DNS response is not *NOERROR*, then
|
||||
go to next name server IP.
|
||||
4. Else, if the DNS response contains at least one DNSKEY
|
||||
record in the answer section, then add the name server IP and
|
||||
the DNSKEY RRset from the answer section to the
|
||||
*DNSKEY RRsets* set.
|
||||
4. Go to next name server IP.
|
||||
|
||||
11. If both the *CDS RRsets* and *CDNSKEY RRsets* sets are empty, then
|
||||
terminate this test case.
|
||||
|
||||
12. If the *DNSKEY RRsets* is empty, then terminate this test case.
|
||||
|
||||
13. For each name server IP in the *CDS RRsets* set do:
|
||||
|
||||
1. Extract the RRSIG records for the CDS RRset.
|
||||
2. Extract the DNSKEY from the *DNSKEY RRsets* for the same name
|
||||
server IP.
|
||||
3. For each DS record in *DS Records* do:
|
||||
1. If the DS record does not point to a DNSKEY record then go
|
||||
to next DS record.
|
||||
2. Else, if the DNSKEY that the DS record points to matches
|
||||
an RRSIG for CDS RRset then go to next name server IP
|
||||
address.
|
||||
3. Go to next DS records.
|
||||
4. Add name server IP to the *DS No Match CDS RRSIG* (i.e. there was no match
|
||||
between any DS record and an RRSIG record for the CDS RRset in the DS
|
||||
record loop above).
|
||||
5. Go to next name server IP address.
|
||||
|
||||
14. For each name server IP in the *CDNSKEY RRsets* set do:
|
||||
|
||||
1. Extract the RRSIG records for the CDNSKEY RRset.
|
||||
2. Extract the DNSKEY from the *DNSKEY RRsets* for the same name
|
||||
server IP.
|
||||
3. For each DS record in *DS Records* do:
|
||||
1. If the DS record does not point to a DNSKEY record then go
|
||||
to next DS record.
|
||||
2. Else, if the DNSKEY that the DS record points to matches
|
||||
an RRSIG for CDNSKEY RRset then go to next name server IP
|
||||
address.
|
||||
3. Go to next DS records.
|
||||
4. Add name server IP to the *DS No Match CDNSKEY RRSIG* (i.e. there was no match
|
||||
between any DS record and an RRSIG record for the CDNSKEY RRset in the DS
|
||||
record loop above).
|
||||
5. Go to next name server IP address.
|
||||
|
||||
15. If the *DS No Match CDS RRSIG* set is non-empty then output
|
||||
*[DS18_NO_MATCH_CDS_RRSIG_DS]* with the name server IP addresses in
|
||||
the set.
|
||||
|
||||
16. If the *DS No Match CDNSKEY RRSIG* set is non-empty then output
|
||||
*[DS18_NO_MATCH_CDNSKEY_RRSIG_DS]* with the name server IP
|
||||
addresses in the set.
|
||||
|
||||
## Outcome(s)
|
||||
|
||||
The outcome of this Test Case is "fail" if there is at least one message
|
||||
with the severity level *[ERROR]* or *[CRITICAL]*.
|
||||
|
||||
The outcome of this Test Case is "warning" if there is at least one message
|
||||
with the severity level *[WARNING]*, but no message with severity level
|
||||
*ERROR* or *CRITICAL*.
|
||||
|
||||
In other cases, no message or only messages with severity level
|
||||
*[INFO]* or *[NOTICE]*, the outcome of this Test Case is "pass".
|
||||
|
||||
## Special procedural requirements
|
||||
|
||||
If either IPv4 or IPv6 transport is disabled, ignore the evaluation of the
|
||||
result of any test using this transport protocol. Log a message reporting
|
||||
the ignored protocol.
|
||||
|
||||
## Intercase dependencies
|
||||
|
||||
None.
|
||||
|
||||
|
||||
[Connectivity01]: ../Connectivity-TP/connectivity01.md
|
||||
[CRITICAL]: ../SeverityLevelDefinitions.md#critical
|
||||
[DNSSEC15]: dnssec15.md
|
||||
[DNSSEC16]: dnssec16.md
|
||||
[DNSSEC17]: dnssec16.md
|
||||
[DS18_NO_MATCH_CDNSKEY_RRSIG_DS]: #summary
|
||||
[DS18_NO_MATCH_CDS_RRSIG_DS]: #summary
|
||||
[Default level]: ../SeverityLevelDefinitions.md
|
||||
[ERROR]: ../SeverityLevelDefinitions.md#error
|
||||
[Get-Parent-NS-IPs]: ../MethodsV2.md#method-get-parent-ns-ip-addresses
|
||||
[INFO]: ../SeverityLevelDefinitions.md#info
|
||||
[Method1]: ../Methods.md#method-1-obtain-the-parent-domain
|
||||
[Method4]: ../Methods.md#method-4-obtain-glue-address-records-from-parent
|
||||
[Method5]: ../Methods.md#method-5-obtain-the-name-server-address-records-from-child
|
||||
[NOTICE]: ../SeverityLevelDefinitions.md#notice
|
||||
[RFC 4035#2.4]: https://datatracker.ietf.org/doc/html/rfc4035#section-2.4
|
||||
[RFC 7344#4.1]: https://datatracker.ietf.org/doc/html/rfc7344#section-4.1
|
||||
[RFC 7344]: https://datatracker.ietf.org/doc/html/rfc7344
|
||||
[RFC 8078]: https://datatracker.ietf.org/doc/html/rfc8078
|
||||
[WARNING]: ../SeverityLevelDefinitions.md#warning
|
||||
Reference in New Issue
Block a user