Post

Runbook: DNSSEC-Validierung im Resolver aktivieren (BIND/Unbound) – inkl. Monitoring

Runbook: DNSSEC-Validierung im Resolver aktivieren (BIND/Unbound) – inkl. Monitoring

Ein DNSSEC-validierender Resolver ist die Basis für sichere DNS-Auflösung im eigenen Netz. Doch die Einrichtung hat einige Fallstricke, die in der Praxis gerne übersehen werden. Dieses Runbook zeigt, wie es richtig geht. DNSSEC bringt nur dann Sicherheitsgewinn, wenn deine Resolver validieren. Dieses Runbook zeigt die Aktivierung (BIND oder Unbound), die wichtigsten Tests mit dig, Monitoring-Signale und ein schnelles Troubleshooting bei SERVFAIL.

Voraussetzungen

  • Du betreibst rekursive Resolver (on-prem oder in einer VPC/VNet).
  • Clients nutzen diese Resolver (DHCP/MDM/VPN Profil).
  • Zeit ist korrekt (NTP) – DNSSEC ist zeitabhängig.

Check:

1
timedatectl status | sed -n '1,6p'

Schritt-für-Schritt: BIND (named) als validierender Resolver

1) named.conf.options anpassen

Beispiel (Distribution abhängig):

1
2
3
4
5
6
7
8
9
10
options {
  recursion yes;
  dnssec-validation auto;

  # Optional: aggressive NSEC (Performance, aber Vorsicht bei Edge-Cases)
  # aggressive-nsec yes;

  listen-on { 10.0.0.53; 127.0.0.1; };
  allow-query { 10.0.0.0/8; 127.0.0.1; };
};

2) Service reloaden und Logs prüfen

1
2
3
sudo named-checkconf
sudo systemctl restart named || sudo systemctl restart bind9
sudo journalctl -u named -u bind9 -n 100 --no-pager

Schritt-für-Schritt: Unbound als validierender Resolver

1) Trust Anchor sicherstellen

Meist reicht auto-trust-anchor-file:

1
2
3
4
5
6
server:
  interface: 10.0.0.54
  access-control: 10.0.0.0/8 allow

  auto-trust-anchor-file: "/var/lib/unbound/root.key"
  val-permissive-mode: no

2) Root Key initialisieren und Dienst starten

1
2
3
4
sudo unbound-anchor -a /var/lib/unbound/root.key
sudo unbound-checkconf
sudo systemctl restart unbound
sudo journalctl -u unbound -n 100 --no-pager

Validierung: Tests, die du wirklich brauchst

1) Positiver Test (valid)

1
dig @10.0.0.53 dnssec-failed.org A +dnssec

Erwartung: SERVFAIL (Domain ist absichtlich kaputt signiert).

2) Negativer Test (unsigned sollte funktionieren)

1
dig @10.0.0.53 example.com A +dnssec

Erwartung: normale Antwort (NOERROR).

3) AD-Flag prüfen (Authenticated Data)

1
dig @10.0.0.53 cloudflare.com A +dnssec +multi | grep -E "\bad\b|flags"

Erwartung: flags: ... ad; (je nach Query/Antwort).

Monitoring & Alarmierung

Was du messen solltest

  • Anzahl SERVFAIL gesamt
  • SERVFAIL nach Domain (Top N)
  • Resolver latency (p50/p95)
  • Root Key/Trust Anchor Updates (Unbound/BIND Logs)

Schneller SERVFAIL-Report aus Query Logs

Wenn du Query Logs im JSON-Format nach Elasticsearch/Loki schickst, filtere:

1
jq -r 'select(.rcode=="SERVFAIL") | .qname' resolver.log | sort | uniq -c | sort -nr | head

Troubleshooting: Wenn plötzlich alles SERVFAIL ist

1) Zeit/Clock Skew

  • NTP ok?
1
timedatectl status | grep -E "System clock synchronized|NTP service"

2) UDP Fragmentation / MTU / Firewall

DNSSEC-Antworten sind größer → EDNS0/Fragmentierung. Test:

1
dig @10.0.0.53 org DNSKEY +dnssec +bufsize=1232

Wenn das hängt:

  • erlaubst du UDP/53 + Fragmentierung?
  • TCP fallback erlaubt?

3) Upstream/Forwarder validiert nicht sauber

Wenn du forwardest (z. B. an ISP-Resolver), kann Validierung kaputt sein. Besser: selbst rekursiv auflösen oder an zuverlässige Validierer forwarden.

4) Trust Anchor veraltet

Unbound:

1
sudo unbound-anchor -a /var/lib/unbound/root.key -v

BIND (auto) → Log prüfen.

Rollout-Strategie

  • Erst 1 Resolver-Cluster „canary“
  • 24–48h beobachten (SERVFAIL-Spikes?)
  • Dann DHCP/VPN/MDM umstellen
  • Parallel: Exception-Prozess für echte kaputte Signaturen (temporär, dokumentiert)

Takeaways

  • DNSSEC ist ein Resolver-Thema: Ohne Validierung kein Sicherheitsgewinn.
  • Teste immer mit dnssec-failed.org (muss SERVFAIL liefern).
  • Häufigste Fehlerursachen: Zeit, MTU/Fragmentierung, schlechte Forwarder.
  • Monitoring auf SERVFAIL und Latenz macht Rollouts sicher.
  • Canary-Rollout reduziert den Impact von Edge-Cases drastisch.
This post is licensed under CC BY 4.0 by the author.