Dernière modification le 08/08/2021

Serveur (S)FTP(S)


Wiki

Lien Utile

Pourquoi Installer un serveur FTP

Vous voulez transférer des fichiers entre votre Raspberry Pi et votre ordinateur à distance sans passer par un média amovible (clé usb/disque dur externe) et sans éteindre le Raspberry pour transférer directement sur sa carte SD ? Nous allons voir comment faciliter la vie grâce à un serveur FTP (File Transfer Protocol) qui comme son nom l’indique permet de transférer des fichiers (recevoir ou envoyer) avec un serveur distant.


Installation du serveur FTP


En ligne de commandes (LXTerminal)

Il existe aujourd’hui plusieurs solutions de serveur FTP et celle que nous choisissons pour ce tutoriel est la plus souvent utilisée à savoir “proftpd”. Pour l’installer, démarrer un terminal (LXTerminal) et tapez :

sudo apt install proftpd ↲
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'proftpd-basic' instead of 'proftpd'
The following additional packages will be installed:
libhiredis0.14 libmemcached11 libmemcachedutil2 proftpd-doc
Suggested packages:
openbsd-inetd | inet-superserver proftpd-mod-ldap proftpd-mod-mysql proftpd-mod-odbc proftpd-mod-pgsql
proftpd-mod-sqlite proftpd-mod-geoip proftpd-mod-snmp
The following NEW packages will be installed:
libhiredis0.14 libmemcached11 libmemcachedutil2 proftpd-basic proftpd-doc
0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
Need to get 4,365 kB of archives.
After this operation, 9,044 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y↲
Get:1 http://ftp.halifax.rwth-aachen.de/raspbian/raspbian buster/main armhf libhiredis0.14 armhf 0.14.0-3 [28.9 kB]
Get:2 http://ftp.halifax.rwth-aachen.de/raspbian/raspbian buster/main armhf libmemcached11 armhf 1.0.18-4.2 [85.0 kB]
Get:3 http://ftp.halifax.rwth-aachen.de/raspbian/raspbian buster/main armhf libmemcachedutil2 armhf 1.0.18-4.2 [2 1.5 kB]
Get:4 http://ftp.halifax.rwth-aachen.de/raspbian/raspbian buster/main armhf proftpd-basic armhf 1.3.6-4+deb10u5 [2,534 kB]
Get:5 http://ftp.halifax.rwth-aachen.de/raspbian/raspbian buster/main armhf proftpd-doc all 1.3.6-4+deb10u5 [1,69 6 kB]
.
.
.
Setting up libhiredis0.14:armhf (0.14.0-3) ...
Setting up libmemcachedutil2:armhf (1.0.18-4.2) ...
Setting up proftpd-basic (1.3.6-4+deb10u5) ...
Adding system user `proftpd' (UID 109) ...
Adding new user `proftpd' (UID 109) with group `nogroup' ...
Not creating home directory `/run/proftpd'.
Adding system user `ftp' (UID 110) ...
Adding new user `ftp' (UID 110) with group `nogroup' ...
Creating home directory `/srv/ftp' ...
'/usr/share/proftpd/templates/welcome.msg' -> '/srv/ftp/welcome.msg.proftpd-new'
Processing triggers for systemd (241-7~deb10u6+rpi1) ...
Processing triggers for man-db (2.8.5-2) ...
Processing triggers for libc-bin (2.28-10+rpi1) ...


Configuration de proftpd

nous allons vous présenter les principales configurations à effectuer en fonction de l’utilité que vous aurez de votre serveur FTP.
Avant toutes choses il est recommandé de faire une copie du fichier de configuration, cela permettra de le restaurer en cas de fause manoeuvre, exécutez la commande suivante :

sudo cp /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.bak

Commencez par ouvrir le fichier de configuration :

sudo nano /etc/proftpd/proftpd.conf

Il y a pas mal de lignes de configuration. Nous allons indiquer les paramètres que nous considérons comme les plus importants.

Une fois que vous avez fini de configurer proftpd, vous pouvez activer les modifications en redémarrant le serveur avec la commande :

sudo service proftpd reload


Sécuriser avec TLS

Votre serveur est maintenant en place, cependant, tout ce qui transite entre votre serveur et votre client FTP est envoyé en clair sur le Net, ce qui est loin d'être sécurisé.
Nous allons donc chiffrer le tout avec une sécurisation TLS (SSLv3 étant deprecated).
Ce système est basé sur un certificat, pour utiliser et générer un certificat il faut utiliser “Openssl”.
Pour créer un certificat auto signé pour “Proftpd” utilisez la commande suivante :

sudo openssl req -new -x509 -days 365 -nodes -out /etc/ssl/certs/proftpd.cert -keyout /etc/ssl/private/proftpd.key

Où :

Renseignez les champs demandés par OpenSSL avec les bonnes informations, par exemple :

Ce qui donne :

Generating a RSA private key
..............+++++
..............................................................+++++
writing new private key to '/etc/ssl/private/proftpd.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BE
State or Province Name (full name) [Some-State]:IciEtLa
Locality Name (eg, city) []:IciEtLa
Organization Name (eg, company) [Internet Widgits Pty Ltd]:carlgregoire.be
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Raspberry
Email Address []:

Voila le certificat créé.

Maintenant nous allons forcer notre serveur FTP à utiliser cela pour générer une connexion chiffrée.
Avec votre éditeur de fichier préféré, créez le fichier “/etc/proftpd/conf.d/tls.conf”, avec les données suivante :

<IfModule mod_tls.c>
   TLSEngine on
   TLSLog /var/log/proftpd/tls.log

   # TLSv1 Uniquement
   TLSProtocol TLSv1

   # N'autorise que les connexions sécurisées
   TLSRequired on

   # Renseigne l'emplacement des certificats
   TLSRSACertificateFile /etc/ssl/certs/proftpd.cert
   TLSRSACertificateKeyFile /etc/ssl/private/proftpd.key

   TLSVerifyClient off
   TLSRenegotiate none
</IfModule>

Dans le fichier “proftpd.conf” io y à une directive pour charger les fichiers de configuration situés dans le dossier “conf.d” de “proftpd” :

Include /etc/proftpd/conf.d/

Ensuite nous re-démarrons notre serveur FTP :

sudo service proftpd restarté


Utiliser le protocole SFTP

Le protocole SFTP est plus sécurisé, car il s'appuie sur le protocol SSH.
Pour passer du FTP vers SFTP il faut activer le SSH.
Pour activer le SSH voir le tuto “SSH”.
Dans la gestion des sites de “FileZille” activez le protocole "SFTP".

Attention

Attention si vous avez créé un utilisateur avec un shell /bin/false/, il n’aura pas accès au service SFTP, même s'il a accès au FTP.


Utilisateur

Pour accéder au serveur FTP l’utilisateur doit être connu dans le système Linux qui héberge le serveur FTP. Il est aussi possible de créer un utilisateur qui n'aura qu'un accès FTP.


Chacun chez soi

Si dans le fichier de configuration de Proftpd la ligne “#DefaultRoot ~” est commentée (précédée de #), les utilisateurs ont accès à toute l'arborescence du système linux, en fonction de leurs doigts.
Si dans le fichier de configuration de Proftpd la ligne “DefaultRoot ~” n’est pas commentée (pas précédée de #), les utilisateurs ont accès uniquement à leur dossier personnel (~) par exemple ‘pi’ ne verra que le contenu du dossier “/home/pi”. Il lui sera impossible de remonter à la racine du système d'exploitation.


Utilisateur exclusif FTP

L’utilisateur exclusif FTP ne pourra utiliser que l’accès à son dossier et ne pourra pas se connecter en shell, donc pas d'accès SSH.
Créer un utilisateur et lui affecter un mot de passe, avec les commandes suivantes :

sudo useradd -s /bin/false ggr
sudo passwd ggr

Maintenant l’utilisateur est bien créé dans le système.
Pour l’instant il n’a pas accès au serveur FTP, car celui-ci vérifie la présence du shell spécifié “-s /bin/false” dans la fichier “/etc/shells” et pour l’instant “/bin/false” n’est pas dans ce fichier.
Nous allons ajouter “/bin/false” au fichier “/etc/shells” avec la commande suivante :

sudo echo "/bin/false" >> /etc/shells

Attention il est possible que l’écriture soit refusée malgré la commande “sudo”. Passez alors en “root” a avec la, commande :

sudo su root

La connexion est toujours impossible car l’utilisateur n’a pas de dossier personnel, ajouter un dossier personnel à l’utilisateur avec les commandes suivantes :

sudo mkdir /home/ggr

Créé de cette façon le propriétaire est “root, donnons maintenant la plein propriété à l'utilisateur avec la commande suivante :

sudo chown ggr:ggr /home/ggr/

Maintenant la connexion FTP fonctionne.

Attention

Attention si le paramètre "#DefaultRoot ~" est toujours commenté, le nouvel utilisateur à accès à toute l'arborescence du système !!!


Limiter l’utilisateur à son dossier personnel uniquement

Pour qu’un utilisateur puisse se connecter au serveur FTP et télécharger des fichiers dans son dossier personnel exclusivement, modifiez le “proftpd.conf” de la façon suivante (exemple avec l’utilisateur “ggr”) :

<Directory /home/ggr>
   Umask 022
   AllowOverwrite off
   <Limit LOGIN>
      AllowUser ggr
      DenyAll
   </Limit>
   <Limit ALL>
      AllowUser ggr
      DenyAll
   </Limit>
</Directory>

où :


Dossier Anonyme

Il est possible de donner accès public à un dossier et ceci de façon anonyme. Pour commencer créer le dossier “ftp” :

sudo mkdir /home/ftp/

Modifier les droits sur le dossier :

sudo chmod 744 -R /home/ftp/

Les droits sont alors :

Modifier le fichier de configuration “proftpd.conf” pour donner un accès aux anonymes :

.
.
.
#DefaultRoot ~
.
.
.
<Anonymous ~ftp>
   User ftp
   Group nogroup

   # Profils de connexion possibles pour Clients
   UserAlias anonymous ftp

   # Masquer les propriétés des utilisateurs et des groupes
   DirFakeUser on ftp
   DirFakeGroup on ftp
   RequireValidShell off
   # maximiser le nombre de Client
   MaxClients 10

   <Directory *>
      <Limit WRITE>
         DenyAll
      </Limit>
   </Directory>
</Anonymous>

Fonctionne aussi avec “Group ftp”.


Utilisateur virtuel

L’utilisateur virtuel permet une configuration plus profonde et un meilleur contrôle des utilisateurs. Un utilisateur virtuel a pour principal intérêt de créer des utilisateurs qui seront uniquement assignés au FTP, plus besoin de contrôler leur accès au ssh ils n’y auront pas accès. Cette méthode permet aussi de les bloquer dans un répertoire autre que leur home, très utile dans le cadre d’un développement web !
Dans mon exemple j’ai placé le dossier dans le “/home” mais il aurait pu être ailleurs. Afin d’avoir un UID et un GID j’ai aussi créé un utilisateur et un groupe “ftp” ce qui me donne un UID et une GID. L’utilisateur “ftp” ne peux pas exécuter de script, dans la me idée de l’utilisateur et le groupe “www-data”.

Le dossier d’accès du FTP

Créer l’utilisateur “ftp” :

sudo adduser -s /bin/false ftp

Créer le groupe “ftp” :

sudo groupadd ftp

Ajouter l’utilisateur “ftp” au groupe “ftp” :

sudo adduser ftp ftp

Récupération du UID et GID de “ftp” (prendre note) :

sudo id ftp ↲
uid=1001(ftp) gid=1001(ftp) groups=1001(ftp)

Création du dossier pour l'utilisateur :

sudo mkdir /home/test

Changer le propriétaire du dossier :

sudo chown -R ftp:ftp /home/test

Shell "/bin/false"

S'assurer que le shell “/bin/false” est bien présent dans le fichier “/etc/shells” avec la commande suivante :

sudo cat /etc/shells ↲
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/bin/false

Ici il est présent, mais si il ne l'était pas effectuer la commande suivante pou l’ajouter dans le fichier :

sudo echo "/bin/false" >> /etc/shells

Configuration de "proftpd" pour gérer les utilisateurs virtuelles

Il faut d’abord créer deux nouveaux fichiers dans le dossier de “proftpd”, le premier pour la déclaration des utilisateurs virtuels et l’autre pour les groupes d’utilisateurs :

sudo touch /etc/proftpd/ftpd.passwd /etc/proftpd/ftpd.group

Pour des raisons de sécurité modifier les droit s du fichier “ftpd.passwd” et “ftpd.group” :

sudo chmod 640 /etc/proftpd/ftpd.passwd /etc/proftpd/ftpd.group

Ajoutons maintenant un utilisateur virtuel avec la commande suivante :

sudo ftpasswd --passwd --name=nom_utilisateur --uid=numéro_uid --file=/etc/proftpd/ftpd.passwd --home=emplacement_dossier_utilisateur --shell=/bin/false

Dans cette commande ce qui est attendu est :

Ajouter l’utilisateur virtuel dans le fichier “ftpd.passwd” à destination de “proftpd” :

sudo ftpasswd --passwd --name=test --uid=1001 --file=/etc/proftpd/ftpd.passwd --home=/home/test --shell=/bin/false

Lors de l’exécution de la commande le mot de passe de l'utilisateur vous sera demandé.
Voilà un utilisateur virtuel “test” à été créé avec un UID de “1001”, avec un accès au répertoire “/home/test”.

Créer maintenant un groupe pour l’utilisateur “test_ftp” avec la commande suivante :

sudo ftpasswd --group --name=test_ftp --gid=1001 --file=/etc/proftpd/ftpd.group --member=test

Vérification du fichier “/etc/proftpd/ftpd.passwd” avec la commande suivante :

sudo cat /etc/proftpd/ftpd.passwd ↲
test:$1$tisX8SWm$KraQe4mCnkWpv1ZTuQOzY/:1001:1001::/home/test:/bin/false

L’utilisateur à bien été créé.

Vérification du fichier “/etc/proftpd/ftpd.group” avec la commande suivante :

sudo cat /etc/proftpd/ftpd.group ↲
test_ftp:x:1001:test

Le groupe “test_ftp” est bien créé et l’utilisateur “test” en fait bien partie.

Editer le fichier “/etc/proftpd/proftpd.conf” pour qu’il prenne en charge les utilisateur virtuel, les lignes suivante donne le chemin des deux nouveaux fichiers qui contiennent les utilisateurs et leurs mot de passe et le ou les groupes utilisateur :

#Emplacement du fichier contenant la liste des utilisateurs virtuels,
AuthUserFile /etc/proftpd/ftpd.passwd
#Emplacement du fichier contenant la liste des groupes virtuels,
AuthGroupFile /etc/proftpd/ftpd.group

Toujours dans “proftpd.conf”, préciser le paramètre “DefaultRoot” pour obliger les utilisateurs du groupe ftp à rester dans le dossier “test” :

DefaultRoot /home/test test_ftp

Personnellement pour les tests le paramètre est le suivant (simplement décommenté):

DefaultRoot ~

Redémarrer le serveur “proftpd” :

sudo service proftpd reload

Ajouter un autre utilisateur

réation du dossier pour l'utilisateur :

sudo mkdir /home/test2

Changer le propriétaire du dossier :

sudo chown -R ftp:ftp /home/test2

Ajouter l’utilisateur virtuel dans le fichier “ftpd.passwd” à destination de “proftpd” :

sudo ftpasswd --passwd --name=test2 --uid=1001 --file=/etc/proftpd/ftpd.passwd --home=/home/test2 --shell=/bin/false

Attention

A noter que je n’ai pas ajouté l’utilisateur "test2" au groupe "test_ftp", ceci parce que j’utilise "DefaultRoot ~" et non "DefaltRoot /home/test". Ce qui serait problématiques avec deux utilisateurs. Donc je pourrais ne pas créer le fichier "ftpd.group" et mettre le paramètre "AuthGroupFile /etc/proftpd/ftpd.group" dans “proftpd.conf”.

Redémarrer le serveur “proftpd” :

sudo service proftpd reload

Changer le mot de passe d’un utilisateur virtuel

Pour changer le mot de passe d'un utilisateur virtuel, exécutez la commande :

sudo ftpasswd --passwd --change-password --file=/etc/proftpd/ftpd.passwd --name=test2 ↲
ftpasswd: updating passwd entry for user cam1

Password: [entrer le nouveau mot de passe][Enter]
Re-type password: [entrer le nouveau mot de passe][Enter]

ftpasswd: entry updated


Type de serveur


Serveur inetd ou standalone

Deux types de serveur est possible avec “proftpd” :

A moins que vous envisagiez de mettre ce serveur FTP sur votre Raspberry à disposition de plusieurs personnes qui comptent se connecter régulièrement, nous vous conseillons de choisir l’option “inetd”.
De base le serveur FTP est du type “standalone”.


Passage en serveur "inetd"

Lien Utile

Installer le paquet “inetd” :

sudo apt install inetd

Ensuite ajouter la ligne suivante dans “/etc/inetd.conf” :

ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/proftpd

Reste à configurer “proftpd” en “inetd”, modifier dans le fichier de configuration”/etc/proftpd/proftpd.conf” la ligne :

ServerType standalone

En

ServerType inetd


Mode passif ou actif

Voir information dans le Wiki.

De base le serveur est en mode “actif”, donc le port utilisé est le port 20 (le port 21 ne sert qu'à initier la connexion et envoyer des commandes).


Accéder à votre serveur FTP

Maintenant que votre serveur FTP est installé et configuré, il ne reste plus qu’à s’y connecter pour pouvoir commencer le transfert de fichiers.


Depuis un navigateur

Pour cela vous pouvez vous connecter directement depuis votre navigateur web avec une url du type :

ftp://ip-raspberry

par exemple :

ftp://192.168.1.21

Attention

Attention certains navigateurs ne permettent plus des connexion FTP, par exemple Chrome.

Il faut ensuite rentrer l’identifiant et le mot de passe pour accéder au serveur FTP.
Sauf pour la connexion “anonymous”, l’utilisateur doit avoir un compte sur le Raspberry.de votre utilisateur Raspberry Pi et vous serez connecté. Cela ne reste pas très pratique car vous ne pourrez pas envoyer de fichier vers le serveur.


Depuis un client FTP en FTP uniquement

Nous vous conseillons l’utilisation d’un client FTP comme par exemple “Filezilla”, qui fonctionne aussi bien sous Linux et Zindowz

.

Dans l’onglet “LinuxGénéral” :

Lors de la connexion le fenêtre suivante apparaît :

Cette fenêtre vous informe que la sécurité n’est pas au rendez-vous !!!

Attention

Donc ATTENTION, FTP n’est pas un protocole chiffré. Si vous souhaitez faire transiter des informations sensibles, nous vous conseillons plutôt d’utiliser SFTP ou le FTPS !


Depuis un client FTP en FTPS

Les paramètres sont identiques sauf le chiffrement qui doit être “Connexion FTP explicite sur TLS”.

A la connexion vous devez approuver le certificat :

Cliquez sur “Valider”.


Erreur

Attention à ma première connexion message d’erreur :

"425 Unable to build data connection: Operation not permitted"

Lien Utile

La solution est d'ajouter la ligne suivante dans le fichier "proftpd.conf" :

TLSOptions NoSessionReuseRequired

Redémarrer le serveur “proftpd”, pour ma part plus de problème.