Verwaiste DNS-Einträge erkennen

Betreibt man einen hosting DNS-Server kann es vorkommen das ein User seine Domain auf einen anderen DNS-Server zügelt, oder die Domain löscht, ohne dies dem DNS-Admin mitzuteilen. Die Folge sind verwaiste Zonenfile-Einträge auf dem DNS-Server.

Mittels dem Script: check_orphaned_dns_zones kann man einfach herauskriegen ob eine domain auf dem eigenen Nameserver wirklich noch diesen eingetragen hat und ggf. das Zonenfile der Domain entfernen.

Inhalt

Das Script

#!/bin/bash
 
VIEW=$1
 
RNDC="/usr/sbin/rndc"
 
command -v rndc dumpdb -zones $VIEW >/dev/null 2>&1 || { echo >&2 "The rndc command is required but not installed.  Aborting."; exit 3; }
$RNDC dumpdb -zones $VIEW
until grep -q "Dump complete" "/var/named/data/cache_dump.db"; do   sleep 1s; done
 
PRIMARY_NAMESERVER="ns1.tech-island.com"
NAMESERVERS=( ns1.tech-island.com ns2.afraid.org google-public-dns-a.google.com )
ZONEFILE="/var/named/data/cache_dump.db"
 
if [ -r $ZONEFILE ]
then
  for ZONE in `grep -iv '\.arpa' $ZONEFILE | grep -oP "'.*\/IN" | tr -d "'" |tr -d "/IN"`;
  do
    for NAMESERVER in ${NAMESERVERS[@]}
    do
      NS_RECORD=$(dig @$NAMESERVER +short $ZONE ns)
      if [[ $NS_RECORD != *$PRIMARY_NAMESERVER* ]]
      then
        RECORDS_FOUND="$RECORDS_FOUND $ZONE\n    $NS_RECORD (our NS not listed on: $NAMESERVER)\n\n"
      fi
    done
  done
else
  echo "Zonefile $ZONEFILE is not readable!"
  exit 3
fi
 
if [[ $RECORDS_FOUND != "" ]]
then
  echo -e "Orphaned zones found\n\n$RECORDS_FOUND"
  exit 1
else
  echo "No orphaned zones found."
  exit 0
fi

Bei PRIMARY_NAMESERVER gibt man seinen primären Nameserver an (hier: ns1.example.com)

Bei NAMESERVERS gibt man alle seine eigenen Nameserver ein (hier: ns1.example.com und ns2.example.com), so wie einen externen Nameserver (hier: google-public-dns-a.google.com).

Bei ZONEFILE gibt man die Zonen Dump Datei des rndc Kommandos an (hier: /var/named/data/cache_dump.db)

Das Script fragt zuerst alle Zonen mit dem rndc Kommando ab, filtert die reverse lookup Zonen heraus und überprüft dann für jede Domain im Zonefile, ob unser primärer Nameserver bei den anderen Nameservern eingetragen ist. Ist das nicht der Fall, wird eine Warnung ausgegeben. So kann man z.B. auch gut erkennen, wenn vergessen wurde eine Domain in den Backup-NS einzutragen.

Als Paramater lässt sich zudem noch eine view mit angeben, falls man in bind einen Split-DNS Server realisiert hat.
Um beispielsweise nur die extenren Zonen miteinzubeziehen kann man mit folgendem Aufruf die view external-zone abfragen:

/usr/local/lib/nagios/plugins/check_orphaned_dns_zones external-zone

Alternatives Script

Dieses Script benötigt das rndc Programm nicht und holt sich die Zonen direkt aus einer Zonen definitions Datei.
Es ist jedoch etwas fragiler, weil es auf eine korrekte Formatierung dieser Datei angewiesen ist und funktioniert beispielsweise nicht, wenn die Trennungen statt mit spaces mit TABs gemacht sind.

#!/bin/bash
 
PRIMARY_NAMESERVER="ns1.tech-island.com"
NAMESERVERS=( ns1.tech-island.com ns2.afraid.org google-public-dns-a.google.com )
ZONEFILE="/etc/named/zones.d/zones.ext"
 
if [ -r $ZONEFILE ]
then
  for ZONE in `cat $ZONEFILE | grep -vh '^[ ]*#' "$@" | grep -v '^[ ]*$' | cut -d" " -f2`; 
  do 
    ZONE=${ZONE//\"/}
    for NAMESERVER in ${NAMESERVERS[@]}
    do
      NS_RECORD=$(dig @$NAMESERVER +short $ZONE ns)
      if [[ $NS_RECORD != *$PRIMARY_NAMESERVER* ]]
      then
        RECORDS_FOUND="$RECORDS_FOUND $ZONE\n    $NS_RECORD (our NS not listed on: $NAMESERVER)\n\n"
      fi
    done
  done
else
  echo "Zonefile $ZONEFILE is not readable!"
  exit 3
fi
 
if [[ $RECORDS_FOUND != "" ]]
then
  echo -e "Orphaned zones found\n\n$RECORDS_FOUND"
  exit 1
else
  echo "No orphaned zones found."
  exit 0
fi

Dieses Script überprüft nun für jede Domain im Zonefile, ob unser primärer Nameserver bei den anderen Nameservern eingetragen ist. Ist das nicht der Fall, wird eine Warnung ausgegeben. So kann man z.B. auch gut erkennen, wenn vergessen wurde eine Domain in den Backup-NS einzutragen.

Zonefile

Das Zonenfile muss folgendes format haben:

zone "example.org" in { type master; file "/etc/named/zones/example.org"; allow-query { any; }; };

Verwendung in NRPE (auf dem Nameserver)

Das script auf den Nameserver kopieren (z.B. in: /usr/local/lib/nagios/plugins/check_orphaned_dns_zones.sh) und im nrpe daemon folgende Zeile einfügen:

command[check_orphaned_dns_zones]=/usr/local/lib/nagios/plugins/check_orphaned_dns_zones.sh

In icinga/nagios auf dem monitoring Server dann ein entsprechendes command definieren:

define command{
  command_name                         check_orphaned_dns_zones
  command_line                         $USER1$/check_nrpe -H $HOSTADDRESS$ -p 5666 -t 60 -c check_orphaned_dns_zones
}

Und ebenfalls einen Check:

define service {
  use                             generic-service
  name                            check_orphaned_dns_zones
  host_name                       ns1.example.com
  service_description             Orphaned DNS-Zones
  check_command                   check_orphaned_dns_zones
}

Ausgabe

Die Ausgabe sieht dann so aus:

check_orphaned_dns_zones-01

Published by

Steven Varco

Steven ist ein Redhat RHCE- und Kubernetes CKA Zertifizierter Linux-Crack und ist seit über 20 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert