[Tuto] Bind9 + DNSSEC

Dans ce tutoriel, nous allons détailler la configuration d’un serveur DNS primaire (votre serveur) et un DNS secondaires (celui votre deuxieme serveur, ou un hebergeur) au cas où le primaire ne réponde plus aux requêtes DNS.

Pour plus d’information sur DNS, j’ai fait un article dédié pour expliquer le fonctionnement. 🙂

1 – Installation de Bind
2 – Fichier de configuration principal
3 – Configuration du fichier de zone
4 – Vérification des fichiers de configuration
5 – Modification des Glues records
6 – Sécurisation du serveur DNS avec DNSSEC
7 – Installation de rng-tools
8 – Générer la clé KSK
9 – Générer la clé ZSK
10 – Importation des clés dans le fichier de zone
11 – Signature du fichier de zone
12 – Configuration de la zone parent
13 – Vérification du fonctionnement de DNSSEC

.

L’ensemble des commandes seronts éxécutées avec les privilèges root :

$ sudo -s
password :
# 

1 – Installation de Bind

# aptitude install bind9

Les fichiers de configuration sont placés dans le répertoire /etc/bind.

Voici la liste des fichiers principaux :
– named.conf.local : Configuration local du serveur DNS, on y déclare les zones associées au domaine.
– named.conf.options : Ce fichier contient l’ensemble des options de configuration du serveur DNS.
– named.conf.default-zones : Ce fichier contient des zones pré-définies

Attention : Dans la suite du tutoriel, n’oubliez pas de remplacer domain.tld par votre nom domaine.

.

2 – Fichier de configuration principal :

# vim /etc/bind/named.conf.options

options {
        directory "/var/cache/bind";
        recursion no;
        allow-transfer { none; };

        dnssec-enable yes;
        dnssec-validation auto;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };

        allow-query { any; };
		allow-update { none; };
};

Fichier de configuration local du serveur DNS, on va déclarer la zone associée au domaine.

# vim /etc/bind/named.conf.local

zone "domain.tld" {
    type master;
    file "/etc/bind/db.domain.tld";
    allow-transfer { IP_SLAVE; };
    notify yes;
};

La directive zone détermine la zone à gérer.
La directive type peut prendre deux valeurs, master ou slave. Le serveur primaire sera toujours de type master. Les serveurs secondaires seront quant à eux de type slave et iront récupérer les informations de la zone depuis le serveur primaire grâce à la directive allow-transfer.

.

3 – Configuration du fichier de zone :

# vim /etc/bind/db.domain.tld

@       IN      SOA     ns1.domain.tld.       postmaster.domain.tld. (
        2726428884      ; Serial
                1D      ; Refresh
                1H      ; Retry
                1W      ; Expire
                3H )    ; Negative Cache TTL

@               IN      NS      ns1.domain.tld.
                IN      NS      ns2.domain.tld.

$TTL : (Time To Live) exprime la durée (en secondes) de validité des informations contenues dans votre fichier de zone. Une fois ce délai expiré, les autres serveurs DNS doivent vérifier à nouveau les enregistrements.
SOA : permet de définir les informations relatives à la zone. En l’occurrence le nom du serveur DNS primaire et l’adresse mail du contact technique (hostmaster.domain.tld. le symbole @ est remplace par un point). Cet enregistrement est composé de plusieurs champs :
; Serial : est un entier non signé de 32 bits. C’est le numéro de série à incrémenter à chaque modification du fichier. Cela permet aux serveurs secondaires de savoir si une modification a été apportée au fichier de zone principal. Le serial est généralement formaté à partir de la date de modification de la zone, AAAAMMDDXX, par exemple pour le 10 octobre 2014 => 2014102001 (première modification), 2014102002 (deuxième modification), … etc.
; Refresh : définit la période de rafraîchissement des données.
; Retry : si une erreur survient au cours du dernier rafraîchissement, celle-ci sera répétée au bout du délai Retry.
; Expire : le serveur sera considéré comme non disponible au bout du délai Expire.
; Negative cache TTL : définit la durée de vie d’une réponse NXDOMAIN de notre part.

Après c’est à vous de personnaliser ce fichier en fonction de vos besoins, voici un exemple :

; Enregistrements A/AAAA

@                   IN                A                    IPv4 de votre serveur
@                   IN                AAAA                 IPv6 de votre serveur

hostname            IN                A                    IPv4 de votre serveur
hostname            IN                AAAA                 IPv6 de votre serveur

ns1                 IN                A                    IPv4 de votre serveur
ns1                 IN                AAAA                 IPv6 de votre serveur

; Sous-domaines - Serveur web
www                 IN                CNAME                hostname
blog                IN                CNAME                hostname
forum               IN                CNAME                hostname
...

; Sous-domaines - Serveur mail
smtp                IN                CNAME                hostname2
imap                IN                CNAME                hostname2
pop                 IN                CNAME                hostname2
...

; Sous-domaines - Seedbox
plex                IN                CNAME                hostname3
torrent             IN                CNAME                hostname3
...

; Enregistrement MX (Mail Exchanger)

@                   IN                MX          10       mail.domain.tld.

; Enregistrement SFP, DKIM, ...etc

...

.

4 – Vérification des fichiers de configuration :

# named-checkconf -z

zone domain.tld/IN: loaded serial 2014102001
zone localhost/IN: loaded serial 2
zone 127.in-addr.arpa/IN: loaded serial 1
zone 0.in-addr.arpa/IN: loaded serial 1
zone 255.in-addr.arpa/IN: loaded serial 1

On va aussi vérifier la validité du fichier de zone :

# named-checkzone domain.tld /etc/bind/db.domain.tld

zone domain.tld/IN: loaded serial 2014102001
OK

On peut maintenant démarrer le service :

# service bind9 start

À chaque modification du fichier de zone, le serial doit être incrémenté et le serveur DNS être redémarré pour que les modifications soient prises en compte.

N’oubliez pas de déclarer les serveurs de nom associés à votre nom de domaine à partir de l’interface de votre registrar (OVH, gandi, godaddy…etc)

.

5 – Modification des Glues records

Quand un domaine est délégué à un serveur de nom qui appartient à ce sous-domaine (par exemple, dans notre cas il s’agit de ns1.domain.tld), il est nécessaire de fournir également l’adresse IP de ce serveur pour éviter les références circulaires.

.

6 – Sécurisation du serveur DNS avec DNSSEC

DNSSEC permet de signer cryptographiquement chaque enregistrement présent au sein de votre fichier de zone afin de ne pas être vulnérable aux attaques MITM ou DNS cache poisoning (Empoisonnement du cache DNS).

Regardez cet article d’OVH pour comprendre le fonctionnement de DNSSEC simplement :
https://www.ovh.com/fr/domaines/service_dnssec.xml

.

7 – Installation de rng-tools

# aptitude install rng-tools

Editer le fichier /etc/default/rng-tools et ajouter ces deux lignes :

HRNGDEVICE=/dev/urandom
RNGDOPTIONS="-W 80% -t 20"
# /etc/init.d/rng-tools start

On peut maintenant générer les clés très rapidement, déplacez-vous avant dans le répertoire /etc/bind/

.

8 – Générer la clé KSK :

# dnssec-keygen -f KSK -a RSASHA256 -b 2048 -n ZONE domain.tld

Generating key pair.......................................................................
..............+++ ..........................................................+++
Kdomain.tld.+008+62062

Dans notre cas, les clés commencent par Kdomain.tld.+008+62062, pour plus de clarté, on va les renommer :

# mv Kdomain.tld.+008+62062.key Kdomain.tldx.ksk.key
# mv Kdomain.tld.+008+62062.private Kdomain.tld.ksk.private

.

9 – Générer la clé ZSK :

# dnssec-keygen -a RSASHA256 -b 2048 -n ZONE domain.tld

Generating key pair.........................................................+++ .+++
Kdomain.tld.+008+32898

On renomme aussi les clés pour plus de clarté :

# mv Kdomain.tld.+008+32898.key Kdomain.tld.zsk.key
# mv Kdomain.tld.+008+32898.private Kdomain.tld.zsk.private

Vérifier les permissions sur les clé privées .private (chmod 600) :

$ ls -l /etc/bind/ | grep Kdomain*

-rw-r--r-- 1 root bind  603 Oct 20 14:45 Kdomain.tld.ksk.key
-rw-r--r-- 1 root bind  604 Oct 20 14:54 Kdomain.tld.zsk.key
-rw------- 1 root bind 1776 Oct 20 14:45 Kdomain.tld.ksk.private
-rw------- 1 root bind 1776 Oct 20 14:54 Kdomain.tld.zsk.private

.

10 – Importation des clés dans le fichier de zone

Les fichiers .key contiennent les clés publiques qu’il faut inclure dans le fichier de zone. Pour cela, il faut utiliser la directive $INCLUDE en dessous du champ SOA :

@       IN      SOA    domain.tld. hostmaster.domain.tld. (
                                        2014102003 ; Serial
                                        7200       ; Refresh
                                        1800       ; Retry
                                        604800     ; Expire - 1 week
                                        86400 )    ; Minimum

$INCLUDE "/etc/bind/domain.tld/Kdomain.tld.zsk.key" ;
$INCLUDE "/etc/bind/domain.tld/Kdomain.tld.ksk.key" ;
...

Il ne faut surtout pas oublier d’incrémenter le serial pour prendre en compte les modifications, c’est très important. Dans mon cas, j’ai mis 2014102003 car c’est la troisième modification que j’ai apporté à ma zone aujourd’hui.

.

11 – Signature du fichier de zone

Pour signer un fichier de zone, il faut utiliser la commande dnssec-signzone comme ceci :

dnssec-signzone -e20160404042000 -t -g -k Kdomain.tld.ksk.key -o domain.tld db.domain.tld Kdomain.tld.zsk.key

Cette commande génére une zone entièrement signée nommée : db.domain.tld.signed
Modifier le nom du fichier de zone dans le fichier named.conf.local :

# vim /etc/bind/named.conf.local

zone "domain.tld" {
        ...
        # Fichier de zone
        file "/etc/bind/db.domain.tld.signed";
        ...
};

.

12 – Configuration de la zone parent

tail -n 1 Kdomain.tld.ksk.key

domain.tld. IN DNSKEY 257 3 10 AwEAAdZUh2epPnQQSMAB5dC7stvMkEfjGLTQqBf+/0cUuA1aQs4L6o8J[.........]emxXk9lW6gBgOeX9

Puis la donner à votre registrar, par exemple chez ovh :

.

13 – Vérification du fonctionnement de DNSSEC

Vous pouvez utiliser ces deux outils pour vérifier la validité de votre domaine :

http://dnssec-debugger.verisignlabs.com/
http://dnsviz.net/

Si tous les voyants sont au vert c’est que tout est bon 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *