Versions
2014/04/28 : creation
2014/08/01 : typo
Contactez-nous
Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81
Installer un sftp avec chroot sur debian
Introduction
Ce tutoriel explique pas à pas comment installer un serveur sftp sur debian wheezy avec les droits d'accès qui vont bien sur les répertoires.
Installation de base
SFTP se base sur ssh. Il faut installer quelques packages :
# basic ssh packages apt-get install ssh openssh-server
Création du groupe unix sftp_chroot
Ce groupe contiendra la liste des users qui peuvent se connecter en sftp
addgroup sftp_chroot
Configuration sshd_config
Evolutions à faire dans /etc/ssh/sshd_config
# Vérifier qu'on a bien :
Subsystem sftp /usr/lib/openssh/sftp-server
# ajouter à la fin du fichier :
Match Group sftp_chroot
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no
# pensez à relancer le serveur ssh : /etc/init.d/ssh restart
Créer un compte sftp
Créer un user unix
Créer un user unix classique
useradd testuser --gid sftp_chroot --groups sftp_chroot -m --shell /bin/false
droits d'accès sur le home directory
Pour empêcher le sftp de remonter dans l'arborescence, on peut jouer avec les droits d'accès
# base directory given to root only chown root /home/testuser chmod go-w /home/testuser # create a writable directory mkdir /home/testuser/writeable chown testuser:sftp_chroot /home/testuser/writeable chmod ug+rwX /home/testuser/writeable
Le script qui fait tout pour vous
Voilà un petit script bash qui fait tout pour vous.
N'utilisez le qu'une fois que vous avez compris ce que vous faites. Et si ça casse tout chez vous, je plaide non coupable :-).
#/bin/bash # author : Philippe Le Van, twitter: @plv USER_NAME=$1 SFTP_GROUP_NAME=sftp_chroot if [ "x$USER_NAME" == "x" ]; then echo "you have to provide a user name" exit; fi getent group $SFTP_GROUP_NAME > /dev/null 2&>1 if [ $? -ne 0 ]; then echo "group $SFTP_GROUP_NAME does not exist."; echo "see this (french) tutorial : http://www.kitpages.fr/fr/cms/193/installer-un-sftp-chroote-sur-debian"; exit; fi getent passwd $USER_NAME > /dev/null 2&>1 if [ $? -eq 0 ]; then echo "user already exists"; exit; fi useradd $USER_NAME --gid $SFTP_GROUP_NAME --groups $SFTP_GROUP_NAME -m --shell /bin/false echo "user created"; # base directory given to root only chown root /home/$USER_NAME chmod go-w /home/$USER_NAME # create a writable directory mkdir /home/$USER_NAME/writeable chown $USER_NAME:$SFTP_GROUP_NAME /home/$USER_NAME/writeable chmod ug+rwx /home/$USER_NAME/writeable echo "access right ok"; echo "change password"; passwd $USER_NAME
Références et conclusion
Pour écrire cet article, je me suis inspiré du message suivant :
en adaptant un peu la recette et en créant le script.

plv)
Je viens de me rendre compte que la phrase que j'ai mis ne veux rien dire. Mais c'est pas grave, je suis sur que tu as tous compris. Par contre en re-regardant ton script, je me suis rendu compte qu'il manquait un "!" dans l'interpreter du début de script ("#!/bin/bash"). Je ne sais pas vraiment si il est obligatoire, mais dans mon cas à moi VI ne détecte pas le langage et n'applique pas du coup la coloration syntaxique. Et une autre petite opti, pourrait-être de définir une variable permettant de définir le chemin du home de l'utilisateur à créer. Pour éviter d'avoir à le modifier sur toutes les lignes. Du coup, il faudra aussi rajouter l'option -d $PATH/$USER_NAME Cordialement,Trés bon script qui marche parfaitement, Pour la vérification qu'un nom d'utilisateur a bien été saisi, j'aurais juste changer la condition "x$USER_NAME" == "x" qui peut être plus parlante. if [ "$#" -lt "1" ]; then echo "Usage : $0 <nom_utilisateur>" exit; fi Mais cela aura le même résultat. Cordialement,