Monitoring DNSSEC and DANE

Dies geschieht am LRZ mit "check_mk", das im Kern auf Nagios basiert, aber eine komfortablere Oberfläche bietet.




Dies ist eine kommerzielle Lösung mit Support. Es lassen sich aber leicht Skripte in bestehende Monitoring-Lösungen integrieren. Dies wird hier am Beispiel von Nagios und Icinga2 gezeigt. Die Check-Scripte selbst können in Bash, Perl, Python oder einer nahezu beliebigen anderen Skriptsprache geschrieben werden, oder als Executable vorliegen und aufgerufen werden.

Icinga2 richtet sich nach dem Nagios-Schema der Exit codes für Check-Skripte, und die Vorgabe ist, dass diese entsprechende Statusmeldungen zurück liefern.

Nagios-konforme Exit codes

Exit codeBedeutungErklärung
0OKService arbeitet wie erwartet
1WARNINGein bedenklicher, aber unkritischer Zustand ist aufgetreten
2CRITICALkritischer Fehler
3UNKNOWNunbekannt, Ausführen des Checks schlug fehl


Anhand dieser Exit codes werden dann die Service-Zustände beurteilt. Dies ist bei Nagios/Icinga(2) (und auch check_mk) gleich.

Monitoring am LRZ

Die DNS-Server werden mit unterschiedlichen Tools überwacht. Am LRZ werden die folgenden Dienste bezüglich DNSSEC überwacht:

  • "check_mk" (https://mathias-kettner.de/check_mk.html) überwacht den Zustand der Hardware und überprüft, ob ein regelmäßig auftretendes Update (ein TXT-Record mit einem Timestamp) auf allen autoritativen Servern ankommt und ob NTP funktioniert.
  • Ein Skript (cronjob) validiert alle DNSSEC-Zonen mit unterschiedlichen Tools (dnssec-verify von bind und ldns) und prüft mit externen validierenden DNS-Resolvern auf das AD-Flag im SOA-Record (Google-DNS 8.8.8.8, OARC BIND 9 184.105.193.73, OARC Unbound 184.105.193.74)

Icinga2

Aufgrund der einfacheren Installation, weniger Resourcenverbrauch und als Opensource freien Verfügbarkeit wurde Icinga2 als Demonstrationslösung gewählt, die auch auf den Workshop-VMs installiert ist.

Icinga2 Webinterface


Icinga2 selbst ist ein "daemon", der die Service-Checks anhand der Konfigurationen in /etc/icinga2/conf.d regelmäßig ausführt. Auf welchen Zeitintervallen ein Servicecheck durchgeführt wird, kann mit Templating oder individuell pro Host fest gelegt werden.

Anhand der durch gereichten Exit-Codes (siehe oben) der ausgeführten Checkskripte wird in der Serviceübersicht das Ergebnis dargestellt.


Icinga2 Service Übersicht, in der alle geprüften Dienste "Ok" sind.



Bei bestimmten Service-Checkergebnissen, die einen festgelegten Wert über- oder unterschreiten, wird eine Warnung angezeigt. Zum Beispiel wenn die Signaturen in einer Zonen-Datei nicht mehr lange genug gültig sind:


Check-Skripte


Allen Monitoring-Systemen liegen auf der untersten Ebene Checkskripte (oder zum Teil kompilierte Programme) zugrunde, die anhand der Ihnen als Kommandoargumente übergebenen Parameter, einen Dienst oder ein Fakt prüfen. Die Parameter legen fest, welcher Host, und beispielsweise welcher Port auf Erreichbarkeit überprüft wird.

Bash-Skript, um die DNSSEC Konfiguration mit dem Tool ldns-verify-zone aus dem ldns-Paket zu überprüfen:


CheckCommand-Definitionen

Diese Argumente werden vom darüber laufenden Monitoring-Daemon als "Check_command"-Definitionen (im Falle von Nagios und Icinga(2)) durch geschleift. D.h. für die Einbindung in Icinga2 muss eine CheckCommand-Definition geschrieben werden, die festlegt, welches Skript ausgeführt wird, in welchem Verzeichnis es liegt, und welche Parameter erwartet werden:

Service-Definitionen

Da ein "check_command" nur das Zutreffen einer bestimmten Tatsache, abhängig von dem ihm übergegebenen Host, überprüft, müssen die "check_commands" noch über Services Hosts konkret  zugeordnet werden. Hier können dann Checkperiode, benachrichtigte Admins, usw. angepasst werden:


Check-Skripte Beispiele

Was an den eigenen DNSSEC- und DANE-Diensten überwacht wird, bleibt den Systemadministratoren überlassen. Eine feinkörnigere Abfrage der notwendigen Voraussetzungen für eine fehlerfreie Konfiguration erhöht zwar im Katastrophenfall die Anzahl an generierter Meldungen, kann aber die Fehlersuche etwas erleichtern.


Hier einige Beispielskripte für den Einstieg, die für die Workshop-VMs geschrieben wurden. Diese sind aber primär als Lehrbeispiele zu sehen und sollten nicht ungeprüft eins-zu-eins in eine Produktivumgebung übernommen werden:


SkriptÜberprüft...Kommandoparameter
check_dnssec-adAD flag in der Anfrage über (OARC - oder anderen) Resolver-z <zone> -n <resolver>
check_daneTLSA-Eintrag  und matcht ihn gegen das Zertifikat-H <host> -p <port> --starttls="smtp"
check_namedconfkorrekte Konfiguration von BIND (/etc/bind/named.conf)
check_dnssec-ldnsDNSSEC Konfiguration mit ldns-verify-zone-z <zone> -e <expirationdate>
check_dnssec-keysgibt die ZSK und KSK zurück, die es in einer Zone findet-z <zone>
check_dnssec-dsob die Key ID im RSA-2 DS-RR einem KSK in der Zone entspricht-z <zone>
check_mtudie MTU Größe, default: Critical 1220 Bytes, Warning 2048 Bytes-w <WARNVAL> -c <CRITVAL>


DNSSEC Monitoring Tools

Es gibt mittlerweile eine ganze Reihe von DNSSEC-Check- und Monitoringtools für jeden Geschmack und bevorzugte (Skript-)Spracke. Mice & Men haben hierzu eine (etwas veraltete) Liste von DNSSEC-monitoring-tools zusammen gestellt.