Configurer un serveur SFTP (FTP sur SSH)

La configuration d'un serveur FTP public anonyme est assez facile. Celle d'un serveur FTP privé, dont les clients peuvent s'y connecter uniquement par identification, est un peu plus complexe. Ajoutons à cela une identification chiffrée (FTPS), tout devient bien compliqué.

Je propose une solution facile à mettre en œuvre fonctionnant uniquement avec des comptes UNIX (petit inconvénient).
Au lieu de mettre en place un serveur FTP chiffré dont la configuration sera difficile, nous pouvons utiliser le protocole SFTP (SSH File Transfer Protocol),

La plupart des distributions GNU/Linux installent et exécutent le service OpenSSH, nous pouvons dès le démarrage de notre ordinateur nous y connecter depuis un autre par le protocole SSH, donc nous pouvons aussi faire des transferts de fichiers par celui-ci avec Filezilla par exemple. Nous voyons à quel point la mise en place d'un serveur SFTP est facile dès le début.

Mais il faut pouvoir sécuriser l'accès au maximum car par défaut :

  • nous avons accès à toute l'arborescence du serveur (pas de chroot), suivant les droits des dossiers et fichiers bien entendu,
  • nous avons accès à un shell.

Configuration d'OpenSSH

Nous pouvons sécuriser ces paramètres en ajoutant au fichier /etc/ssh/sshd_config :

PermitRootLogin no

Simple question de bon sens mais pas obligatoire.

Subsystem  sftp    internal-sftp

Cette commande autorise le faux shell "internal-sftp". J'y reviendrai un peu plus tard.

Match group geeks
   X11Forwarding no
   AllowTcpForwarding no
   ForceCommand internal-sftp
   ChrootDirectory /sftp/geeks/%u

Ici nous autorisons le groupe "geeks" à accéder au shell "internal-sftp" uniquement, et il ne pourra pas sortir de son home car il est chrooté.
Le %u est la variable désignant l'identifiant de l'utilisateur : si bob se connecte au serveur, il sera chrooté dans "/sftp/geeks/bob".

Maintenant que la configuration d'OpenSSH est faite, nous pouvons ajouter/configurer les comptes de nos clients.

Configuration des comptes utilisateurs

Tout d'abord, si le groupe "geeks" n'existe pas, il faut le créer :

groupadd geeks

Maintenant, ajoutons l'utilisateur "bob" :

useradd -g geeks -d /bob -s /usr/libexec/sftp-server bob

Bob :

  • fait partie du groupe "geeks",
  • son home est "/bob" donc " /sftp/geeks/bob" d'après /etc/sshd_config puisqu'il ne s'y connectera qu'en SSH,
  • et son shell est "/usr/libexec/sftp-server" (le chemin de ce shell peut être différent suivant les distributions). Ce faux shell permet de donner accès uniquement au protocole SFTP donc bob ne pourra pas avoir accès à la ligne de commande. Le faux shell /bin/false ne fonctionne pas dans ce cas.

Nous lui donnons un mot de passe :

passwd bob

Bob peut maintenant se connecter à "sftp://bob@<serveur>"

Cependant un petit inconvénient peut ennuyer : le chemin chrooté doit obligatoirement appartenir à "root:root" avec les droits "rwxr-xr-x" soit chmod 755. Dans ce cas, l'administrateur sera obligé de faire un répertoire dans chaque "home" avec des droits en lecture/écriture pour que chaque client puissent envoyer des fichiers.
Une autre solution est possible, mais peut ennuyer aussi : remplacer la ligne suivante de /etc/ssh/sshd_config :

ChrootDirectory /sftp/geeks/%u

par

ChrootDirectory /sftp/geeks

Dans ce cas, les clients seront chrooté dans le répertoire "/sftp/geeks" uniquement mais pourront faire tout ce qu'ils veulent dans leur home qui leur appartiendront.

Même si la configuration d'un serveur SFTP est moins flexible qu'un serveur FTP classique, nous avons pu voir qu'elle est très facile à mettre en œuvre et convient pour un petit serveur perso.

Vus : 1394
Publié par Thomas Bourdon : 17