mai 29

Faire du SFTP dans un chroot avec scponlyc

Tag: Debian GNU/Linux, SystèmeSylvain @ 06:39

Commençons tout d’abord par expliquer les quelques termes alambiqués du titre de ce billet pour les néophytes :

  • SFTP signifie « Secure File Transfer Program », c’est un programme permettant de transférer des fichiers en utilisant une liaison chiffrée par SSH (Secure SHell) ; attention à ne pas confondre SFTP avec FTPS qui signifie pour sa part « File Transfer Protocol over SSL » !
  • chroot est un programme permettant de changer le répertoire racine d’un processus afin que ce dernier n’ai accès qu’à une partie limitée de l’arborescence.
  • scponlyc est un shell limité destiné uniquement aux transferts de fichiers dans un chroot.

Le but du jeu est donc de permettre à un utilisateur de transférer des fichiers sur un serveur de manière sécurisée sans qu’il n’obtienne pour autant un shell et sans qu’il lui soit permit de voir l’arborescence du serveur. Nous utiliserons pour l’exemple, la version 4.7 d’OpenSSH livrée avec Debian Testing.

Démarrons par l’installation du paquet scponly :

root@gnusquad:~# aptitude install scponly

Un script permettant de créer un compte utilisateur destiné au SFTP chrooté a été installé dans le répertoire « /usr/share/doc/scponly/setup_chroot/ », exécutons le en utilisant les réponses par défaut aux questions :

root@gnusquad:~# cd /usr/share/doc/scponly/setup_chroot/
root@gnusquad:/usr/share/doc/scponly/setup_chroot# gunzip setup_chroot.sh.gz
root@gnusquad:/usr/share/doc/scponly/setup_chroot# chmod +x setup_chroot.sh
root@gnusquad:/usr/share/doc/scponly/setup_chroot# ./setup_chroot.sh

Next we need to set the home directory for this scponly user.
please note that the user’s home directory MUST NOT be writeable
by the scponly user. this is important so that the scponly user
cannot subvert the .ssh configuration parameters.

for this reason, a writeable subdirectory will be created that
the scponly user can write into.

Username to install [scponly]
home directory you wish to set for this user [/home/scponly]
name of the writeable subdirectory [incoming]

creating  /home/scponly/incoming directory for uploading files

Your platform (Linux) does not have a platform specific setup script.
This install script will attempt a best guess.
If you perform customizations, please consider sending me your changes.
Look to the templates in build_extras/arch.
 - joe at sublimation dot org

please set the password for scponly:
Enter new UNIX password:
Retype new UNIX password:
passwd : le mot de passe a été mis à jour avec succès
if you experience a warning with winscp regarding groups, please install
the provided hacked out fake groups program into your chroot, like so:
cp groups /home/scponly/bin/groups

Un compte utilisateur contenant les fichiers nécessaires au chroot a été créé dans « /home/scponly/ », celui-ci est presque complet, il ne lui manque que le fameux « /dev/null » que nous allons créer à la main :

root@gnusquad:/usr/share/doc/scponly/setup_chroot# cd ~scponly
root@gnusquad:/home/scponly# mkdir dev
root@gnusquad:/home/scponly# mknod -m 666 dev/null c 1 3

Dernière étape avant que ça ne fonctionne : pour pouvoir utiliser le programme « scponlyc », il faut que celui-ci soit exécuté avec les droits root ; pour cela, il faut placer le « sticky bit » sur l’exécutable « scponlyc » :

root@gnusquad:/home/scponly# chmod u+s $(which scponlyc)

Il est maintenant temps de tester notre compte chrooté : nous allons créer un fichier et l’envoyer à l’utilisateur « scponly » grâce au répertoire accessible en écriture « incoming » :

root@gnusquad:/home/scponly# cd
root@gnusquad:~#  echo “coucou” > test.txt
root@gnusquad:~#  scp test.txt scponly@localhost:incoming
scponly@localhost’s password:
test.txt                                                           100%    7     0.0KB/s   00:00

Vérifions maintenant que le chroot fonctionne bien en utilisant « sftp » :

root@gnusquad:~# sftp scponly@localhost
Connecting to localhost…
scponly@localhost’s password:
sftp> ls
bin       dev       etc       incoming  lib       usr
sftp> cd incoming
sftp> ls
test.txt
sftp> quit

Voilà, tout fonctionne correctement ! Notez cependant que toute cette procédure ne sera bientôt plus nécessaire avec les futures releases d’OpenSSH qui inclueront la possibilité de définir des chroot directement dans le fichier de configuration ce qui évitera par la même occasion de devoir mettre à jour son chroot lors de mise à jour de sécurité touchant les fichiers de celui-ci si l’on s’intéresse un tant soit peu à la sécurité ! :-)

Source :

Laissez un commentaire