BIND9 : DNSSEC

To the non-french speaker, note that you can translate the articles using the Google Trad widget situated at the bottom of all pages.


Il y a de cela quelques semaines, des attaquants encore non identifiés ont réussis à compromettre des zones DNS afin de rediriger de légitimes utilisateurs vers de faux sites dans le but de leur voler leurs identifiants de connexions et autres données sensibles.

Cette attaque, ce n’était ni plus ni moins que du DNS hijacking et, comme l’a si bien dis l’ICANN, elle aurait pu être éviter si les serveurs DNS ciblés avaient été configurés pour utiliser DNSSEC.

Dans cet article nous verrons donc à quoi sert DNSSEC et du coup comment l’implémenter sur un serveur DNS.

I/ DNSSEC kezako ?

DNSSEC (pour Domain Name System Security Extensions) est un ensemble d’extensions au protocole DNS permettant de garantir l’authenticité des données reçues. Autrement dit, DNSSEC va permettre à un utilisateur de s’assurer que les données DNS reçues n’ont pas été ni empoisonnées ni falsifiées.

Attention, DNSSEC va nous permettre de garantir l’authenticité des données mais pas la confidentialité. DNSSEC ne chiffrera pas le contenu des échanges entre un client et un serveur DNS.

Alors comment ça fonctionne tout ça ? Globalement ce n’est qu’une histoire de signature. Pour faire simple avec DNSSEC nous allons signer nos zones à l’aide d’un couple de clés privées et publiques. Les clients DNS, lorsqu’ils feront une requête DNS, réceptionneront des entrées DNS ainsi qu’un hash qui leur permettra de vérifier que le contenu de la zone DNS n’a pas été modifié en cours de route.

II/ Quels sont les ajouts liés à DNSSEC ?

Avant lorsqu’on faisait une requête dig pour un nom de domaine en particulier, on obtenait des entrées DNS de type A, AAAA, MX, NS etc… En plus de ces entrées, avec DNSSEC, on pourra aussi recevoir des entrées de type RRSIG ou encore DNSKEY. Pour être plus précis, avec DNSSEC, six nouvelles entrées ont été créées :

Cette entrée DNS contient la clé publique utilisé par notre client DNS afin de vérifier la signature contenue dans l’entrée DNS RRSIG.

  • DS (Delegation Signer)

Cette entrée DNS va être utilisée lorsque l’on voudra faire de la délégation d’autorité. Entendez ici qu’au lieu d’utiliser la DNSKEY de la zone DNS, on utilisera la DNSKEY d’une autre zone qui aura – en quelques sortes – autorité.

L’idée avec ces entrées DNS est qu’elles vont nous permettre de nous assurer que les zones reçues dans la réponse du serveur DNS existe. En effet, pour chaque entrées DNS présentent dans la zone DNS, il existe une entrée de type NSEC/NSEC3 qui ne sera ni plus ni moins qu’un pointeur vers la prochaine entrée DNS de la zone.

Si le client DNS reçoit une entrée de type NSEC, NSEC3 ou NSEC3PARAM dont la valeur n’est pas égale à la prochaine entrée DNS alors il y a eu une corruption et donc on ne peut pas s’assurer de la validité des informations reçues.

  • RRSIG (RRset Signature)

Cette entrée DNS contient tout simplement la signature d’une entrée DNS.

III/ Comment implémenter DNSSEC ?

La première chose à faire ça va être d’ajouter les options relatives à DNSSEC dans le fichier /etc/bind/named.conf.options :

dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;

Ensuite nous allons avoir besoin d’une zone DNS. Voici le fichier de configuration que j’utiliserai tout au long de cet article :

1.png

Pour mettre en place DNSSEC, il faut avant tout avoir déjà une zone DNS fonctionnelle. Si vous ne savez pas comment faire je vous redirige vers cet article qui vous l’expliquera 🙂 !

Pour la suite, deux paires de clé seront à générer, les clés KSK (Key Signing Keys) et les clés ZSK (Zone Signing Keys). La première paire va nous permettre de signer la seconde qui elle même va nous permettre de signer notre zone DNS.

Nous allons donc créer un répertoire « keys_zone »  avec « zone » le nom de la zone à signer :

mkdir /var/cache/bind/keys_site1

Dans ce répertoire on va d’abord générer les clés KSK via cette commande :

dnssec-keygen -f KSK -a RSASHA256 -b 2048 -n ZONE site1.com

-f : va nous permettre d’ajouter le flag KSK dans notre entrée DNS de type DNSKEY
-a : c’est l’algorithme utilisé afin de signer notre pair de clé ZSK
-b : la taille de la clé (entre 512 et 2048 bits pour du RSA)
-n : indique que ces clés sont relatives à une ZONE

On obtient deux clés :

Ksite1.com.zone.+008+42045.key // clé publique
Ksite1.com.zone.+008+42045.private //clé privée

Que nous allons renommer en :

Ksite1.com.+008+08359.ksk.key
Ksite1.com.+008+08359.ksk.private

Puis nous allons générer les clés ZSK via cette commande :

dnssec-keygen -a RSASHA256 -b 2048 -n ZONE site1.com

-a : c’est l’algorithme utilisé afin de signer notre pair de clé ZSK
-b : la taille de la clé (entre 512 et 2048 bits pour du RSA)
-n : indique que ces clés sont relatives à une ZONE

Encore une fois on va obtenir deux clés supplémentaires que nous allons renommer en :

Ksite1.com.+008+12588.zsk.key
Ksite1.com.+008+12588.zsk.private

Au total nous avons donc quatre clés :

6.png

Pour la suite, il va falloir inclure les clés publiques ZSK et KSK dans le fichier de configuration de notre zone :

7.png

Pour finir nous n’aurons plus qu’à signer notre zone en utilisant cette commande :

dnssec-signzone -N INCREMENT -C -g -l site1.com -k /var/cache/bind/keys_site1/Ksite1.com.+008+08359.ksk.key -o site1.com -t /var/cache/bind/site1.com.zone Ksite1.com.+008+12588.zsk.key

-N permet d’incrémenter le serial number
-C permet d’assurer la compatibilité entre les nouvelles et anciennes versions de Bind
-g qui génère des entrées DNS DS
-l le nom du domaine
-k le fichier contenant la clé publique KSK
-o le nom de la zone originale à signer
-t qui va nous afficher un récapitulatif (savoir si la signature s’est bien déroulée)
Suivie de la localisation du fichier de configuration de la zone et la clé publique ZSK

Pour signer notre zone :

8.png

Dernière chose à faire, modifier le fichier /etc/bind/named.conf.local pour faire pointer la directive :

file "site1.com"

vers :

file "site1.com.zone.signed"

Ajouter la directive :

key-directory "/var/cache/bind/keys_site1/";

Puis relancer bind :

sudo sytemctl reload bind9

Si tout marche bien alors en lançant cette commande:

dig DNSKEY site1.com.

Vous devriez voir apparaître les signatures RRSIG de nos entrées DNS :

9.png

Voilà, nous avons mis en place DNSSEC 😁 !

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s