Aggiungere i record DNSSEC in una zona in BIND

Prima di leggere questo post dovete creare la zona in BIND.

È arrivato adesso il momento di inserire nella zona i record DNSSEC. Se avete familiarità con i record DNS ma non con quelli DNSSEC potete trovare un semplice guida https://dlv.isc.org/about/dnssec_records

In linea con il funzionamento di DNSSEC occorre disporre di 2 chiavi:

ZSK
Zone Signin Key: Composta da una chiave pubblica e una chiave privata, sono usate per firmare i campi nella zona. Queste chiavi sono sconosciute al registry. Si raccomanda di cambiarla ogni 3 mesi.
KSK
Key Signin Key: Composta da una chiave pubblica e una chiave privata, sono solo usate per firmare le ZSK. Queste chiavi sono firmate da un campo DS nella zona padre. È cecessario cambiarla almeno una volta l’anno.

Generiamo quindi le nostre chiavi.

Per tenere organizzate le nostre chiavi ed i file che genereremo successivamente suggerisco di tenerli in una una directory a parte. La mia scelta è quella di creare una directory keys nella directory /var/lucafrosini.eu.zone. Mettetela dove preferite ma suggerisco di evitare /etc/bind

~$ sudo mkdir -p /var/lucafrosini.eu.zone/keys

Posizioniamoci nella directory appena creata e generiamo la nostra ZSK (pubblica + privata):

~$ cd /var/lucafrosini.eu.zone/keys
/var/lucafrosini.eu.zone/keys$ dnssec-keygen -a rsasha1 -b 1024 -n ZONE lucafrosini.eu
/var/lucafrosini.eu.zone/keys$ ls
Klucafrosini.eu.+005+54300.key  Klucafrosini.eu.+005+54300.private

Generiamo quindi la nostra KSK (pubblica + privata)

/var/lucafrosini.eu.zone/keys$ dnssec-keygen -a rsasha1 -b 2048 -n ZONE -f KSK lucafrosini.eu
/var/lucafrosini.eu.zone/keys$ ls
Klucafrosini.eu.+005+06508.key  Klucafrosini.eu.+005+06508.private  Klucafrosini.eu.+005+54300.key  Klucafrosini.eu.+005+54300.private

I permessi dei file creati dovrebbero essere del tipo (se non lo fossero adeguateli):

/var/lucafrosini.eu.zone/keys$ ls -la 
total 24
drwxr-xr-x 2 root root 4096 feb 13 12:14 .
drwxr-xr-x 3 root root 4096 feb 13 12:15 ..
-rw-r--r-- 1 root root  610 feb 13 12:14 Klucafrosini.eu.+005+06508.key
-rw------- 1 root root 1774 feb 13 12:14 Klucafrosini.eu.+005+06508.private
-rw-r--r-- 1 root root  437 feb 13 12:14 Klucafrosini.eu.+005+54300.key
-rw------- 1 root root 1010 feb 13 12:14 Klucafrosini.eu.+005+54300.private

A questo punto dobbiamo inserire le nostre chiavi pubbliche nella nostra zona. Per farlo consiglio di copiare la zona precedentemente creata nella directory /var/lucafrosini.eu.zone/ (capirete il perché, per adesso cercate di fidarvi) (N.B per abitudine personale torno sempre nella home per evitare di sporcare directory di sistema nel caso in cui digiti un comando errato).

/var/lucafrosini.eu.zone/keys$ cd ~
~$ sudo cp /var/lib/bind/lucafrosini.eu /var/lucafrosini.eu.zone/

Andiamo quindi ad inserire le nostre chiavi pubbliche semplicemente lanciando il comando
~$ sudo cat /var/lucafrosini.eu.zone/keys/Klucafrosini.eu.+005+*.key >> /var/lucafrosini.eu.zone/lucafrosini.eu
N.B. Se questo comando fallisce dovete lanciarlo direttamente dall’utente root (sudo potrebbe non essere sufficiente).

A questo punto il contenuto del file sarà (notare che ho rieditato il file aggiornando il seriale a 2013111503):

~$ cat /var/lucafrosini.eu.zone/lucafrosini.eu 
;
; BIND data file for lucafrosini.eu
;
$TTL 	3600
@       IN      SOA     ns1.lucafrosini.eu. n2.lucafrosini.eu. (
				2013111503	; serial, todays date + todays serial #
				7200		; refresh
				540		; retry
				604800		; expire
				86400 )		; minimum
;
@       IN      NS      ns1.lucafrosini.eu.
@       IN      NS      ns2.lucafrosini.eu.
ns1	IN	A	146.48.85.137
ns2     IN      A       146.48.85.137

; This is a key-signing key, keyid 6508, for lucafrosini.eu.
; Created: 20131113145004 (Wed Nov 13 15:50:04 2013)
; Publish: 20131113145004 (Wed Nov 13 15:50:04 2013)
; Activate: 20131113145004 (Wed Nov 13 15:50:04 2013)
lucafrosini.eu. IN DNSKEY 257 3 5 AwEAAbbqxrv8HCwcy8wONrRRYsfR+EaRaVhqwkU4Lw0Eh5zu82LoBZms 5yn7EIe9vWsusLNUPbFUz9CZuee68rMyJy+tdIcFObrmZw46PpVl/QfF MFfsMSPCxvwt5L18VBXJ0oGsaE1TljnpXX25lRL2yFqFPZzYxwr7Ugn9 Kpk8KBrWYJ0Ei1kjDRzyktKTkGWRdQH04K8I9iBjkRi8VpPRuXSyDarZ 140tPLdlv73C5q8/q/D8TgscoBTtcC5hNuMR7EZ7v9jdG1E2/1d4jUW8 FJZpjFdB/0s9Cvo26y4briyQt+Hy1xwXoY+4vXuBa2wX5TyyXaCgfmuu 2r+2A/Wqc98=
; This is a zone-signing key, keyid 54300, for lucafrosini.eu.
; Created: 20131113141755 (Wed Nov 13 15:17:55 2013)
; Publish: 20131113141755 (Wed Nov 13 15:17:55 2013)
; Activate: 20131113141755 (Wed Nov 13 15:17:55 2013)
lucafrosini.eu. IN DNSKEY 256 3 5 AwEAAdftGe9lb1JhW+f6DmJtX4XfXhIMvpgL+18LLsXmldLUBSmr7jpV OG0WNUprUd84CAu4g4eWIk8KP0VfWBO9rqQbUwKWSGPqaVMeTFQKcuTP Op0s6MygWxYPGWw/ZdZi30HBLoQ7CkL+e8vsWVde53JEC965+OowwV9k gGo473dN

Per sicurezza controlliamo che la nostra zona sai corretta per BIND:
~$ named-checkzone lucafrosini.eu /var/lucafrosini.eu.zone/lucafrosini.eu
zone lucafrosini.eu/IN: loaded serial 2013111503
OK

Siamo quindi pronti per firmare i nostri record (entro nella directory per comodità)

~$ cd /var/lucafrosini.eu.zone/
/var/lucafrosini.eu.zone$ sudo dnssec-signzone lucafrosini.eu
Verifying the zone using the following algorithms: RSASHA1.
Zone fully signed:
Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
ZSKs: 1 active, 0 stand-by, 0 revoked
lucafrosini.eu.signed

Il comando ha generato il file lucafrosini.eu.signed contente la zona firmata senza toccare la nostra zona.
/var/lucafrosini.eu.zone/$ ls
dsset-lucafrosini.eu. lucafrosini.eu.signed lucafrosini.eu

/etc/bind/lucafrosini.eu.keys$ cat lucafrosini.eu.signed 
; File written on Mon Nov 18 15:47:10 2013
; dnssec_signzone version 9.9.3-rpz2+rl.13214.22-P2-Ubuntu-1:9.9.3.dfsg.P2-4ubuntu1
lucafrosini.eu.		3600	IN SOA	ns1.lucafrosini.eu. n2.lucafrosini.eu. (
					2013111503 ; serial
					7200       ; refresh (2 hours)
					540        ; retry (9 minutes)
					604800     ; expire (1 week)
					86400      ; minimum (1 day)
					)
			3600	RRSIG	SOA 5 2 3600 (
					20131218134710 20131118134710 54300 lucafrosini.eu.
					sbD8Ht2xeE0qI9tQJJVnfDmOfhXr3kjupE5Z
					BVY5jDrtQiMtI3wgmKx7NeVdfd7tsWxJ21kY
					JQeWp8QV/LZeHe6KJH64gUXnJ++j0oWlrGnz
					GQ7M6FemJfEbTYqCmaN6Cz6/O4D+9L4WS+AY
					28iOaO5YmXM6fRHjKZfFKdDhy3c= )
			3600	NS	ns1.lucafrosini.eu.
			3600	NS	ns2.lucafrosini.eu.
			3600	RRSIG	NS 5 2 3600 (
					20131218134710 20131118134710 54300 lucafrosini.eu.
					UK2b8KhPfTD6BWuQZEM5WtCuLVOq5REPF2xs
					5GgmiNQiVZMmJ/wRA3CSddTSJwbh4AyFoNUa
					PY7KBrS87sQ9/GMypmTi5iPAwRuD4zFVx4Oc
					yTM4/CdlcLVQSUxpI9ALmx7apDuMmUHqvmbt
					LLaZzhox2CY9hKqxyywiVPK2fIg= )
			86400	NSEC	ns1.lucafrosini.eu. NS SOA RRSIG NSEC DNSKEY
			86400	RRSIG	NSEC 5 2 86400 (
					20131218134710 20131118134710 54300 lucafrosini.eu.
					bGJbGJ5a4R6rKCDS0X/8zW8mug5pn3ZEutgW
					lmgVjE+haF18DbpPOkX+EsXhLxtV46TGU9/6
					la6fcKryuRQmLRA9yTlqjxNepkcPKk80SBwQ
					W4LVSB8AwT0GLfcaWQIlRB2OfNIgw6tsHwPj
					WtgAAZRwVjc0s06rb9l59ZFSSEw= )
			3600	DNSKEY	256 3 5 (
					AwEAAdftGe9lb1JhW+f6DmJtX4XfXhIMvpgL
					+18LLsXmldLUBSmr7jpVOG0WNUprUd84CAu4
					g4eWIk8KP0VfWBO9rqQbUwKWSGPqaVMeTFQK
					cuTPOp0s6MygWxYPGWw/ZdZi30HBLoQ7CkL+
					e8vsWVde53JEC965+OowwV9kgGo473dN
					) ; ZSK; alg = RSASHA1; key id = 54300
			3600	DNSKEY	257 3 5 (
					AwEAAbbqxrv8HCwcy8wONrRRYsfR+EaRaVhq
					wkU4Lw0Eh5zu82LoBZms5yn7EIe9vWsusLNU
					PbFUz9CZuee68rMyJy+tdIcFObrmZw46PpVl
					/QfFMFfsMSPCxvwt5L18VBXJ0oGsaE1Tljnp
					XX25lRL2yFqFPZzYxwr7Ugn9Kpk8KBrWYJ0E
					i1kjDRzyktKTkGWRdQH04K8I9iBjkRi8VpPR
					uXSyDarZ140tPLdlv73C5q8/q/D8TgscoBTt
					cC5hNuMR7EZ7v9jdG1E2/1d4jUW8FJZpjFdB
					/0s9Cvo26y4briyQt+Hy1xwXoY+4vXuBa2wX
					5TyyXaCgfmuu2r+2A/Wqc98=
					) ; KSK; alg = RSASHA1; key id = 6508
			3600	RRSIG	DNSKEY 5 2 3600 (
					20131218134710 20131118134710 6508 lucafrosini.eu.
					tMc7w5IVs5I0cVXqHqEhUrRUzDb87ywNj19p
					xlqQCBgS5Wr7DIh7pQE+BZKClcSImJAFGbgs
					sDPfPqjlSOAVItxJSjig8Xqv2dyV1d4DDhJN
					p23ww7EPKdynGe0/cOXA1X1nj1DMKk9ulXf+
					GRh+2609QPeHTEVntsjT43D2KKrADZKJKfSi
					jquGjkZz491xxda6Bvu3ydSgLGyDrVs0w1KE
					eCaAmn3Gh2HUyn/v4gPB5kdqI51Aj2LfzwJB
					PJvswWM+5oicm5fpLCYt31Y9zU8CIDm3Jo3B
					c+xpQY6aNbtzE0qXSKoLw7cu9nn1Dl3XX59L
					dIkR0bz0mzp+bXtKRw== )
			3600	RRSIG	DNSKEY 5 2 3600 (
					20131218134710 20131118134710 54300 lucafrosini.eu.
					mU/JgFeRYPXfiwnGiy3FvKd2JrDYP8rI7oPf
					5dr7hdGBNYkpADal6H3nF+uLWe6WmR+CW8ID
					//ZqYh+pKFc9dKReS/3CW0LNzEhZq5dMDUNZ
					eYUUYgJCGEizROV439wEOrTPVXoz8O3SJE0B
					0Q7C2j8MPzaqNf7Z25TK+4EC9mc= )
ns2.lucafrosini.eu.	3600	IN A	146.48.85.137
			3600	RRSIG	A 5 3 3600 (
					20131218134710 20131118134710 54300 lucafrosini.eu.
					WnJPvaapIV4YblbVk35xT+/01iSMvzeEmNO1
					2yd0ebrh4fiu2nRJRCV7Gkksw7pfY2fmwCno
					Aj2lYDyaTUDCSiwU925aj7CDm/T+qd9YpnXl
					xPvg4KRAKQDrlxuI4HFaaDuquWDKVP62WC70
					SfFIENBCDyfBjCwtbLzWIhfhPOc= )
			86400	NSEC	lucafrosini.eu. A RRSIG NSEC
			86400	RRSIG	NSEC 5 3 86400 (
					20131218134710 20131118134710 54300 lucafrosini.eu.
					19nJdmcs+A449TPDhKkI8/NXVnXMM/rvxSHN
					aFQ58aDZGznn5G2fuxOvXer0VULC8rvN4T4S
					SeNNJa/FrzR0NDc0BA/OJaMJnGGYd4JvF1d7
					rSCF6Vz7/QNNUUjb3KoBRtP/HL+d4SEb4zLV
					qGD4e4rhdwaQ+eIC+w9/ujLv65s= )
ns1.lucafrosini.eu.	3600	IN A	146.48.85.137
			3600	RRSIG	A 5 3 3600 (
					20131218134710 20131118134710 54300 lucafrosini.eu.
					D8evduVUmGuW8Kb+Wsmf+Wk3XYn7JNxx4KvT
					hspXx/TBLppCUFq3QWWic6/OhulDJHNISMiR
					MH5XqAkb54Ok1fq7LW5+uPRBZjWNDu0Pn/dp
					2anA34fKzrEdFUONu09QKBaARvqGzRnwIiT9
					WXLYFSzyPhhJi5jduq1QEZVphj0= )
			86400	NSEC	ns2.lucafrosini.eu. A RRSIG NSEC
			86400	RRSIG	NSEC 5 3 86400 (
					20131218134710 20131118134710 54300 lucafrosini.eu.
					SPTxP2Fk9ZNjtBvgu/vNoufzcCj8BqFOPRqh
					NqSI9kGQzGFxFVgC+AYMUSyeBvszxnEHs0hd
					Fw12HpPki04KXG8tVEetl4nvJXEzodj4JXh8
					7KjFX8BRdn4icu95eaSFLGIVbsKb7emIIAL2
					2nc+D+uiAXeMbixs8eEbBDyLf7E= )

Per ecceso di zelo potete anche verificare che il file contiene una zona valida:
~$ named-checkzone lucafrosini.eu /var/lucafrosini.eu.zone/lucafrosini.eu.signed
zone lucafrosini.eu/IN: loaded serial 2013111503 (DNSSEC signed)
OK

Come potete vedere la firma non incrementa il serial. Se avevate ncessità di farlo dovete farlo prima della firma. Nell’esempio lo avevo incrementato dopo aver inserito le chiavi.
Durante la firma è stata generata anche un altro file contenente i record DS da comunicare alla zona padre (.eu nel mio caso).
~$ cat /var/lucafrosini.eu.zone/dsset-lucafrosini.eu.
lucafrosini.eu. IN DS 6508 5 1 1301057AE756EE2608E7697670FFDDEB0D967F51
lucafrosini.eu. IN DS 6508 5 2 3FE6706B5C804AD97817E4474FBD1EFD8D6EBBC2324526C72C657533 ADCFAEC1

A questo punto basterà copiare il file dove BIND legge la nostra zona (che nel nostro caso abbiamo configurato nel file /etc/bind/named.conf.local verso il file /var/lib/bind/lucafrosini.eu) (VEDI articolo precedente). Quindi:
~$ sudo cp /var/lucafrosini.eu.zone/lucafrosini.eu.signed /var/lib/bind/lucafrosini.eu

Non rimane che riavviare BIND per fargli leggere la nuova configurazione della zona:
~$ sudo service bind9 restart

Complimenti la vostra zona adesso ha tutto ciò che serve per supportare DNSSSEC.

Per gestire facilmente i passi che ho elencato, mi sono creato uno script che lancio ogni volta che intevengo sul file di zona lucafrosini.eu (quello dentro la directory /var/lucafrosini.eu.zone/ che non ha i campi di firma e pertanto rimane più pulito).

/var/lucafrosini.eu.zone/$ cat signandpublishzone.sh
!#/bin/bash
cd /var/lucafrosini.eu.zone/
sudo named-checkzone lucafrosini.eu lucafrosini.eu
sudo dnssec-signzone -K ./keys/ lucafrosini.eu
sudo cp lucafrosini.eu.signed /var/lib/bind/lucafrosini.eu
sudo service bind9 restart

Nota: Per evitare la copia del file firmato si potrebbe modificare la configurazione della zona nel file /etc/bind/named.conf.local, facendo puntare la zona direttamente al file /var/lucafrosini.eu.zone/lucafrosini.eu.signed. Io però preferisco tenere le cose separate anche perchè se poi volete configurare il Secondary Master è preferibile usare la directory /var/lib/bind/.

Abbiamo finito? Non ancora, serve comunicare alla zona padre le nostre chiavi pubbliche per far si che vengano inseriti i record DS relativi alla nostra zona.
Questa operazione deve essere fatta tramite il registrar del nostro dominio o da noi stessi nella zona padre se stiamo facendo un terzo livello. Notare che in quest’ultimo caso dovremmo inserire i record DS nella zona padre e poi rifirmarla.

Fate riferimento al vostro registrar per capire la procedura che esso richiede. Normalmente dovete fargli conoscere le vostre due chiavi pubbliche KSK e ZSK.

A questo punto dovremmo anche aver capito come mai molti registrar pur supportando DNSSEC non supportano i suoi campi nel pannello di controllo in modo semplice. Principalmente:

  • Sarebbe noioso per l’utente inserire tutti i campi RRSIG di firma.
  • Per rendere possibile il semplice inserimento di un record e generare automaticamente i campi di firma dovrebbero possidere le chiave private di KSK e ZSK. Io diffiderei di registar che forniscono questo tipo di funzionalità, la chiave privata ha questo nome e DEVE rimanere tale.

Andiamo a vedere come verificare che tutto sia andato a buon fine e la nostra sia compatibile con DNSSEC per il resto del mondo. Per sapere come fare basta leggere il prossimo articolo Testare un dominio con DNSSEC.

Potete trovare maggiori informazioni sui passaggi appena descritti ai seguenti indirizzi:

7 thoughts on “Aggiungere i record DNSSEC in una zona in BIND

  1. Ciao, grazie per i tuoi howto. Sto in parallelo studiando e testando bind. Ora con i tuoi howto sto cercando di implementare dnssec.

    Consiglio l’uso di haveged per ottimizzare i tempi di creazione delle chiavi 🙂

    Ho un problema con il sign:

    cd /var/miodominio.it.zone
    dnssec-signzone miodominio.it

    dnssec-signzone: warning: dns_dnssec_keylistfromrdataset: error reading private key file miodominio.it/RSASHA1/42807: file not found
    dnssec-signzone: warning: dns_dnssec_keylistfromrdataset: error reading private key file miodominio.it/RSASHA1/64636: file not found
    dnssec-signzone: fatal: cannot find DNSKEY RRSIGs

    qualche idea?
    grazie!

    Pol

    1. Vedo che cerca le private keys in miodominio.it/RSASHA1/
      Ricordati di specificare il path corretto nel comando che nel mio caso è:

      sudo dnssec-signzone -K ./keys/ lucafrosini.eu
      Vedi il file che ho chiamato signandpublishzone.sh
      Nel tuo caso dovrebbe essere qualcosa del tipo
      -K ./RSASHA1/
      Vedi di aver dato i permessi di lettura all’utente con il quale firmi la zona.

      Che dovrebbero essere di questo tipo:

      /var/lucafrosini.eu.zone/keys$ ls -la
      total 24
      drwxr-xr-x 2 root root 4096 feb 13 12:14 .
      drwxr-xr-x 3 root root 4096 feb 13 12:15 ..
      -rw-r–r– 1 root root 610 feb 13 12:14 Klucafrosini.eu.+005+06508.key
      -rw——- 1 root root 1774 feb 13 12:14 Klucafrosini.eu.+005+06508.private
      -rw-r–r– 1 root root 437 feb 13 12:14 Klucafrosini.eu.+005+54300.key
      -rw——- 1 root root 1010 feb 13 12:14 Klucafrosini.eu.+005+54300.private

      1. Se hai provato più di una volta a generare le chiavi sei sicuro che quelle che hai messo nella zona da firmare corrispondano a quelle che hai nella directory che passi come argomento al comando che dicevo sopra (sudo dnssec-signzone -K ./keys/ lucafrosini.eu)

        ; This is a key-signing key, keyid 6508, for lucafrosini.eu.
        ; Created: 20131113145004 (Wed Nov 13 15:50:04 2013)
        ; Publish: 20131113145004 (Wed Nov 13 15:50:04 2013)
        ; Activate: 20131113145004 (Wed Nov 13 15:50:04 2013)
        lucafrosini.eu. IN DNSKEY 257 3 5
        AwEAAbbqxrv8HCwcy8wONrRRYsfR+EaRaVhqwkU4Lw0Eh5zu82LoBZms
        5yn7EIe9vWsusLNUPbFUz9CZuee68rMyJy+tdIcFObrmZw46PpVl/QfF
        MFfsMSPCxvwt5L18VBXJ0oGsaE1TljnpXX25lRL2yFqFPZzYxwr7Ugn9
        Kpk8KBrWYJ0Ei1kjDRzyktKTkGWRdQH04K8I9iBjkRi8VpPRuXSyDarZ
        140tPLdlv73C5q8/q/D8TgscoBTtcC5hNuMR7EZ7v9jdG1E2/1d4jUW8
        FJZpjFdB/0s9Cvo26y4briyQt+Hy1xwXoY+4vXuBa2wX5TyyXaCgfmuu 2r+2A/Wqc98=
        ; This is a zone-signing key, keyid 54300, for lucafrosini.eu.
        ; Created: 20131113141755 (Wed Nov 13 15:17:55 2013)
        ; Publish: 20131113141755 (Wed Nov 13 15:17:55 2013)
        ; Activate: 20131113141755 (Wed Nov 13 15:17:55 2013)
        lucafrosini.eu. IN DNSKEY 256 3 5
        AwEAAdftGe9lb1JhW+f6DmJtX4XfXhIMvpgL+18LLsXmldLUBSmr7jpV
        OG0WNUprUd84CAu4g4eWIk8KP0VfWBO9rqQbUwKWSGPqaVMeTFQKcuTP
        Op0s6MygWxYPGWw/ZdZi30HBLoQ7CkL+e8vsWVde53JEC965+OowwV9k gGo473dN – See
        more at:
        http://www.lucafrosini.it/aggiungere-i-record-dnssec-in-una-zona-in-bind/#comment-1896433374

        Fammi sapere

        1. salve, sto configurando il bind9 con un server master e uno slave, ma non mi condivide le zone, ce qualcuno che puo aiutarmi?

Comments are closed.