GNU/Linux : comment emprisonner (« chroot/jail ») un utilisateur ?
Pour des raisons de sécurité vous souhaitez que les utilisateurs qui se connectent sur votre serveur (via un simple Shell ou par SSH par exemple) n’aient pas une vision complête de l’arborescence de vos répertoires, mais qu’ils soient en quelque-sorte « enfermés » dans une sous-arborescence totalement isolée, de telle sorte qu’ils ne puissent pas s’en échapper ? La mise en place d’un « chroot/jail » pour ces utilisateurs est faite pour vous.
Afin de mettre en place cela, je vous propose de suivre les étapes suivantes, construites à partir d’une compilation d’articles diffusés sur les sites web ci-dessous dont je remercie les auteurs :
http://linoxide.com/security/create-jailed-ssh-user-jailkit-debian/
http://www.marthijnvandenheuvel.com/2010/03/10/how-to-create-a-chroot-ssh-user-in-ubuntu/
http://ubuntuforums.org/showthread.php?t=248724
http://olivier.sessink.nl/jailkit/howtos_ssh_only.html
http://olivier.sessink.nl/jailkit/howtos_chroot_shell.html
http://ubuntuforums.org/showthread.php?t=1503138
https://lists.gnu.org/archive/html/jailkit-users/2012-06/msg00002.html
Un des outils magiques pour réaliser cela est « JailKit » (cf. http://olivier.sessink.nl/jailkit), qui livre plusieurs scripts automatisants la construction de cette prison (« jail ») et la mise dans cette prison d’un utilisateur donné.
Pré-Requis / Hypothèses de travail
- la plateforme d’expérimentation est une Ubuntu en version 14.04
- le répertoire qui accueille la prison est « /opt/jail »
- l’utilisateur qui sera « enfermé » dans cette prison se nomme « john »
Etapes
- installer « JailKit ».
cd /tmp tar zxvf jailkit-2.17.tar.gz cd jailkit-2.17
puis, pour une distrib Debian / Ubuntu,
./debian/rules binary cd .. dpkg -i jailkit_2.17-1_i386.deb
ou, pour une autre distrib
./configure;make;make install
- Créer le répertoire qui accueillera le « jail ».
mkdir /opt/jail chown root:root /opt/jail
- Initialiser les répertoires fonctionnels (pour info cf. le fichier /etc/jailkit/jk_init.ini)
jk_init -f -v /opt/jail basicshell jk_init -f -v /opt/jail editors jk_init -f -v /opt/jail extendedshell jk_init -f -v /opt/jail jk_lsh jk_init -f -v /opt/jail logbasics jk_init -f -v /opt/jail netbasics jk_init -f -v /opt/jail netutils jk_init -f -v /opt/jail scp jk_init -f -v /opt/jail ssh jk_init -f -v /opt/jail sftp jk_init -f -v /opt/jail ssh-keygen jk_init -f -v /opt/jail uidbasics
- Copier les binaires désirés (optionnel)
jk_cp -v -f /opt/jail /bin/bash jk_cp -v -f /opt/jail /bin/ls jk_cp -v -f /opt/jail /bin/ps jk_cp -v -f /opt/jail /bin/su jk_cp -v -f /opt/jail /etc/bash.bashrc jk_cp -v -f /opt/jail /usr/bin/cc jk_cp -v -f /opt/jail /etc/environment jk_cp -v -f /opt/jail /etc/profile jk_cp -v -f /opt/jail /etc/sudoers jk_cp -v -f /opt/jail /lib/x86_64-linux-gnu/libnss_compat.so.2 jk_cp -v -f /opt/jail /usr/bin/dircolors jk_cp -v -f /opt/jail /usr/bin/g++ jk_cp -v -f /opt/jail /usr/bin/gcc jk_cp -v -f /opt/jail /usr/bin/groups jk_cp -v -f /opt/jail /usr/bin/id jk_cp -v -f /opt/jail /usr/bin/irssi jk_cp -v -f /opt/jail /usr/bin/passwd jk_cp -v -f /opt/jail /usr/bin/perl jk_cp -v -f /opt/jail /usr/bin/pork jk_cp -v -f /opt/jail /usr/bin/python jk_cp -v -f /opt/jail /usr/bin/screen jk_cp -v -f /opt/jail /usr/bin/ssh jk_cp -v -f /opt/jail /usr/bin/ssh-keygen jk_cp -v -f /opt/jail /usr/bin/sudo jk_cp -v -f /opt/jail /usr/sbin/usermod jk_cp -v -f /opt/jail /usr/share/perl/5.10.0/strict.pm jk_cp -v -f /opt/jail /var/lib/pam/account jk_cp -v -f /opt/jail /var/lib/pam/auth jk_cp -v -f /opt/jail /var/lib/pam/password jk_cp -v -f /opt/jail /var/lib/pam/seen jk_cp -v -f /opt/jail /var/lib/pam/session
- Créer et enfermer l’utilisateur
adduser john jk_jailuser -m -j /opt/jail john
- Editer le fichier « passwd » du jail pour y mettre « bash » comme shell
vi /opt/jail/etc/passwd john:x:1006:1006::/home/john:/bin/bash
- Vérifier que le fichier « group » du jail est ok
vi /opt/jail/etc/group john:x:1006:
- Copier les fichiers « shadow » dans le jail (semble être optionnel)
jk_cp -v -f /opt/jail /etc/shadow jk_cp -v -f /opt/jail /etc/shadow-
- Créer le répertoire « /proc » dans le jail pour que la commande « ps » fonctionne
cd /opt/jail/ mkdir proc mount -t proc none /opt/jail/proc
- Mettre les permissions nécessaires dans le jail pour que la commande « sudo » fonctionne
chown root:root /opt/jail/usr/bin/sudo chmod 4755 /opt/jail/usr/bin/sudo chmod u+s /opt/jail/usr/bin/passwd
- Editer si nécessaire le fichier de config su shell limité « lsh » proposé par jail (cf. http://olivier.sessink.nl/jailkit pour plus d’infos)
vi /opt/jail/etc/jailkit/jk_lsh.ini #[test] #paths= /usr/lib/ #executables= /usr/lib/sftp-server #allow_word_expansion = 0 #umask = 002 # ##example for a group, there should be only 1 space inbetween the words! #[group users] #paths = /usr/bin #executables = /usr/bin/cvs #allow_word_expansion = 0 #environment= HELIX_PATH=/opt/RealPlayer/, TMP=/tmp/ [john] paths= /usr/bin executables= /usr/bin/ssh
- Editer si nécessaire le fichier de configuration du chroot de jail (cf. http://olivier.sessink.nl/jailkit pour plus d’infos)
vi /etc/jailkit/jk_chrootsh.ini ## example for a user #[john] #env= DISPLAY, XAUTHORITY # ##example for a group, there should be only 1 space inbetween the words! #[group users] #env = DISPLAY, XAUTHORITY, TERM [DEFAULT] env = TERM
- Redémarrer le démon de la socket « JailKit » (seulement si des fichiers de configuration de JailKit ont été modifiés)
killall jk_socketd ; jk_socketd
- ‘That’s all folks! » 🙂 vous pouvez désormais tester la connexion « chrootée » pour l’utilisateur « john »
On peut tester une connexion Shell
su john
Cela fonctionne également pour une connexion SSH (si on dispose d’un serveur SSH)
ssh john@votre_serveur
Dans les 2 cas, en se déplacant dans l’arborescence des répertoires, on constate que l’utilisateur « john » est emprisonné dans une arboresecence « virtuelle » à laquelle il ne peut pas échapper.
Remarque : pour mettre à jour de temps en temps les version de binaires de votre distribution Linux dans le jail, utiliser la commande suivante
jk_update -j /opt/jail
Attention : effectuer une sauvegarde au cas où avant d’effectuer cette modification