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:
- Maak een sleutel paar, liefst een KSK (Key signing key) en een ZSK (zone signing key). Dus in totaal twee sleutel paren;
- Sign je zone met die sleutels;
- Configureer je nameserver zodat de gesignde zone wordt geserveerd;
- Configureer CRON zodat elke dag je zone wordt ge-resigned;
- 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.
4 comments
-N unixtime in dnssec-signzone. Ik heb de blog post aangepast.
