Création d'un chroot sous Debian
Par Sébastien Le Ray le mardi 28 juillet 2009, 21:48 - Sysadmin - Lien permanent
Comment créer un chroot qui sera lancé au démarrage de la machine.
Merci à Florent et Sylvain pour leur aide
Pourquoi un chroot permanent ?
Un chroot (permanent ou non) peut servir à plusieurs choses. On met de côté ici le chroot créé pour une application seule (comme bind ou apache), on ne s'intéresse qu'au chroot d'un système complet.
Personnellement, je m'en sers en développement, pour avoir une plateforme de test "propre" sur ma machine (sans sources unstables ou paquets divers) ou pour avoir différentes versions du même système (hôte en lenny, chroot en unstable). Cela peut également être utilisé en production pour simplifier les migrations d'une machine à l'autre, une fois l'hôte prêt, on a juste à décompresser l'archive du chroot original et en 3 minutes de configuration (montages), on a quelque chose de prêt à fonctionner.
Notons également qu'avec GRSecurity, les chroots peuvent être beaucoup plus stricts que par défaut (impossible de voir les process hors chroot, impossible de chroot dans un chroot, impossible de mettre en place un montage) ce qui en fait une solution attractive pour limiter les risques en cas de compromission (pas d'accès au noyau pour injecter un rootkit par exemple).
Préparation du chroot
Afin d'initialiser le chroot, nous utiliserons debootstrap, un utilitaire Debian qui met en place une arborescence de base prête à être utilisée.
sebastien@boiboite$ sudo aptitude install deboostrap sebastien@boiboite$ sudo debootstrap [release] /var/chroots/monchroot [mirroir]
release doit être remplacé par une des versions de debian, mirroir est facultatif et permet d'indiquer un mémoire alternatif à utiliser (par défaut il s'agit de us.debian.org).
Nous pouvons maintenant rajouter les montages nécessaires au bon fonctionnement des différents éléments et copier le fichier hosts de l'hôte pour le bon fonctionnement du réseau :
sebastien@boiboite$ sudo mount -o bind /proc /var/chroot/monchroot/proc sebastien@boiboite$ sudo mount -o bind /dev /var/chroot/monchroot/dev none bind sebastien@boiboite$ sudo mount -o bind /dev/pts /var/chroot/monchroot/dev/pts none bind sebastien@boiboite$ sudo mount -o bind /sys /var/chroot/monchroot/sys none bind sebastien@boiboite$ sudo cp /etc/hosts /var/chroot/monchroot/etc
Tout est prêt, il n'y a plus qu'à changer de racine et démarrer les services :
sebastien@boiboite$ sudo chroot /var/chroots/monchroot /bin/bash sebastien@boiboite$ sudo /etc/init.d/rc 2
Pour éviter toute confusion, nommez votre chroot en écrivant son nom dans /etc/debian_chroot (dans le chroot), par défaut le prompt debian affiche son contenu au début de l'invite pour les utilisateurs non root.
Vous pouvez aptitude install ce que vous voulez (après avoir éventuellement configuré votre sources.list correctement). Voici un bon début :
boiboite:/# aptitude install locales vim less sudo screen boiboite:/# dpkg-reconfigure locales # sélectionner les locales appropriées
Attention : pour les applications réseau n'utilisez pas le même port sur l'hôte et dans le chroot (ce serait bête) ou utilisez deux IP distinctes (logique quoi).
Démarrage automatique
Nous allons maintenant configurer le système hôte pour qu'il lance le chroot au démarrage.
On commence par rendre nos mount permanent via la fstab (de l'hôte bien sûr) :
/proc /var/chroot/monchroot/proc none bind /dev /var/chroot/monchroot/dev none bind /dev/pts /var/chroot/monchroot/dev/pts none bind /sys /var/chroot/monchroot/sys none bind
Et on modifie /etc/inittab pour lancer le chroot :
hop0:2:wait:/usr/sbin/chroot /var/chroot/monchroot /etc/init.d/rc 2 >/dev/null
Syntaxe :
- hop0 : Identifiant de l'entrée (1 à 4 caractères, libre) ;
- 2 : runlevels auxquels l'entrée est prise en compte (le runlevel 2 est celui par défaut) ;
- wait : lance le process à l'entrée du runlevel 2 et init attend qu'il soit terminé avant de continuer
/usr/sbin/chroot /var/chroot/monchroot /etc/init.d/rc 2 >/dev/null: commande à lancer (on lance le runlevel 2 dans le chroot), cela revient à faire ce que l'on a fait à la main dans la première partie de l'article.
Voila, vous pouvez tout casser dans votre chroot sans aucune conséquence sur l'hôte. Formidable non ?