Sécuriser BIND
Préliminaires
Nous utiliseront dans ce tutorial la zone test.net, considérerons que celle-ci est actuellement en place sur un serveur primaire et un secondaire de façon standard et qu'elle fonctionne correctement. Ces deux serveurs utilisent le logiciel BIND.
- ns1.test.net : Serveur primaire, adresse IPv4 10.0.0.1, IPv6 fd00:a::1
- ns2.test.net : Serveur secondaire, adresse IPv4 10.0.0.2, IPv6 fd00:a::2
- Zone DNS : test.net
Le Chroot
Les chroot consiste à enfermer un programme dans une arborescence de votre système de fichier, ne lui donnant qu'une vue très partielle du système, lui évitant de se répandre partout en cas de problème, voyons les modifications à faire dans le cas de BIND.
Notre chroot enfermera BIND dans le répertoire /var/chroot/bind9/
.
- Il faut tout d'abord arrêter le service BIND, puis, modifier le fichier
/etc/default/bind9
et remplacer la ligne :OPTIONS="-u bind"
Par :OPTIONS="-u bind -t /var/chroot/bind9"
- Puis, dans le dossier de chroot, créer la structure de répertoires nécessaire au fonctionnement de BIND :
# mkdir -p /var/chroot//bind9{etc,dev,var/cache/bind,var/run/named}
- Créer les fichiers de devices utilisé par BIND et leurs donner des droits corrects :
# mknod /var/chroot/bind9/dev/null c 1 3 # mknod /var/chroot/bind9/dev/random c 1 8 # chmod 660 /var/chroot/bind9/dev/{null,random}
- Déplacer le dossier de configuration de BIND dans le chroot :
# mv /etc/bind /var/chroot/bind9/etc/ # ln -s /var/chroot/bind9/etc/bind /etc/bind
- Assigner les droits correct au chroot :
# chown -R bind:bind /etc/bind/* # chmod 775 /var/chroot/bind9/var/{cache/bind,run/named} # chgrp bind /var/chroot/bind9/var/{cache/bind,run/named}
- Editer le fichier
/etc/init.d/bind9
et modifier la valeur de la variablePIDFILE
:PIDFILE=/var/chroot/bind9/var/run/named/named.pid
- Editer la configuration de RSyslog pour qu'il écoute le device log utilisé par BIND :
# echo "\\$AddUnixListenSocket /var/chroot/bind9/dev/log" > /etc/rsyslog.d/bind-chroot.conf
- Redémarrer RSyslog et BIND :
# /etc/init.d/rsyslog restart && /etc/init.d/bind9 start
Réduire l'exposition de BIND
Plusieurs options peuvent êtres modifiées dans le fichier named.conf.options
:
- Les options
listen-on
etlisten-on-v6
permettent de limiter les adresses IPv4 et IPv6 d'écoutes de BIND, ne le faire écouter que sur certaines adresses évite de le rendre disponible sur des où il n'est pas nécessaire.
Il est nécessaire que BIND écoute au minimum sur les adresses IPv4 et IPv6 locales. Si vous désirez que BIND soit disponibles via une autres IPv4 ou IPv6 que la locale, il vous suffit de l'ajouter.listen-on { 127.0.0.1; 10.0.0.1; }; listen-on-v6 { ::1; fd00:a::1; };
- Il est possible de cacher la version de BIND en paramétrant l'option
version
ànone
.version "none";
- Si votre BIND ne sert qu'à votre machine local, il vous est possible de le rendre plus fermé en restreignant les transferts, ainsi que l'origine des requêtes et récursions.
allow-query { localhost;}; allow-recursion { localhost; }; allow-transfer { none; };
Utiliser des clefs RNDC
Les clefs RNDC sont un système de chiffrement asymétrique utilisé par BIND pour chiffrer ses communications. Les clef RNDC utilisent l'algorythme MD5 et ont une longueur maximum de 512 bits.
Génération de la clef et l'utiliser pour gérer BIND
Générer un clef RNDC avec la commande rndc-confgen. Indiquer les options -b
pour la longueur de la clef, et -k
pour lui donner un nom :
# rndc-confgen -b 512 -k test.net
Une fois la clef généré, la commande vous indique où mettre les différentes informations, cependant, celle-ci sont pas très correct dans le cas de Debian, voici comment faire :
- Copier le bloc suivant, qui contient la clef RDNC proprement dites, dans
/etc/bind/rndc.key
:key "test.net" { algorithm hmac-md5; secret "CpObjiWEGtRGKj1xsCbrbJbCjxZNyQr1+mHGAS56yP5912kv4OyQFoLDfHJ4HQEI8aNaR3VCwpiSSifSe9DwBQ=="; };
- Copier le bloc suivant, dans
/etc/bind/rndc.conf
, si vous avez plusieurs clef RNDC, choisissez celle par défaut. La clef indiquée dans la sectionserver localhost { }
indique la clef utilisé pour interagir avec le serveur local :include "/etc/bind/rndc.key"; options { default-server localhost; default-port 953; default-key "test.net"; }; server localhost { key "test.net"; };
- Enfin, éditer le fichier
/etc/bind/named.conf
et ajouter/modifier ces lignes pour lui indiquer que vous utilisez RNDC pour contrôler BIND&rndc;include "/etc/bind/rndc.key"; acl internals { 127.0.0.0/8; ::1/128; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "test.net"; }; inet ::1 port 953 allow { ::1; } keys { "test.net"; }; };
Enfin, redémarrer BIND :
# service bind9 restart
Configuration maître/esclave
Fichier de configuration générale
Il faut autoriser les serveurs à se contacter en ajoutant leurs réseaux et adresses IPv4 et IPv6 dans les options acl internal
et controls
- Pour le serveur primaire :
acl internals { 127.0.0.0/8; 10.0.0.0/8; ::1/128; fd00:a::/64; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; 10.0.0.2; } keys { "test.net"; }; inet 10.0.0.1 port 953 allow { 127.0.0.1; 10.0.0.2; } keys { "test.net"; }; inet ::1 port 953 allow { ::1; fd00:a::2; } keys { "test.net"; }; inet fd00:a::1 port 953 allow { ::1; fd00:a::2; } keys { "test.net"; }; };
- Pour le serveur secondaire :
acl internals { 127.0.0.0/8; 10.0.0.0/8; ::1/128; fd00:a::/64; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; 10.0.0.1; } keys { "test.net"; }; inet 10.0.0.2 port 953 allow { 127.0.0.1; 10.0.0.1; } keys { "test.net"; }; inet ::1 port 953 allow { ::1; fd00:a::1; } keys { "test.net"; }; inet fd00:a::2 port 953 allow { ::1; fd00:a::1; } keys { "test.net"; }; };
Fichiers de configuration de zones
Il est possible de chiffrer les communications en indiquant une clef RNDC dans :
- Les options
allow-transfert
,allow-update
du serveur primaire.allow-transfer { 10.0.0.2; fd00:a::2; key "test.net"; }; allow-update { 10.0.0.2; fd00:a::2; key "test.net"; };
- Les options
masters
,allow-notify
du serveur secondaire.masters { 10.0.0.1; fd00:a::1; key "test.net"; }; allow-notify { 10.0.0.1; fd00:a::1; key "test.net"; };
Utiliser DNSSEC
Pour cela, je vous renvoi à l'article que j'ai écrit sur ce point.