Comment installer et configurer un serveur FTP (vsftpd) avec SSL/TLS sur Ubuntu 20.04

FTP ou File Transfer Protocol est un très vieux protocole bien connu pour transférer des fichiers entre un client et un serveur. C’est aussi un protocole non sécurisé, uniquement s’il est utilisé sans TLS. Dans ce tutoriel, nous allons configurer vsftpd pour TLS, ce qui nous permet d’utiliser FTP en toute sécurité. De nos jours, FTP a souvent été remplacé par des protocoles plus sûrs comme SFTP ou SCP.

Si toutefois tu as besoin d’utiliser FTP avec ton serveur, vsftpd (Very Secure FTP Daemon) est un choix parfait.

Dans ce tutoriel, nous allons apprendre à installer et à configurer un serveur FTP à l’aide de vsftpd sur un serveur basé sur Ubuntu 20.04. Nous apprendrons également comment sécuriser la connexion à l’aide du protocole SSL/TLS.

Conditions préalables

  • Un serveur Ubuntu 20.04 avec un utilisateur non-root ayant les privilèges sudo.

Étape 1 – Installer vsftpd

La première étape consiste à installer vsftpd.

$ sudo apt update
$ sudo apt install vsftpd

Ensuite, nous devons sauvegarder le fichier de configuration original afin de pouvoir commencer avec une nouvelle configuration.

$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

Étape 2 - Configurer le pare-feu

Dans cette étape, nous allons configurer le pare-feu UFW pour autoriser l'accès aux ports FTP.

Tout d'abord, vérifions l'état du pare-feu.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Comme nous pouvons le voir, seuls les ports SSH sont autorisés jusqu'à présent. Ouvrons les ports 20(port de commande FTP), 21(port de données FTP), 990 pour lorsque nous utilisons TLS et les ports 35000-40000 pour la gamme de ports passifs dont nous pourrions avoir besoin à l'avenir.

$ sudo ufw allow 20:21/tcp
$ sudo ufw allow 990/tcp
$ sudo ufw allow 35000:40000/tcp
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
990/tcp                    ALLOW       Anywhere
20:21/tcp                  ALLOW       Anywhere
35000:40000/tcp            ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
20:21/tcp (v6)             ALLOW       Anywhere (v6)
990/tcp (v6)               ALLOW       Anywhere (v6)
35000:40000/tcp (v6)       ALLOW       Anywhere (v6)

Étape 3 - Configuration de vsftpd

Nous allons maintenant passer en revue certains paramètres importants pour que vsftpd fonctionne.

Commence par ouvrir le fichier de configuration.

$ sudo nano /etc/vsftpd.conf

1. Accès FTP

Dans ce tutoriel, nous allons autoriser l'accès FTP uniquement aux utilisateurs locaux et désactiver tout accès anonyme. Pour ce faire, assure-toi que les lignes suivantes existent et sont les suivantes.

anonymous_enable=NO
local_enable=YES

2. Activer les téléchargements de fichiers

L'objectif le plus important de FTP est de pouvoir écrire sur le serveur. Dé-commente la ligne suivante pour activer les téléchargements de fichiers en supprimant # devant elle.

write_enable=YES

3. Prison Chroot

FTP fonctionne mieux lorsqu'un utilisateur est restreint à un certain répertoire. vsftpd y parvient en utilisant des prisons chroot. Lorsque chroot est activé pour les utilisateurs locaux, ils sont limités à leurs répertoires personnels par défaut. Pour cela, décommente la ligne suivante.

chroot_local_user=YES

Pour éviter toute faille de sécurité, chroot, lorsqu'il est activé, ne fonctionnera pas tant que le répertoire auquel les utilisateurs sont restreints est accessible en écriture.

Pour contourner cette limitation, nous avons deux méthodes pour autoriser le téléchargement de fichiers lorsque chroot est activé.

  1. Méthode 1 - Cette méthode fonctionne en utilisant un répertoire différent pour les téléchargements FTP. Pour ce tutoriel, nous allons créer un répertoire ftp à l'intérieur du domicile de l'utilisateur pour servir de chroot et un deuxième répertoire accessible en écriture upload pour le téléchargement des fichiers. Pour y parvenir, ajoute les lignes suivantes au bas du fichier.

    user_sub_token=$USER
    local_root=/home/$USER/ftp
    
  2. Méthode 2 - La deuxième méthode consiste simplement à accorder un accès en écriture à l'ensemble du répertoire personnel. Ajoute la ligne suivante pour y parvenir.

    allow_writeable_chroot=YES
    

4. FTP passif

vsftpd peut utiliser n'importe quel port pour les connexions FTP passives. Nous pouvons spécifier une plage pour le numéro de port minimum et maximum que vsftpd peut utiliser. Ce sont les ports que nous avons configurés dans notre pare-feu UFW auparavant.

Ajoute les lignes suivantes pour autoriser les connexions FTP passives.

pasv_min_port=35000
pasv_max_port=40000

5. Restreindre les utilisateurs

Pour permettre à certains utilisateurs seulement de se connecter au serveur FTP, ajoute les lignes suivantes en bas.

userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

Avec cette option activée, nous devons préciser quels utilisateurs doivent être autorisés à utiliser FTP et ajouter leurs noms d'utilisateur dans le fichier /etc/vsftpd.userlist.

Redémarre vsftpd pour activer la configuration.

$ sudo systemctl restart vsftpd

Étape 4 - Configuration du répertoire des utilisateurs

Pour les besoins de ce tutoriel, nous allons créer un nouveau compte utilisateur pour les transactions FTP. Si tu as déjà un compte utilisateur à cet effet, tu peux passer l'étape 1. De même, si tu avais déjà défini allow_writeable_chroot=YES dans le fichier de configuration, tu peux passer l'étape 3.

Étape 1 - Ajoute un nouvel utilisateur.

$ sudo adduser testuser

Définis un mot de passe fort et passe directement à toutes les autres invites.

Étape 2 - Ajoute l'utilisateur à la liste des utilisateurs FTP autorisés.

$ echo "testuser" | sudo tee -a /etc/vsftpd.userlist

Étape 3 - Créer un répertoire FTP et de fichiers

Cette étape est nécessaire si tu veux un répertoire différent comme racine FTP et un autre pour le téléchargement de fichiers afin de contourner la limitation de la prison chroot.

Crée le répertoire FTP.

$ sudo mkdir /home/testuser/ftp

Définis sa propriété.

$ sudo chown nobody:nogroup /home/testuser/ftp

Supprime les droits d'écriture.

$ sudo chmod a-w /home/testuser/ftp

Vérifie les permissions avant de continuer.

$ sudo ls -al /home/testuser/ftp
total 8
dr-xr-xr-x 2 nobody   nogroup  4096 Jun  7 13:08 .
drwxr-xr-x 3 testuser testuser 4096 Jun  7 13:08 ..

Maintenant, créons le véritable répertoire accessible en écriture pour les fichiers.

$ sudo mkdir /home/testuser/ftp/upload
$ sudo chown testuser:testuser /home/testuser/ftp/upload

Vérifie les permissions.

$ sudo ls -al /home/testuser/ftp
total 12
dr-xr-xr-x 3 nobody   nogroup  4096 Jun  7 13:10 .
drwxr-xr-x 3 testuser testuser 4096 Jun  7 13:08 ..
drwxr-xr-x 2 testuser testuser 4096 Jun  7 13:10 upload

Enfin, ajoutons un fichier test.txt à utiliser pour les tests.

$ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt

Étape 5 - Teste l'accès FTP

Notre serveur FTP est entièrement fonctionnel à ce stade. Nous pouvons faire un petit test avant de continuer.

Essayons de nous connecter en tant qu'utilisateur anonyme.

$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): anonymous
530 Permission denied.
ftp: Login failed.
ftp>

Ferme la connexion.

ftp> bye

Cela fonctionne comme prévu, c'est-à-dire que les utilisateurs anonymes ne sont pas autorisés.

Essayons de nous connecter en tant que n'importe quel autre utilisateur sudo. Il ne devrait pas se connecter non plus.

$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>

Ferme la connexion.

ftp> bye

Essayons enfin de nous connecter sous le nom de testuser que nous avons créé pour le FTP.

$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): testuser
331 Please specify the password.
Password: your_user's_password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Passons au répertoire upload et utilisons la commande get pour transférer le fichier de test sur notre machine locale.

ftp> cd upload
250 Directory successfully changed.
ftp> get test.txt
227 Entering Passive Mode (136,244,105,99,165,42).
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (164.3719 kB/s)
ftp>

Ensuite, téléchargeons le fichier avec un nouveau nom en utilisant la commande put pour tester les autorisations d'écriture.

ftp> put test.txt upload.txt
227 Entering Passive Mode (136,244,105,99,163,102).
150 Ok to send data.
226 Transfer complete.
17 bytes sent in 0.000894 seconds (518.7988 kB/s)

Ferme la connexion.

ftp> bye

Étape 6 - Sécuriser les transmissions à l'aide de SSL/TLS

Pour crypter les transmissions FTP, nous devons disposer d'un certificat SSL et configurer vsftpd pour l'utiliser.

Si tu as déjà un domaine ou un sous-domaine qui pointe vers ton serveur FTP, tu peux créer un certificat SSL Let's Encrypt gratuit et l'utiliser.

Pour les besoins de notre tutoriel, nous utiliserons un certificat SSL auto-signé. Pour en créer un, utilise la commande openssl.

La commande suivante créera une clé privée de 2048 bits et un certificat valable 1 an. Le certificat et la clé seront tous deux enregistrés dans le même fichier.

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

Tu peux soit ignorer les invites qui suivent, soit remplir les valeurs à ta convenance.

Maintenant que notre certificat est créé, il est temps d'ouvrir à nouveau le fichier de configuration vsftpd.

$ sudo nano /etc/vsftpd.conf

Trouve les lignes suivantes et commente-les en mettant un dièse devant elles comme suit.

# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

Maintenant, ajoute les lignes suivantes.

rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

Change également la valeur de ssl_enable en YES.

ssl_enable=YES

Ajoutons quelques paramètres supplémentaires pour améliorer la sécurité SSL.

allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

La plupart de ces paramètres sont auto-explicatifs. Ils permettent de désactiver SSL pour les utilisateurs anonymes et d'exiger SSL pour le transfert de données et les connexions. Nous avons également désactivé les protocoles SSL non sécurisés et nous nous en tiendrons à TLSv1.0. Et enfin, nous avons désactivé la réutilisation de SSL et exigé des suites de chiffrement à haut niveau de cryptage.

Redémarre le serveur pour que les paramètres prennent effet.

$ sudo systemctl restart vsftpd

Maintenant, tu ne pourras plus utiliser FTP via la ligne de commande. Tu devras te connecter en utilisant un client qui prend en charge TLS.

Étape 7 - Test de TLS avec FileZilla

Pour notre tutoriel, nous allons tester la capacité TLS en utilisant Filezilla.

Lorsque tu ouvres Filezilla, clique sur l'icône Site Manager juste au-dessus du mot Host sur la ligne supérieure.

FileZilla Site Manager

Une nouvelle fenêtre s'ouvre. Clique sur le bouton Nouveau site dans le coin inférieur droit.

Create New Site - FileZilla

Tu verras une nouvelle icône avec le nom Nouveau site. Tu peux le renommer en utilisant le bouton Renommer.

Remplis le champ Hôte avec l'adresse IP de ton serveur. Comme notre port FTP est 21, qui est le port par défaut pour le FTP, tu peux laisser le champ du port vide. Pour l'option Chiffrement, sélectionne Exiger un FTP explicite sur TLS dans le menu déroulant.

Site Edit - FileZilla

Remplis ton nom d'utilisateur et ton mot de passe FTP avec ceux que nous avons créés ci-dessus. Clique sur le bouton Connecter pour continuer.

Une fois la connexion réussie, tu verras un certificat de serveur qui ressemble à ce qui suit.

FTP SSL Certificate - FileZilla

Tu peux cocher l'option Toujours faire confiance à ce certificat dans les futures sessions. afin de ne pas te faire demander à chaque fois de te connecter. Clique sur Ok pour continuer.

Successful Connection - FileZilla

Tu peux maintenant effectuer des opérations FTP normales.

Étape 8 - Désactiver l'accès Shell

Cette étape est entièrement facultative. Par défaut, lors de la création d'un utilisateur FTP, s'il n'est pas explicitement spécifié, l'utilisateur aura un accès SSH au serveur.

Tu devrais désactiver l'accès shell à l'utilisateur FTP pour améliorer la sécurité. Pour le désactiver, nous devons créer un nouveau shell qui imprimera un message indiquant que le compte utilisateur est limité à l'accès FTP uniquement.

Crée le shell /bin/ftponly et rends-le exécutable.

$ echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a  /bin/ftponly
$ sudo chmod a+x /bin/ftponly

Ajoute le nouveau shell à la liste des shells valides dans le fichier /etc/shells.

$ echo "/bin/ftponly" | sudo tee -a /etc/shells

Change le shell de l'utilisateur en /bin/ftponly.

$ sudo usermod newftpuser -s /bin/ftponly

Tu peux utiliser la même commande pour modifier l'interpréteur de commandes de tous les utilisateurs auxquels tu veux donner l'accès FTP.

Conclusion

Ceci conclut notre tutoriel où nous avons installé et configuré vsftpd pour installer un serveur FTP sur un serveur basé sur Ubuntu 20.04. Nous avons également configuré notre connexion FTP pour qu'elle fonctionne avec SSL/TLS.

Si tu as des questions, pose-les dans les commentaires ci-dessous.

Vous aimerez aussi...