Sécuriser BIND

Le service DNS est bien souvent un service assez critique dont dépendent plusieurs autres, si vous utilisez BIND pour remplir cette tâche, voici quelques astuces pour le rendre plus sûr. Comme toujours, cet article est plus centré sur Debian, mais peut être adapté à d'autres distributions.

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 variable PIDFILE :
    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 et listen-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 section server 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.

Vus : 1215
Publié par Zergy : 41