Ce document décrit une procédure semi-automatique de sécurisation du service DNS avec `bind9`.

La version de `bind9` disponible sous [[Debian]] est maintenant automatiquement lancée sous l'utilisateur `bind` par défaut, mais toujours pas en `chroot`, ce qui serait pourtant une bonne idée du point de vue sécurité.

== Mettre en place la protection ==

{{{
# stopper l'exécution de bind pendant son emprisonnement
invoke-rc.d bind9 stop

# créer la prison pour bind
mkdir -p /var/chroot/bind
cd /var/chroot/bind
mkdir -p dev etc var/cache var/run
cp -a /dev/log /dev/null /dev/random dev/
cp -p /etc/localtime etc/

# la configuration
mv /etc/bind etc/
chown -R root:bind etc/bind
chmod -R u=rwX,g=rX,o= etc/bind
ln -s /var/chroot/bind/etc/bind /etc/

# fichiers racine DNS
if [ -e /usr/share/dns ] ; then # dist ≥ Debian Buster
 mkdir -p usr/share
 cp -a /usr/share/dns usr/share/
fi

# le cache
mv /var/cache/bind var/cache/
chown -R bind:bind var/cache/bind
chmod -R u=rwX,g=rX,o= var/cache/bind
ln -s /var/chroot/bind/var/cache/bind /var/cache/

# le pid
if [ -e /var/run/bind ] ; then # dist < Debian Squeeze
 mv /var/run/bind var/run/
 chown -R bind:bind var/run/bind/run
 chmod -R u=rwX,g=rX,o= var/run/bind/run
 ln -s /var/chroot/bind/var/run/bind /var/run/
elif [ -e /var/run/named ] ; then # dist ≥ Debian Squeeze
 mv /var/run/named var/run/
 chown -R root:bind var/run/named
 chmod -R u=rwX,g=rwX,o=rX var/run/named
 ln -s /var/chroot/bind/var/run/named /var/run/
else
 echo "*** ERREUR ***"
fi
if [ -e /run ] ; then # dist ≥ Debian Buster
 ln -s var/run
fi

# changer le répertoire personnel de bind vers sa future prison
usermod -d /var/chroot/bind bind

# modifier les options de demarrage de bind
sed -i '/^OPTIONS=/c OPTIONS="-u bind -t /var/chroot/bind"' /etc/default/bind9

# configurer sysklogd pour accepter les messages de logs depuis le bind emprisoné (version Etch)
[ -r /etc/default/syslogd ] && sed -i '/^SYSLOGD=/s#"\(.*\)"#"\1 -a /var/chroot/bind/dev/log"#' /etc/default/syslogd && invoke-rc.d sysklogd restart

# configurer syslog-ng pour accepter les messages de logs depuis le bind emprisoné
[ -r /etc/syslog-ng/syslog-ng.conf ] && sed -i '/unix-stream("\/dev\/log");/a\\t# bind9 chroot\n\tunix-stream("/var/chroot/bind/dev/log");' /etc/syslog-ng/syslog-ng.conf && invoke-rc.d syslog-ng restart

# configurer rsyslog pour accepter les messages de logs depuis le bind emprisoné (rsyslog vient par défaut avec Lenny)
[ -r /etc/rsyslog.conf ] && echo '$AddUnixListenSocket /var/chroot/bind/dev/log' >> /etc/rsyslog.d/bind9.conf && invoke-rc.d rsyslog restart

# enfin, redemarrer bind dans sa prison !
invoke-rc.d bind9 start
}}}

== Vérifier que tout va bien ==

En surveillant, comme d'habitude, le contenu du fichier `/var/log/daemon.log` qui ne doit pas contenir d'erreur ou d'avertissement (''warning'') suite aux redémarrage des deux services.

En faisant un `ps ax | grep named`, le résultat doit ressembler à cela :

{{{
# ps ax | grep named
17938 ?        Ss     0:00 /usr/sbin/named -u bind -t /var/chroot/bind
17939 ?        S      0:00 /usr/sbin/named -u bind -t /var/chroot/bind
17941 ?        S      0:00 /usr/sbin/named -u bind -t /var/chroot/bind
17942 ?        S      0:00 /usr/sbin/named -u bind -t /var/chroot/bind
17943 ?        S      0:00 /usr/sbin/named -u bind -t /var/chroot/bind
}}}

Et on peut aussi vérifier que le répertoire racine du processus `named` est bien devenu `/var/chroot/bind` :

{{{
# ls -l /proc/17938/root
lrwxrwxrwx    1 root     root            0 Jul 13 14:05 /proc/17938/root -> /var/chroot/bind
}}}


== Documentation ==

Une bonne documentation sur les autres aspects largement aussi importants (allow-transfer, allow-query) : [[http://www.security-labs.org/full-page.php3?page=411|Sécuriser un serveur de nom]] (à copier-coller et adapter ici si besoin).
----
[[CatégorieRecommandationsARI]]