Fatmawati Achmad Zaenuri / Shutterstock.com
La 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é.
Lors des discussions avec les utilisateurs Linux – en personne et sur les forums – il semble que le chroot
est 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 dans le chroot
l’environnement est écrit et contenu. Rien dans le chroot
l’environnement 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 chroot
prison. Le terme «prison» ne doit pas être confondu avec FreeBSD jail
commande, qui crée un chroot
environnement c’est plus sûr que d’habitude chroot
environnement.
Mais en fait, il existe une manière très simple d’utiliser 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 à mettre en place chroot
environnements, tels que debootstrap pour Ubuntu, mais nous sommes indépendants de la distribution ici.
Quand devriez-vous utiliser un chroot?
UNE chroot
l’environnement 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, chroot
les environnements sont plus proches des 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 examinant comment vous allez utiliser votre chroot
environnement.
Certaines utilisations courantes sont:
Développement de logiciels et vérification de 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 de logiciels obsolètes. 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 chroot
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. Exécution d’un serveur FTP ou d’un autre appareil connecté à Internet dans un chroot
l’environnement 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 en tant que répertoire racine du chroot
environnement. 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
Si le répertoire n’existe pas, nous devons le créer. Nous pouvons le faire avec cette commande. La -p
L’option (parents) garantit que tous les répertoires parents manquants sont créés en même temps:
mkdir -p $chr
Nous devons créer des répertoires pour contenir les parties du système d’exploitation chroot
l’environnement exigera. Nous allons mettre en place un environnement Linux minimaliste qui utilise Bash comme shell interactif. Nous inclurons également le touch
, rm
, et ls
commandes. 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.
Répertoriez les répertoires que vous devez créer dans le {}
expansion des accolades.
mkdir -p $chr/{bin,lib,lib64}
Maintenant, nous allons changer de répertoire dans notre nouveau répertoire racine.
cd $chr
Copions les binaires dont nous avons besoin dans notre environnement Linux minimaliste de votre répertoire «/ bin» normal dans notre chroot
Répertoire «/ bin». La -v
(verbose) option rend cp
dites-nous ce qu’il fait pendant qu’il exécute chaque action de copie.
cp -v /bin/{bash,touch,ls,rm} $chr/bin
Les fichiers sont copiés pour nous:
Ces binaires auront des dépendances. Nous devons découvrir ce qu’ils sont et copier également les fichiers dans notre environnement, sinon bash
, touch
, rm
, et ls
ne pourra pas fonctionner. Nous devons le faire à tour de rôle pour chacune de nos commandes choisies. Nous ferons d’abord Bash. La ldd
commande va lister les dépendances pour nous.
ldd /bin/bash
Les dépendances sont identifiées et répertoriées dans la fenêtre du 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 introduire les résultats via un tube dans egrep
. En utilisant egrep
revient à utiliser grep
avec le -E
(expressions régulières étendues). La -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]')"
Nous pouvons vérifier le contenu de la liste en utilisant echo
:
echo $list
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 chroot
répertoire racine qui est la valeur contenue dans $chr
.
La -v
(verbose) cause cp
pour annoncer chaque copie au fur et à mesure de son exécution. La --parents
garantit que tous les répertoires parents manquants sont créés dans le chroot
environnement.
for i in $list; do cp -v --parents "$i" "${chr}"; done
Et voici le résultat:
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 rassemble les dépendances.
Nous pouvons récupérer la commande de notre historique des commandes en appuyant sur la touche Up Arrow
touchez plusieurs fois, puis effectuez la modification. La commande de copie en boucle n’a pas besoin de changer du tout.
Ici, nous avons utilisé le Up Arrow
clé 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]')"
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
Et nos fichiers sont copiés pour nous:
Nous pouvons maintenant modifier le list
ligne de commande pour ls
:
list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"
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
Et les dépendances pour ls
sont copiés pour nous:
Nous éditons le list
ligne de commande pour la dernière fois, ce qui le fait fonctionner pour rm
:
list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"
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 chroot
environnement. Nous sommes enfin prêts à utiliser le chroot
commander. Cette commande définit la racine du chroot
environnement, et spécifie quelle application exécuter en tant que shell.
sudo chroot $chr /bin/bash
Notre chroot
l’environnement est maintenant actif. L’invite de la fenêtre du terminal a changé et le shell interactif est géré par le bash
shell dans notre environnement.
Nous pouvons essayer les commandes que nous avons introduites dans l’environnement.
ls
ls /home/dave/Documents
La ls
La commande 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.
On peut 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
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
Utilisez la sortie pour quitter chroot
environnement:
exit
Si vous souhaitez supprimer le chroot
l’environnement, vous pouvez simplement le supprimer:
rm -r testroot/
Cela supprimera récursivement les fichiers et répertoires dans le chroot
environnement.
Automatisez pour plus de commodité
Si tu penses ça chroot
Les environnements peuvent vous être utiles, mais ils sont un peu fastidieux à mettre en place, rappelez-vous que vous pouvez toujours réduire la pression et le risque des tâches répétitives en utilisant des alias, des fonctions et des scripts.