Zonen mit BIND 9 DNSSEC signieren

DNS Workshop

Created: 2019-08-29 Thu 09:51

Agenda

  1. eine Zone manuell signieren
  2. automatisches Signieren einer dynamischen Zone
  3. automatisches Signieren per 'in-line' Signing

Zone manuell signieren

Seit BIND 9.6 können Zonen mit den BIND 9 Tools manuell signiert werden

  • Vorteile:
    • das Signieren kann vollständig offline und ohne laufenden BIND 9 DNS-Server erfolgen
    • die privaten Schlüssel können auf sicheren Geräten gespeichert werden, ggf. verschlüsselt
    • die erstellen Zonendateien sind unabhängig von der DNS-Server Software
    • die Parameter des Signaturvorgangs können optimal eingestellt werden
  • Nachteile:
    • die Zonen müssen regelmäßig manuell aufgefrischt werden, damit die Signaturen nicht ablaufen
    • Automatisierung muss durch eigene Skripte erfolgen

Manuelles Signieren mit BIND 9 (1)

  • DNSSEC in der BIND 9 Konfigurationsdatei named.conf anschalten

             options {
                directory "/var/named";
                dnssec-enable yes;
             };
    

Manuelles Signieren mit BIND 9 (2)

  • Erstellen des Zone-Signing-Keys (ZSK)
    • hierzu wird genügend echter Zufall auf dem System benötigt. Ggf. muss ein Hardware-Zufallszahlengenerator oder ein Software-Entropy-Gathering-Daemon (z.B. Haveged) installiert werden.
     % dnssec-keygen -a RSASHA256 -b 1536 -n ZONE zone0x.dnslab.org
     Generating key pair.........++++ ............................
     Kzone0x.dnslab.org.+008+16239

     % more Kzone0x.dnslab.org.+008+16239.key
     ; This is a zone-signing key, keyid 16239, for zone0x.dnslab.org.
     ; Created: 20160202121320 (Tue Feb  2 13:13:20 2016)
     ; Publish: 20160202121320 (Tue Feb  2 13:13:20 2016)
     ; Activate: 20160202121320 (Tue Feb  2 13:13:20 2016)
     zone0x.dnslab.org. IN DNSKEY 256 3 8 AwEAAc1xFtt40wPEx4TVB7h8Ac7HvMZuF1LIqESU/0HUUzDT2rkujMdL
     z0fgJJQVStYIbb1fXN0/PmKayEpj5ScbT7WU9Bef6b49uG1PwhsaftRr
     /udr3DEA6MTEdRqkl8K+E3P9hFj4XKxus45MYVSPaXZg3TcIQK3xpXC8
     sKISny43cQaJpm12oBtKsANlA25KRJC8soP1s/GqLSnArWDMN/YGqvs0
     QECulpm2Nh1uULZfzwga8515xizyx5yAl/sgWQ==

Manuelles Signieren mit BIND 9 (3)

  • Erstellen des Key-Signing-Keys (KSK)

             % dnssec-keygen -a RSASHA256 -b 2048 -f KSK -n ZONE zone0x.dnslab.org
             Generating key pair...................................................
             Kzone0x.dnslab.org.+008+04351
    
             % more Kzone0x.dnslab.org.+008+04351.key
             ; This is a key-signing key, keyid 4351, for zone0x.dnslab.org.
             ; Created: 20160202121714 (Tue Feb  2 13:17:14 2016)
             ; Publish: 20160202121714 (Tue Feb  2 13:17:14 2016)
             ; Activate: 20160202121714 (Tue Feb  2 13:17:14 2016)
             zone0x.dnslab.org. IN DNSKEY 257 3 8 AwEAAcmn/QkiCne922gBBBuJJOnq9jnG2yYbB10zBS2SgUCUxlZfM2ja
             PAyubB2V+QhFsKf0VKUsVGl28JWAMcG1NGitj+nna4sGwvmeumj70DbG
             ZzynwcFknEZG1Swn2bM/OFmlMS2WV3luzDYKnLeZgvN5geB6ZetONlpP
             H9am3MRmExNIxoFb5NEcUlCzxSUI5GzjPZtGmCtDoNKrGE5nsssCgrjw
             ec6hbeXLOjP9JiQ3egF3+PJHLUOjuqXKwSofHw4jV4Rqc3eP+uAHk5Wp
             iH/BNW7c7lJ9IP+jZYZ3dp3SkO2qU8BOVV4fcm1L+IVcA9jwuuPaOV53
             j9L8fCTL/Uk=
    

Manuelles Signieren mit BIND 9 (4)

  • die unsignierte Zone

             $TTL 3600
             $ORIGIN zone0x.dnslab.org.
             @             IN SOA server0x.dnslab.org.  hostmaster.zone0x.dnslab.org. (
                                  1001 ; serial
                                  1d   ; refreh
                                  2h   ; retry
                                  4w   ; expire
                                  30m  ; negTTL
                               )
                           IN NS server0x.dnslab.org.
                           IN MX 10 mail.zone0x.dnslab.org.
             www           IN A  192.168.53.199
             mail          IN A  192.168.53.199
    

Manuelles Signieren mit BIND 9 (5)

  • die öffentlichen Schlüssel (ZSK und KSK) der Zone hinzufügen

             % cat Kzone0x.dnslab.org.+008+*.key >> zone0x.dnslab.org
    

Manuelles Signieren mit BIND 9 (6)

  • die Zonendatei signieren

             % dnssec-signzone -o zone0x.dnslab.org -k Kzone0x.dnslab.org.+008+04351.private \
               zone0x.dnslab.org Kzone0x.dnslab.org.+008+16239.private
             Verifying the zone using the following algorithms: RSASHA256.
             Zone fully signed:
             Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
                                   ZSKs: 1 active, 0 stand-by, 0 revoked
             zone0x.dnslab.org.signed
    
  • Syntax:

             dnssec-signzone -o <origin> -k <KSK-privat> <Zonendatei> <ZSK-privat>
    
  • wird die Fehlermeldung dnssec-signzone: fatal: SOA is not signed (keys offline or inactive?) angezeigt, dann sind der KSK und der ZSK in der falschen Reihenfolge angegeben worden

Manuelles Signieren mit BIND 9 (7)

  • weitere Optionen zu dnssec-signzone
    • -j sec Jitter, Variation in Sekunden der Signatur-Gültigkeit
    • -M maxttl - die maximale TTL in der Zone festlegen. Höhere TTL-Werte werden auf diesem Wert gesetzt.
    • -s starttime - Gültigkeitsbeginn der Signaturen
    • -e endtime - Gültigkeitsende der Signaturen
    • -N SOA-format - Format der SOA-Seriennummer
      • increment SOA-Serial um eins erhöhen
      • unixtime Unixtime (Sekunden seit dem 1.1.1970) als SOA-Serial benutzen
    • -x DNSKEY Record-Set nur mit dem KSK signieren (keine Signatur mit dem ZSK)
    • -n numcpus Anzahl CPU-Kerne für die Signierung
    • -t Ausgabe von Statistiken zur Geschwindigkeitsmessung

Manuelles Signieren mit BIND 9 (8)

  • signierte Zone anzeigen
more zone0x.dnslab.org.signed
zone0x.dnslab.org.      3600    IN SOA  server0x.dnslab.org. hostmaster.zone0x.dnslab.org. (
                                         1001       ; serial
                                         86400      ; refresh (1 day)
                                         7200       ; retry (2 hours)
                                         2419200    ; expire (4 weeks)
                                         1800       ; minimum (30 minutes)
                                         )
                         3600    RRSIG   SOA 8 3 3600 (
                                         20160303114542 20160202114542 16239 zone0x.dnslab.org.
                                         jT+M9IhjViHkoLnC5/y+MaHYoxpcoyHvif7H
                                         sFESQfk7JBx654zb7OZ2LVxsmMnGtiqxkLlD
                                         l5nJtBJuWXMufPLks+qQb42YjdGgU6vf5WOI
                                         GkTyTMf0ZcNc3ULZZCMG/Vkf3Pak4O6He+cB
                                         xvdbDzOOaLcQqlKH8xY/ylmHawJTm8Mmcbb/
                                         1tL3B/Iv0SI9Lv+F/g+ajaA7fd3bcr0Vueol
                                         gOTJ3OZkIEoQFROrn5UMQ/fvbY7Go2TjDT7I
                                         GYMu )
                         3600    NS      server0x.dnslab.org.
                         3600    RRSIG   NS 8 3 3600 (
                                         20160303114542 20160202114542 16239 zone0x.dnslab.org.
                                         ColPExa9EdSA1Nt1DsEtX5qjYzNWA8vUl8ef
                                         oJG409V6BX4JJsK7RJGCGlmqDIA7HO1IQKug
                                         64N+fD/IuVjqHsPxc/YtP1sdnnLjYK0rHgG7
                                         kMMkoqU7Ta/l/laKKd3jcI/kh66dOsTwYrEC
                                         aykvfzYCnVj/rxwEomu2aTbPh/Nt7V2OEXDT
                                         EqlmpS34yQ3LvYfnSTTipLYZNS/2kL7NRuEo
                                         1gId5PD/IMAKSpTqfilW1bQUf+CYJF/CGgF5
                                         KRIx )

Manuelles Signieren mit BIND 9 (9)

  • Dateigröße vergleichen

             % wc zone0x.dnslab.org*
                  23     133    1554 zone0x.dnslab.org
                 130     314    5178 zone0x.dnslab.org.signed
                 153     447    6732 total
    

Manuelles Signieren mit BIND 9 (10)

  • BIND 9 Zonenkonfiguration anpassen, so dass nun die signierte Zone geladen wird

             zone "zone0x.dnslab.org" IN {
                 type master;
                 file "zone0x.dnslab.org.signed";
             };
    
  • Konfiguration prüfen

             % named-checkconf -z
             zone zone0x.dnslab.org/IN: loaded serial 1001 (DNSSEC signed)
    
  • BIND 9 Zone neu laden

             % rndc reload zone0x.dnslab.org
    

DS-Record

  • den DS-Record an den Betreiber der Elternzone senden
    • der DS-Record befindet sich in der Datei "dsset-". Diese Datei wird beim manuellen Signieren automatisch erstellt.
  • warten bis der DS-Record in der Elternzone sichtbar ist
  • DNSSEC-Validierung prüfen (AD-Flag)
    % dig zone0x.dnslab.org SOA +dnssec +m
    ; <<>> DiG 9.10.3-P3 <<>> zone0x.dnslab.org soa +dnssec +m
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20294
    ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 1

DNSSEC mit dynamischen Zonen

Seit BIND 9.7.4 können dynamische DNS-Zonen mit DNSSEC signiert werden

  • Vorteile
    • BIND 9 aktualisiert die Signaturen automatisch (RRSIG Records)
    • die Zonenschlüssel werden automatisch in die Zone importiert und nach dem Austausch der Schlüssel wieder aus der Zone entfernt
    • der Lebenszyklus eines DNSSEC-Schlüssels kann über Meta-Daten des Schlüssels gesteuert werden
    • mit diesem Metadaten lassen sich die Schlüssel-Rollover automatisieren
    • Änderungen an der Zone werden sofort per DNSSEC signiert
    • die SOA-Seriennummer wird automatisch bei jeder Änderung in der Zone aktualisiert
    • beim Parsen von Update-Befehlen werden Syntax-Fehler in den Zonendaten entdeckt. Diese Fehler können nicht in die Zonendatei kommen
    • das Journal der Zone erfasst alle Änderungen in der Zone über die Zeit

DNSSEC mit dynamischen Zonen

Seit BIND 9.7.4 können dynamische DNS-Zonen mit DNSSEC signiert werden Nachteile:

  • die DNS-Master-Server muss online Zugriff auf die Privaten Schlüssel der Zone haben. Der DNS-Master sollte daher ein "Hidden-Master" sein.
  • die Zonendaten dürfen nicht mehr in den Zonendateien verändert werden. Die Benutzung von Editoren und einigen DNS-Verwaltungsprogrammen ist nicht möglich.

dynamisches DNSSEC (1)

DNSSEC in der BIND 9 Konfiguration anschalten und das Verzeichnis für DNSSEC-Schlüssel angeben

     options {
         directory "/var/named";
         key-directory "/var/named/keys";
         dnssec-enable yes;
     };

Konfiguration testen und BIND 9 neu laden

     % named-checkconf -z
     % rndc reconfig

dynamisches DNSSEC (2)

ZSK und KSK für die Zone erstellen.

  • Wird kein Algorithmus angegeben, so ist RSASHA1 der Default (nicht empfohlen).
  • Werden keine Schlüsselgrößen angegeben, so wird ein ZSK mit 1024bit RSA und ein KSK mit 2048bit RSA erstellt
  • der Parameter -k gibt an, in welchem Verzeichnis die Schlüssel abgelegt werden
     % dnssec-keygen -a RSASHA256 -b 1536 -K /var/named/keys -n ZONE dynamic0x.dnslab.org
     % dnssec-keygen -a RSASHA256 -b 2048 -K /var/named/keys -f KSK -n ZONE dynamic0x.dnslab.org

dynamisches DNSSEC (3)

Bei der Erstellung der Schlüssel können die Schlüssel-Ereignisse für den Lebenszyklus des Schlüssels angegeben werden.

Zeitpunkte können entweder im Format YYYYMMDD oder YYYYMMDDHHMMSS, oder als Offset von der aktuellen Uhrzeit (now) angegeben werden. Das Offset wird mit +/-, einer Zahl und den Einheiten y (Jahr), mo (Monat), d (Tage), h (Stunde) und mi (Minute) angegeben

  • Monate haben in diesem Format 30 Tage
  • Jahre haben 365 Tage

dynamisches DNSSEC (4)

Diese Daten können mit dnssec-settime angezeigt und auch nachträglich geändert werden.

  • -P Zeitpunkt, wann der Schlüssel in der Zone sichtbar werden soll (Publish)
  • -A Zeitpunkt, an dem der Schlüssel zum Erstellen von Signaturen verwendet wird (Active)
  • -I Zeitpunkt, von dem an der Schlüssel nicht mehr zum Signieren verwendet wird (Inactive)
  • -D Zeitpunkt, an dem der Schlüssel aus der Zone gelöscht werden soll (Delete)
  • -R Zeitpunkt, an dem der Schlüssel wiederrufen wurde (Revoke)

dynamisches DNSSEC (5)

publizierte Schlüssel können mit dem Befehl dnssec-revoke wiederrufen werden.

     % dnssec-revoke Kzone0x.dnslab.org.+008+23689.private
     Kzone0x.dnslab.org.+008+23817

     % more Kzone0x.dnslab.org.+008+23817.key
     ; This is a revoked key-signing key, keyid 23817, for zone0x.dnslab.org.
     ; Revoke: 20160202164447 (Tue Feb  2 17:44:47 2016)
     zone0x.dnslab.org. IN DNSKEY 385 3 8 AwEAAeHhGKk8bOlK2sI8dysod64WOBpkudNx/SNNsAcy8PWddOGau8Iq
     F7a+YZH2JAOPFshfF9GLR3yt0kWTDjUOs0TCkyFoB4uYJftkeP5o/VO1
     BeDapl5O87Qij3sq+DC8AmPfxYIIT/Kl0BSl0bEhR0AxnGoEpPzsaoNH
     MSgkYp3wUZjNxZrXfOslekfN2VcCdwtzXfjW9FJxw61tg4bc2HydDUKw
     6YS8YntWcdkbDdTWHImcaBk2UqBcfzluL9BShedDZ7psnIqh9EmNu+BR
     jaMuE64xAbuk5py2cKKY3sg9LEpT5CLEuN0HSoH+iNY/E1QV1AHMGWlj
     pdnw9il5Wq0=
  • ein wiederrufender KSK hat die Flags 385
  • es werden nur KSK-Schlüssel wiederrufen, das Wiederrufen eines ZSK-Schlüssels ist nicht definiert

dynamisches DNSSEC (6)

Anpassen der Zonendefinition in der Datei named.conf

  • update-policy local; erlaubt Updates mit dem BIND 9 Sitzungschlüssel aus /var/run/named/session.key. Dieser Schlüssel wird von nsupdate benutzt, wenn nsupdate mit dem Parameter -l gestartet wird
  • auto-dnssec maintain sorgt für das automatische Laden der Schlüssel in die Zone und das aktualisieren der DNSSEC-Signaturen
     zone "dynamic0x.dnslab.org" IN {
         type master;
         file "dynamic0x.dnslab.org";
         update-policy local;
         auto-dnssec maintain;
     };

dynamisches DNSSEC (7)

Konfiguration prüfen und BIND 9 neu laden

     % named-checkconf -z
     % rndc reconfig
  • Ab diesem Zeitpunkt darf die Zonendatei nicht mehr per Editor verändert werden!
  • BIND 9 wird die Zone beim nächsten DNSSEC-Signatur-Interval (max. 60 Minuten) signieren
  • Das Signieren der Zone kann über rndc sign angestossen werden. Der Befhl rndc sign liefert keine Fehlermeldung, wenn die Zone nicht signiert werden kann (weil z.B. Schlüssel fehlen). Daher immer die Log-Dateien prüfen!
     % rndc sign dynamic0x.dnslab.org
     % dig axfr @localhost dynamic0x.dnslab.org

dynamisches DNSSEC (8)

einen neuen DNS-Record hinzufügen. Die neuen Daten werden sofort per DNSSEC signiert:

     # nsupdate -l
     > update add test.dynamic0x.dnssec.example. 3600 IN TXT "Ein neuer DNS-Record"
     > send
     # dig txt test.dynamic0x.dnssec.example. @localhost +dnssec
     [..]
     ;; ANSWER SECTION:
     test.dynamic0x.dnssec.example. 3600 IN TXT "Ein neuer DNS-Record"
     test.dynamic0x.dnssec.example. 3600 IN RRSIG TXT 5 4 3600 20160230114919 (
         20160131104919 25032 dynamic0x.dnssec.example.
         YliG936cphhDO2nAp1V5pXVMUH8/+9ODEyRMqv0YCBVWR7Tz8tqqxjmr
         5sj0hxNJSfHJlMXa81gwx33X0D6nl3JeAQ48ivDAKDHYOKd/ogo8GxjB
         L4OlyxZ9O0NWcWQaCW0Ly9lKHgoD8PV4t50qb0/lqpZ/AK0m0TsMWpi/ IeA=

dynamisches DNSSEC (9)

einen DNS-Record löschen. Die Daten und die Signatur wird entfernt, die SOA-Serial wird hochgezählt:

     # nsupdate -l
     > update del test.dynamic0x.dnssec.example. IN TXT
     > send

dynamisches DNSSEC (10)

Die DS-Records für die Elternzone werden mit dem Befehl dnssec-dsfromkey erstellt. Als Eingabeparameter erwartet dnssec-dsfromkey die Datei mit dem öffentlichen KSK-Schlüssel:

     % dnssec-dsfromkey Kdynamic0x.dnslab.org.+008.+12345.key
     dynamic0x.dnssec.example. IN DS 12345 8 1 B7BE432A2C4A25A0C9F1DA6DD4C289C99C25B2CC
     dynamic0x.dnssec.example. IN DS 12345 8 2 DCA5AFBD131982707B55A19CD33048674ADE5FDD9FFCB008A2F54744
                                               B378B689

Es werden die DS-Records mit SHA1-Hash und SHA256-Hash am Terminal ausgegeben.

dynamisches DNSSEC (11)

  • Warten, das der DS-Record in der Elternzone erscheint
  • DNSSEC-Validierung in der Zone testen (AD-Flag!)

DNSSEC mit 'inline-signing'

DNSSEC mit 'inline-signing'

Seit BIND 9.9 kann der BIND 9 DNS-Server eine Zone beim laden der Zone DNSSEC-signieren:

  • beim Laden aus einer Zonendatei
  • beim Zonentransfer von einem andern DNS-Server

Die DNSSEC-Signaturen werden automatisch aktualisiert

  • wenn die Zone neu aus der Datei geladen wird und in der Datei eine höhere SOA-Serial vorkommt
  • wenn die Zonendaten neu per Zonentransfer übertragen werden

DNSSEC mit 'inline-signing'

Vorteile von 'inline-signing'

  • gewohnte Administrations-Arbeitsabläufe können beibehalten werden
  • DNS-Verwaltungs-Programme ohne DNSSEC-Unterstützung können weiter verwendet werden
  • bestehende DNS-Infrastrukturen können durch einen BIND 9 Server als 'bump-in-the-wire' DNSSEC-Signer DNSSEC-fähig gemacht werden, ohne den bestehenden DNS-Master anpassen zu müssen
  • BIND 9 lädt die DNSSEC-Schlüssel automatisch und frischt die Signaturen selbsttätig auf
  • der Lebenszyklus eines DNSSEC-Schlüssels kann über Meta-Daten des Schlüssels gesteuert werden
  • mit diesem Metadaten lassen sich die Schlüssel-Rollover automatisieren

DNSSEC mit 'inline-signing'

Nachteile von 'inline-signing'

  • die SOA-Serial in der Zone auf den DNS-Servern kann höher sein als die Nummer in der Zonendatei
  • die SOA-Serial in der Zonendatei muss weiterhin manuell erhöht werden

DNSSEC mit 'inline-signing' (1)

DNSSEC in der BIND 9 Konfiguration anschalten und das Verzeichnis für DNSSEC-Schlüssel angeben

     options {
         directory "/var/named";
         key-directory "/var/named/keys";
         dnssec-enable yes;
     };

Konfiguration testen und BIND 9 neu laden

     % named-checkconf -z
     % rndc reconfig

DNSSEC mit 'inline-signing' (2)

ZSK und KSK für die Zone erstellen.

  • der Parameter -k gibt an, in welchem Verzeichnis die Schlüssel abgelegt werden
     % dnssec-keygen -a RSASHA256 -b 1536 -K /var/named/keys -n ZONE inline0x.dnslab.org
     % dnssec-keygen -a RSASHA256 -b 2048 -K /var/named/keys -f KSK -n ZONE inline0x.dnslab.org

DNSSEC mit 'inline-signing' (2)

Inline-Signing in der Zone aktivieren

     zone "inline0x.dnslab.org" IN {
         type master;
         file "inline0x.dnslab.org";
         inline-signing yes;
         auto-dnssec maintain;
     };

DNSSEC mit 'inline-signing' (3)

Konfiguration prüfen, BIND 9 neu laden, Zone signieren

     % named-checkconf -z
     % rndc reload
     % rndc sign inline0x.dnslab.org

In den Logdateien das Ergebnis prüfen (rndc sign liefert keinen Fehler zurück!):

     % tail /var/log/named.log
     31-Jan-2016 21:58:37.945 zone inline0x.dnslab.org/IN (unsigned): loaded serial 1002
     31-Jan-2016 21:58:37.946 zone inline0x.dnslab.org/IN (signed): loaded serial 1003 (DNSSEC signed)

DNSSEC mit 'inline-signing' (4)

  • Die Daten der signierten Zone werden im Binärformat (Format "raw") in die Datei mit der Endung ".signed" geschrieben
  • BIND 9 legt zusätzlich noch eine Journaldatei (.jnl) mit den Änderungen (für IXFR-Zonentransfers) und ein Backup des Journals (.jbk) an
  • die Ursprungsdatei wird nicht geändert!
  • geänderte Daten werden nach spätestes 15 Minuten nach der Änderung in die Datei geschrieben
  • mittels rndc sync kann die Datei sofort aktualisiert werden
  • der Befehl named-compilezone kann eine Zonedatei vom Format "RAW" in das RFC 1035 Textformat umwandeln
     # rndc sync inline0x.dnslab.org
     # named-compilezone -f RAW \
         -o inline0x.dnslab.org.txt \
            inline0x.dnslab.org inline0x.dnslab.org.signed

DNSSEC mit 'inline-signing' (5)

Änderungen in den Zonendaten werden wie gewohnt in der Zonendatei durchgeführt. Die SOA-Serial muss dabei erhöht werden. Die SOA-Serial kann, muss dabei nicht höher als die SOA-Serial der Zone auf den DNS-Servern werden

Fragen?