Aangezien gister avond (22 augustus) om 5 voor half 1 's nachts de eerste gesignde versie van .NL is gepubliceerd is het natuurlijk de hoogste tijd om je eigen zone te signen. Je kunt vooralsnog geen secure delegatie aanvragen, maar dat proces zit in de pijplijn bij SIDN.

Ik ga er van uit dat je redelijk bekent bent met DNS. Deze howto neemt een recent BIND9 als uitgangspunt, maar met NSD kom je ook een heel eind.

Er zijn een aantal stappen die je moet zetten voordat je DNSSEC aan hebt staan:

  1. Maak een sleutel paar, liefst een KSK (Key signing key) en een ZSK (zone signing key). Dus in totaal twee sleutel paren;
  2. Sign je zone met die sleutels;
  3. Configureer je nameserver zodat de gesignde zone wordt geserveerd;
  4. Configureer CRON zodat elke dag je zone wordt ge-resigned;
  5. Test het.

Deze sleutels zijn statisch. We gaan dus geen key rollovers implementeren.

Maak de sleutels:

Sleutels maken gaat met dnssec-keygen, dit programma heeft nogal wat opties. De belangrijkste zijn: -a ALG om het algoritme van je sleutel te specificeren, -b BITS: hoe lang moet je sleutel zijn, -f KSK specificeert een KSK en -n ZONE zegt dat er een DNS sleutel moet worden gemaakt. Voor miek.nl, komen we tot:

dnssec-keygen -a RSASHA256 -b 2048 -f KSK -n ZONE miek.nl
dnssec-keygen -a RSASHA256 -b 1024 -n ZONE miek.nl

(Je kunt dit versnellen door -r /dev/urandom als optie mee te geven, maar dan krijg je kwalitatief slechtere sleutels). Dit levert vier files op, in mijn geval:

Kmiek.nl.+008+12051.{key,private} en Kmiek.nl.+008+33694.{key,private}

Het public deel van mijn KSK ziet er zo uit:

; This is a key-signing key, keyid 33694, for miek.nl.
; Created: Wed Aug 18 14:46:09 2010
; Publish: Wed Aug 18 14:46:09 2010
; Activate: Wed Aug 18 14:46:09 2010
miek.nl. IN DNSKEY 257 3 8 AwEAAcWdjBl4W4wh/hPmNC.<ingekort>...V BdTRBtgHi0s=

Signeer je zone

Dit is de stap die je van PLAIN DNS naar DNSSEC tilt. Signeren gaat met dnssec-signzone. In dit geval gebruik ik ook de -S optie, de zogenaamd smart signing, hierbij kijkt dnssec-signzone naar de commentaar regels (de regels die met ; beginnen in de key), om te zien welke sleutels gebruikt moeten worden. Verder hebben we de sleutels in een aparte directory staan (-K keys) en moeten de gegenereerde DS records ook apart komen (-d ds) (zie "DS records"), -o miek.nl wordt gebruik om aan te geven dat het hier om miek.nl gaat.

Het signeren van miek.nl gaat uiteindelijk met:

dnssec-signzone -K keys -d ds -o miek.nl -S miek.nl

Om dit te automatiseren gebruik ik een kleine Makefile:

.PHONY: miek.nl.signed
KEYDIR=/etc/bind/external/keys
DSDIR=/etc/bind/external/ds
miek.nl.signed:     miek.nl
    @dnssec-signzone -N unixtime -K $(KEYDIR) -d $(DSDIR) -o $< -S $<

NB: deze Makefile zorgt ervoor dat er altijd wordt ge-resigned.

Nameserver configuratie

Verander in mijn geval:

zone "miek.nl" {
type master;
file "/etc/bind/external/miek.nl";
};

naar

zone "miek.nl" {
type master;
file "/etc/bind/external/miek.nl.signed";
};

De bedoeling is duidelijk: serveer de gesignde variant van je zone.

CRON

Plaats een script /etc/cron.daily, die zorgt voor een dagelijkse resign:

% cat /etc/cron.daily/dnssec

#!/bin/bash
# Resign unconditionally
( cd /etc/bind/external ; /usr/bin/make ) && /usr/sbin/rndc reload

Test

Run het script even met de hand: /etc/cron.daily/dnssec:

Fetching KSK 33694/RSASHA256 from key repository.
Fetching ZSK 12051/RSASHA256 from key repository.
Verifying the zone using the following algorithms: RSASHA256.
Zone signing complete:
Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
          ZSKs: 1 active, 0 stand-by, 0 revoked
miek.nl.signed
server reload successful

Ziet er goed uit, nu een tweede controle:

dig @a.miek.nl +dnssec +multiline DNSKEY miek.nl

;; ANSWER SECTION:
miek.nl.        14400 IN DNSKEY 257 3 8 (
            AwEAAcWdjBl4W4wh/hPxMDcBytmNCvEngIgB9Ut3C2+Q
            ...
            4N0t9ac/T0a0Sxba/BUX2UVPWaIVBdTRBtgHi0s=
            ) ; key id = 33694
miek.nl.        14400 IN DNSKEY 256 3 8 (
            AwEAAcNEU67LJI5GEgF9QLNqLO1SMq1EdoQ6E9f85ha0
            ...
            M335Ft9xjtXHPy7ztCbV9qZ4TVDTW/Iyg0PiwgoXVesz
            ) ; key id = 12051

Succes!

DS records

In de ds directory staat na het signen een dsset bestand:

% cat dsset-miek.nl.
miek.nl.        IN DS 33694 8 1 8BA582C292324D256599CE72EEE6DF2A9F317AFD
miek.nl.        IN DS 33694 8 2 2C235500B09FA87BBC0981674FC31AF87D2FA4DCFE666A64BA2646F2 9651DB83

Deze records zijn de hash waardes van mijn KSK. Er staan twee DSen in deze file, omdat er twee verschillende hashes SHA-1 (de 1 in "33694 8 1") en SHA-256 (de 2 in "33694 8 2").

Deze DS records, of misschien maar eentje moeten bij .nl terecht komen, zodat zij een secure delegatie voor miek.nl kunnen maken.

Tags: dutch, dns(sec)

4 comments

is 'make -C /etc/bind/external' niet eenvoudiger?
Ik hou van sub-shells :-)
leuk stukje :) mocht je dingen wat automatischer laten gaan, dan is opendnssec wel een boeiende tool (maar dat wist je vast al)
Het is natuurlijk ook handig als de serial wordt opgehoogd na het signen. Dan kan heel handig met:
-N unixtime in dnssec-signzone. Ik heb de blog post aangepast.

Comments are closed

If you really, really want to comment, please mail miek@miek.nl.

0 comments in moderator queue