Chrooter un programme consiste à le lancer en utilisant la commande chroot. Cette commande permet de changer l'emplacement de la racine (/).
Exemple :
On veut chrooter le programme prog_chroot dans le dossier /chroot/. Le programme considèrera le dossier /chroot/ comme /. Il n'aura donc pas accès aux autres dossiers.
L'intérêt de cette manipulation est donc d'enfermer un programme afin qu'il ne touche que à ce qu'on lui autorise de toucher.
La manipulation va se dérouler en plusieurs étapes :
L'utilisateur à chrooter s'appellera franck. Pour le créer (plus d'infos sur la Gestion Des Utilisateurs), lancer en root les 2 commandes suivantes :
# useradd -d /home/franck -s /bin/bash -m franck
Puis pour lui affecter un mot de passe :
# passwd franck
A ce niveau, on dispose d'un utilisateur tout ce qu'il y a de plus classique.
L'utilisateur chrooté verra son $HOME comme la racine /. Il va donc falloir recréer une arborescence sui contiendra un shell et les outils que l'on veut donner à l'utilisateur.
On va créer les dossiers indispensables :
# mkdir /home/franck/bin # mkdir /home/franck/lib # mkdir /home/franck/dev
On copie le shell (ici le Bash) :
# cp /bin/bash /home/franck/bin/
Le problème est que le programme bash ne sert à rien sans ses librairies. On va donc les copier aussi dans le nouvel environnement.
Pour avoir la liste des librairies :
" ldd /bin/bash
On obtient :
linux-gate.so.1 => (0xffffe000) libncurses.so.5 => /lib/libncurses.so.5 (0xb7f6f000) libdl.so.2 => /lib/tls/libdl.so.2 (0xb7f6b000) libc.so.6 => /lib/tls/libc.so.6 (0xb7e34000) /lib/ld-linux.so.2 (0xb7fc1000)
On les copie (sauf la première dont on n'a pas le chemin) :
# cp /lib/libncurses.so.5 /home/franck/lib/ # cp /lib/tls/libdl.so.2 /home/franck/lib/ # cp /lib/tls/libc.so.6 /home/franck/lib/ # cp /lib/ld-linux.so.2 /home/franck/lib/
Maintenant vous vous demandez ce qu'on va mettre dans /home/franck/dev/ ? On y mettra les devices voulus. Mais pour le moment on se contentera de /dev/null :
# mknod /home/franck/dev/null c 1 3 -m 666
Afin d'être sûr d'avoir les bons droits, exécutez en tant que root :
# chown -R franck /home/franck # chmod -R 755 /home/franck
Et voilà... vous être prêts.... ah ben non en fait.... vous pouvez vous connecter en tant que franck, mais vous vous retrouvez dans /home/franck comme un utilisateur normal...
Il reste encore à configurer l'utilisateur pour sa connection...
Tout d'abord, on va (en root) créer un fichier /bin/chrootshell qui va contenir :
#!/bin/bash exec -c /usr/sbin/chroot /home/$USER /bin/bash
On change les droits du fichier :
# chmod 755 /bin/chrootshell
On rend le programme /usr/sbin/chroot utilisable par tout le monde :
# chmod u+s /usr/sbin/chroot
Ensuite, on va modifier dans le fichier /etc/passwd la ligne qui concerne notre utilisateur franck. Actuellement on a :
franck:x:1003:1003::/home/franck:/bin/bash
Modifions la en
franck:x:1003:1003::/home/franck:/bin/chrootshell
Et oui, nous utilisons notre petit script de chroot fait précedemment.
Maintenant on peut tenter une connection en tant que franck :
$ su - franck
En s'amusant un peu, on peut vérifier qu'on est bien chrooté :
bash-3.1$ pwd / bash-3.1$ cd .. bash-3.1$ pwd / bash-3.1$ cd lib bash-3.1$ pwd /lib
Par contre, on remarquera qu'on est très vite limité :
bash-3.1$ ls bash: ls: command not found
Pour pouvoir utiliser ls, vi et d'autres programmes, il va falloir les ajouter.
La connection par ssh fonctionne correctement aussi. Mission réussie !!!!!!
Pour ajouter des commandes, il faut procéder de la même manière que pour l'on a procédé pour /bin/bash.
Pour simplifier l'ajout de commandes on peut utiliser le script suivant que j'ai nommé chroot-addcmd.sh :
#!/bin/sh
if [[ $# -le 1 ]] ; then
cat << !
Usage : $(basename $0)
!
exit
fi
dossierChroot=$1
shift
while [[ $# -gt 0 ]]
do
## Copie des librairies
# la ligne ci-dessous devrait pouvoir être optimisée. Elle a été faite pour un besoin urgent
for lib in $(ldd $1 |sed "s/(.*)//" | awk "BEGIN { FS=\"=>\" }{ print \$2}")
do
echo "Exécution de 'cp $lib $dossierChroot/lib/'..."
cp $lib $dossierChroot/lib/
if [[ $? -ne 0 ]] ; then
echo "ERREUR"
exit
fi
done
## Si on a passé le 'for' on a pu copier les librairies. On copie donc le programme
echo "Exécution de ..."
cp $1 $dossierChroot/bin/
if [[ $? -ne 0 ]] ; then
echo "ERREUR"
exit
fi
echo " "
shift
done
echo "Pensez à vérifier les droits des librairies ;)"
Voici ce que ça donne en pratique :
LightStar:~/33rr# ./chroot-addcmd.sh /home/franck/ /bin/ls /bin/cp /bin/mv /bin/cat Exécution de cp /lib/tls/librt.so.1 /home/franck//lib/... Exécution de cp /lib/libacl.so.1 /home/franck//lib/... Exécution de cp /lib/tls/libc.so.6 /home/franck//lib/... Exécution de cp /lib/tls/libpthread.so.0 /home/franck//lib/... Exécution de cp /lib/ld-linux.so.2 /home/franck//lib/... Exécution de cp /lib/libattr.so.1 /home/franck//lib/... Exécution de cp /bin/ls /home/franck//bin/... Exécution de cp /lib/libacl.so.1 /home/franck//lib/... Exécution de cp /lib/tls/libc.so.6 /home/franck//lib/... Exécution de cp /lib/libattr.so.1 /home/franck//lib/... Exécution de cp /lib/ld-linux.so.2 /home/franck//lib/... Exécution de cp /bin/cp /home/franck//bin/... Exécution de cp /lib/libacl.so.1 /home/franck//lib/... Exécution de cp /lib/tls/libc.so.6 /home/franck//lib/... Exécution de cp /lib/libattr.so.1 /home/franck//lib/... Exécution de cp /lib/ld-linux.so.2 /home/franck//lib/... Exécution de cp /bin/mv /home/franck//bin/... Exécution de cp /lib/tls/libc.so.6 /home/franck//lib/... Exécution de cp /lib/ld-linux.so.2 /home/franck//lib/... Exécution de cp /bin/cat /home/franck//bin/... Pensez à vérifier les droits des librairies ;)
Et n'oublions pas le fameux
# chmod -R 755 /home/franck/lib
Les serveurs Proftpd et Vsftpd nécessitent le rajout du shell /bin/chrootshell dans le fichier /etc/shells pour autoriser la connection au ftp de l'utilisateur :
# echo "/bin/chrootshell" >> /etc/shells
Rédémarrez ensuite le serveur ftp (ici pour proftpd) :
# /etc/init.d/proftpd restart
L'objectif est d'installer ssh pour l'utilisateur chrooté.
Lorsque vous lancez ssh, vous obtenez l'agréable message suivant :
bash-3.1$ ssh You don't exist, go away!
Sympathique non ?
Pour y remédier, nous allons lancer les commandes suivantes pour montrer qu'on existe.
Lancez en tant que franck :
$ mkdir /etc/
En tant que root :
# grep franck /etc/passwd > /home/franck/etc/passwd
Ensuite, j'ai rajouté une librairie (merci google) :
# cp /lib/libnss_files.so.2 /home/franck/lib/
Mais il faut aussi pouvoir avoir des nombres aléatoires. On va donc créer /dev/random et /dev/urandom__ pour notre utilisateur. Lancez en tant que franck :
$ mknod -m 0444 /dev/random c 1 8 $ mknod -m 0444 /dev/urandom c 1 9
Ensuite il nous faut un /home/franck/ (dans le dossier chrooté) pour que ssh puisse y stocker ses clés. Lancez en tant que franck :
$ mkdir -p /home/franck/
Mettez le programme /usr/bin/ssh-keygen dans l'environnement. Lancez en tant que root :
# ./chroot-addcmd.sh /home/franck/ /usr/bin/ssh-keygen
Et pour finir, on créée les clés :
# ssh-keygen -t dsa