DNSSec

réf : http://guides.ovh.com/dnssec
http://ensiwiki.ensimag.fr/index.php/Introduction_%C3%A0_DNSSEC
http://reseau.ciril.fr/wikidoc/Services/DNS
https://2009.jres.org/planning_files/summary/html/5.htm



Le but est de migrer, puis de maintenir, la zone univ.fr dans Bind sous DNSSec.
DNSSec est largement documenté dans la littérature du web, on ne va donc pas reprendre les principes ici mais plutôt s'attacher à son déploiement avec Bind pour une zone existante, le tout avec des clés asymétriques.

Quelques rappels de terminologie et pré-requis

ZSK (Zone Signing Key) : clés (publiques et privées) servant à signer les champs de la zone. Ces clés sont inconnues du registre.
KSK (Key Signing Key) : clés utilisées pour signer les clés ZSK. Ces clés sont signées par un champ DS dans la zone mère, gérée par Renater pour nous.
DNSKEY : champ contenant une clé publique
DS : condensat (hash) d'une DNSKEY, transmis à la zone mère.

Avant d'aller plus loin, on vérifie que nos équipements laisseront passer les paquets DNS d'une taille supérieure à 512 octets :
# dig +short rs.dns-oarc.net txt
rst.x3827.rs.dns-oarc.net.
rst.x3837.x3827.rs.dns-oarc.net.
rst.x3843.x3837.x3827.rs.dns-oarc.net.
"193.54.203.3 DNS reply size limit is at least 3843"
"193.54.203.3 sent EDNS buffer size 4096"
"Tested at 2012-02-07 09:46:15 UTC"

Création de la KSK

On utilise la commande dnssec-keygen livrée par Bind. Cette commande prend un certain temps de traitement, ne pas s'inquiéter.
# cd /etc/bind
# dnssec-keygen -f KSK -r /dev/urandom -a RSASHA1 -b4096 -n ZONE univ.fr
Kuniv.fr.+003+28209
On peut bien sûr choisir un autre algorithme de chiffrement ainsi qu'une autre longueur de clé. Lire le man de la version de dnssec-keygen installé sur son serveur pour voir les valeurs possibles d'algorithme et de longueur de clés associées.
L'option -r /dev/urandom accélère considérablement le temps de génération de la clé sur une machine peu sollicitée (clé non encore générée après 50 minutes sur mon serveur sans urandom !)

Pour simplifier les manipulations ultérieures, on renomme les deux fichiers générés :
# mv Kuniv.fr.+003+28209.key Kuniv.fr.ksk.key
# mv Kuniv.fr.+003+28209.private Kuniv.fr.ksk.private

Création de la ZSK

On utilise simplement la même commande dnssec-keygen qui demande aussi un certain temps de traitement :
# dnssec-keygen -r /dev/urandom -a RSASHA1 -b4096 -n ZONE univ.fr
Kuniv.fr.+003+18973

Comme précédemment, on renomme les fichiers produits :
# mv Kuniv.fr.+003+18973.key Kuniv.fr.zsk.key
# mv Kuniv.fr.+003+18973.private Kuniv.fr.zsk.private

Insertion des clés dans la zone

On édite le fichier de zone db.univ.fr auquel on ajoute deux inclusions (les clés publiques ZSK et KSK) à la fin. On n'oublie pas au passage d'incrémenter le serial.
$ORIGIN univ.fr.
$TTL 2D
@               IN      SOA     bind.univ.fr. hostmaster.univ.fr. (
                                        2012020701 ; Serial
                                        8H  ; Refresh every 3 hours
                                        1H  ; Retry every hour
                                        1W  ; Expire after a week
                                        1D ); Minimum ttl of 1 day

                IN      NS     bind.univ.fr.
                IN      NS     nsa1.cict.fr.

                IN      MX     10     ASPMX.L.GOOGLE.COM.
                IN      MX     20     ALT1.ASPMX.L.GOOGLE.COM.
                IN      MX     20     ALT2.ASPMX.L.GOOGLE.COM.
                IN      MX     30     ASPMX2.GOOGLEMAIL.COM.
                IN      MX     30     ASPMX3.GOOGLEMAIL.COM.
                IN      MX     30     ASPMX4.GOOGLEMAIL.COM.
                IN      MX     30     ASPMX5.GOOGLEMAIL.COM.
sender          IN      MX     10     relay.univ.fr.
sender          IN      TXT    "v=spf1 ip4:193.54.203.130 ?all"

                IN      A       193.54.203.131
truffade        IN      A       193.54.203.202
aioli           IN      A       193.54.203.204
name            IN      A       193.54.203.131
bastion         IN      A       193.54.203.132
relay           IN      A       193.54.203.130
frontal-http    IN      A       193.54.203.133
cache           IN      A       193.54.203.134
[...]
_xmpp-client._tcp.univ.fr. IN SRV 5 0 5222 xmpp-server.l.google.com.
_xmpp-client._tcp.univ.fr. IN SRV 20 0 5222 xmpp-server1.l.google.com.
_xmpp-client._tcp.univ.fr. IN SRV 20 0 5222 xmpp-server2.l.google.com.
_xmpp-client._tcp.univ.fr. IN SRV 20 0 5222 xmpp-server3.l.google.com.
_xmpp-client._tcp.univ.fr. IN SRV 20 0 5222 xmpp-server4.l.google.com.
$include /etc/bind/Kuniv.fr.zsk.key
$include /etc/bind/Kuniv.fr.ksk.key

Et on vérifie la cohérence du fichier de zone :
# named-checkzone univ.fr db.univ.fr
zone univ.fr/IN: loaded serial 2012020701
OK

Signature de la zone

Maintenant que nous disposons des clés, nous pouvons signer la zone. Cette opération va produire le fichier de zone signée à partir du fichier de zone standard.
La zone devra être resignée à chaque changement (ajout/modification/suppression d'un enregistrement par exemple)
Pour ceci, on utilise la commande dnssec-signzone de la forme :

dnssec-signzone -z -e YYYYMMDDHHmmss -p -t -g -k fichier_KSK_publique -o nom_zone fichier_zone fichier_ZSK_publique

YYYYMMDDHHmmss est la date d'expiration de la signature année, mois, jour, heure, minutes, secondes.
-z : impératif au moins une fois pour générer les RRSIG de tous les enregistrements.
Le fichier fichier_zone.signed sera alors produit.

# dnssec-signzone -z -e 20130101000000 -p -t -g -k Kuniv.fr.ksk.key -o univ.fr db.univ.fr Kuniv.fr.zsk.key
db.univ.fr.signed
Signatures generated:                      176
Signatures retained:                         0
Signatures dropped:                          0
Signatures successfully verified:            0
Signatures unsuccessfully verified:          0
Runtime in seconds:                      0.122
Signatures per second:                1433.645

Configuration de Bind

On active dnssec dans Bind par l'option dnssec-enable :

# nano named.conf.options

options {
        directory "/var/cache/bind";

         auth-nxdomain no;    # conform to RFC1035

//        allow-query { interne; };
//      allow-recursion { interne; };
        recursion no;
        allow-transfer { serveurs_esclave; };
        also-notify { 195.220.53.228; };
        recursive-clients 4000;
        version "Tu aurais jamais du essayer de savoir, rascal. Je t'envoie une equipe de tueurs...";
        dnssec-enable yes;
};
Par habitude, on vérifie le fichier modifié :
# named-checkconf named.conf.options

On déclare enfin la zone signée à la place de la zone standard dans named.conf.local

...
zone "univ.fr" {

        type master;
        allow-query {any;};
        notify yes;
        file "/etc/bind/db.univ.fr.signed";
        };
...
Vérification :
named-checkconf named.conf.local


On redémarre bind
/etc/init.d/bind9 restart

On peut ensuite tester :
# dig +cd +multi univ.fr dnskey

;; Truncated, retrying in TCP mode.

; <<>> DiG 9.7.0-P1 <<>> +cd +multi univ.fr dnskey
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19786
;; flags: qr rd ra cd; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3

;; QUESTION SECTION:
;univ.fr.        IN DNSKEY

;; ANSWER SECTION:
univ.fr.        172800 IN DNSKEY 257 3 3 (
                CLM4L1dUW8n6ebezLeg7mRYFU8WP/k3PsoKiaLTmNGZG
                pNGRIXj4SlXW1//bsihvLUViFR4P7MOGVgctQ1Z/wWAA
                a+IJd+zGSLNXEcvZc4GVf5v0FncOKd6tiDfboIxUMcQR
                QQnD2guqTANwQ+Nn06nFfoplRDGS9Uebw43Fbw/trT8n
                C4hWQFt4Ij5EHD3MZ7vTsRHj2ohgLG/uz1pxJV9FvOIB
                mbaOU70aXVSgHn0pKxXCb+QaAlVjVhoHHOfzAE3vIAkK
                xSWOL2cVg3Kh6Wr9I6aj9dV5pEK56K8DkdE2Og3r7QAj
                qKcQ6Z+xU2KLpbFNJfKOZpIBNJtdF9qxvDt8qXPd7fSO
                02BayUQX7pUQBilzRB9wYXx21Igmjhn5PjMFhGP2zGnA
                DCeZasDr3O1Eg3w3DPLE8owKXKrpG9v3TLC+Z9+foFY+
                lYFTeMafpH32AcRJGc9JhPRwNd7PBJf8YlehHD0r8llG
                NmxptilMhcd74WGYyEzbtUJo1s5nIZGvkzm3jzWHgwxd
                9W1OGrjgozML
                ) ; key id = 28209
univ.fr.        172800 IN DNSKEY 256 3 3 (
                CMKrllfULw20EZf3AKWN+PI++/HjmE5SMMKezal75Tqq
                FmVvcs5BeIXUxHgMaOyvqCS8jB7V92bi6sEYJfFul8pp
                hbXWvjwSYGjc2lgbg7x/8nUSFGIiWoZAoVA0ij651Kp/
                +MlUNiBHElThQDOa+pkpUgBAu03ZM29YbflzQVx1TH4R
                tWFGTCJtZsYs3xHWc0eebgNzI6US3Fw25Y84XL7FOWQP
                GILnRPHcls8yBRdjfws6truPCiwlx6GOqrTJlbyL+8Ab
                fdDA7ZRcQYwOJ2gaZ9e2kfrW0mVMtb7JJBzsAkNajnBr
                SB/SB+oPN4AINLi7sUmTULsZbO/MNaTLQx32LF5Kwjli
                1yjTIjEp1x21hzhXplKz/VM4gCnMCRPK3GaMW2iGl9sW
                tBEsKqTm42ULMWxbY4x/4iLHDzhUxMhixkYnpd85d8Ky
                r46RVlJkEP4TejmCRroGkpiLS8jdFmDqKxrVTiFdfCd3
                kNvzFXXvlkspEGoyRwL+H8np+FLEM0k6Ac3pIENJJt+H
                0omBtFBBw+jU
                ) ; key id = 18973

;; AUTHORITY SECTION:
univ.fr.        126908 IN NS nsa1.cict.fr.
univ.fr.        126908 IN NS bind.univ.fr.

;; ADDITIONAL SECTION:
bind.univ.fr.        126908 IN A 193.54.203.131
bind.univ.fr.        126908 IN AAAA 2001:660:6606:2::12
nsa1.cict.fr.        40512 IN A 195.220.53.228

;; Query time: 1 msec
;; SERVER: 192.168.100.50#53(192.168.100.50)
;; WHEN: Tue Feb  7 14:41:03 2012
;; MSG SIZE  rcvd: 975

Déclaration à la zone mère

Une fois que tout fonctionne, on fait remonter à la zone mère le condensat de la clé KSK afin d'assurer la chaîne de certification depuis .fr

Le pré-requis, si c'est Renater qui se charge de l'enregistrement (http://www.renater.fr/spip.php?article574), est que notre zone soit validée par le test ZoneCheck de l'AFNIC : http://www.afnic.fr/fr/produits-et-services/services/zonecheck/formulaire-complet/

Attention : si on annonce des adresses IPv6 dans le  DNS, l'AFNIC effectuera les tests en IPv6 (s'assurer des routes IPv6 dans ce cas).

On récupère les informations de la KSK :

cat Kuniv.fr.ksk.key

univ.fr. IN DNSKEY 257 3 5 AwEAActk+J9gDHhmYdgWAGAvT4kkYIAKuT75uVThH+UJ9cTTDp+4udaJ MUDhBglhF8V5ohFgWwv8PPCkkytUewAuttJ2jjtyDEu6EKECVO8fC/ke IUWp39apk5DIYpZu6X3i4CPpRykq6ne95lS6kQ6/LEqQAZGuN+FoB7LJ +30D6hst4YDRoAAZdFt3duo8QuMm5DVeQtb1effzfRRfLLz1AtVkIyfJ wg3FfaBHxQITYYV6Kw2G7AKb4lfR4ftswuu1zRi61nFD4d1BtmLXAkDP tFbR+p3jCqQp/G5G2WxFBdItg/eWRL5+xNCsPqXyMauwInG1CmVxHvlP fujENmCzTdfxDoYG5jIHu+qB0gvi8IWpViC18m6aH/IJBiTg+qLBJTCd t7R0nRrEKD0CiHNXES0MwD5X2K2NQ8GHj4r0W+HnXp0GceLNpv0nsxg6 DsGxe6499IiUHPFx15bCmKpswqGFKnkt23HjdIPzf3AxWHzAxO8FyULf j38E5y0me/CMv0Y9cK0/Bw3GFRKlNrVvy5IU7fbToZsYBDwYEj9Cece7 tyfIECM1HzM0n7eXds1UPPofzEGP/i1jFkzbAGWXOTGVklhS1tVIdH7i +JQQu1O6MzXbX0Yr0s8O5GJVGpfsP220OevJas553glfLSinKK0vQfkj DUF1PazgYaUdHl/J

Les informations dont le bureau d'enregistrement aura besoin sont celles-ci :
  • Le Keytag (ou key id) que l'on trouve dans l'enregistrement DNSKEY du fichier de zone signé db.univ.fr.signed : key id = 54703
  • Le flag = 257
  • L'algorithme de chiffrement de la clé = 5 (RSA/SHA-1)
  • L'algorithme choisi pour générer un condensat = 2 (SHA-256 ici)
  • La valeur du condensat qu'on obtient en calculant la sha256sum sur le fichier de la clé.

Cette valeur est complexe à calculer manuellement vue la RFC : http://tools.ietf.org/html/rfc4509

Donc si on dispose d'une version de bind supérieure ou égale 9.6, on utilise simplement la commande dnssec-dsfromkey :

# dnssec-dsfromkey -2 Kuniv.fr.ksk.key
univ.fr.    3600    IN    DS    54703 5 2 68acfebcc48c8bv6b6c4cdde29b83e10b84b4cb6c20347c464963a9158308486
Sinon, on installe le paquet ldnsutils (http://www.nlnetlabs.nl/projects/ldns/) par exemple (ici liste des outils possibles : https://www.dnssec-deployment.org/wiki/index.php/Tools_and_Resources) et on utilise la commande ldns-key2ds
# apt-get install ldnsutils
# ldns-key2ds -2 Kuniv.fr.ksk.key
Kuniv.fr.+005+54703
# cat
Kuniv.fr.+005+54703
univ.fr.    3600    IN    DS    54703 5 2 68acfebcc48c8bc6b6c3cdde29b83e10b84bfc46c20347c464963a9158308486

La valeur du condensat à transmettre est alors : 68acfebcc48c8bc6b6c3cdde29b83e10b84bfcb6c10347c464963a9158308486


Comments