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.
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 à 10h49Ajouter un commentaire
Flux RSS des commentaires de cet article.
Commentaires
Gérald a répondu le Permalien
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.
Stéphane a répondu le Permalien
Idem pour moi.
Cyp a répondu le Permalien
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.
Cyp a répondu le Permalien
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.
Cyp a répondu le Permalien
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 !