chroot : Environnements isolés sous Linux/Unix

chroot

chroot (change root) est une commande Unix/Linux historique qui permet de modifier la racine apparente du système de fichiers pour un processus et ses processus enfants. Créé dans les années 1980, c’est l’ancêtre des technologies de conteneurisation modernes.

Définition et concept

chroot est une opération système qui change le répertoire racine (/) d’un processus vers un nouveau répertoire. Le processus « chrooté » et ses descendants ne peuvent alors plus accéder aux fichiers en dehors de ce nouveau répertoire racine.

Principe de fonctionnement

Lorsqu’un processus est placé dans un environnement chroot, appelé « prison chroot » ou « jail » :

  • Le répertoire spécifié devient le nouveau / pour ce processus
  • Le processus ne peut plus remonter au-dessus de cette nouvelle racine
  • Les chemins absolus sont résolus par rapport à cette nouvelle racine
  • L’accès au reste du système de fichiers est impossible (en théorie)

Historique

Le concept de chroot a été introduit dans la version 7 d’Unix en 1979 par Bill Joy pour BSD Unix. L’objectif initial était de permettre le test de programmes dans un environnement isolé.

  • 1979 : Première implémentation dans BSD
  • 1982 : Intégration dans System III d’AT&T
  • Années 1990 : Adoption généralisée pour les serveurs FTP et web
  • Années 2000 : Base conceptuelle pour les conteneurs modernes

Syntaxe et utilisation

Commande de base

chroot NOUVEAU_RACINE [COMMANDE [ARGS…]]

Exemple pratique

Création d’un environnement chroot simple

# Créer la structure de répertoires mkdir -p /home/jail/{bin,lib,lib64} # Copier le shell bash cp /bin/bash /home/jail/bin/ # Copier les bibliothèques nécessaires ldd /bin/bash | grep -o ‘/lib.*\.[0-9]’ | xargs -I {} cp {} /home/jail/lib/ # Entrer dans le chroot sudo chroot /home/jail /bin/bash

Résultat : Un shell bash fonctionnant dans un environnement isolé où /home/jail est devenu la racine.

Cas d’usage courants

Sécurité des services

Isolation de services réseau pour limiter les dégâts en cas de compromission :

  • Serveurs FTP (vsftpd, ProFTPD)
  • Serveurs DNS (BIND)
  • Serveurs web (Apache, Nginx)
  • Serveurs SSH (sftp-only)

Exemple : Serveur SSH chrooté pour SFTP

# Dans /etc/ssh/sshd_config Match Group sftponly ChrootDirectory /home/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no

Développement et tests

  • Compilation de logiciels pour différentes distributions
  • Test d’installations sans affecter le système hôte
  • Création de builds reproductibles

Récupération système

Utilisation courante pour réparer un système Linux non bootable :

# Booter sur un Live CD/USB # Monter la partition système mount /dev/sda1 /mnt # Monter les systèmes de fichiers virtuels mount –bind /dev /mnt/dev mount –bind /proc /mnt/proc mount –bind /sys /mnt/sys # Chrooter dans le système chroot /mnt # Réparer GRUB, réinitialiser mot de passe, etc. update-grub passwd root

Gestion de paquets

  • Debian/Ubuntu : debootstrap crée des environnements chroot
  • Arch Linux : pacstrap pour l’installation
  • Gentoo : Construction depuis stage3 dans chroot

Création d’un environnement complet

Avec debootstrap (Debian/Ubuntu)

# Installer debootstrap apt-get install debootstrap # Créer un système Debian minimal debootstrap –arch=amd64 bookworm /home/debian-jail http://deb.debian.org/debian/ # Monter les systèmes virtuels mount –bind /dev /home/debian-jail/dev mount –bind /proc /home/debian-jail/proc mount –bind /sys /home/debian-jail/sys # Entrer dans l’environnement chroot /home/debian-jail /bin/bash

Configuration réseau dans le chroot

# Copier la configuration DNS cp /etc/resolv.conf /home/debian-jail/etc/ # Configurer le hostname echo « debian-jail » > /home/debian-jail/etc/hostname

Limitations et sécurité

⚠️ Important : chroot n’est PAS une solution de sécurité complète. Un utilisateur root peut s’échapper d’un chroot.

Vulnérabilités connues

  • Root escape : Un processus root peut créer des périphériques et remonter au système parent
  • Montage /proc : Permet d’accéder à des informations du système hôte
  • Partage du noyau : Le noyau reste commun avec le système hôte
  • Ressources non isolées : PID, réseau, IPC ne sont pas isolés

Exemple d’échappement

# Un utilisateur root peut s’échapper ainsi : mkdir /tmp/escape cd /tmp/escape chroot . /bin/sh cd ../../../../../ chroot . /bin/sh # Répéter jusqu’à atteindre la vraie racine

Bonnes pratiques de sécurisation

  • Ne jamais exécuter de processus root dans un chroot
  • Utiliser des utilisateurs non-privilégiés
  • Combiner avec d’autres mécanismes (SELinux, AppArmor)
  • Limiter les capabilities du processus
  • Surveiller les montages de systèmes de fichiers

Comparaison avec les technologies modernes

Caractéristique chroot Conteneurs (Docker/LXC) Machines virtuelles
Isolation système de fichiers ✓ Partielle ✓ Complète ✓ Complète
Isolation PID ✗ Non ✓ Oui (namespaces) ✓ Oui
Isolation réseau ✗ Non ✓ Oui (namespaces) ✓ Oui
Isolation ressources ✗ Non ✓ Oui (cgroups) ✓ Oui
Noyau séparé ✗ Non ✗ Non ✓ Oui
Performance Excellente Très bonne Bonne
Complexité Faible Moyenne Élevée
Overhead Minimal Faible Important

Évolution vers les conteneurs

chroot a posé les bases conceptuelles des conteneurs modernes. Linux a ensuite introduit :

  • Namespaces (2002) : Isolation PID, réseau, IPC, montage, UTS, utilisateurs
  • Cgroups (2006) : Limitation et comptabilisation des ressources
  • LXC (2008) : Premier système de conteneurs Linux
  • Docker (2013) : Popularisation des conteneurs

Avantages et inconvénients

✓ Avantages

  • Simplicité d’utilisation
  • Overhead minimal
  • Aucune dépendance externe
  • Idéal pour isolation basique
  • Utile pour récupération système
  • Compatible tous systèmes Unix/Linux

✗ Inconvénients

  • Sécurité limitée (root escape)
  • Pas d’isolation réseau
  • Pas d’isolation PID
  • Pas de limitation ressources
  • Configuration manuelle complexe
  • Obsolète pour production moderne

Outils utilisant chroot

Systèmes de build

  • pbuilder : Construction de paquets Debian dans un chroot propre
  • sbuild : Alternative à pbuilder
  • mock : Construction de RPM pour Fedora/RHEL

Déploiement

  • debootstrap : Création d’environnements Debian/Ubuntu
  • arch-chroot : Wrapper pratique pour Arch Linux
  • schroot : Gestion avancée de chroots multiples

💡 Note : La commande systemd-nspawn est considérée comme « chroot sous stéroïdes » et offre une meilleure isolation tout en restant plus simple que les conteneurs complets.

Pour finir

Bien que chroot soit une technologie ancienne (plus de 40 ans), elle reste pertinente aujourd’hui pour des usages spécifiques :

  • Récupération et maintenance de systèmes
  • Construction de paquets dans des environnements propres
  • Isolation basique de services non-critiques
  • Apprentissage des concepts d’isolation

Pour des besoins de production modernes nécessitant une véritable isolation et sécurité, les technologies de conteneurisation (Docker, Podman, LXC/LXD) ou de virtualisation sont préférables. Cependant, chroot demeure un outil fondamental dans la boîte à outils de tout administrateur Linux et conserve sa place pour des tâches spécifiques où sa simplicité est un atout.

Ressources complémentaires :

  • man chroot(1) et chroot(2)
  • Linux Namespaces : man namespaces(7)
  • Debian Wiki : chroot
  • Arch Wiki : Change root

Exposé technique sur chroot – Linux/Unix