Aller au contenu

Le principe du chroot

En une phrase

chroot (change root) fait croire à un programme que le dossier choisi est la racine / du système. Il ne peut alors plus voir, ni atteindre, le reste de l'arborescence.

1. L'idée de départ

Sous Linux, tout est organisé en une seule arborescence qui part de la racine /. Un programme qui s'exécute voit cette arborescence et peut, selon ses droits, lire et écrire n'importe où.

chroot modifie, pour un processus et ses enfants, ce que signifie / :

Système réel                      Vue depuis le chroot
/                                 /          (en réalité /mnt)
├── bin                           ├── bin    (en réalité /mnt/bin)
├── etc                           ├── etc    (en réalité /mnt/etc)
├── home                          ├── home   (en réalité /mnt/home)
└── mnt   ← dossier choisi        └── ...
    ├── bin
    ├── etc
    └── home

Pour le programme enfermé, /etc/passwd désigne en réalité /mnt/etc/passwd. Tout ce qui se trouve au-dessus de /mnt lui est devenu inaccessible : il ne sait même pas que cela existe.

2. Ce que fait vraiment chroot

  • C'est un appel système du noyau (chroot(2)), et aussi la commande du même nom qui l'utilise.
  • Le noyau mémorise, pour chaque processus, où se trouve sa racine. Les enfants héritent de cette racine.
  • Les chemins absolus (/bin/sh) et les chemins relatifs qui tentent de remonter (../..) sont résolus à partir de cette racine : on ne peut pas « sortir par le haut ».

3. Pourquoi on parle d'isolation

Ce qui est isolé : la vue du système de fichiers.

Dans un chroot :

  • les programmes n'utilisent que les bibliothèques et les fichiers présents dans le dossier choisi ;
  • on peut y installer une autre version d'un logiciel, voire une autre distribution, sans toucher au système hôte ;
  • une erreur de manipulation (un rm -rf / par exemple) reste cantonnée au dossier du chroot.

Isolation partielle seulement

Le chroot n'isole que les fichiers. Le programme enfermé :

  • partage le même noyau que le système hôte ;
  • voit les mêmes processus (si /proc est monté) ;
  • partage le même réseau ;
  • garde le même utilisateur (donc root reste root).

Le chroot n'est pas une barrière de sécurité

Un processus qui dispose des droits root dans un chroot peut, dans bien des cas, s'en échapper. Le chroot a été conçu pour changer d'environnement, pas pour enfermer un programme hostile. Pour cet usage, on s'appuie sur des mécanismes plus complets (voir section 7).

4. Un chroot vide ne sert à rien

Une fois enfermé, un programme n'a plus accès à /bin, /lib, /etc du système hôte. Le dossier choisi doit donc contenir tout ce dont le programme a besoin : l'interpréteur, les bibliothèques partagées, les fichiers de configuration.

C'est pourquoi on y place soit :

  • un système complet, comme dans le cas d'une partition Linux montée sous /mnt (usage de dépannage) ;
  • un système minimal, construit avec debootstrap ou avec un binaire statique comme busybox.

5. Pourquoi monter /dev, /proc, /sys et /run

Le dossier choisi est un simple dossier sur le disque. Il ne contient pas les systèmes de fichiers virtuels fournis par le noyau :

Dossier Rôle Pourquoi dans le chroot
/dev Les périphériques (disques, terminaux, null…) De nombreux programmes écrivent vers /dev/null ou lisent /dev/urandom
/proc Informations sur les processus et le noyau ps, mount et d'autres outils en dépendent
/sys Informations sur le matériel Nécessaire aux outils système et au chargeur de démarrage
/run Données d'exécution (sockets, fichiers PID) Utilisé par les services et certains outils

On les rend visibles dans le chroot avec un montage lié (bind mount), qui montre un même dossier à deux endroits :

mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /run /mnt/run

Note

Pour un simple changement de mot de passe, tous ces montages ne sont pas toujours indispensables. En revanche, pour réinstaller GRUB ou mettre à jour des paquets depuis un chroot, ils le deviennent.

6. Usages courants

  • Dépannage : réinitialiser un mot de passe, réparer GRUB, corriger un fichier de configuration d'un système qui ne démarre plus (voir la fiche Récupérer l'accès administrateur sous Linux).
  • Construire un système : c'est le principe de Linux From Scratch et de l'installation d'Arch Linux ou de Gentoo, où l'on travaille dans le futur système avant de le faire démarrer.
  • Compiler des paquets dans un environnement propre, avec les seules dépendances voulues.
  • Faire tourner un ancien logiciel qui exige une vieille version de bibliothèques.

7. Aller plus loin : chroot, conteneurs

Le chroot est l'ancêtre des conteneurs. Les conteneurs (Docker, Podman, LXC) reprennent l'idée de changer de racine, puis y ajoutent :

Mécanisme Ce qu'il isole
Espace de noms de fichiers (mount namespace) La vue des systèmes de fichiers, de façon bien plus robuste que chroot
Espace de noms de processus (PID namespace) Les processus visibles
Espace de noms réseau (network namespace) Les interfaces et le réseau
Espace de noms utilisateur (user namespace) Les identifiants : root dans le conteneur n'est pas root sur l'hôte
cgroups Les ressources (processeur, mémoire)

À retenir

  • chroot : « change ta vue des fichiers » — pratique, léger, mais peu sûr.
  • conteneur : « vis dans un mini-système séparé » — isole fichiers, processus, réseau, utilisateurs et ressources.

8. Essayer soi-même

Un exemple minimal, sans système complet, avec busybox (binaire statique, qui n'a besoin d'aucune bibliothèque).

# Installation (Debian, Ubuntu)
sudo apt install busybox-static

# Création du dossier et copie du binaire
mkdir -p ~/prison/bin
cp /bin/busybox ~/prison/bin/

# Création de quelques commandes
cd ~/prison/bin
for c in sh ls cat pwd; do ln -s busybox $c; done
cd ~

# Entrée dans le chroot
sudo chroot ~/prison /bin/sh

Une fois à l'intérieur :

ls /         # on ne voit que "bin"
pwd          # affiche "/"
cat /etc/passwd   # erreur : le fichier n'existe pas ici
exit         # retour au système normal

Ce qu'on constate

Le programme croit être à la racine d'un système qui ne contient que bin. Le reste du disque est devenu invisible pour lui.

Pour obtenir un vrai système Debian dans un dossier :

sudo apt install debootstrap
sudo debootstrap stable ~/debian-chroot http://deb.debian.org/debian
sudo chroot ~/debian-chroot

Résumé

Question Réponse
Que fait chroot ? Change la racine / vue par un processus et ses enfants
Qu'est-ce qui est isolé ? La vue des fichiers uniquement
Qu'est-ce qui ne l'est pas ? Noyau, processus, réseau, utilisateurs
Est-ce sûr contre un programme hostile ? Non
À quoi sert-il ? Dépannage, construction de systèmes, environnements de compilation
Quel est son successeur ? Les conteneurs (espaces de noms et cgroups)