Jouer avec Chroot

Gazette Linux n°161 — Avril 2009

Kamal Sawal Toure

Adaptation française  

Joëlle Cornavin

Relecture de la version française  

Article paru dans le n°161 de la Gazette Linux d'avril 2009.

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

Dans le noyau
Chroot dans Linux From Scratch
Un compilateur rapide
À propos de l'auteur

Il m'a fallu un peu de temps pour réaliser ce que fait vraiment chroot. J’ai finalement compris qu’elle permet d’exécuter une commande dans un système de fichiers dont la racine a été changée vers un autre répertoire spécifique. Normalement, seul root en est capable. [1]

Voici un rapide exemple :

Premièrement, j’ai utilisé ldd pour afficher les bibliothèques partagées dont a besoin mon bash :

libtermcap.so.2 => /lib/libtermcap.so.2
libdl.so.2 => /lib/libdl.so.2
libc.so.6 => /lib/libc.so.6
/lib/ld-linux.so.2 => /lib/ld-linux.so.2

J’ai ensuite créé un répertoire et y ai copié les fichiers :

myroot/bin:
ls bash
myroot/lib:
ld-linux.so.2 libc.so.6 libtermcap.so.2 libdl.so.2

ensuite, j’ai juste tapé :

chroot myroot /bin/bash
cd /
ls

Remarque : l’invite du bash dira sûrement « je n’ai pas de nom !  », étant donné qu’il n’y a pas de fichier /etc/passwd dans le système chrooté.

Dans le noyau

La commande chroot fait partie du paquetage shell utilities de GNU. Elle est toute petite  et elle appelle simplement la fonction de bibliothèque C, chroot() et exécute ensuite son deuxième argument (ou /bin/sh par défaut) avec la fonction C execyp(). Ici, elle utilise le PATH du shell, ou « /bin:/usr/bin » si le PATH n’est pas défini. La fonction de bibliothèque chroot est définie dans unistd.h :

CAP_SYS_CHROOT
/* Transformer le PATH en répertoire racine (le point de départ des chemins absolus).
Seul le  super-utilisateur peut appeler cette fonction   */
extern int chroot (__const char *__path)

Dans le noyau, on trouve la fonction « sys_chroot ». Elle vérifie uniquement la possibilité CAP_SYS_CHROOT. Ensuite, elle change simplement les champs « rootmnt » et « root » de la structure globale de « current->fs » en leur donnant le « dentry » du nom du fichier. Les autres lignes de code utilisent ces champs pour déterminer le répertoire racine. Regardez dans les sources du noyau les fichiers fs/open.c et fs/namespace.c (le nom de la fonction est 'set_fs_root') pour plus d'infos.

Chroot dans Linux From Scratch

chroot est une partie clé du projet Linux From Scratch (LFS), qui permet de compiler un système Linux fait à la main. La commande chroot là bas est en fait un peu plus complexe :

chroot "$LFS" /tools/bin/env -i \ 
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \ 
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ 
/tools/bin/bash --login +h 

L'option -i donne un environnement vide. Le hachage de bash est désactivé car nous allons changer l'emplacement des outils.

On peut voir comment chroot s'intègre dans le projet LFS tout entier. Une fois qu'on a configuré ce qu'il y a ci-dessus, on peut suivre les étapes suivantes :

  1. Créer une nouvelle partition et des répertoires de base (/lib, /bin, /usr, etc. )

  2. Compiler une nouvelle « chaîne d'outils » dans la partition, en y incluant binutils (l'assembleur et l'éditeur de liens), le compilateur gcc et le grand glibc (bibliothèque C).

  3. Recompiler gcc, en utilisant les options de la commande configure pour utiliser le nouvel éditeur de liens dynamiques du glibc. (d'habitude on fait configure, make , et make install quand on installe un programme à partir du code source. Essayons d'exécuter gcc -dumpspecs pour voir les options mystérieuses du compilateur)

  4. Recompiler binutils en utilisant l'option '--prefix' de configure pour utiliser le nouveau glibc.

  5. Compiler de nombreux outils comme bash, core/file utils, make, perl, et autres.

  6. FAITES UN CHROOT DANS LES RÉPERTOIRES DE LA NOUVELLE PARTITION !

  7. Recompiler glibc.

  8. Recompiler binutils et gcc en changeant les répertoires pour qu'ils correspondent au répertoire racine de chroot. Compiler à nouveau tous les outils.

  9. Compiler le noyau.

  10. Ajouter la nouvelle partition et le nouveau noyau dans le chargeur de démarrage.

Comme vous pouvez le voir, nous avons du compiler les outils de base 3 fois de suite ! Heureusement, il y a un autre projet LFS qui automatise ce processus, avec des scripts. Mieux encore, le projet « Beyond Linux from Scratch » nous montre comment ajouter encore plus d'outils comme des serveurs Web et les environnements de bureau KDE et GNOME.

Un compilateur rapide

Je suis actuellement en train de mettre sur pied un système LFS sur un vieux laptop qu'un ami m'a offert. J'ai commencé avec un noyau et quelques petits outils (fdisk, ls, cp, etc. ), que j'ai compilés et compressés de façon statique sur une disquette. J'y ai ensuite copié Damn Small Linux (DSL), disquette par disquette, avant de configurer une ligne ppp avec un câble série. DSL n'a pas de compilateur par défaut, et je voulais en avoir un rapidement. Le compilateur semblait être en conflit avec le système DSL (un vieux noyau 2.4 sans possibilité de « stockage des threads » utilisable par la bibliothèque C), j'ai donc créé un répertoire chroot avec juste de quoi compiler un simple programme « hello world ». J'ai ajouté les fichiers suivants. (Je pense que « crt » veut dire « C run-time » et que les fichiers « begin » représentent du code ajouté au début du programme ( ? ). Un « s » en préfixe ou en suffixe veut d'habitude dire qu'on utilise des bibliothèques. )


myroot/usr
|
+---include:
|       a.out.h ... xlocale.h
|
+---lib:
|       Mcrt1.o Scrt1.o crt1.o crti.o crtn.o gcrt1.o
|
+---local
    |
    +---bin:
    |       gcc
    |          
    +---i686-pc-linux-gnu
    |   |
    |   +---bin: 
    |   |       as ld
    |   |
    |   +---lib
    |       +---ldscripts:
    |               elf_i386.x ...
    |    
    +---lib:
    |   |   libgcc_s.so libgcc_s.so.1 libgmp.so.3 libmpfr.so.1
    |   |
    |   |---gcc
    |       +---i686-pc-linux-gnu
    |           +---4.3.2:
    |                   crtbegin.o crtbeginS.o ...
    |                   libgcc.a ... 
    |    
    +---libexec
        +---gcc
            +---i686-pc-linux-gnu
                +---4.3.2:
                        cc1 cc1plus collect2



[1] Une application commune de la commande chroot serait de faire tourner un serveur Web ou FTP dans un répertoire chrooté comme /home/www ou /home/ftp. Cela fournit une excellente couche de sécurité, étant donné qu'un utilisateur malicieux non-root qui arrive à pirater ce serveur est coincé dans un « système de fichiers » qui contient très peu d'outils voire aucun, qui ne contient pas non plus de fichiers utiles à part ceux qui sont déjà disponibles à l'affichage ou au téléchargement, et qui n'offre aucune possibilité de monter à un « niveau supérieur » à la racine de ce système de fichiers. Cela s'appelle une « prison chroot » . Remarquez cependant qu'il n'est pas sécurisé de permettre à un utilisateur de se connecter en tant que root dans votre compte chroot : root peut s'évader d'une prison chroot très facilement. Regardez les liens suivants pour plus d'informations : --Ben Okopnik

http://kerneltrap.org/Linux/Abusing_chroot.

http://unixwiz.net/techtips/chroot-practices.html.

http://www.bpfh.net/simes/computing/chroot-break.html .

À propos de l'auteur

Oscar Laycock

J'habite à River Thames dans la banlieue de Londres, en Angleterre. Pendant mon temps libre, je joue avec Linux sur un PC vieux de 10 ans. J'étais un programmeur sous C et sous Oracle quand j'étais plus jeune.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://www.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.