|
|
by 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.
|