Petit tutoriel pour expliquer la mise en place d’un Chroot Jail afin d’emprisonner un utilisateur SSH dans son home.
Tout d’abords quelque préparations : il vous faudra openssh-server en version supérieur ou égale à 4.8p1 car l’option du fichier de configuration de sshd n’est pas présente avant cette version. Pour Ubuntu ou Debian cette version est présente depuis au moins le troisième trimestre 2008.
Donc on installe openssh-server :
sudo aptitude install openssh-server openssh-client
Rq : On installe ici aussi le client afin de faire des test en local.
Ensuite configurons sshd :
sudo nano /etc/ssh/sshd_config
tout en bas du fichier (et j’ai bien dit tout en bas) ajouter ces quelques lignes :
Match Group chrootssh ChrootDirectory %h AllowTcpForwarding no
Expliquons un peu ces lignes :
- Match Group chrootssh : on va dire ici que le groupe chrootssh va être configuré avec les règles supplémentaires suivantes.
- ChrootDirectory %h : Tous les utilisateurs faisant partie du groupe chrootssh seront chrooté dans leur home : ici et comme dans la configuration de samba %h signifie le dossier de l’utilisateur. Ainsi vous pouvez mettre par exemple /var/www/%u si vous voulez que vos utilisateurs soit chrooté dans un dossier portant leur nom dans /var/www
- AllowTcpForwarding no : on désactive tous ce qui est tunnel ssh, on veux pas que notre serveur serve de proxy socks ou autre au client qui se connecte.
Pour plus de renseignement sur la configuration de sshd_config reportez vous au man sshd_config ou bien à cette page du manuel d’openssh
On y est, normalement le fichier de configuration est lu à chaque connexion d’un user donc pas besoin de reload le service ssh, mais si vous voulez en être sûre :
sudo invoke-rc.d ssh reload
Rq : même si vous stoppé le service vos connexions en cours seront toujours « Alive » 🙂 jusqu’à ce que vous quittiez vos sessions bien sûr.
Ensuite passons aux choses sérieuses, la configuration d’un compte utilisateur Chrooté :
#On créé le groupe chrootssh sudo addgroup chrootssh #on rajoute l'utilisateur sudo adduser monuserchrootssh #on ajoute le user au groupe chrootssh sudo adduser monuserchrootssh chrootssh
Nous allons maintenant créé sont environnement en utilisant un petit script un poil modifié par mes soins mais qui vient tout droit du paquet libpam-chroot :
#!/bin/bash # Here specify the apps you want into the enviroment APPS="/usr/bin/env /usr/bin/wget /usr/bin/clear /usr/bin/ftp /usr/bin/traceroute /usr/bin/host /bin/sh /bin/grep /bin/cat /usr/bin/vi /bin/gzip /bin/gunzip /usr/bin/less /usr/bin/tail /usr/bin/nslookup /usr/bin/resolveip /bin/bash /bin/ls /bin/mkdir /bin/mv /bin/pwd /bin/rm /usr/bin/id /usr/bin/ssh /bin/ping /usr/bin/dircolors /usr/bin/screen /bin/ps /bin/uname /bin/sed" # Sanity check if [ -z "$1" ]; then echo " Usage: $0 username" exit fi # Obtain username and HomeDir CHROOT_USERNAME=$1 HOMEDIR=`grep /etc/passwd -e "^$CHROOT_USERNAME:" | cut -d':' -f 6` cd $HOMEDIR mkdir etc bin lib usr usr/bin dev # We need as many tty's as consoles /bin/mknod -m 666 dev/tty c 5 0 /bin/mknod -m 644 dev/tty1 c 4 1 /bin/mknod -m 644 dev/tty2 c 4 2 /bin/mknod -m 644 dev/tty3 c 4 3 /bin/mknod -m 644 dev/tty4 c 4 4 /bin/mknod -m 644 dev/tty5 c 4 5 /bin/mknod -m 644 dev/tty6 c 4 6 #and pts mkdir dev/pts /bin/mknod -m 666 dev/pts/0 c 136 0 /bin/mknod -m 666 dev/pts/1 c 136 1 # Some special nodes, just for fun /bin/mknod -m 444 dev/urandom c 1 9 /bin/mknod -m 666 dev/zero c 1 5 /bin/mknod -m 666 dev/null c 1 3 # Create short version to /usr/bin/groups # On some system it requires /bin/sh, generally unnessesary in a chroot cage echo "#!/bin/bash" > usr/bin/groups echo "id -Gn" >> usr/bin/groups # Add some users to ./etc/paswd grep /etc/passwd -e "^root:" -e "^$CHROOT_USERNAME:" > etc/passwd grep /etc/group -e "^root" -e "^$CHROOT_USERNAME:" > etc/group #Settings prompt cp /etc/profile etc/profile cp -R /etc/bash* etc echo "export HOME=/" >> etc/profile for prog in $APPS; do cp $prog ./$prog # obtain a list of related libraries ldd $prog > /dev/null if [ "$?" = 0 ] ; then LIBS=`ldd $prog` for l in $LIBS; do if [ -f $l ]; then mkdir -p .`dirname $l` > /dev/null 2>&1 cp $l ./$l fi done fi done # For strange reason, these 3 libraries are not in the ldd output, but without # them some stuff will not work, like usr/bin/groups cp /lib/libnss_compat.so.2 /lib/libnsl.so.1 /lib/libnss_files.so.2 /lib/ld-linux.so.2 /lib/libresolv.so.2 /lib/libnss_dns.so.2 ./lib/ chmod 755 usr/bin/groups cp /etc/host.conf ./etc/ cp /etc/hosts ./etc/ cp /etc/nsswitch.conf ./etc/ cp /etc/localtime ./etc/ cp /etc/resolv.conf ./etc/ cp /etc/services ./etc/ cp /etc/protocols ./etc/ mkdir ./etc/terminfo/ cp -R /etc/terminfo/* ./etc/terminfo/ find . -type d -exec chown -R root:root {} \;
Si vous êtes sous architecture 64 bits une erreur peut apparaitre :
cp: cannot stat `/lib/ld-linux.so.2′: No such file or directory
Copier donc votre librairie :
mkdir /home/monuserchrootssh/lib64 cp /lib64/ld-linux-x86-64.so.2 /home/monuserchrootssh/lib64
Elle est nécessaire pour faire fonctionner bash par exemple 🙂
Ligne 4 de ce fichier listez tous les exécutables que vous voulez donné à votre utilisateur, ici j’ai listez les plus courant dans une liste riquiqui.
Petit bémol mais peut être que quelqu’un pourra le résoudre : screen ne retrouve pas ses petits et ne peux pas démarré dans cette environnement, mais il semblerait qu’un mount –bind bien placé pour tous ce qui « pts » résoudrait l’affaire : a creuser donc…
il ne nous reste plus qu’à exécuter notre petit script. Donc vous avez bien sûre fait un :
cd nano createchroot.sh #on colle le contenu dans ce fichier chmod +x ./createchroot.sh
Enfin nous créons l’envirronnement à l’aide de ce script :
sudo ./createchroot.sh monuserchrootssh
Si vous avez quelques erreurs disant que le programme n’existe pas c’est surement que l’un des exécutables donné dans la variable $APPS ligne 4 n’est pas installé, et que donc vous n’en avez pas besoin.
Si vous voulez controler que tout marche pour le mieux éxécuter sshd en mode devel :
sudo invoke-rc.d ssh stop sudo /usr/sbin/sshd -d #ctrl+c pour quitter
Voilà on y est loggé l’utilisateur pour faire un test :
ssh monuserchrootssh@localhost
Si vous avez pas d’erreur et un prompt faite :
pwd #qui devrait affiché # / ls -al #qui devrait vous afficher une petite arborescence tel que celle-ci: #drwxr-xr-x 7 root root 4096 May 25 16:15 . #drwxr-xr-x 7 root root 4096 May 25 16:15 .. #-rw-r--r-- 1 root root 220 May 25 16:14 .bash_logout #-rw-r--r-- 1 root root 3115 May 25 16:14 .bashrc #-rw-r--r-- 1 root root 675 May 25 16:14 .profile #drwxr-xr-x 2 root root 4096 May 25 16:15 bin #drwxr-xr-x 2 root root 4096 May 25 16:15 dev #drwxr-xr-x 3 root root 4096 May 25 16:15 etc #drwxr-xr-x 4 root root 4096 May 25 16:15 lib #drwxr-xr-x 4 root root 4096 May 25 16:15 usr
Si quelqu’un trouve un petite technique pour avoir le bon prompt aussi ça serait cool 🙂 car là on a le prompt de bash par défaut, et le .bashrc ne s’exécute pas.
Je suis ouvert à tout commentaires afin d’enrichir cette article, posez vos questions dans les commentaires ci-dessous 🙂
11 réponses à “OpenSSH Server avec Chroot Jail”
Après qques corrections le script marche nickel. Les > qui apparaissent dans le script sur la page doivent être remplacés par des >
Sous Ubuntu 9.04 j’ai également du reloader le daemon ssh pour que les paramètres soient pris en compte.
J’ai pas fait attention aux >. Je corrige ça tout de suite.
Merci
Pour l’histoire du .bashrc …
lors de l’ouverture d’une session de login (par ex via SSH) bash lit le profile dans /etc/profile … hors avec ce système de chroot … le /etc se trouve en réalité dans le homedir de l’utilisateur ..
J’ai donc fait un cp /etc/profile /home/userssh/etc/
Et dans /home/userssh/etc/profile j’ai rajouté la ligne « source /.bashrc »
Et tout fonctionne.
Exacte je n’avais pas vu la chose sous cette angle, merci pour l’aide, je modifie le tuto en conséquence.
@Steve : Alors voilà j’ai trouver une méthode plus propre disons 🙂
Tu m’as mis sur la piste avec etc/profile, si on le copie il va pouvoir redonner le même comportement qu’une configuration de prompt normal en appelant $HOME/.profile mais ici notre $HOME pointait vers /home/monuserchrootssh
J’ai donc modifier le script de création de l’environnement jail afin qu’il remplace le home_dir de l’utilisateur lors de la création du nouveau etc/passwd
En passant j’ai corrigé des petit problèmes au niveau /dev/*
Qu’en dis tu ?
Je viens de tester. Il y a un net progrès puisque le prompt bash est déjà formaté comme le prompt standard. Par contre la coloration etc n’est pas prise en compte.
Mais je pense avoir compris pourquoi. Le fichier etc/profil fait référence à un bash.bashrc … qui n’existe pas sous ubuntu9.04 … j’ai donc remplacé ça par le .bashrc normal … et là tout va impec.
La coloration se fait dans ~/.bashrc et le prompt est modifié lors de l’exécution de /etc/profile, donc ma modification ne doit pas marcher, je vais regarder ça…
bon solution : mettre un export HOME=/ dans le fichier etc/profile par contre de nouveaux binaires doivent être intégré et il subsistera une erreur disant :
id: cannot find name for group ID 1017
A cause du fait que nous ne transférons pas le group chrootssh dans le nouveau etc/group
Il reste un truc encore les raccourcies clavier du style Ctrl+L ne fonctionne pas comme la touche Fin et ‘Début’
bonjour, merci beaucoup pour ce tuto je viens de tester et ça marche bien.
Néanmoins j’ai un petit problème et j’aimerais avoir vos avis.
D’abord j’ai chrooté un user ,puis je me suis connecté avec ssh , le problème c’est que je n’arrive pas a exécuter les commandes comme mkdir, ça me fait permission denied quand je fait un ls-l j’ai root comme usr propriétaire et root en groupe donc je pense que c’est normale que je ne puisse pas executer ces commande mais alors comment on fait pour changer donc l’utilisateur et le groupe pour que je puisse le faire et que j’ai pas permission denied??
merci d’avance
Les dossiers créés par le script sont tous possédés par root à cause de la dernière ligne du script. Mais on peux juste après cette ligne donner les droits au user chrooté en fesant un tout bête chown.
Salut,
Je me suis permit de prendre ton script et l’améliorer un peu.
J’ai aussi fait un petit article, je te laisse voir tout ça:
http://www.syl21.org/2011/05/14/script-chroot-ssh-pour-debian-et-ses-derives/
Merci pour ton article en tout cas, il m’a beaucoup aidé…
Bonne journée 😉