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 am.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:
Jesin A
DS record 1:
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