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 Spoofing

Die 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ürdig

Trust 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/keys

Schlü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 .private

Zone 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.signed

BIND-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 eintragen

Mit PowerDNS

DNSSEC aktivieren

# In pdns.conf
dnssec=yes

Zone 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.de

Automatische 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.de

Mit drill

# drill installieren
apt install ldnsutils

# Chain of Trust prüfen
drill -TD example.de

# Signatur prüfen
drill -S example.de

Online-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 Data

Resolver 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: 1

BIND 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.key

Key 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 entfernen

KSK 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 entfernen

Automatisch 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.de

DNSSEC deaktivieren (Notfall)

# Beim Registrar: DS-Record löschen
# Dann warten (TTL der DS)
# Zone unsigniert veröffentlichen

Best 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!"
fi

Zusammenfassung

| 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.