Comment utiliser la commande chroot sous Linux

La commande chroot peut vous envoyer en prison, isoler vos environnements de développement ou de test, ou simplement améliorer la sécurité de votre système. Nous vous montrons la manière la plus simple de l’utiliser.

Qu’est-ce qu’un chroot?

Si vous essayez de mesurer l’utilité d’une commande, vous devez prendre en compte les fonctionnalités qu’elle fournit et sa facilité d’utilisation. S’il est trop compliqué à utiliser pour les gens ou trop long pour leur donner envie d’essayer de l’utiliser, la fonctionnalité pourrait tout aussi bien être nulle. Si personne ne l’utilise, il ne fournit aucune fonctionnalité.

Dans les discussions avec les utilisateurs de Linux – en personne et sur les forums – il semble que la commande chroot soit une commande qui est considérée comme difficile à utiliser, ou trop perspicace et fastidieuse à configurer. Il semble que cet utilitaire formidable ne soit pas utilisé autant qu’il pourrait l’être.

Avec chroot, vous pouvez configurer et exécuter des programmes ou des shells interactifs comme Bash dans un système de fichiers encapsulé qui ne peut pas interagir avec votre système de fichiers normal. Tout ce qui se trouve dans l’environnement chroot est écrit et contenu. Rien dans l’environnement chroot ne peut voir au-delà de son propre répertoire racine spécial sans passer aux privilèges root. Cela a valu à ce type d’environnement le surnom de prison chroot. Le terme «prison» ne doit pas être confondu avec FreeBSD commande jail, qui crée un environnement chroot c’est plus sûr que l’environnement chroot habituel.

Mais en fait, il existe une manière très simple d’utiliser le chroot, que nous allons parcourir. Nous utilisons des commandes Linux régulières qui fonctionneront sur toutes les distributions. Certaines distributions Linux ont des outils dédiés pour configurer des environnements chroot, tels que debootstrap pour Ubuntu, mais nous sommes indépendants de la distribution ici.

Quand devriez-vous utiliser un chroot?

Un environnement chroot fournit des fonctionnalités similaires à celles d’une machine virtuelle, mais c’est une solution plus légère. Le système captif n’a pas besoin d’un hyperviseur pour être installé et configuré, tel que VirtualBox ou Gestionnaire de machine virtuelle. Il n’est pas non plus nécessaire d’installer un noyau dans le système captif. Le système captif partage votre noyau existant.

Dans certains sens, les environnements chroot sont plus proches de conteneurs tels que LXC qu’aux machines virtuelles. Ils sont légers, rapides à déployer, et leur création et leur mise en route peuvent être automatisées. Tout comme les conteneurs, un moyen pratique de les configurer consiste à installer juste assez de système d’exploitation pour que vous puissiez accomplir ce qui est requis. La question «ce qui est requis» est répondue en regardant comment vous allez utiliser votre environnement chroot.

  Comment afficher les paroles de chansons sur un iPhone, iPad, Mac ou Apple TV

Certaines utilisations courantes sont:

Développement de logiciels et vérification des produits. Les développeurs écrivent des logiciels et l’équipe de vérification des produits (PV) les teste. Parfois, des problèmes sont détectés par PV qui ne peuvent pas être répliqués sur l’ordinateur du développeur. Le développeur a toutes sortes d’outils et de bibliothèques installés sur son ordinateur de développement que l’utilisateur moyen – et PV – n’aura pas. Souvent, un nouveau logiciel qui fonctionne pour le développeur mais pas pour les autres s’avère utiliser une ressource sur le PC du développeur qui n’a pas été incluse dans la version de test du logiciel. chroot permet aux développeurs d’avoir un environnement captif pur et simple sur leur ordinateur dans lequel ils peuvent plonger le logiciel avant de le donner à PV. L’environnement captif peut être configuré avec les dépendances minimales requises par le logiciel.

Réduire les risques de développement. Le développeur peut créer un environnement de développement dédié afin que rien de ce qui s’y passe ne puisse gâcher son PC réel.

Exécution d’un logiciel obsolète. Parfois, vous devez simplement avoir une ancienne version de quelque chose en cours d’exécution. Si l’ancien logiciel a des exigences qui entreraient en conflit ou seraient incompatibles avec votre version de Linux, vous pouvez chrooter un environnement pour le logiciel problématique.

Récupération et mises à niveau du système de fichiers: Si une installation Linux devient inopérante, vous pouvez utiliser chroot pour monter le système de fichiers endommagé sur un point de montage sur un Live CD. Cela vous permet de travailler dans le système endommagé et d’essayer de le réparer comme s’il était monté normalement à root /. Cela signifie que les chemins de fichiers attendus dans le système endommagé seront correctement référencés à partir du répertoire racine, et non à partir du point de montage du Live CD. Une technique similaire a été utilisée dans l’article décrivant comment migrer le système de fichiers Linux d’ext2 ou ext3 vers ext4.

Applications de Ringfencing. L’exécution d’un serveur FTP ou d’un autre appareil connecté à Internet dans un environnement chroot limite les dommages qu’un attaquant externe peut causer. Cela peut être une étape précieuse pour renforcer la sécurité de votre système.

Créer un environnement chroot

Nous avons besoin d’un répertoire pour agir comme répertoire racine de l’environnement chroot. Pour que nous ayons une manière abrégée de faire référence à ce répertoire, nous allons créer une variable et y stocker le nom du répertoire. Ici, nous mettons en place une variable pour stocker un chemin vers le répertoire «testroot». Peu importe si ce répertoire n’existe pas encore, nous allons le créer bientôt. Si le répertoire existe, il doit être vide.

chr=/home/dave/testroot

chr = / home / dave / testroot dans une fenêtre de terminal

Si le répertoire n’existe pas, nous devons le créer. Nous pouvons le faire avec cette commande. L’option -p (parents) garantit que tous les répertoires parents manquants sont créés en même temps:

mkdir -p $chr

mkdir -p $ chr dans une fenêtre de terminal

Nous devons créer des répertoires pour contenir les parties du système d’exploitation dont notre environnement chroot aura besoin. Nous allons mettre en place un environnement Linux minimaliste qui utilise Bash comme shell interactif. Nous inclurons également les commandes touch, rm et ls. Cela nous permettra d’utiliser toutes les commandes intégrées de Bash et touch, rm et ls. Nous pourrons créer, lister et supprimer des fichiers et utiliser Bash. Et – dans cet exemple simple – c’est tout.

  Vérifiez si votre image de profil LinkedIn est bonne ou doit être améliorée

Répertoriez les répertoires que vous devez créer dans {} expansion des accolades.

mkdir -p $chr/{bin,lib,lib64}

mkdir -p $ chr / {bin, lib, lib64} dans une fenêtre de terminal

Maintenant, nous allons changer de répertoire dans notre nouveau répertoire racine.

cd $chr

cd $ chr dans une fenêtre de terminal

Copions les binaires dont nous avons besoin dans notre environnement Linux minimaliste de votre répertoire «/ bin» normal dans notre répertoire chroot «/ bin». L’option -v (verbose) fait que cp nous indique ce qu’il fait pendant qu’il effectue chaque action de copie.

cp -v /bin/{bash,touch,ls,rm} $chr

cp -v / bin / {bash, touch, ls, rm} $ chr dans une fenêtre de terminal

Les fichiers sont copiés pour nous:

sortie de cp lorsque les fichiers sont copiés dans une fenêtre de terminal

Ces binaires auront des dépendances. Nous devons découvrir ce qu’ils sont et copier ces fichiers dans notre environnement également, sinon bash, touch, rm et ls ne pourront pas fonctionner. Nous devons le faire à tour de rôle pour chacune de nos commandes choisies. Nous ferons d’abord Bash. La commande ldd lister les dépendances pour nous.

ldd /bin/bash

ldd / bin / bash dans une fenêtre de terminal

Les dépendances sont identifiées et répertoriées dans la fenêtre du terminal:

Dépendances Bash répertoriées dans une fenêtre de terminal

Nous devons copier ces fichiers dans notre nouvel environnement. Récupérer les détails de cette liste et les copier un à la fois prendra du temps et sera source d’erreurs.

Heureusement, nous pouvons le semi-automatiser. Nous listerons à nouveau les dépendances, et cette fois nous formerons une liste. Ensuite, nous allons parcourir la liste en copiant les fichiers.

Ici, nous utilisons ldd pour lister les dépendances et envoyer les résultats via un tube dans egrep. Utiliser egrep revient à utiliser grep avec l’option -E (expressions régulières étendues). L’option -o (correspondance uniquement) limite la sortie aux parties de lignes correspondantes. Nous recherchons des fichiers de bibliothèque correspondants qui se terminent par un numéro [0-9].

list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"

liste =

Nous pouvons vérifier le contenu de la liste en utilisant echo:

echo $list

echo $ list dans une fenêtre de terminal

Maintenant que nous avons la liste, nous pouvons la parcourir avec la boucle suivante, en copiant les fichiers un par un. Nous utilisons la variable i pour parcourir la liste. Pour chaque membre de la liste, nous copions le fichier dans notre répertoire racine chroot qui est la valeur contenue dans $ chr.

L’option -v (verbose) oblige cp à annoncer chaque copie pendant qu’il l’exécute. L’option –parents garantit que tous les répertoires parents manquants sont créés dans l’environnement chroot.

for i in $list; do cp -v --parents "$i" "${chr}"; done

pour i dans $ list; do cp -v --parents

Et voici le résultat:

sortie de la boucle cp dans une fenêtre de terminal

Nous utiliserons cette technique pour capturer les dépendances de chacune des autres commandes. Et nous utiliserons la technique de la boucle pour effectuer la copie réelle. La bonne nouvelle est que nous n’avons qu’à apporter une petite modification à la commande qui regroupe les dépendances.

  Comment empaqueter un script AHK en tant qu'exe sur Windows 10

Nous pouvons récupérer la commande de notre historique des commandes en appuyant plusieurs fois sur la touche Flèche vers le haut, puis effectuer la modification. La commande de copie en boucle n’a pas du tout besoin de changer.

Ici, nous avons utilisé la touche Flèche vers le haut pour trouver la commande, et nous l’avons modifiée pour dire touch au lieu de bash.

list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"

liste =

Nous pouvons maintenant répéter exactement la même commande de boucle que précédemment:

for i in $list; do cp -v --parents "$i" "${chr}"; done

pour i dans $ list; do cp -v --parents

Et nos fichiers sont copiés pour nous:

sortie de la boucle cp copiant les dépendances tactiles dans une fenêtre de terminal

Nous pouvons maintenant éditer la ligne de commande de la liste pour ls:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

liste =

Encore une fois, nous utiliserons la même commande de boucle. Peu importe quels fichiers sont dans la liste. Cela fonctionne aveuglément à travers la liste en copiant les fichiers pour nous.

for i in $list; do cp -v --parents "$i" "${chr}"; done

pour i dans $ list; do cp -v --parents

Et les dépendances pour ls sont copiées pour nous:

Sortie de la boucle cp copiant les dépendances ls dans une fenêtre de terminal

Nous éditons la ligne de commande de la liste pour la dernière fois, ce qui la fait fonctionner pour rm:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

liste =

Nous utilisons la commande de copie en boucle une dernière fois:

for i in $list; do cp -v --parents "$i" "${chr}"; done

La dernière de nos dépendances est copiée dans notre environnement chroot. Nous sommes enfin prêts à utiliser la commande chroot. Cette commande définit la racine de l’environnement chroot et spécifie l’application à exécuter en tant que shell.

sudo chroot $chr /bin/bash

sudo chroot $ chr / bin / bash dans une fenêtre de terminal

Notre environnement chroot est maintenant actif. L’invite de la fenêtre du terminal a changé et le shell interactif est géré par le shell bash dans notre environnement.

Environnement chroot actif dans une fenêtre de terminal

Nous pouvons essayer les commandes que nous avons introduites dans l’environnement.

ls
ls /home/dave/Documents

Environnement chroot actif dans une fenêtre de terminal

La commande ls fonctionne comme prévu lorsque nous l’utilisons dans l’environnement. Lorsque nous essayons d’accéder à un répertoire en dehors de l’environnement, la commande échoue.

Nous pouvons utiliser touch pour créer un fichier, ls pour le lister et rm pour le supprimer.

touch sample_file.txt
ls
rm sample_file.txt
ls

touchez sample_file.txt dans une fenêtre de terminal

Bien sûr, nous pouvons également utiliser les commandes intégrées fournies par le shell Bash. Si vous tapez help sur la ligne de commande, Bash les listera pour vous.

help

Sortie de la commande d'aide dans une fenêtre de terminal

Utilisez exit pour quitter l’environnement chroot:

exit

utiliser exit pour quitter l'environnement chroot dans une fenêtre de terminal

Si vous souhaitez supprimer l’environnement chroot, vous pouvez simplement le supprimer:

rm -r testroot/

rm -r testroot / dans une fenêtre de terminal

Cela supprimera récursivement les fichiers et répertoires dans l’environnement chroot.

Automatisez pour plus de commodité

Si vous pensez que les environnements chroot pourraient vous être utiles, mais qu’ils sont un peu fastidieux à mettre en place, rappelez-vous que vous pouvez toujours alléger et éviter les tâches répétitives en utilisant des alias, des fonctions et des scripts.