Navigation

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

Par Philippe Le Van (twitter accountplv) Dernière mise à jour : 01 August 2014

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 :

http://askubuntu.com/questions/134425/how-can-i-chroot-sftp-only-ssh-users-into-their-homes/134442#134442

en adaptant un peu la recette et en créant le script.

Commentaires

Ajouter un commentaire
Thank you a lot for sharing this with all of us 
you really recognize what you are speaking about! Bookmarked.
Kindly additionally talk over with my web site =).
We could have a link alternate agreement among us
Commentaire
Salut, est-ce qu'il faut commenter la ligne :

Subsystem sftp /usr/lib/openssh/sftp-server

Dans la majorité des tutos, c'est indiqué de la commenter.

Merci !
On trouve souvent des trucs compliqués pour chrooté mais cette méthode est top, ça m'a fait gagner beaucoup de temps !! Merci :)
Votre TC est mine d'or, merci
Clef public
Bonjour,
Merci pout le tuto !
Comment puis-je intégrer une clef public pour l'utilisateur créée ?
J'arrive a lui donner accès qu'à son répertoire mais avec mot de passe. Il n'a pas d'accès SSH mais seulement SFTP. Et si je lui mets l'accès SSH il a alors droit à remonter à \.
Une idée ??
Merci
Evidemment !
Je suis lassé des tutoriels barbants qui n'expliquent pas correctement comment faire ce qui est décrit dans le titre. On passe souvent par de grands moments de solitude, jusqu'à ce qu'on comprenne qu'il faut d'abord lire le tutoriel, et donc en fin de page, on sait qu'on ne peut pas le faire, car on ne comprend rien...

Et puis on tombe sur un tuto comme le tien... qui est juste super bien fait, les détails parlants, les lignes de commandes facilement adaptables, tout est assez compréhensible, le script est également très facile à adapter, et mon serveur SFTP est maintenant configuré du premier coup, merci !

Je garde bien sur le script en otage :p
Aide ! impossible de se connecter !
Bonjour,
Merci pour le tuto. pour moi cela ne fonctionne pas.
Est ce que vous pouvez jetter un coup d'oeil à mon post ? 

http://openclassrooms.com/forum/sujet/serveur-sftp-avec-ssh-sous-raspbian-debian

Cd, bigbrownies
Petite évolution (2)
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,
Petite évolution
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,
Re: Tuto suivi à la lettre mais pas d'accès ftp
OK, J'ai compris. Merci beaucoup pour la réponse.
Re: Tuto suivi à la lettre mais pas d'accès ftp
Bonjour av,

Ce tuto sert à installer SFTP. C'est différent de FTP. SFTP est un genre de FTP, mais sécurisé et basé sur openSSH.

Le process qui tourne est sshd. Pour se connecter au serveur, il faut utiliser sftp et non ftp.

Cordialement,
Philippe
Tuto suivi à la lettre mais pas d'accès ftp
Le service n'est pas actif :
# ps -ef | grep ftp [ne retourne rien]

Depuis l'extérieur le service n'existe pas :
$ ftp ip-de-la-machine
ftp: connect: Connection refused

# nmap ip-de-la-machine [ ne retourne ni 20, ni 21]

Où est mon problème?
Re: Bon tuto
Bien vu steve13, c'est une boulette, c'était testuser et non bob. J'ai corrigé le tuto.
Bon tuto
excelent tuto cependant ,je ne comprends pas ce que viens faire
l'utilisateur bob
"chown bob:sftp_chroot /home/testuser/writeable"
merci de m'eclairer
Merci pour ce très bon tutoriel
Tout fonctionne parfaitement.
Tuto Parfait
Un grand merci pour ce tutoriel.
Après avoir passé une journée et demi sur d'autre tutoriel j'ai mis 3 min avec le votre pour créer un sftp.

Merci pour tout Philippe