Emprisonner un utilisateur ssh 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 :

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 et fuschlberger 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 » :

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

Décompresser le fichier :

tar xvzf jailkit-2.17.tar.gz

Se rendre dans le dossier :

cd jailkit-2.17

Exécuter la commande suivante :

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

Sortir du répertoire actuel :

cd ..

Lancer l’installation de Jailkit :

dpkg -i jailkit_2.17-1_amd64.deb

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

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 :

mkdir /home/jail/

Nous devons donner tous les droits à « root » :

chown root:root /home/jail/

Ajouter des programmes dans la prison :

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 :

nano /etc/jailkit/jk_init.ini

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

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

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

ldd /usr/bin/mysql

Si vous souhaitez utiliser mysql dans votre jail :

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

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

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
        N° 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 :

jk_jailuser -m -j /home/jail/ jeremie

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

nano /home/jail/etc/passwd

Retrouvez votre utilisateur et modifier votre « shell » :

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

Vous pouvez maintenant vous loguer avec votre utilisateur :

su - jeremie

Affichez la racine de la prison :

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 :

debianutils coreutils

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

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

Rendre exécutable le script:

chmod 770 make_chroot_jail.sh

Lancer le script (version simplifiée) : 

make_chroot_jail.sh jeremie

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

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 :

nano make_chroot_jail.sh

Puis retrouver les deux lignes suivantes :

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 :

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 :

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 :

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 :

 make_chroot_jail.sh jeremie

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

 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  :

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éé :

su - jeremie

Erreur « su: module is unknow » :

 su: Module is unknown

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

nano /bin/chroot-shell

Initialement vous trouverez ceci à l’intérieur :

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

La modification à effectuer  :

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

Ensuite il faut relancer la commande :

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 !

nano /usr/local/sbin make_chroot_jail.sh

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

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 :

make_chroot_jail.sh update

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

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.
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.