Emprisonner un utilisateur ssh sous linux

Emprisonner un utilisateur ssh sous linux
Jérémie Kassianoff
23 février 2014
9 min de lecture

Comprendre la technique du chroot/jail sous linux. Des accès restreints pour vos utilisateurs en SSH. Utilisez le Jailkit ou le script fuschlberger!

Cas d'usage concret

Vous devez restreindre un utilisateur SSH à un périmètre précis : voici comment mettre en place un chroot/jail sous Linux.

Emprisonner un utilisateur

Des projets communs peuvent amener parfois à donner des accès sur un serveur de production.
Il est difficile de donner l’accès total du système à une société externe (confidentialité/sécurité).
Pour palier ce problème il existe le chroot/jail ou l’emprisonnement d’un utilisateur dans un dossier.
La vision complète de l’arborescence du serveur ne sera plus disponible pour cet utilisateur.
L’emprisonnement de celui-ci permet :

  • Une flexibilité accrue.
  • Une sécurité supplémentaire.
  • Fournir des accès plus facilement.

Création d’un environnement fermé

La compréhension des étapes générales dans la création d’un chroot/jail sont importantes :

  1. Création d’un utilisateur sur le système.
  2. Création de l’arborescence du répertoire prison.
  3. Ajouter un interpréteur de commandes.
  4. Montage de device (optionnel).
  5. Modification de certains fichiers « /etc/« .
  6. Création d’une fonction dit wrapper.
  7. Ajout des droits au fichier.
  8. Ajout de commandes supplémentaire.

Pour plus d’informations sur la création d’un environnement pas à pas « chroot/jail » sur léa-linux.
Cette méthode est relativement longue, nous allons plutôt utiliser des scripts déjà existants.
Les scripts que nous allons utiliser seront le Jailkit etfuschlberger script sous Debian 7 x64.

Le premier est un script clé en main toujours développé et plus évolué tandis que le second est vieillissant mais fonctionne tout aussi bien mais avec plus de difficultés sous la version 64 bits.
Plus d’informations sur le site officiel du jailkit ainsi que le site de fuschlberger.

Le script Jailkit

Le Jailkit est un script qui est maintenu et qui permet d’automatiser la construction d’une prison.
Nous pourrons y ajouter un ou plusieurs utilisateurs afin de les restreindre.

Télécharger le script avec « wget » :

bash
wget http://olivier.sessink.nl/jailkit/jailkit-2.17.tar.gz

Décompresser le fichier :

bash
tar xvzf jailkit-2.17.tar.gz

Se rendre dans le dossier :

bash
cd jailkit-2.17

Exécuter la commande suivante :

bash
./debian/rules binary
=> make[1]: quittant le répertoire « /root/jailkit-2.17 »

Sortir du répertoire actuel :

bash
cd ..

Lancer l’installation de Jailkit :

bash
dpkg -i jailkit_2.17-1_amd64.deb

On remarque que de nouvelles commandes sont disponibles : essayer de faire : « jk_«

bash
jk_addjailuser   jk_chrootlaunch  jk_cp            jk_jailuser      jk_lsh           jk_uchroot       
jk_check         jk_chrootsh      jk_init          jk_list          jk_socketd       jk_update

Créer le répertoire prison :

bash
mkdir /home/jail/

Nous devons donner tous les droits à « root » :

bash
chown root:root /home/jail/

Ajouter des programmes dans la prison :

bash
jk_init -v /home/jail netutils basicshell jk_lsh ssh sftp editors

Pour ajouter d’autres programmes il suffit d’éditer le fichier de configuration suivant :

bash
nano /etc/jailkit/jk_init.ini

La copie des bibliothèques se fait avec la commande « jk_cp » exemple avec « mysql » :

bash
jk_cp -j /home/jail/ /usr/bin/mysql

Pour information, voici comment afficher les librairies d’un programme :

bash
ldd /usr/bin/mysql

Si vous souhaitez utiliser mysql dans votre jail :

bash
mount --bind /var/run/mysqld/ /votre/prison/var/run/mysqld/

Créer l’utilisateur qui sera « chrooté » dans sa prison :

bash
adduser jeremie
=>Ajout de l'utilisateur « jeremie » ...
Ajout du nouveau groupe « jeremie » (1001) ...
Ajout du nouvel utilisateur « jeremie » (1001) avec le groupe « jeremie » ...
Création du répertoire personnel « /home/jeremie»...
Copie des fichiers depuis « /etc/skel »...
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd : le mot de passe a été mis à jour avec succès
Modification des informations relatives à l'utilisateur jeremie
Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée
        Nom complet []: Jérémie Kassianoff
 de bureau []:
        Téléphone professionnel []:
        Téléphone personnel []:
        Autre []:
chfn : nom contenant des caractères non ASCII : Jérémie Kassianoff
Cette information est-elle correcte ? [O/n]O

On ajoute l’utilisateur dans la prison avec la commande suivante :

bash
jk_jailuser -m -j /home/jail/ jeremie

Éditer le fichier des utilisateurs existants sur le système « jail » :

bash
nano /home/jail/etc/passwd

Retrouvez votre utilisateur et modifier votre « shell » :

bash
jeremie:x:1001:1001:,,,:/home/jeremie:/bin/bash

Vous pouvez maintenant vous loguer avec votre utilisateur :

bash
su - jeremie

Affichez la racine de la prison :

bash
ls /
bin  dev  etc  home  lib  lib64  usr

L’introduction sur le jailkit est terminée.

Le script fuschlberger

Le script de fuschlberger est assez vieux (2008) mais il fonctionne encore très bien.
Nous allons le faire fonctionner sous Debian 7 en version 64 bits.

Avant toute chose vérifiez que vous avez bien les paquets suivants d’installés :

bash
debianutils coreutils

Télécharger le script avec « wget » :

bash
wget http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/make_chroot_jail.sh

Rendre exécutable le script:

bash
chmod 770 make_chroot_jail.sh

Lancer le script (version simplifiée) :

bash
make_chroot_jail.sh jeremie

Par défaut la prison se trouvera dans « /home/jail » si vous souhaitez changer le répertoire :

bash
make_chroot_jail.sh jeremie [/chemin/shell] [/chemin/prison]

Si vous lancez l’exécution du script, vous aurez très certainement une erreur sous la version 64 bits.
C’est maintenant que nous allons commencer à modifier certaines valeurs dans le script.

Erreurs sous Debian 7 version X64

Lors de la première exécution du script (x64) vous avez du voir apparaître des erreurs.
Pour résoudre la première erreur (ligne 406 & 407), il faut éditer le script fuschlberger :

bash
nano make_chroot_jail.sh

Puis retrouver les deux lignes suivantes :

bash
TMPFILE1=`mktemp` &> /dev/null ||  TMPFILE1="${HOME}/ldlist"; if [ -x ${TMPFILE1} ]; then mv ${TMPFILE1} ${TMPFILE1}.bak;fi
TMPFILE2=`mktemp` &> /dev/null ||  TMPFILE2="${HOME}/ldlist2"; if [ -x ${TMPFILE2} ]; then mv ${TMPFILE2} ${TMPFILE2}.bak;fi

Il faut alors supprimer « /dev/null »  comme ceci :

bash
TMPFILE1=`mktemp` ||  TMPFILE1="${HOME}/ldlist"; if [ -x ${TMPFILE1} ]; then mv ${TMPFILE1} ${TMPFILE1}.bak;fi
TMPFILE2=`mktemp` ||  TMPFILE2="${HOME}/ldlist2"; if [ -x ${TMPFILE2} ]; then mv ${TMPFILE2} ${TMPFILE2}.bak;fi

Le second problème se trouve dans le chemin des librairies :

bash
elif [ "$DISTRO" = DEBIAN ]; then
  cp /lib/libnss_compat.so.2 /lib/libnsl.so.1 /lib/libnss_files.so.2 /lib/libcap.so.1 /lib/libnss_dns.so.2 ${JAILPATH}/lib/
else
  cp /lib/libnss_compat.so.2 /lib/libnsl.so.1 /lib/libnss_files.so.2 /lib/libcap.so.1 /lib/libnss_dns.so.2 ${JAILPATH}/lib/
fi

On se retrouve avec des chemins pour la version x86, il faut donc les adapter à notre système x64 :

bash
elif [ "$DISTRO" = DEBIAN ]; then
  cp /lib/x86_64-linux-gnu/libnss_compat.so.2 /lib/x86_64-linux-gnu/libnsl.so.1 /lib/x86_64-linux-gnu/libnss_files.so.2 /lib/x86_64-linux-$
else
  cp /lib/x86_64-linux-gnu/libnss_compat.so.2 /lib/x86_64-linux-gnu/libnsl.so.1 /lib/x86_64-linux-gnu/libnss_files.so.2 /lib/x86_64-linux-$
fi

Une fois les problèmes réglés, relancez le script avec la commande :

bash
 make_chroot_jail.sh jeremie

Ensuite, le résultat de la commande vous affichera :

bash
 Release: 2008-04-26

Am I root?
  OK
Checking distribution...
  Supported Distribution found
  System is running Debian Linux
Checking for which...
  OK
Checking for chroot...
  OK
Checking for sudo...
  OK
Checking for dirname...
  OK
Checking for awk...
  OK

Subsystem sftp /usr/lib/openssh/sftp-server

-----------------------------
The file /bin/chroot-shell exists.
Probably it was created by this script.

Are you sure you want to overwrite it?
(you want to say yes for example if you are running the script for the second
time when adding more than one account to the jail)
(yes/no) -> yes

Modifying /etc/sudoers
Adding User "jeremie" to system
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd : le mot de passe a été mis à jour avec succès

Adding User jeremie to jail
Copying necessary library-files to jail (may take some time)
Copying files from /etc/pam.d/ to jail
Copying PAM-Modules to jail

Si vous naviguez dans le dossier prison  :

bash
ls -al /home/jail

Vous vous rendrez compte du travail effectué par le script fuschlberger.
Essayez de vous connecter avec votre utilisateur précédemment créé :

bash
su - jeremie

Erreur « su: module is unknow » :

bash
 su: Module is unknown

La solution que j’ai trouvée est de modifier le fichier chroot-shell :

bash
nano /bin/chroot-shell

Initialement vous trouverez ceci à l’intérieur :

bash
#!/bin/bash 
/usr/bin/sudo /usr/sbin/chroot /home/jail /bin/su - $USER "$@"

La modification à effectuer  :

bash
#!/bin/bash
sudo /usr/sbin/chroot /home/jail /bin/bash

Ensuite il faut relancer la commande :

bash
su - jeremie

Vous êtes normalement logué sans aucune erreur et vous êtes bien dans votre prison.
Cependant, vous avez une liste de commandes restreintes , pour en rajouter : éditez le script !

bash
nano /usr/local/sbin make_chroot_jail.sh

Recherchez la ligne « APPS » avec « ctrl + w« et rajouter le chemin des commandes souhaitées.

bash
elif [ "$DISTRO" = DEBIAN ]; then
  APPS="/bin/bash /bin/crontab /bin/vim /bin/mysql /bin/hg /bin/hg-ssh /usr/bin/clear /usr/bin/ncurses5-config /bin/nano /bin/cp /usr/bin/ /bin/ls /bin/mkdir /bin/mv /bin/rm /bin/rmdir /bin/sh /bin/ping  /bin/su /usr/bin/groups /usr/bin/id /usr/bin/rsync /usr/bin/ssh /usr/bin/scp /sbin/unix_chkpwd"

Ensuite, il faut mettre à jour votre prison avec le script :

bash
make_chroot_jail.sh update

Aussi, si vous souhaitez résoudre des noms de domaine il vous faudra ajouter la librairie DNS :

bash
cp /lib/x86_64-linux-gnu/libnss_dns.so.2 /home/jail/lib

Ce script est un peu vieillissant mais constitue une bonne base pour commencer le jail/chroot.

Conclusion

J'ai comparé ici deux méthodes pour emprisonner un utilisateur SSH sous Linux : le script Jailkit, plus récent et maintenu, et le script fuschlberger, plus ancien mais toujours fonctionnel moyennant quelques adaptations pour la version 64 bits. Ces techniques de chroot/jail permettent de fournir un accès restreint à un serveur de production sans exposer l'intégralité de son arborescence, ce qui renforce la sécurité et la confidentialité lors de collaborations externes. Un point de vigilance : la liste des commandes disponibles dans la prison doit être ajustée avec parcimonie pour ne pas recréer un environnement trop ouvert. Personnellement je me suis arrêté là et je n’ai pas recherché les autres options possibles.
Vous savez maintenant utiliser ces deux scripts ! Partagez vos retours dans la section commentaire.