Installation d'un serveur sFTP chroot

Installer et configurer un serveur sFTP en environnement sécurisé

Problématique

De plus en plus la sécurité des échanges devient une problématique majeure. La protection de la vie privée également. Dans ces conditions, il est nécessaire de pouvoir garantir la sécurité des données échangées, y compris sur un serveur FTP. Pour cela, il faut installer un serveur FTP sécurisé : sFTP.

Par défaut, sous FreeBSD, le SFTP n'est pas configuré. Nous allons voir comment transformer une machine classique en serveur SFTP. Ce n'est pas très compliqué, mais sans explications, l'on peut chercher longtemps.

Dans notre exemple nous prendrons un serveur sous FreeBSD, un client FileZilla (libre, gratuit, gérant le SFTP) et un poste Windows.

Solution

Le SFTP repose sur une communication chiffrée par SSH. Il faut donc commencer par configurer le SSH correctement.

Mise en place du SSH

Création d'une clef de chiffrement

Le chiffrage repose sur une clef de chiffrement permettant à la fois de chiffrer un message clair et de déchiffrer un message chiffrer. Cette clef peut être unique ou double (publique/privée).

Sous Windows, puttygen permet de créer des clefs de chiffrement aisément.

Application puttygen.exe
puttygen.exe

Sélectionnons SSH2-RSA pour générer une clef RSA (ici de longueur 1024 bits, par défaut) puis cliquons sur Generate. L'application demande de faire bouger le pointeur de la souris sur la zone key, de façon à générer des nombres aléatoires.

puttygen.exe générant la clef
puttygen.exe générant la clef…

Une fois la clef générée :

puttygen.exe avec la clef générée
puttygen.exe avec la clef générée

Prenons le temps d'observer cette fenêtre. Dans la zone key, nous avons un message qui nous indique que pour OpenSSH, il faut copier et coller le contenu dans un fichier authorized_keys. Comme nous utilisons OpenSSH (ce qui est le cas du SSH par défaut sous freeBSD), suivons donc cette invitation : copions-collons le contenu dans un fichier authorized_keys (créé avec notepad) et mettons ce fichier de côté pour l'instant. Nous pouvons aussi décider de nous occuper de cela plus tard (en ouvrant une clef existante avec puttygen et en effectuant alors l'opération à ce moment).

Ensuite, nous avons un champ présentant l'empreinte de la clef puis deux champs demandant le mot de passe. C'est ici que nous le définissons. Choisissons donc le mot de passe et entrons le (deux fois) dans l'application et sauvons la clef privée (save private key) et la clef publique (save public key).

La partie génération de clef est finie.

Création du compte unix

Cette partie se passe sur le serveur (ici freeBSD). Nous créons un groupe spécifique dans /etc/group, par exemple ftpusers :

ftpusers:*:201:

Créons des utilisateurs attachés à ce groupe, par exemple sftpuser, avec la configuration par défaut. Il faut absolument qu'il puisse se connecter, évitons donc l'option nologin pour le Shell. Pour le reste, mettons ce que nous voulons :

adduser
Username : ...

Pour Home directory, laissons aussi son répertoire par défaut /home/sftpuser, cela nous sera fort utile pour y déposer la clef publique.

Pour le mot de passe, choisissons un mot de passe.

Le compte étant créé, nous allons dans le répertoire de notre nouvel utilisateur et nous créons un répertoire .ssh dans lequel nous transférons (par exemple par FTP classique ou samba) le fichier authorized_keys généré par puttygen. Le répertoire et le fichier doivent appartenir au propriétaire, c'est-à-dire le nouvel utilisateur créé (sftpuser). Et le fichier authorized_keys accessible uniquement pour le propriétaire (chmod 600).

Remarque

Si l'utilisateur existe déjà et qu'il possède déjà un fichier authorized_keys, alors il faut ajouter la nouvelle clef publique à la suite des autres dans ce fichier. authorized_keys est un trousseau de clefs publiques authentifiées pour le compte.

Création du répertoire partagé (chroot)

Pour notre groupe, nous voulons qu'il ait accès à un répertoire et seulement celui-là, sans pouvoir en sortir. Avec le compte root, créons donc ce répertoire :

mkdir /chemin/vers/mon_rep_partagé
chmod -R 755 /chemin/vers/mon_rep_partagé

Remarque

Ce répertoire doit appartenir à root et ne doit pas être accessible en écriture aux autres. Placez donc les droits à 755.

Pour que les utilisateurs puissent modifier le contenu de ce répertoire, il faudra créer des sous-répertoire accessibles, eux, en écriture.

Configuration de SSH

Editons /etc/ssh/sshd_config et ajoutons les lignes suivantes :

Match Group ftpusers
ChrootDirectory /chemin/vers/mon_rep_partagé

Pour le groupe ftpusers (groupe de notre nouvel utilisateur), nous redirigeons les connexions ssh vers /chemin/vers/mon_rep_partagé.

Modifions aussi la ligne :

Subsystem sftp /usr/libexec/sftp-server

en :

Subsystem sftp internal-sftp

En effet, il semble que, par défaut, ssh ne sache pas utiliser le serveur sftp FreeBSD (/usr/bin/sftp).

Démarrons le serveur :

/etc/rc.d/sshd start

Pour chaque modification du fichier de configuration, il faudra redémarrer le serveur ssh :

/etc/rc.d/sshd restart

Pour le démarrer automatiquement au démarrage de la machine, il ne faudra pas oublier de modifier le /etc/rc.conf :

sshd_enable="YES"

Connexion avec FileZilla

FileZilla gérant le sFTP, nous utiliserons cet outil pour nous connecter.

Dans Edition/Configuration/sFTP :

Gestion des clefs avec FileZilla
Gestion des clefs avec FileZilla

Importons notre nouvelle clef privée (Ajouter). Un message nous indique que les fichiers protégés par un mot de passe ne sont pas pris en charge par fileZilla. Acceptons alors de le convertir et enregistrons le sous un nouveau nom. Une fois cela fait, notre nouvelle clef apparaîtra dans la configuration :

La nouvelle clef est ajoutée dans FileZilla
La nouvelle clef est ajoutée dans FileZilla

Validons : OK

Dans Fichier/Gestionnaire de sites, créons un nouveau site, de type SFTP- SSH file Transfert Protocol, en authentification Normale, avec l'utilisateur créé (sftpuser) et comme mot de passe, le mot de passe UNIX.

Cliquons sur Connexion. Et voilà !

Erreurs possibles

FileZilla : Couldn't initialise connection to server

Si le fichier de log ne donne aucune erreur particulière, c'est que le problème se situe au niveau du sous-système sftp. Pensez bien à utiliser internal-sftp

Syslog : fatal: bad ownership or modes for chroot directory…

Si le fichier de log donne cette erreur, c'est que le répertoire indique n'appartient pas à root ou possède les droits d'écriture pour les étrangers. Effectuez un changement de propriétaire (chown) ou restreignez les droits (chmod)