DNSSEC07: DNSSEC signed zone and DS in parent for signed zone
Test case identifier
DNSSEC07
Table of contents
- Objective
- Scope
- Inputs
- Summary
- Test procedure
- Outcome(s)
- Special procedural requirements
- Intercase dependencies
- 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. The DNSKEY record is defined in section 2 of RFC 4034, and the DS record is defined in section 5 of RFC 4034.
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.
-
Create a DNS Query with query type SOA and query name Child Zone ("SOA Query").
-
Create a DNSSEC Query with query type DNSKEY and query name Child Zone ("DNSKEY Query").
-
Create a DNSSEC Query with query type DS and query name Child Zone ("DS Query") (for the parent name servers).
-
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").
-
Create the following empty sets:
- Name server IP address ("Ignored Child NS").
- Name server IP address ("No Response DNSKEY Query").
- Name server IP address ("No Auth DNSKEY Response").
- Name server IP address and RCODE Name ("Error RCODE DNSKEY Response").
- Name server IP address ("No DNSKEY").
- Name server IP address ("Signed Response").
- Name server IP address ("Ignored Parent NS IP").
- Name server IP address ("No DS").
- Name server IP address ("DS in Response").
-
For each name server IP address in Child NS IP do:
- Send SOA Query to the name server IP.
- 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:
- There is no DNS response.
- The RCODE Name in the response is not "NoError".
- The AA flag is not set in the response.
- The SOA record is missing in the answer section.
- Send DNSKEY Query to the name server IP.
- 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.
- 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.
- 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.
- 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.
- Else add the name server IP to the No DNSKEY set and go to next name server IP.
-
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").
-
If Undelegated DS is non-empty then do:
- Add name server IP as "-" to the DS in Response set.
- Make Parent NS Names and IPs an empty set.
-
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.
-
For each unique parent name server IP in Parent NS Names and IPs do:
- Send DS Query to the name server IP.
- 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:
- There is no DNSSEC Response.
- The RCODE Name in the DNSSEC Response is not "NoError".
- The OPT record is absent in the DNSSEC Response.
- The DO flag is unset in the DNSSEC Response.
- The AA flag is not set in the DNSSEC Response.
- 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.
- Else add the parent name server IP to the No DS set and go to next parent name server IP.
-
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.
-
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
-
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.
-
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.
-
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.
-
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.
-
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.
-
If both the Signed Response and No DNSKEY sets are non-empty then output DS07_INCONSISTENT_SIGNED.
-
If the Signed Response is non-empty and the No DNSKEY set is empty then output DS07_SIGNED.
-
If the Signed Response is empty and the No DNSKEY set is non-empty then output DS07_NOT_SIGNED.
-
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.
-
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.
-
If both the No DS and the DS in Response sets are non-empty, then output DS07_INCONSISTENT_DS.
-
If the No DNSKEY set is empty and the Signed Response set is non-empty, then do:
- If the No DS is non-empty and the DS in Response set is empty, then output DS07_NO_DS_FOR_SIGNED_ZONE.
- 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 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. The verification described in the following four bullets and the actual verification against the DNSKEY is not included for this test case.