{{{#!wiki warning
'''Attention'''

Cette page est une ébauche de documentation, qui pour le moment '''N'EST PAS UN MODÈLE À SUIVRE à l'AuF'''.<<BR>>
(avant-tout du fait du non respect des standards Debian) -- [[JeanChristopheAndré|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:  [[attachment:dnssec || ici]]