DNS / DNSSEC

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

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:

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

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