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.