DNSSEC (Domain Name System Security Extensions) schützt DNS-Antworten vor Manipulation. Es stellt kryptografisch sicher, dass DNS-Daten authentisch sind.
Was ist DNSSEC?
Das Problem ohne DNSSEC
1. User fragt: "Wo ist bank.de?"
2. DNS-Server antwortet: "192.168.1.100"
3. Problem: Antwort könnte gefälscht sein!
Angriffe:
- DNS Cache Poisoning
- Man-in-the-Middle
- DNS SpoofingDie Lösung mit DNSSEC
1. User fragt: "Wo ist bank.de?"
2. DNS-Server antwortet: "192.168.1.100" + digitale Signatur
3. Resolver prüft Signatur gegen öffentlichen Schlüssel
4. Bei gültiger Signatur → Antwort vertrauenswürdigTrust Chain
Root (.)
└── Signiert .de
└── Signiert example.de
└── Signiert www.example.de
Jede Ebene signiert die darunterliegende.DNSSEC-Records
Übersicht
| Record | Name | Funktion | |--------|------|----------| | DNSKEY | DNS Key | Öffentlicher Schlüssel | | RRSIG | Resource Record Signature | Signatur | | DS | Delegation Signer | Vertrauenskette | | NSEC/NSEC3 | Next Secure | Nicht-Existenz beweisen |
DNSKEY
; Zone Signing Key (ZSK) - signiert Records
example.de. IN DNSKEY 256 3 13 (
AwEAAcFfK...
)
; Key Signing Key (KSK) - signiert DNSKEY
example.de. IN DNSKEY 257 3 13 (
AwEAAb2T...
)RRSIG
; Signatur für A-Record
www.example.de. IN A 192.168.1.100
www.example.de. IN RRSIG A 13 3 3600 (
20260226000000 20260126000000 12345 example.de.
J8s3n...
)DS-Record
; Bei der Registry (z.B. DENIC für .de)
example.de. IN DS 12345 13 2 (
49FD46E6C4B45C55D4AC...
)DNSSEC einrichten
Mit BIND
# dnssec-keygen installiert über bind9-utils
apt install bind9 bind9-utils
# Schlüsselverzeichnis erstellen
mkdir -p /etc/bind/keys
cd /etc/bind/keysSchlüssel generieren
# Zone Signing Key (ZSK)
dnssec-keygen -a ECDSAP256SHA256 -n ZONE example.de
# Key Signing Key (KSK)
dnssec-keygen -a ECDSAP256SHA256 -n ZONE -f KSK example.de
# Ergebnis: Kexample.de.+013+12345.key und .privateZone signieren
# Zone-Datei mit Schlüsseln signieren
cd /etc/bind/zones
dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) \
-N INCREMENT -o example.de -t db.example.de
# Ergebnis: db.example.de.signedBIND-Konfiguration
# /etc/bind/named.conf.local
zone "example.de" {
type master;
file "/etc/bind/zones/db.example.de.signed";
key-directory "/etc/bind/keys";
auto-dnssec maintain;
inline-signing yes;
};DS-Record beim Registrar
# DS-Record-Daten extrahieren
dnssec-dsfromkey Kexample.de.+013+12345.key
# Beispielausgabe:
# example.de. IN DS 12345 13 2 49FD46E6C4B45C55D4AC...
# Diese Daten beim Domain-Registrar eintragenMit PowerDNS
DNSSEC aktivieren
# In pdns.conf
dnssec=yesZone sichern
# Zone für DNSSEC aktivieren
pdnsutil secure-zone example.de
# Schlüssel anzeigen
pdnsutil show-zone example.de
# DS-Record für Registrar
pdnsutil ds-record example.deAutomatische Key-Rotation
# PowerDNS rotiert automatisch
pdnsutil set-meta example.de SOA-EDIT INCREMENT-WEEKS
# Manuelle Rotation
pdnsutil activate-zone-key example.de <key-id>Validierung testen
Mit dig
# DNSSEC-Records abfragen
dig +dnssec example.de
# Nur DNSKEY
dig DNSKEY example.de
# Nur DS
dig DS example.de @ns1.registrar.de
# Mit Validierung
dig +dnssec +cd example.deMit drill
# drill installieren
apt install ldnsutils
# Chain of Trust prüfen
drill -TD example.de
# Signatur prüfen
drill -S example.deOnline-Tools
- https://dnssec-analyzer.verisignlabs.com/
- https://dnsviz.net/
- https://www.dnssec-tools.org/Validierungsergebnis
dig +dnssec example.de
# Im Antwort-Header:
# flags: qr rd ra ad ← "ad" = Authenticated DataResolver einrichten
Unbound (Validierender Resolver)
# /etc/unbound/unbound.conf
server:
# Validierung aktivieren
module-config: "validator iterator"
# Trust Anchor (Root Key)
auto-trust-anchor-file: "/var/lib/unbound/root.key"
# Bei Validierungsfehler: SERVFAIL
val-permissive-mode: no
# Logging
val-log-level: 1BIND als Resolver
# /etc/bind/named.conf.options
options {
dnssec-validation auto;
# Oder mit explizitem Trust Anchor:
# dnssec-validation yes;
};Trust Anchor aktualisieren
# Root Trust Anchor automatisch aktualisieren
unbound-anchor -a /var/lib/unbound/root.keyKey Rollover
ZSK Rollover (regelmäßig)
# Pre-publish Methode (empfohlen)
# 1. Neuen ZSK erzeugen
dnssec-keygen -a ECDSAP256SHA256 -n ZONE example.de
# 2. In Zone veröffentlichen (beide Keys aktiv)
# 3. Warten (2x TTL)
# 4. Alten ZSK deaktivieren
# 5. Alten ZSK entfernenKSK Rollover (seltener)
# Double-DS Methode
# 1. Neuen KSK erzeugen
dnssec-keygen -a ECDSAP256SHA256 -n ZONE -f KSK example.de
# 2. Neuen DS beim Registrar hinzufügen
# 3. Warten (DS TTL)
# 4. Alten KSK entfernen
# 5. Alten DS beim Registrar entfernenAutomatisch mit BIND
zone "example.de" {
type master;
file "/etc/bind/zones/db.example.de";
key-directory "/etc/bind/keys";
auto-dnssec maintain;
inline-signing yes;
# Automatische Key-Rotation
dnssec-policy default;
};DNSSEC Policy
# /etc/bind/named.conf
dnssec-policy "my-policy" {
keys {
ksk lifetime unlimited algorithm ecdsap256sha256;
zsk lifetime 90d algorithm ecdsap256sha256;
};
max-zone-ttl 86400;
zone-propagation-delay 300;
};Troubleshooting
Häufige Fehler
# SERVFAIL bei DNSSEC-gesicherter Zone
# 1. Signatur abgelaufen?
dig +dnssec example.de | grep RRSIG
# Prüfe Inception und Expiration
# 2. DS-Record stimmt nicht?
dig DS example.de @ns1.registrar.de
# Vergleiche mit lokalen DNSKEY
# 3. Uhr nicht synchronisiert?
timedatectl status
# DNSSEC verwendet Zeitstempel!Validierung debuggen
# Mit delv (Domain Entity Lookup & Validation)
delv @127.0.0.1 example.de
# Zeigt detaillierte Validierungskette
delv +rtrace example.deDNSSEC deaktivieren (Notfall)
# Beim Registrar: DS-Record löschen
# Dann warten (TTL der DS)
# Zone unsigniert veröffentlichenBest Practices
Algorithmus-Wahl
| Algorithmus | ID | Empfehlung | |-------------|-----|------------| | ECDSAP256SHA256 | 13 | Empfohlen | | ECDSAP384SHA384 | 14 | Sehr sicher | | ED25519 | 15 | Modern | | RSASHA256 | 8 | Kompatibel |
Signatur-Gültigkeit
# Signatur-Zeitraum
# - Inception: Etwas in der Vergangenheit (Uhren-Toleranz)
# - Expiration: 1-4 Wochen in der Zukunft
dnssec-signzone -A \
-i -3600 \ # Inception: 1h vor jetzt
-e +2592000 \ # Expiration: 30 Tage
...Monitoring
#!/bin/bash
# DNSSEC-Signatur-Monitoring
DOMAIN="example.de"
WARNING_DAYS=7
# Ablaufdatum der RRSIG prüfen
EXPIRY=$(dig +short RRSIG $DOMAIN | head -1 | awk '{print $5}')
EXPIRY_DATE=$(date -d "${EXPIRY:0:4}-${EXPIRY:4:2}-${EXPIRY:6:2}" +%s)
NOW=$(date +%s)
DIFF=$(( (EXPIRY_DATE - NOW) / 86400 ))
if [ $DIFF -lt $WARNING_DAYS ]; then
echo "WARNING: DNSSEC signature expires in $DIFF days!"
fiZusammenfassung
| Record | Funktion | |--------|----------| | DNSKEY | Öffentliche Schlüssel | | RRSIG | Signaturen | | DS | Delegation Signer | | NSEC3 | Nicht-Existenz |
| Schlüssel | Funktion | Rotation | |-----------|----------|----------| | KSK | Signiert DNSKEY | Jährlich | | ZSK | Signiert Records | Monatlich |
| Befehl | Funktion | |--------|----------| | dig +dnssec | Mit DNSSEC abfragen | | drill -TD | Chain of Trust prüfen | | delv | Validierung debuggen |
Fazit
DNSSEC ist ein wichtiger Sicherheitsmechanismus für das DNS. Die Einrichtung ist initial etwas aufwendig, aber moderne DNS-Server wie BIND und PowerDNS bieten gute Automatisierung. Key Rollover muss regelmäßig durchgeführt werden. Validierung auf dem Resolver stellt sicher, dass gefälschte DNS-Antworten erkannt werden. Für Produktionsumgebungen ist DNSSEC-Monitoring unerlässlich.