par Denis Ducamp (13/02/2001) Cet article montre comment installer une cage pour exécuter bind de façon plus sécurisée. Un article de référence est http://www.psionic.com/papers/whitep01.html expliquant cela pour des systèmes OpenBSD et RedHat. note : les commandes données sont pour Linux, certains paramètres changent suivant les systèmes. L'installation ici décrite nécessite de recompiler bind et donc ne peut être réalisée à partir de packages binaires pré-compilés. L'installation se fera dans le répertoire /var/named et bind sera chrooté dans ce répertoire. Les différentes étapes à suivre dans notre installation sont réparties en deux parties : compilation et installation. * compilation 1- récupérer les sources depuis le site de ISC. Dans notre cas ftp://ftp.isc.org/isc/bind/src/8.2.3/bind-src.tar.gz 2- désarchiver les sources : mkdir bind-8.2.3 cd bind-8.2.3 tar xzvf ../bind-src.tar.gz cd src 3- appliquer le patch suivant : --- port/linux/Makefile.set.orig Fri Jun 11 08:01:35 1999 +++ port/linux/Makefile.set Mon Feb 12 19:23:03 2001 @@ -1,12 +1,12 @@ 'CC=gcc -D_GNU_SOURCE' -'CDEBUG=-O -g' -'DESTBIN=/usr/bin' -'DESTSBIN=/usr/sbin' -'DESTEXEC=/usr/sbin' +'CDEBUG=-O2' +'DESTBIN=/var/named/usr/bin' +'DESTSBIN=/var/named/usr/sbin' +'DESTEXEC=/var/named/usr/sbin' 'DESTMAN=/usr/man' -'DESTHELP=/usr/lib' -'DESTETC=/etc' -'DESTRUN=/var/run' +'DESTHELP=/var/named/usr/lib' +'DESTETC=/var/named/etc' +'DESTRUN=/var/named/var/run' 'LEX=flex -8 -I' 'YACC=yacc -d' 'SYSLIBS=-lfl' Il faut bien sûr éditer le fichier qui correspond à votre système. Ici le but est de changer l'emplacement des fichiers pour qu'ils soient installés dans la cage et qu'ils aillent chercher leurs données dedans. Ici tous les répertoires, sauf celui des manuels, sont changés pour être placés dans l'arborescence /var/named . 4- compilation et installation des binaires make make install * installation 1- créer un utilisateur et un groupe ici seront utilisés le compte daemon et le groupe daemon Il vous est par exemple possible de créer le compte bind avec un groupe du même nom. 2- créer une cage avec les sous répertoires etc, lib, dev, usr/sbin, var/named et var/run mkdir /var/named cd /var/named mkdir -p etc lib dev usr/bin usr/lib usr/sbin var/run 3- créer le fichier dev/null mknod -m 666 dev/null c 1 3 sous FreeBSD utiliser "c 2 2" 4- créer le fichier dev/log mkfifo -m 666 dev/log ceci est inutile si /dev/log est une socket, celle-ci sera créée quand syslogd sera lancé. 5- recopier les fichiers de configuration : /etc/named.conf cp /etc/named.conf etc Les répertoires var/named/s (l'arborescence des fichiers secondaires) et var/run doivent être modifiables par l'utilisateur ou le groupe. Les autres fichiers ne doivent être modifiables ni par l'utilisateur, ni par le groupe et ne doivent pas appartenir à ceux-ci. 6- recopier les programmes en dehors de la cage cp usr/bin/* /usr/bin cp usr/sbin/* /usr/sbin 7- recopier les bibliothèques nécessaires dans lib . sous Linux glibc 2.1.x : cp /lib/libc.so.6 /lib/ld-linux.so.2 lib . sous FreeBSD 4.2 : mkdir -p usr/lib usr/libexec cp /usr/lib/libc.so.4 /usr/lib/libutil.so.3 usr/lib cp /usr/libexec/ld-elf.so.1 usr/libexec La liste des fichiers varie énormément suivant les systèmes et les versions de bibliothèques. Pour connaître les bibliothèques à recopier, il est possible d'utiliser la commande ldd : ldd usr/sbin/named-xfer libc.so.6 => /lib/libc.so.6 (0x4001a000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) Dans certains cas ce n'est pas suffisant et il est possible de recopier tout /lib puis après quelques jours d'exploitation de lancer la commande 'ls -artlu lib' pour connaître la liste des derniers fichiers lus. Au format elf, les programmes ont besoin d'un programme leur permettant de charger les bibliothèques dynamiques. Ce programme peut se trouver dans le répertoire /lib (ld-linux.so.1 sous linux libc5, ld-linux.so.2 sous linux glibc2) ou /usr/libexec (ld-elf.so.1 sous FreeBSD 3 et 4). 8- lancer syslogd pour écouter les événements générés dans la cage : syslogd -a /var/named/dev/log sous FreeBSD, l'option à utiliser est -l à la place de -a Avec de nombreuses versions de syslogd, il est inutile de créer un tube nommé puisque au lancement de syslogd celui-ci créé une socket. 9- lancer named avec les option '-u user -g group -t cage' . /usr/sbin/named -u daemon -g daemon -t /var/named Il n'y a pas besoin ici de passer les options adéquates à named ou à ndc puisque les programmes ont en dur le chemin correct vers tous les utilitaires, ce qui n'aurait pas été le cas en recopiant les utilitaires depuis le système vers la cage. note : chrooter named sans changer son identité est inutile car il est alors possible pour root de sortir de la cage, voir http://www.bpfh.net/simes/computing/chroot-break.html pour l'explication et le programme d'exemple. Ceci était utilisé dans l'exploitation de la vulnérabilité de bind 8.2.0 à 8.2.2 afin de sortir de la cage et accéder à l'intégralité du disque. Voir aussi le tips http://www.hsc.fr/tips/chroot.html donnant la méthode pour chrooter un serveur apache installé en relais inverse.