Chroot ton shell avec Jailkit

Dernière mise à jour de l'article : 21/04/2020.

chroot est une commande de base du projet GNU permettant de changer le répertoire racine apparent d'un processus.

Il y a deux avantages à cette pratique. Tout d'abord, le processus est isolé dans son environnement et ne peut pas, a priori, porter atteinte au reste du système d'exploitation. Ensuite, il est possible de choisir les programmes présents dans l'environnement afin d'en restreindre l'usage. Cela peut être utile dans bien des cas, par exemple pour permettre un accès SSH restreint à l'espace disque d'un hébergement web mutualisé.

Jailkit est un ensemble d'outils permettant de limiter facilement le shell d'un utilisateur — ou d'un démon — dans un environnement cloisonné de type chroot. Ce tutoriel n'a pas vocation à présenter toutes les possibilités offertes par le programme mais d'en donner un aperçu par le biais d'un exemple concret. L'objectif est de créer un environnement isolé basique et d'y enfermer un nouvel utilisateur, le tout sur une distribution Debian GNU/Linux.

Logo de Jailkit
Logo de Jailkit

Informations techniques

Nom du programme : Jailkit
Version utilisée : 2.21
Licences : GNU LGPL v2
Auteur : Olivier Sessink
Site web de l'auteur : http://olivier.sessink.nl
Site web du programme : http://olivier.sessink.nl/jailkit

Distribution utilisée : Debian GNU/Linux 10.3 « Buster »

chroot (article Wikipédia) : https://fr.wikipedia.org/wiki/Chroot

Installation de Jailkit

L'installation du programme est facilitée par sa présence dans le dépôt officiel buster-backports. Il faut commencer par se connecter à la machine sur laquelle installer Jailkit, et activer le dépôt mentionné. Les étapes suivantes sont énoncées ci-dessous.

Se connecter en tant que super-utilisateur :

su -

Éditer le fichier sources.list :

vim /etc/apt/sources.list

Ajouter la ligne suivante pour activer le dépôt buster-backports :

deb http://deb.debian.org/debian buster-backports main

Actualiser la liste des paquets :

apt update

Installer Jailkit :

apt install -t buster-backports jailkit

Préparation de l'environnement isolé

Créer le répertoire racine de l'environnement :

mkdir /home/jail

L'initialiser :

jk_init -v -j /home/jail limitedshell basicshell

Là, je dois quelques explications. Par défaut, l'environnement isolé ne dispose d'aucune fonctionnalité. Il est possible d'ajouter des commandes une à une via jk_cp ou de définir des profils d'utilisation regroupant des packs de commandes. Ceux-ci se configurent dans le fichier /etc/jailkit/jk_init.ini — au format INI. Chaque section représente un jeu de fonctionnalités que l'on peut ajouter à l'environnement. Cela peut être des commandes, des fichiers ou des périphériques. Une section peut dépendre d'autres ; si bien qu'en activant l'une, les autres sont également ajoutées. Le fichier jk_init.ini dispose déjà de nombreuses sections. Il est bien évidemment possible de le compléter afin de répondre au mieux à ses besoins.

Ainsi, la section basicshell utilisée lors de la dernière étape ajoute les commandes usuelles d'un système de type Unix (ls, mv, cp, rm...).

La section uidbasics mérite une attention particulière car elle inclue des bibliothèques qui dépendent de l'architecture matérielle. Pas de problème pour un système 32 ou 64 bits standard, mais il faudra penser à la compléter pour des architectures plus « exotiques » — de type ARM, par exemple.

Il est fortement conseiller de parcourir attentivement le fichier jk_init.ini afin d'identifier précisément les pouvoirs alloués. Par exemple, la section netutils ajoute à l'environnement isolé les commandes wget et rsync — et quelques autres — ainsi que l'ensemble des sections netbasics, ssh, sftp et scp qui apportent à leur tour tout un lot de fonctionnalités et de dépendances. Pour ajouter à notre environnement la section netutils — et tout ce qui en découle — il faut exécuter la commande suivante :

jk_init -v -j /home/jail netutils

Lorsqu'on ajoute une commande à l'environnement, Jailkit copie la version correspondante depuis le système hôte. Il est donc nécessaire que la commande soit déjà installée sur le système avant d'essayer de la dupliquer. Par ailleurs, il peut arriver que le système hôte profite de mises à jour logicielles. Afin de tenir également l'environnement isolé à jour, il est nécessaire d'utiliser la commande jk_update.

Enfin, il est possible qu'un processus ou un utilisateur ait besoin d'un répertoire /tmp. Il peut s'avérer utile de le créer en lui attribuant les droits correspondants :

mkdir -m a=rwx /home/jail/tmp

Isolement d'un utilisateur

Attention

À cause d'un bug de Jailkit, le nom de l'utilisateur qu'il est suggéré de créer ci-dessous ne doit pas commencer comme le nom du répertoire de l'environnement isolé sous peine de ne pouvoir se connecter par la suite au nouveau compte utilisateur sans une intervention manuelle. Par exemple, si le répertoire est /home/jail, il vaut mieux éviter de nommer le nouvel utilisateur jailalice.

L'environnement isolé est désormais prêt à être utilisé. Nous pouvons créer un nouvel utilisateur :

adduser JAIL_USER

Puis lui imposer l'usage de l'environnement restreint grâce à la commande suivante. À noter que celle-ci se charge de déplacer le répertoire utilisateur dans l'arborescence cloisonnée :

jk_jailuser -m -j /home/jail JAIL_USER

Définir Bash comme shell de l'utilisateur dans son nouvel environnement :

sed -i "/JAIL_USER/ s/\/usr\/sbin\/jk_lsh/\/bin\/bash/" /home/jail/etc/passwd

Il est intéressant de remarquer que plusieurs utilisateurs peuvent se partager le même environnement isolé, ainsi que plusieurs environnements différents peuvent aussi coexister. Cela peut s'avérer pratique pour faire tourner plusieurs instances d'un même service sur le même hôte, par exemple.

Se déconnecter :

exit

Il est désormais possible de se connecter avec le nouvel utilisateur, localement ou par SSH.

Voici à quoi ressemble la racine de l'environnement telle qu'est est vue par ce nouvel utilisateur :

JAIL_USER@HOSTNAME:~$ ls -l /
total 20
lrwxrwxrwx 1 root root    7 Apr 21 16:05 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 21 16:05 dev
drwxr-xr-x 3 root root 4096 Apr 21 16:06 etc
drwxr-xr-x 3 root root 4096 Apr 21 16:06 home
lrwxrwxrwx 1 root root    7 Apr 21 16:05 lib -> usr/lib
lrwxrwxrwx 1 root root    9 Apr 21 16:05 lib64 -> usr/lib64
drwxrwxrwx 2 root root 4096 Apr 21 16:05 tmp
drwxr-xr-x 7 root root 4096 Apr 21 16:05 usr

Pour aller plus loin, il est fortement recommandé de lire le manuel et le site web de Jailkit. Les options ne sont pas nombreuses et le fonctionnement somme toute assez logique. L'outil n'est pas très difficile à prendre en main et les services qu'il peut rendre sont multiples. Attention toutefois, la sécurité du système n'est pas absolue et un environnement mal configuré peut présenter de grands risques pour le système hôte !

Article sous licence Creative Commons BY-SA 3.0 France.

Publié le

Mercredi 11 février 2015 à 10h49

Commentaires

Bonjour,

Est-il normal que ma fenêtre Putty, DOS ou KVM se referme instantanément lorsque je valide mon utilisateur se trouvant dans le jail ?

Merci.

Ma légendaire réactivité m'oblige ici à répondre au plus vite... Hum, hum.

Oui, c'est peut-être normal s'il manque des bibliothèques indispensables au shell dans le fichier jk_init.ini. Par défaut, le fichier n'est pas adapté à une distribution GNU/Linux particulière, il faut donc s'en charger manuellement en fonction des besoins. Souvent, il est assez facile d'identifier les problèmes en inspectant les journaux systèmes. Néanmoins, théoriquement, mon tutoriel devrait être fonctionnel pour Debian. Je lance une machine virtuelle de test et je regarde ça.

À noter que ce tutoriel est quelque-peu obsolète — tout du moins dans la description de l'installation de Jailkit — étant donné que le paquet est désormais disponible dans les dépôts Debian ! Il va me falloir mettre l'article à jour. Du coup, cela résout peut-être directement votre problème étant donné que le paquet Debian doit certainement avoir été adapté pour fonctionner immédiatement. Je vais tester ça aussi.

OK, problème identifié. C'est assez sioux. C'est un problème dû à Jailkit. J'ai ouvert un ticket sur la forge de développement pour le faire corriger (cf. https://savannah.nongnu.org/bugs/index.php?58213).

Il ne faut pas que l'utilisateur à emprisonner commence par le même mot que le répertoire de la prison. Par exemple, si le répertoire de la prison est /home/jail comme c'est le cas dans mon tutoriel, il ne faut pas que l'utilisateur s'écrive jailquelquechose. Dans ce cas, le répertoire utilisateur calculé par Jailkit est quelquechose, pas /home/jailquelquechose. Cela empêche la connexion à cet utilisateur. Pour corriger cela, il faut rétablir le bon répertoire dans le fichier /home/jail/etc/password en remplaçant quelquechose par /home/jailquelquechose.

Ou bien, plus simplement, utiliser un autre nom d'utilisateur — qui ne commence pas par jail — dès le début. Ou utiliser un autre nom de répertoire pour la prison ; bref, vous avez compris l'idée.

Après l'avoir essayé, je confirme que le paquet Debian s'installe très bien depuis les dépôts buster-backports. Ça fait une étape en moins. Par contre, évidemment, le bug sus-nommé est toujours présent. Je mettrai bientôt le tutoriel à jour afin de tenir compte de ces changements.

Édit : article mis à jour ! Smile

Ajouter un commentaire

HTML filtré

  • Balises HTML autorisées : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <p>
  • Textual smiley will be replaced with graphical ones.
  • Les adresses de pages web et de courriels sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Texte brut

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de courriels sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Flux RSS des commentaires de cet article.