# -*- mmm-classes: donuts-perl -*- # Copyright 2004-2011 SPARTA, Inc. All rights reserved. # See the COPYING file included with the DNSSEC-Tools package for details. # # This file checks aspects of parent/child relationships # name: DNS_MULTIPLE_NS level: 6 minnsrecords: 2 help: minnsrecords: minimum number of NS records that must be present for a delegation desc: Tests to see if at least two NS records exist for a delegated zone. ruletype: name class: Warning if (exists($records->{'NS'}) && $#{$records->{'NS'}}+1 < $rule->{'minnsrecords'}) { donuts_error("Only " . ($#{$records->{'NS'}}+1) . " NS record(s) for $recordname found, but at least " . $rule->{'minnsrecords'} . " are suggested/required"); } name: DNSSEC_SUB_NOT_SECURE level: 3 ruletype: name desc: Tests for the existence of a DS record in a zone for sub-domains. If not present then the sub-domain is not being securely delegated to. if ($current_domain ne $recordname && # not the root exists($records->{'NS'}) && $#{$records->{'NS'}} > -1 && # is a sub exists($records->{'RRSIG'}) && # DS||NSEC signed !exists($records->{'DS'}) # No DS ) { donuts_error("sub-domain $recordname is not securely delegated. It is missing a DS record."); } name: DNSSEC_DNSKEY_PARENT_HAS_VALID_DS level: 4 feature: live type: DNSKEY desc: tests for valid DS checksum and for RFC4034: section 5.2: The DNSKEY RR referred to in the DS RR MUST be a DNSSEC zone key. test: $record->setkeytag(); return if ($record->flags & 0x100); # key is not a zone signing key my @DSs = live_query($record->name, "DS"); if ($#DSs == -1) { donuts_error("Parent zone has no DS records for $record->{name} (keyid = $record->{keytag})"); } map { if ($_->verify($record)) { if ($_->keytag != $record->keytag) { # tag ids match donuts_error("KEY with tag $record->{keytag} verifies DS record with non matching tag $_->{keytag}"); } return; } } @DSs; donuts_error("DNSKEY record for $record->{name} (keytag = " . $record->keytag . ") does not have a matching DS record in the live parent zone"); name: DNSSEC_DS_CHILD_HAS_MATCHING_DNSKEY level: 4 feature: live desc: tests for valid DS checksum and for RFC4034: section 5.2: The DNSKEY RR referred to in the DS RR MUST be a DNSSEC zone key. type: DS test: my @KEYs = live_query($record->name, "DNSKEY"); if ($#KEYs == -1) { return donuts_error("Child zone has no DNSKEY records for $record->{name}"); } map { if ($record->verify($_)) { return if ($_->flags & 0x100); # zone bit set properly if ($_->keytag != $record->keytag) { return donuts_error("Key tag $_->{keytag} in child for $_->{name} does not match key tag $record->{keytag}"); } return donuts_error("Key in child for $_->{keytag} referred to by DS for $record->{name} does not have the zone flag set"); return; } } @KEYs; donuts_error("DS record for $record->{name} does not have a matching DNSKEY record in the live child zone");