Modifications entre les versions 2 et 3
Version 2 à la date du 2012-01-31 04:41:03
Taille: 10221
Commentaire: avertissement de rigueur…
Version 3 à la date du 2012-01-31 15:12:56
Taille: 13833
Commentaire:
Texte supprimé. Texte ajouté.
Ligne 8: Ligne 8:
= Introduction =
Les informations présentées dans ce document ne sont pas encore retenues comme recommendations à l'AUF. D'ailleurs, toutes les manipulations servant d'illustration ici s'applique au domaine '''localhost.''' pour bien faire ressortir ce caractère ''' non officiel '''.

= Mise en oeuvre =
== Préparation du serveur ==
La plupart des manipulations présentées dans cette section sont des choix personnels, discutables et non standards à l'AUF.

Le fichier de définition de la zone ''localhost'' est renommée de ''db.local'' en ''master.localhost''.

De même, le fichier ''db.127'' représentant la zone inverse pour ''localhost'', est renommée en ''localhost.rev''.

Le fichier ''db.root'' contenant la liste des serveurs racines devient ''root-servers.net''.

Le fichier ''bind.keys'' qui fait reférence à la clé DLV associé au domaine dlv.isc.org deviendra ''dlv.isc.org.key''. L'enregistrement de type DLV est une alternative à la mise en place d'une chaîne de sécurité pour un domaine donnée. On parle de chaîne de sécurité lorsqu'une hiérarchie entière du système DNS est signée (par exemple, td.auf.org signé et reférencé dans la configuration de auf.org qui lui même signé et reférencée (éventuellement) dans la config de .org etc).

Je n'utilise pas rndc pour la gestion du serveur bind. Pour ca, j'ajoute
{{{
controls {};
}}}
dans les options et j'efface tous les autres fichiers contenues dans /etc/bind: ''db.0'', ''db.255'', ''db.empty'', ''zones.rfc1918'' et ''rndc.key''.

Mes configs dns n'impliquant pas de nombreux domaines, je préfère tout mettre dans un seul fichier ''named.conf'':
{{{
nacer@nacerix-lab:/etc/bind$ sudo cat named.conf.options >> named.conf.final
nacer@nacerix-lab:/etc/bind$ sudo cat named.conf.local >> named.conf.final
nacer@nacerix-lab:/etc/bind$ sudo cat named.conf.default-zones >> named.conf.final
nacer@nacerix-lab:/etc/bind$ sudo mv named.conf.final named.conf
nacer@nacerix-lab:/etc/bind$ sudo rm named.conf.options named.conf.default-zones
}}}
Ensuite, je crée un dossier keys qui contiendra les clés qui seront générés tout à l'heure:
{{{
nacer@nacerix-lab:/etc/bind$ mkdir keys
}}}
Le dossier /etc/bind ressemble à ceci:
{{{
nacer@nacerix-lab:/etc/bind$ ls -l
-rw-r--r-- 1 root root 601 2011-11-16 21:30 dlv.isc.org.key
drwxr-sr-x 2 root bind 4096 2012-01-30 17:30 keys
-rw-r--r-- 1 root root 271 2011-11-16 21:30 localhost.rev
-rw-r--r-- 1 root root 270 2011-11-16 21:30 master.localhost
-rw-r--r-- 1 root bind 1591 2012-01-30 18:15 named.conf
-rw-r--r-- 1 root bind 165 2011-11-16 21:30 named.conf.local
-rw-r--r-- 1 root root 2940 2011-11-16 21:30 root-servers.net
}}}

Dans les options, j'active dnssec et, après édition, j'obtiens à peu près ceci sans les commentaires:
{{{
nacer@nacerix-lab:/etc/bind$ cat named.conf
nacer@nacerix-lab:/etc/bind$ cat named.conf
= 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
Ligne 63: Ligne 61:

    dnssec-enable yes;
    controls {};
 
 dnssec-enable yes;
Ligne 67: Ligne 64:

// les serveurs root - utiles pour la récursion
zone "." {
 type hint;
 file "root-servers.net"
}}}

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; };
Ligne 74: Ligne 106:
zone "localhost" {
 type master;
 file "master.localhost";
};

zone "127.in-addr.arpa" {
 type master;
 file "localhost.rev";
};
}}}

Maintenant, on va générer une paire de clés (privée/publique) pour signer l'ensemble des enregistrements DNS (Resources Records ou RR) de la zone, cette clé s'appelle (Zone Signing Keys ou ZSK):
{{{
nacer@nacerix-lab:/etc/bind$ sudo dnssec-keygen -a rsasha1 -b 512 -n zone localhost
; aller, j'utilise 512 octets à cause de ma vieille machine.
; on obtient deux fichiers:
; l'enregistrement DNSKEY correspondant à la partie publique de la ZSK:
Klocalhost.+005+14058.key
}}}

Et dont le contenu ressemble à:
{{{
nacer@nacerix-lab:/etc/bind$ cat Klocalhost.+005+14058.key
; This is a zone-signing key, keyid 14058, for localhost.
; Created: Mon Jan 30 17:26:32 2012
; Publish: Mon Jan 30 17:26:32 2012
; Activate: Mon Jan 30 17:26:32 2012
localhost. IN DNSKEY 256 3 5 AwEAAcFICEMvLIItggaAqR1TyDEsQzH4QlC6X/7MQ6PBcR0M/SEpN2uD D24Ui9NIPsKLBBpzZ3DJ1EgRa4SKNnA4BE0=
}}}
Puis, on a la partie privée dont le contenu n'est pas franchement intéressant ;-)(sauf si vous aimer jouer avec la théorie des codes hein), mais qu'il est important de bien sécuriser:
{{{
nacer@nacerix-lab:/etc/bind$ ls -l keys/
total 8
-rw-r--r-- 1 root bind 290 2012-01-30 17:30 Klocalhost.+005+14058.key
-rw------- 1 root bind 622 2012-01-30 17:30 Klocalhost.+005+14058.private
}}}
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).
Ligne 113: Ligne 145:
nacer@nacerix-lab:/etc/bind$ sudo dnssec-keygen -a rsasha1 -b 512 -f KSK -n zone localhost
}}}

Là encore, on obtient deux clés, une publique et une privée. La clé privée est utilisée pour signer tous les enregistrements de type DNSKEY (d'où son nom de clé signant les clés). Bien sûr, les enregistrements de type DNSKEY sont à la fois signée par le ZSK et le KSK.
Voici, à titre d'illustration, le contenu de Klocalhost.+005+19396.key:
{{{
nacer@nacerix-lab:/etc/bind/keys$ cat Klocalhost.+005+19396.key
; This is a key-signing key, keyid 19396, for localhost.
; Created: Mon Jan 30 19:35:11 2012
; Publish: Mon Jan 30 19:35:11 2012
; Activate: Mon Jan 30 19:35:11 2012
localhost. IN DNSKEY 257 3 5 AwEAAcDW/bYLI36kvviwi4afvAzNwieUxMcYqoc1hEsRCXHC2RLy4uZX wMQEbLwx6GFEO/2sTnppfAhbRKD4IL0d0PU=
}}}

La KSK est reconnaissable au nombre 257 suivant DNSKEY, et le ZSK par le 256 à la même position.

L'étape suivante consiste à associer ZSK et KSK au fichier de zone:
{{{
nacer@nacerix-lab:/etc/bind$ sudo cat master.localhost
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
Ligne 133: Ligne 174:
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
                  2 ; Serial
             604800 ; Refresh
              86400 ; Retry
            2419200 ; Expire
             604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1
@ IN AAAA ::1
@ 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";
Ligne 148: Ligne 186:
$include "keys/Klocalhost.+005+14058.key";
; KSK
$include "keys/Klocalhost.+005+19396.key";
}}}
Et
{{{
nacer@nacerix-lab:/etc/bind$ sudo cat localhost.rev
;
; BIND reverse data file for local loopback interface
;
$TTL 604800
@ IN SOA localhost. root.localhost. (
                  1 ; Serial
             604800 ; Refresh
              86400 ; Retry
            2419200 ; Expire
             604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
1.0.0 IN PTR localhost.

; ZSK
$include "keys/Klocalhost.+005+14058.key";
; KSK
$include "keys/Klocalhost.+005+19396.key";
}}}
Il ne nous reste plus qu'à signer ces deux fichiers et le tour est joué:
{{{
nacer@nacerix-lab:/etc/bind$ sudo dnssec-signzone -o localhost -t -k keys/Klocalhost.+005+19396 master.localhost keys/Klocalhost.+005+14058
$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
Ligne 181: Ligne 194:
master.localhost.signed
Signatures generated: 7
master.example.com.signed
Signatures generated: 9
Ligne 187: Ligne 200:
Runtime in seconds: 0.164
Signatures per second: 42.497
}}}
Et le fichier résultant, master.localhost.signed:
{{{
nacer@nacerix-lab:/etc/bind$ cat master.localhost.signed
; File written on Mon Jan 30 20:04:39 2012
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
Ligne 195: Ligne 209:
localhost. 604800 IN SOA localhost. root.localhost. (
     2          ; serial
example.com. 86400 IN SOA example.com. hostmaster.example.com. (
     2012013100 ; serial
Ligne 200: Ligne 214:
     604800 ; minimum (1 week)      86400  ; minimum (1 day)
Ligne 202: Ligne 216:
   604800 RRSIG SOA 5 1 604800 20120229180439 (
     20120130180439 14058 localhost.
     pe+xZHJyYRaKtb+Tc22gmCBBJBWPIxcrQ6Qi
     pX7Uq+bTAvISZm2oJ/AKxwFwDf0vWu2ulWz/
     xqwtnF7WkC64Pw== )
   604800 NS localhost.
   604800 RRSIG NS 5 1 604800 20120229180439 (
     20120130180439 14058 localhost.
     gx7b09+c+t0WHgd0Uy6hjQe593MphKU4u7r+
     iqjW+dCMST7YZrGIYnrvlhIehauL8jhbaWDX
     dJayzJ67lNmnDg== )
   604800 A 127.0.0.1
   604800 RRSIG A 5 1 604800 20120229180439 (
     20120130180439 14058 localhost.
     SyM2yNCJ8lBNA4s7qSnPZTi+rwEvVt+HdFui
     RmSkfn5ijD+9Q2hsuRnPfYzGOJLY9D2wW2hp
     6JYHpQ3BTY3W9A== )
   604800 AAAA ::1
   604800 RRSIG AAAA 5 1 604800 20120229180439 (
     20120130180439 14058 localhost.
     EgnaOMGXWjB+c1FpJUZr3M16wu1QkynACZsY
     ftgC8jFFSTchlcrB3nP3D15X7zCO7IN/lsEw
     4YGuAJEjCRVZmg== )
   604800 NSEC localhost. A NS SOA AAAA RRSIG NSEC DNSKEY
   604800 RRSIG NSEC 5 1 604800 20120229180439 (
     20120130180439 14058 localhost.
     mU0xFwhJiVXkGl8dPZQfHdlOYNz5F0LJySF/
     m//sogxonT6jiQHvNxcRCq20cTUXVAyVQ1IK
     e6jkEDw3kjgtqg== )
   604800 DNSKEY 256 3 5 (
     AwEAAcFICEMvLIItggaAqR1TyDEsQzH4QlC6
     X/7MQ6PBcR0M/SEpN2uDD24Ui9NIPsKLBBpz
     Z3DJ1EgRa4SKNnA4BE0=
     ) ; key id = 14058 - ZSK
   604800 DNSKEY 257 3 5 (
     AwEAAcDW/bYLI36kvviwi4afvAzNwieUxMcY
     qoc1hEsRCXHC2RLy4uZXwMQEbLwx6GFEO/2s
     TnppfAhbRKD4IL0d0PU=
     ) ; key id = 19396 - KSK
   604800 RRSIG DNSKEY 5 1 604800 20120229180439 (
     20120130180439 14058 localhost.
     nsKNmlcM6DGx/L4goK0W9dmFFiF/0pHkqaz1
     3haTR4YaFh/AtvIFZnH0Urxx2hgY7NUz1aK0
     DRf3KSJbdxNOTw== )
   604800 RRSIG DNSKEY 5 1 604800 20120229180439 (
     20120130180439 19396 localhost.
     ea82+hqXgoFqaVFHvQtU/vTnz+0rDXvpBOBx
     jP6AEiiOWgXBrrZt7hlkDmdWEc9063DkfJAy
     lvg23API5Ylhqw== )
}}}

''' Je sais, il y a peu de détails, mais ce sera ajouté au fur et à mesure, tout doucement -- To be continued'''
   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à!

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à!

DNS/DNSSEC (dernière édition le 2012-08-30 12:45:39 par NacerAdamouSaidou)