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 :
- Création d’un utilisateur sur le système.
- Création de l’arborescence du répertoire prison.
- Ajouter un interpréteur de commandes.
- Montage de device (optionnel).
- Modification de certains fichiers « /etc/« .
- Création d’une fonction dit wrapper.
- Ajout des droits au fichier.
- 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.