IPv6 Certification Badge for kiokoman

DNSSEC

Il DNS è il protocollo che risolve i nomi di dominio in indirizzi IP tuttavia e' possibile che un malintenzionato fornisca false informazioni mettendosi in mezzo e potrebbe essere in grado di dirottare le nostre ricerche verso siti malevoli, quindi per essere sicuri che l'indirizzo ip restituito sia autentico è stato introdotta questa nuova specifica: DNS Security Extensions (DNSSEC)

Il principio e' sempre lo stesso, firmare con una chiave i record DNS

DNSSEC Resource Records

I (RR) contengono specifiche informazioni riguardante il dominio. I più comuni sono i record A che contengono gli indirizzi IP del dominio, i record AAAA record contengono gli indirizzi IPv6, i record MX che riguardano il server di posta etc etc.

Una lista completa e presente qui.

Allo stesso modo dnssec richiede diversi RR:

  • DNSKEY contiene la chiave pubblica
  • RRSIG esiste per ogni singolo RR e contiene la firma digitale del record.
  • DS - Delegation Signer – E' il record che dovrà essere comunicato al gestore del TLD's del nostro dominio. Per intenderci se example.com è il vostro nome di dominio, il TLD è "com" e il suo nameservers è a.gtld-servers.net., b.gtld-servers.net. fino a  m.gtld-servers.net..  lo scopo di questo record e' quello di creare appunto una catena di fiducia ( chain of trust ) in parole povere noi abbiamo la chiave e il gestore del .com ha lo strumento per verificare che la chiave sia quella giusta
 

Setup Environment

Per procedere prendiamo come esempio un ambiente in cui sono previsti un server DNS Master e un server DNS slave per il dominio example.com su server Ubuntu 16.02 LTS e Bind

Domain Name: example.com

Master Nameserver:
IP Address: 1.1.1.1
Hostname: master.example.com

Slave Nameserver:
IP Address: 2.2.2.2
Hostname: slave.example.com

Posizionamento dei file nel mio caso di default sono quanto segue

Service name:
bind9
Main configuration file:
/etc/bind/named.conf.options
Zone names file:
/etc/bind/named.conf.local
Default zone file location:
/etc/bind/

DNSSEC Master Configuration

Abilitiamo DNSSEC aggiungendo la seguente direttiva nel file di configurazione all'interno di options{ }

nano /etc/bind/named.conf.options

dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;

spostiamoci all'interno della directory di bind

cd /etc/bind

Creiamo la  Zone Signing Key(ZSK) con il seguente comando:

dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com

Se avete installato haveged, l'operazione richiederà solo alcuni secondi.

root@master:/etc/bind# dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com
Generating key pair..................+++ .............+++
Kexample.com.+007+40400

Creiamo la Key Signing Key(KSK) con il seguente comando.

dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com

Esempio:

root@master:/etc/bind# dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com
Generating key pair......................++ ..............................................................................................................................................++
Kexample.com.+007+62910

La directory conterra ora 4 chiavi - una coppia di  chiavi private/publicche di ZSK e KSK.  Dobbiamo aggiungere il record DNSKEY al file della nostra zona. il seguente comando fa al caso nostro:

root@master:/etc/bind# for key in `ls Kexample.com*.key`
> do
> echo "\$INCLUDE $key">> example.com.zone
> done

Firmiamo la zona con dnssec-signzone : dnssec-signzone -3 <salt> -A -N INCREMENT -o <zonename> -t <zonefilename>

esempio:

dnssec-signzone -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N INCREMENT -o example.com -t /etc/bind/pri.example.com

Verifying the zone using the following algorithms: NSEC3RSASHA1.
Zone signing complete:
Algorithm: NSEC3RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
                        ZSKs: 1 active, 0 stand-by, 0 revoked
example.com.zone.signed
Signatures generated:                       14
Signatures retained:                         0
Signatures dropped:                          0
Signatures successfully verified:            0
Signatures unsuccessfully verified:          0
Signing time in seconds:                 0.046
Signatures per second:                 298.310
Runtime in seconds:                      0.056

 

Questo creerà un nuovo file con estensione .signed ( pri.example.com.signed ) che contiene i record  RRSIG per ogni singola voce come menzionato precedentemente. Dobbiamo ora avvisare bind di utilizzare il nuovo file firmato

nano /etc/bind/named.conf.local

Cambiamo il nome del file dentro alla sezione zone { } .

zone "example.com" IN {
    type master;
    file "pri.example.com.signed";
    allow-transfer { 2.2.2.2; };
    allow-update { none; };
};

Salviamo il file e riavviamo bind

service bind9 restart

Verifichiamo che il record sia stato recepito correttamente usando dig per interrogare il nostro DNS.

dig DNSKEY example.com. @localhost +multiline

Esempio:

root@master:/var/cache/bind# dig DNSKEY example.com. @localhost +multiline
; <<>> DiG 9.10.3-P4-Ubuntu <<>> DNSKEY example.com. @localhost +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46413
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.com.           IN DNSKEY

;; ANSWER SECTION:
example.com.            3600 IN DNSKEY 257 3 8 (
                                AwEAAbOFAxl+Lkt0UMglZizKEC1AxUu8zlj65KYatR5w
                                BWMrh18TYzK/ig6Y1t5YTWCO68bynorpNu9fqNFALX7b
                                Vl9/gybA0v0EhF+dgXmoUfRX7ksMGgBvtfa2/Y9a3klX
                                NLqkTszIQ4PEMVCjtryl19Be9/PkFeC9ITjgMRQsQhmB
                                39eyMYnal+f3bUxKk4fq7cuEU0dbRpue4H/N6jPucXWO
                                wiMAkTJhghqgy+o9FfIp+tR/emKao94/wpVXDcPf5B18
                                j7xz2SvTTxiuqCzCMtsxnikZHcoh1j4g+Y1B8zIMIvrE
                                M+pZGhh/Yuf4RwCBgaYCi9hpiMWVvS4WBzx0/lU=
                                ) ; KSK; alg = RSASHA256; key id = 31406
example.com.            3600 IN DNSKEY 256 3 8 (
                                AwEAAZY7qVdlW3YdrIauvu6bxPOIp6a7v8quvBAwg6rz
                                RauFhQMbXyoyyFUSZ7lafUWXUcZoPZcpefZ6cY1/ocdv
                                vzScrkPSZclVjdV5LDwPvSE69Lmft/rOhJHi6A8GKzdF
                                BqukBPsr5cAdKlUYsQphX3NLNjsxKCY9AZGeIPz9yc9/
                                G63X
                                ) ; ZSK; alg = RSASHA256; key id = 64680

;; Query time: 1934 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Apr 25 22:44:47 CEST 2016
;; MSG SIZE  rcvd: 467

Verifichiamo la  presenza del record RRSIG.

dig A example.com. @localhost +noadditional +dnssec +multiline

; <<>> DiG 9.10.3-P4-Ubuntu <<>> A example.com. @localhost +noadditional +dnssec +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15999
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 14, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;example.com.           IN A

;; ANSWER SECTION:
example.com.            2446 IN A 93.184.216.34
example.com.            2446 IN RRSIG A 8 2 86400 (
                                20160512143857 20160421102909 64680 example.com.
                                LcI4nVP1/6zCM0ae16IEwLtVnAvL/B/C7vlRZtm1HSge
                                8rhpW4QatmAE41QiFwOl9MzgpvODIlkHAhv7pQ/XGALl
                                7LK/kz8v8GmV6OcFw/PL8YOPelKpFlY/Xxg1IjhG3Poy
                                R3N8UZrsz0K79vT5ji+6Wn3v6a7zKWN78kudRMUvHZQ= )

;; AUTHORITY SECTION:
.                       1351 IN NS m.root-servers.net.
.                       1351 IN NS a.root-servers.net.
.                       1351 IN NS i.root-servers.net.
.                       1351 IN NS d.root-servers.net.
.                       1351 IN NS h.root-servers.net.
.                       1351 IN NS f.root-servers.net.
.                       1351 IN NS l.root-servers.net.
.                       1351 IN NS g.root-servers.net.
.                       1351 IN NS k.root-servers.net.
.                       1351 IN NS c.root-servers.net.
.                       1351 IN NS e.root-servers.net.
.                       1351 IN NS b.root-servers.net.
.                       1351 IN NS j.root-servers.net.
.                       1352 IN RRSIG NS 8 0 518400 (
                                20160505050000 20160425040000 60615 .
                                Zxmcx7216Plz3YkC0FANtUdF+WAPdJfY0ywC5WVxkB1i
                                hsa0hNAqUkxc5fYB9y2JgQUgu0CR1ikbfFIXZ4x5A1eL
                                euwM57ce0HRTP9i3zRISeWdcgJllWuqVQd70VoSdio5j
                                wsgUHDU08AUR1gBNPbS/BYTAXy166nnP961qBKc= )

;; Query time: 173 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Apr 25 22:46:26 CEST 2016
;; MSG SIZE  rcvd: 599

La configurazione del server lato Master è completata

 

DNSSEC Slave Configuration

La configurazione del server lato slave è molto semplice, basta abilitare il DNSSEC e cambiare il nome dei file di zona.

nano /etc/bind/named.conf.options

Aggiungiamo all'interno del campo options { } quanto segue:

dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;

Ed editiamo il file con le nostre zone.

nano /etc/bind/named.conf.local
zone "example.com" {
    type slave;
    file "sec.example.com.signed";
    masters { 1.1.1.1; };
    allow-notify { 1.1.1.1; };
};

Riavviamo il servizio Bind.

service bind9 restart

Controllando dovreste ritrovarvi con un nuovo file con estensione .signed

Mettiamo in sicurezza DNSSEC dallo Zone Walking

Zone Walking è una tecnica usata per trovare tutti i Resource Records di una zona interrogando NSEC (Next-Secure) record. NSEC3 cripta queste informazioni tuttavia con tempo e pazienza gli hacker sarebbero in grado ri ricavare queste informazioni, è necessario fare in modo che la chiave usata per criptare queste informazioni venga cambiata a intervalli regolari in modo da rendere vano qualsiasi tentativo di decriptarla e cioè nel tempo che impiegherebbero a trovare la chiave per decriptare i dati noi abbiamo già protetto i nostri dati con un'altra. per fare questo possiamo senza sbatterci tanto delegare il compito a bind che si occuperà del caso

modifichiamo ancora una volta il nostro file di zone

nano /etc/bind/named.conf.local

e aggiungiamo all'interno della nostra zona quanto segue:

auto-dnssec maintain;
update-policy local;

esempio:

zone "example.com" {
        type master;
        allow-transfer {1.1.1.1;};
        also-notify {1.1.1.1;};
        file "/etc/bind/pri.example.com.signed";
        auto-dnssec maintain;
        update-policy local;
};

riavviamo bind

service bind9 restart

controllando in /var/log/syslog dovremmo trovare questo:

Apr 25 23:31:55 server named[26176]: zone example.com/IN: loaded serial 2016042502 (DNSSEC signed)
Apr 25 23:31:55 server named[26176]: all zones loaded
Apr 25 23:31:55 server named[26176]: running
Apr 25 23:31:55 server named[26176]: zone example.com/IN: sending notifies (serial 2016042502)
Apr 25 23:31:55 server named[26176]: zone example.com/IN: reconfiguring zone keys

Modificare i record di Zona

Se abbiamo necessità di modificare i record della nostra zona non dobbiamo mettere mano al file .signed ma bensi a quello originale non firmato ( pri.example.com ), una volta modificato e incrementato il seriale va firmato nuovamente con il comando

dnssec-signzone -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N INCREMENT -o example.com -t /etc/bind/pri.example.com

che genererà un nuovo file .signed

riavviamo bind e le modifiche verranno replicate anche al server slave

service bind9 restart

 

Configurare i DS records

Questa operazione è necessaria in particolar modo perche' dobbiamo creare una catena di fiducia senza il quale tutto il nostro lavoro risulterà vano

I record DS sono contenuti in uno dei file che abbiamo precedentemente creato con il comando dnssec-signzone, il file avra nome che inizia con dsset- ( esempio dsset-example.com )

esaminandolo

cat dsset-example.com.

avremo:

example.com.        IN DS 62910 7 1 1D6AC75083F3CEC31861993E325E0EEC7E97D1DD
example.com.        IN DS 62910 7 2 198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859F FFC3F59D

Questi vanno comunicati in qualche modo al nostro registrar nel suo pannello di controllo. per comodità ho spudoratamente copiato e incollato alcuni esempi presi in rete .

tnx to:

https://www.digitalocean.com/community/tutorials/how-to-set-up-dnssec-on-an-nsd-nameserver-on-ubuntu-14-04

Jesin A

 

GoDaddy's Domain control panel

DS record 1:

DS record 1

DS record 2:

 

DS record 2

Dopo aver atteso qualche minuto affinche le modifiche vengano salvate possiamo verificare la creazione dei record DS interrogando i nameserver del nostro TLD che se non sappiamo qual'e' lo scoviamo con dig + trace

per esempio 

dig +trace +noadditional DS example.com. @8.8.8.8 | grep DS

; <<>> DiG 9.10.3-P4-Ubuntu <<>> +trace +noadditional DS example.com. @8.8.8.8
com.                    86400   IN      DS      30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.                    86400   IN      RRSIG   DS 8 1 86400 20160505170000 20160425160000 60615 . ZGFmiWOOFQeI0nhN6otmA5DM3jq5R3hXaciQCANvDVFDozqIeWlV0iLK m3D8Yu9vjp+tbug0+06ionIg4dCzX3zNsH3JqjumVIdziGyR9nwU54XP g3B2ygltuFr3APr4P8Y5B87JGlXQDE6dEDyXyoad94pmJTnmS/J6FhXF sjg=
example.com.            86400   IN      DS      31589 8 1 3490A6806D47F17A34C29E2CE80E8A999FFBE4BE
example.com.            86400   IN      DS      31589 8 2 CDE0D742D6998AA554A92D890F8184C698CFAC8A26FA59875A990C03 E576343C
example.com.            86400   IN      DS      43547 8 1 B6225AB2CC613E0DCA7962BDC2342EA4F1B56083
example.com.            86400   IN      DS      43547 8 2 615A64233543F66F44D68933625B17497C89A70E858ED76A2145997E DF96A918
example.com.            86400   IN      DS      31406 8 1 189968811E6EBA862DD6C209F75623D8D9ED9142
example.com.            86400   IN      DS      31406 8 2 F78CF3344F72137235098ECBBD08947C2C9001C7F6A085A17F518B5D 8F6B916D
example.com.            86400   IN      RRSIG   DS 8 2 86400 20160501043713 20160424032713 34745 com. czAh4px3Es3j/zznLXDFVFwRN4eIqgcRTWZhoIHpDf1ow/4uvKwwnmCE LvS+t3I+lAX5+D71CcuxnA7JjGYBGGf7aRtNbJoTUtaVcrMuemtceBRO B/dowYmQkchriZg//Fi2qJKLAM4RSmDfTKyOq0lmTN8m47MGUCg2vJj+ pG4=

Una volta che abbiamo confermato la presenza dei record DS possiamo procedere a testarne il funzionamento appoggiandoci ai numerevoli siti online che offrono questo servizio come ad esempio:

http://dnssec-debugger.verisignlabs.com

http://dnsviz.net/

http://dnscheck.pingdom.com