Attention
Cette page est une ébauche de documentation, qui pour le moment N'EST PAS UN MODÈLE À SUIVRE à l'AuF.
(avant-tout du fait du non respect des standards Debian) -- JC
Environnement de test utilisé
Pour jouer avec DNSSEC, j'ai créer deux machines virtuelles (virtualbox) et mis en place le réseau suivant:
Internet -------- | | Ma machine / \ 192.168.127.1 / \ 192.168.127.10 / \ 192.168.127.20 ns1.example.com ns1.example.net
ns1.example.com: serveur primaire pour le domaine example.com et cache pour le reste
ns1.example.net: serveur primaire pour le domaine example.net et cache pour le reste
Dans la première partie, on va sécuriser uniquement le domaine example.com. Voici l'histoire:
Mise en place DNSSEC pour ns1.example.com
J'installe bind9 et je crée le dossier /etc/bind/keys pour les clés qu'on va créer plus tard:
nacer@ns1.example.com:~$ sudo aptitude install bind9 nacer@ns1.example.com:~$ cd /etc/bind/ nacer@ns1.example.com:/etc/bind$ sudo mkdir keys nacer@ns1.example.com:/etc/bind$ ls -l total 56 -rw-r--r-- 1 root root 2544 16 nov. 20:43 bind.keys -rw-r--r-- 1 root root 237 16 nov. 20:43 db.0 -rw-r--r-- 1 root root 271 16 nov. 20:43 db.127 -rw-r--r-- 1 root root 237 16 nov. 20:43 db.255 -rw-r--r-- 1 root root 353 16 nov. 20:43 db.empty -rw-r--r-- 1 root root 270 16 nov. 20:43 db.local -rw-r--r-- 1 root root 2994 16 nov. 20:43 db.root drwxr-sr-x 2 root bind 4096 31 janv. 12:53 keys -rw-r--r-- 1 root bind 463 16 nov. 20:43 named.conf -rw-r--r-- 1 root bind 490 16 nov. 20:43 named.conf.default-zones -rw-r--r-- 1 root bind 165 16 nov. 20:43 named.conf.local -rw-r--r-- 1 root bind 572 16 nov. 20:43 named.conf.options -rw-r----- 1 bind bind 77 31 janv. 12:39 rndc.key -rw-r--r-- 1 root root 1317 16 nov. 20:43 zones.rfc1918
Je change le dossier de configuration et j'active dnssec dans les options et après édition, j'obtiens ceci sans les commentaires:
nacer@ns1.example.com:/etc/bind$ sudo cat named.conf.options options { directory "/etc/bind"; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; dnssec-enable yes; };
Je mets en place le fichier de zone de example.com:
nacer@ns1.example.com:/etc/bind$ sudo cat master.example.com $TTL 86400 $ORIGIN example.com. @ IN SOA example.com. hostmaster.example.com. ( 2012013100 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 86400 ) ; Negative Cache TTL ; @ IN NS ns1.example.com. IN NS ns1.example.net. ; glue record ns1 IN A 192.168.127.10 ; autre nacer IN A 192.168.127.1
Un truc qui m'aide toujours:
nacer@ns1.example.com:/etc/bind$ sudo named-checkzone example.com master.example.com zone example.com/IN: loaded serial 2012013100 OK
Bien sûr, named-checkzone a d'autres paramètres qui permettrai de checker de façon un peu plus pointue. La zone reverse, vu que j'utilise des IP privées et qu'une telle zone n'apporte rien de plus à l'objectif de ce document, je laisse le fichier zone.rfc1918 s'en occuper.
Je rajoute donc notre nouvelle zone à la configuration bind et je fais vérifier de nouveau:
nacer@ns1.example.com:/etc/bind$ sudo cat named.conf.local zone "example.com" { type master; file "master.example.com"; allow-update { none; }; }; include "/etc/bind/zones.rfc1918"; nacer@ns1.example.com:/etc/bind$ sudo named-checkconf named.conf
La commande named-checkconf ne doit rien retourner, preuve qu'il y a des chances que tout aille bien.
Maintenant, on va générer une paire de clés (privée/public) pour signer l'ensemble des enregistrements (Resources Records) de la zone. Cette clé s'appelle "Zone Signing Key" (ZSK).
nacer@ns1.example.com:/etc/bind/keys$ sudo dnssec-keygen -a rsasha1 -b 512 -n zone example.com Generating key pair......++++++++++++ .++++++++++++ Kexample.com.+005+12822
L'option -a introduit l'algorithme utilisé pour le chiffrement. Il y a plusieurs choix. Le mien signifie que la génération des clés se fait suivant l'algorithme RSA et SHA-1 est utilisé pour créer les empreintes (digest) associées. La taille (option -b) de la clé peut aller de 512 à 4096 pour rsasha1. La clé va servir à signer une zone (d'où l'option -n avec la valeur zone) qui est la zone example.com. Pour plus de détails, voir les commandes man dnssec-keygen ou sudo dnssec-keygen -h.
Comme résultat de la commande dnssec-keygen, on obtient deux fichiers:
nacer@ns1.example.com:/etc/bind$ ls -l keys/ -rw-r--r-- 1 root bind 294 2012-01-31 15:05 Kexample.com.+005+12822.key -rw------- 1 root bind 622 2012-01-31 15:05 Kexample.com.+005+12822.private
c'est à dire:
- la partie à publier: Kexample.com.+005+12822.key
- la partie privée: Kexample.com.+005+12822.private
Le nom Kexample.com.+005+12822 permet d'identifier de façon unique la paire de clés générée. Il (le nom) se présente toujours sous la forme: K + <nom du domaine> + (+alg) + (+tag) où alg=identifiant de l'algorithme (RSASHA1 = 005) et tag=identifiant unique de la clé. Voici à quoi ressemble la partie publique de la ZSK:
; This is a zone-signing key, keyid 12822, for example.com. ; Created: Tue Jan 31 15:02:41 2012 ; Publish: Tue Jan 31 15:02:41 2012 ; Activate: Tue Jan 31 15:02:41 2012 example.com. IN DNSKEY 256 3 5 AwEAAcBTpz1wbz2jTIBbRO7J+6xJsFLf646oSAX+tfFoSg+Onk+zbz35 DFlARIv4Gojd5LBORZX2SRkclX4imFqGpl0=
Ce fichier sera intégré tel quel dans le fichier de zone de example.com. Il est bon de retenir que le chiffre 256 qui suit DNSKEY ci-dessus identifie le type de la clé (ici ZSK).
Ensuite, c'est au tour de la Key Signing Keys (KSK) d'être créer:
nacer@ns1.example.com:/etc/bind/keys$ sudo dnssec-keygen -a rsasha1 -b 512 -f KSK -n zone example.com Generating key pair.......................++++++++++++ ....++++++++++++ Kexample.com.+005+20677
Là encore, on obtient deux clés, une publique et une privée. Alors que la ZSK est utilisée pour signer tous les enregistrements du fichier de zone, la KSK sera utilisée pour signer uniquement les enregistrements de type DNSKEY (que la ZSK signe aussi).
nacer@ns1.example.com:/etc/bind$ cat keys/Kexample.com.+005+20677.key ; This is a key-signing key, keyid 20677, for example.com. ; Created: Tue Jan 31 15:17:50 2012 ; Publish: Tue Jan 31 15:17:50 2012 ; Activate: Tue Jan 31 15:17:50 2012 example.com. IN DNSKEY 257 3 5 AwEAAbeXOpYF9Wtf+5zmuWogLk7XaFL9ItpJlH/2SP1r4/nlI5pyxkGj HrdcX74a7aRE6LgXJJhh/5i6diprj7YH8vU=
La KSK est reconnu par le nombre 257 suivant DNSKEY. La seule différence avec la génération de la ZSK est l'utilisation de l'option -f à laquelle on précise le type (KSK) de la clé à créer. Le manpage associé donne plus de détails.
Maintenant que les deux clés KSK et ZSK sont créées, nous allons les associer au fichier de zone et puis signer celui-ci:
nacer@ns1.example.com:/etc/bind$ sudo cat master.example.com $TTL 86400 $ORIGIN example.com. @ IN SOA example.com. hostmaster.example.com. ( 2012013100 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 86400 ) ; Negative Cache TTL ; @ IN NS ns1.example.com. IN NS ns1.example.net. ; glue record ns1 IN A 192.168.127.10 ; autre nacer IN A 192.168.127.1 ; KSK $include "keys/Kexample.com.+005+20677.key"; ; ZSK $include "keys/Kexample.com.+005+12822.key"; ; il ne nous reste plus qu'à signer ces deux fichiers et le tour est joué: nacer@ns1.example.com:/etc/bind$ sudo dnssec-signzone -o example.com -t -k keys/Kexample.com.+005+20677 master.example.com keys/Kexample.com.+005+12822 Verifying the zone using the following algorithms: RSASHA1. Zone signing complete: Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked ZSKs: 1 active, 0 stand-by, 0 revoked master.example.com.signed Signatures generated: 9 Signatures retained: 0 Signatures dropped: 0 Signatures successfully verified: 0 Signatures unsuccessfully verified: 0 Runtime in seconds: 0.185 Signatures per second: 48.613
On obtient le fichier de zone signé nommé master.example.com.signed dont voici le contenu:
nacer@ns1.example.com:/etc/bind$ cat master.example.com.signed ; File written on Tue Jan 31 15:30:48 2012 ; dnssec_signzone version 9.7.0-P1 example.com. 86400 IN SOA example.com. hostmaster.example.com. ( 2012013100 ; serial 604800 ; refresh (1 week) 86400 ; retry (1 day) 2419200 ; expire (4 weeks) 86400 ; minimum (1 day) ) 86400 RRSIG SOA 5 2 86400 20120301133048 ( 20120131133048 12822 example.com. VCP726L8/XF8j27MY6QMN0XtIUoFPmDoSb4W ctotLii8+nXXV5C6fv82zfWVFchHx+woj6FS tL7DIUZAisppOQ== ) 86400 NS ns1.example.com. 86400 NS ns1.example.net. 86400 RRSIG NS 5 2 86400 20120301133048 ( 20120131133048 12822 example.com. TLUmtrSo0NSDcYKdGqhkyrtp9F2NdE/gsMyV 0PKYFG1xeLox6XyuVJAe4T8T0CX8rQkz9ss/ t7GaD8HlUKiYfg== ) 86400 NSEC nacer.example.com. NS SOA RRSIG NSEC DNSKEY 86400 RRSIG NSEC 5 2 86400 20120301133048 ( 20120131133048 12822 example.com. IpgE4S3zWfqov0yNY6vVrMRijoKlzZvXgpm/ 0y9q3AYdQbYUEyDH+Gr5Xe+qAdZRD5zAwR2l IVpLA0H7UEWstw== ) 86400 DNSKEY 256 3 5 ( AwEAAcBTpz1wbz2jTIBbRO7J+6xJsFLf646o SAX+tfFoSg+Onk+zbz35DFlARIv4Gojd5LBO RZX2SRkclX4imFqGpl0= ) ; key id = 12822 86400 DNSKEY 257 3 5 ( AwEAAbeXOpYF9Wtf+5zmuWogLk7XaFL9ItpJ lH/2SP1r4/nlI5pyxkGjHrdcX74a7aRE6LgX JJhh/5i6diprj7YH8vU= ) ; key id = 20677 86400 RRSIG DNSKEY 5 2 86400 20120301133048 ( 20120131133048 12822 example.com. Jq2hs8NKC+lzIx9kvBs8xJfRJhkVPaiICPNl DihhHALhXI3CTuXq8A1pC510NfdN02jvKZka 4mR9jy8S+WEMvg== ) 86400 RRSIG DNSKEY 5 2 86400 20120301133048 ( 20120131133048 20677 example.com. kMWLry2bDJgKqOGXVq/YlxJiwEJaZL52aeSt HVUJTSBo9BZJIBj7Rtg1HXMtqv6+tnOFBhQr pDODjVx+iHYXMw== ) nacer.example.com. 86400 IN A 192.168.127.1 86400 RRSIG A 5 3 86400 20120301133048 ( 20120131133048 12822 example.com. N40aFNKektUO7v8GXdpNS1nAu57nMHmwTsTw I+1zse1e1BgwTtLO8V33HTGnXmZvABuPpZlM N7i1Zs9QZJB8RQ== ) 86400 NSEC ns1.example.com. A RRSIG NSEC 86400 RRSIG NSEC 5 3 86400 20120301133048 ( 20120131133048 12822 example.com. Iif5sXpJ3dDUlRRY1HUxVq2Lxv1PI90cvcql VMs83/YVnAFnBLOqvtHlXwJNoMS/YjJ45Wd9 GhhkcppsYcqgDQ== ) ns1.example.com. 86400 IN A 192.168.127.10 86400 RRSIG A 5 3 86400 20120301133048 ( 20120131133048 12822 example.com. WcTOWZ+G0GQNB51o+iigMje0/f6yQxgp1fhd P18qtly9CacYdGuyZBiXN8qWJTvZIOTln6RD ZByLLTx6dS/tBg== ) 86400 NSEC example.com. A RRSIG NSEC 86400 RRSIG NSEC 5 3 86400 20120301133048 ( 20120131133048 12822 example.com. lWobxSzCH/mDMVyRZMumrmC06YDUhXkUGEoj gEwl9XdFGlCWO/qHTGInTPEKCFHM/Q5a5d4x Un3bjXJyOL6UeQ== )
Lors de la signature du fichier de zone master.example.com, j'ai activé l'affichage des statistiques associées avec l'option -t, d'où la sortie de cette commande. L'option -o précise le nom de la zone dont on veut signer le fichier, -k permet de préciser la KSK (on peut en préciser plusieurs, notamment lors d'un renouvellement de KSK), ensuite le nom du fichier de zone et enfin la clé de zone (ZSK). Voir la manpage associée pour plus de détails.
La dernière étape consiste maintenant à corriger le fichier de configuration de bind et de relancer le serveur:
nacer@ns1.example.com:/etc/bind$ cat named.conf.local zone "example.com" { type master; file "master.example.com.signed"; allow-update { none; }; }; include "/etc/bind/zones.rfc1918";
Un petit test rapide à partir de ma machine:
nacer@nacerix-lab:~$ dig +dnssec @192.168.127.10 example.com soa ; <<>> DiG 9.7.0-P1 <<>> +dnssec @192.168.127.10 example.com soa ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15487 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 3 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;example.com. IN SOA ;; ANSWER SECTION: example.com. 86400 IN SOA example.com. hostmaster.example.com. 2012013100 604800 86400 2419200 86400 example.com. 86400 IN RRSIG SOA 5 2 86400 20120301133048 20120131133048 12822 example.com. VCP726L8/XF8j27MY6QMN0XtIUoFPmDoSb4WctotLii8+nXXV5C6fv82 zfWVFchHx+woj6FStL7DIUZAisppOQ== ;; AUTHORITY SECTION: example.com. 86400 IN NS ns1.example.com. example.com. 86400 IN NS ns1.example.net. example.com. 86400 IN RRSIG NS 5 2 86400 20120301133048 20120131133048 12822 example.com. TLUmtrSo0NSDcYKdGqhkyrtp9F2NdE/gsMyV0PKYFG1xeLox6XyuVJAe 4T8T0CX8rQkz9ss/t7GaD8HlUKiYfg== ;; ADDITIONAL SECTION: ns1.example.com. 86400 IN A 192.168.127.10 ns1.example.com. 86400 IN RRSIG A 5 3 86400 20120301133048 20120131133048 12822 example.com. WcTOWZ+G0GQNB51o+iigMje0/f6yQxgp1fhdP18qtly9CacYdGuyZBiX N8qWJTvZIOTln6RDZByLLTx6dS/tBg== ;; Query time: 1 msec ;; SERVER: 192.168.127.10#53(192.168.127.10) ;; WHEN: Tue Jan 31 15:47:01 2012 ;; MSG SIZE rcvd: 471
et voilà!
Semaine tech 2012
Voici les slides servant de base à la discussion: dnssec