Comment configurer vsftpd pour un répertoire utilisateur sur Debian 10

introduction

FTP, abréviation de File Transfer Protocol, est un protocole réseau qui était autrefois largement utilisé pour transférer des fichiers entre un client et un serveur. Depuis, il a été remplacé par des moyens plus rapides, plus sûrs et plus pratiques de livrer des fichiers. De nombreux internautes occasionnels s’attendent à télécharger directement à partir de leur navigateur Web avec + https +, et les utilisateurs de ligne de commande sont plus susceptibles d’utiliser des protocoles sécurisés tels que le + scp + ou https://www.digitalocean.com/community/ didacticiels / comment-utiliser-sftp-pour-transférer-des-fichiers-en toute sécurité avec un serveur distant [SFTP].

FTP est toujours utilisé pour prendre en charge les applications héritées et les workflows ayant des besoins très spécifiques. Si vous avez le choix du protocole à utiliser, explorez les options les plus modernes. Cependant, lorsque vous avez besoin de FTP, vsftpd est un excellent choix. Optimisé pour la sécurité, les performances et la stabilité, vsftpd offre une protection efficace contre de nombreux problèmes de sécurité rencontrés sur d’autres serveurs FTP. Il s’agit du paramètre par défaut pour de nombreuses distributions Linux.

Dans ce didacticiel, vous allez configurer vsftpd pour permettre à un utilisateur de télécharger des fichiers dans son répertoire de départ via FTP, avec les informations de connexion sécurisées par SSL / TLS.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

  • Un serveur Debian 10 et un utilisateur non root avec les privilèges + sudo +. Pour en savoir plus sur la création d’un utilisateur avec ces privilèges, consultez notre guide Initial Initial Server avec Debian 10.

Étape 1 - Installation de vsftpd

Commençons par mettre à jour votre liste de paquets et installer le démon + vsftpd:

sudo apt update
sudo apt install vsftpd

Une fois l’installation terminée, copiez le fichier de configuration pour pouvoir commencer avec une configuration vierge et enregistrez l’original en tant que sauvegarde:

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

Avec une sauvegarde de la configuration en place, nous sommes prêts à configurer le pare-feu.

Étape 2 - Ouverture du pare-feu

Vérifions l’état du pare-feu pour voir s’il est activé. Si tel est le cas, nous veillerons à ce que le trafic FTP soit autorisé afin que les règles de pare-feu ne bloquent pas nos tests. Ce guide suppose que vous avez installé UFW, à l’étape 4 de la https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-10#step-4-%E2%80%94. -setting-up-a-basic-firewall [guide de configuration initiale du serveur].

Vérifiez l’état du pare-feu:

sudo ufw status

Dans ce cas, seul SSH est autorisé via:

OutputStatus: active

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

Vous pouvez avoir d’autres règles en place ou aucune règle de pare-feu du tout. Etant donné que seul le trafic SSH est autorisé dans ce cas, nous devrons ajouter des règles pour le trafic FTP.

Ouvrons les ports + 20 + et '+ 21 + pour FTP, le port + 990 + pour activer TLS, et les ports + 40000-50000 + `pour la gamme de ports passifs que nous prévoyons de définir dans le fichier de configuration:

sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp

Vérifiez l’état du pare-feu:

sudo ufw status

Les règles de votre pare-feu doivent maintenant ressembler à ceci:

OutputStatus: active

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

Avec + vsftpd + installé et les ports nécessaires ouverts, passons à la création d’un utilisateur FTP dédié.

Étape 3 - Préparation du répertoire de l’utilisateur

Nous allons créer un utilisateur FTP dédié, mais vous avez peut-être déjà un utilisateur ayant besoin d’un accès FTP. Nous veillerons à préserver l’accès d’un utilisateur existant à leurs données dans les instructions qui suivent. Néanmoins, nous vous recommandons de commencer avec un nouvel utilisateur jusqu’à ce que vous ayez configuré et testé votre configuration.

Premièrement, ajoutez un utilisateur de test appelé ++:

sudo adduser

Attribuez un mot de passe lorsque vous y êtes invité. N’hésitez pas à appuyer sur + ENTER + à travers les autres invites.

FTP est généralement plus sécurisé lorsque les utilisateurs sont limités à un répertoire spécifique. + vsftpd + accomplit cela avec https://www.digitalocean.com/community/tutorials/how-to-configure-chroot-environments-for-testing-on-an-ubuntu-12-04-vps#what-is -a-chroot-environment [+ chroot +]] jails. Lorsque + chroot + est activé pour les utilisateurs locaux, ceux-ci sont limités à leur répertoire de base par défaut. Cependant, en raison de la manière dont + vsftpd + sécurise le répertoire, il ne doit pas être accessible en écriture à l’utilisateur. Cela convient très bien à un nouvel utilisateur qui doit uniquement se connecter via FTP, mais un utilisateur existant peut avoir besoin d’écrire dans son dossier personnel s’il dispose également d’un accès shell.

Dans cet exemple, plutôt que de supprimer les privilèges d’écriture du répertoire de base, créons un répertoire + ftp + à utiliser en tant que + chroot + et un répertoire en écriture + files + pour contenir les fichiers réels.

Créez le dossier + ftp +:

sudo mkdir /home//ftp

Définir sa propriété:

sudo chown nobody:nogroup /home//ftp

Supprimer les autorisations d’écriture:

sudo chmod a-w /home//ftp

Vérifiez les autorisations:

sudo ls -la /home//ftp
Outputtotal 8
4 dr-xr-xr-x  2 nobody nogroup 4096 Aug 24 21:29 .
4 drwxr-xr-x  3 sammy  sammy   4096 Aug 24 21:29 ..

Créons ensuite le répertoire des téléchargements de fichiers et attribuons la propriété à l’utilisateur:

sudo mkdir /home//ftp/files
sudo chown : /home//ftp/files

Une vérification des autorisations sur le répertoire + ftp + devrait retourner ce qui suit:

sudo ls -la /home/sammy/ftp
Outputtotal 12
dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 .
drwxr-xr-x 3 sammy  sammy   4096 Aug 26 13:59 ..
drwxr-xr-x 2 sammy  sammy   4096 Aug 26 14:01 files

Enfin, ajoutons un fichier + test.txt + à utiliser lorsque nous testons:

echo "vsftpd test file" | sudo tee /home//ftp/files/test.txt

Maintenant que nous avons sécurisé le répertoire + ftp + et que nous avons autorisé l’utilisateur à accéder au répertoire + fichiers +, modifions notre configuration.

Étape 4 - Configuration de l’accès FTP

Nous prévoyons d’autoriser un seul utilisateur disposant d’un compte shell local à se connecter via FTP. Les deux paramètres clés pour cela sont déjà définis dans + vsftpd.conf +. Commencez par ouvrir le fichier de configuration pour vérifier que les paramètres de votre configuration correspondent à ceux ci-dessous:

sudo nano /etc/vsftpd.conf

/etc/vsftpd.conf

. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .

Ensuite, permettons à l’utilisateur de télécharger des fichiers en vérifiant que le paramètre + write_enable + ne soit pas commenté et qu’il soit défini sur ++:

/etc/vsftpd.conf

. . .
write_enable=
. . .

Nous allons également supprimer le + chroot + pour empêcher l’utilisateur connecté à FTP d’accéder à des fichiers ou à des commandes en dehors de l’arborescence:

/etc/vsftpd.conf

. . .
chroot_local_user=
. . .

Ajoutons également un + user_sub_token + pour insérer le nom d’utilisateur dans notre répertoire + local_root directory + afin que notre configuration fonctionne pour cet utilisateur et tous les utilisateurs futurs. Ajoutez ces paramètres n’importe où dans le fichier:

/etc/vsftpd.conf

. . .

Limitons également le nombre de ports pouvant être utilisés pour le FTP passif afin de s’assurer qu’il existe suffisamment de connexions:

/etc/vsftpd.conf

. . .

Pour autoriser l’accès FTP au cas par cas, définissons la configuration de manière à ce que les utilisateurs n’y aient accès que s’ils sont explicitement ajoutés à une liste, et non par défaut:

/etc/vsftpd.conf

. . .

+ userlist_deny + bascule la logique: lorsqu’il est défini sur + YES +, l’accès FTP aux utilisateurs de la liste est refusé. Lorsqu’il est défini sur + NO +, seuls les utilisateurs de la liste sont autorisés à accéder.

Une fois les modifications apportées, enregistrez le fichier et quittez l’éditeur.

Enfin, ajoutons notre utilisateur à + ​​/ etc / vsftpd.userlist +. Utilisez l’indicateur + -a + pour ajouter au fichier:

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

Vérifiez qu’il a bien été ajouté comme prévu:

cat /etc/vsftpd.userlist
Outputsammy

Redémarrez le démon pour charger les modifications de configuration:

sudo systemctl restart vsftpd

Une fois la configuration en place, nous pouvons maintenant tester l’accès FTP.

Étape 5 - Test de l’accès FTP

Nous avons configuré le serveur pour n’autoriser que l’utilisateur * sammy * à se connecter via FTP. Assurons-nous que cela fonctionne comme prévu.

  • Les utilisateurs anonymes ne devraient pas pouvoir se connecter *: nous avons désactivé l’accès anonyme. Testons cela en essayant de vous connecter anonymement. Si notre configuration est correctement configurée, l’autorisation des utilisateurs anonymes devrait être refusée. Ouvrez un autre terminal et exécutez la commande suivante. Assurez-vous de remplacer ` par * l'adresse IP publique de votre serveur * et utilisez ` comme nom d’utilisateur:

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Permission denied.
ftp: Login failed.
ftp>

Fermer la connexion:

bye
  • Les utilisateurs autres que sammy ne devraient pas pouvoir se connecter *: Ensuite, essayons de nous connecter en tant qu’utilisateur + sudo +. L’accès devrait également leur être refusé, et cela devrait se produire avant de pouvoir saisir leur mot de passe:

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Permission denied.
ftp: Login failed.
ftp>

Fermer la connexion:

bye
  • L’utilisateur sammy devrait pouvoir se connecter, lire et écrire des fichiers *: s’assurons que notre utilisateur désigné peut se connecter:

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Passons au répertoire + fichiers dans et utilisons la commande` + get` pour transférer le fichier de test créé précédemment sur notre ordinateur local:

cd files
get test.txt
Output229 Entering Extended Passive Mode (|||47398|)
150 Opening BINARY mode data connection for test.txt (17 bytes).
100% |**********************************|    17      146.91 KiB/s    00:00 ETA
226 Transfer complete.
17 bytes received in 00:00 (0.17 KiB/s)
ftp>

Ensuite, transférons le fichier avec un nouveau nom pour tester les autorisations d’écriture:

put test.txt upload.txt
Output229 Entering Extended Passive Mode (|||46598|)
150 Ok to send data.
100% |**********************************|    17        8.93 KiB/s    00:00 ETA
226 Transfer complete.
17 bytes sent in 00:00 (0.08 KiB/s)

Fermer la connexion:

bye

Maintenant que nous avons testé notre configuration, prenons des mesures pour sécuriser davantage notre serveur.

Étape 6 - Sécurisation des transactions

Étant donné que FTP ne crypte pas les données en transit, y compris les identifiants des utilisateurs, nous allons permettre à TLS / SSL de fournir ce cryptage. La première étape consiste à créer les certificats SSL à utiliser avec + vsftpd +.

Utilisons + openssl + pour créer un nouveau certificat et l’indicateur + -days + pour le rendre valide pendant un an. Dans la même commande, nous allons ajouter une clé RSA privée à 2048 bits. En définissant les indicateurs + -keyout + et + +out + sur la même valeur, la clé privée et le certificat seront situé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

Vous serez invité à fournir les informations d’adresse pour votre certificat. Remplacez vos propres informations par les valeurs en surbrillance ci-dessous. Pour le champ + Common Name, assurez-vous d’ajouter` ++ `:

OutputGenerating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
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]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Pour plus d’informations sur les indicateurs de certificat, voir OpenSSL Essentials: Travailler avec SSL Certificats, clés privées et CSR

Une fois les certificats créés, ouvrez à nouveau le fichier de configuration + vsftpd +:

sudo nano /etc/vsftpd.conf

Vers le bas du fichier, vous verrez deux lignes qui commencent par + rsa_ +. Commentez-les pour qu’ils ressemblent à ceci:

/etc/vsftpd.conf

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

Sous celles-ci, ajoutez les lignes suivantes qui pointent vers le certificat et la clé privée que nous venons de créer:

/etc/vsftpd.conf

. . .


. . .

Après cela, nous allons forcer l’utilisation de SSL, ce qui empêchera les clients qui ne peuvent pas gérer TLS de se connecter. Cela est nécessaire pour garantir que tout le trafic est crypté, mais cela peut forcer votre utilisateur FTP à changer de client. Changez + ssl_enable + en + + OUI +:

/etc/vsftpd.conf

. . .
ssl_enable=
. . .

Après cela, ajoutez les lignes suivantes pour refuser explicitement les connexions anonymes via SSL et pour exiger l’utilisation de SSL pour le transfert de données et les connexions:

/etc/vsftpd.conf

. . .



. . .

Après cela, configurez le serveur pour utiliser TLS, le successeur préféré de SSL, en ajoutant les lignes suivantes:

/etc/vsftpd.conf

. . .



. . .

Enfin, nous ajouterons deux autres options. Premièrement, nous n’exigerons pas de réutilisation de SSL car cela peut endommager de nombreux clients FTP. Nous aurons besoin de suites de chiffrement de chiffrement «élevé», ce qui signifie actuellement que les longueurs de clé sont égales ou supérieures à 128 bits:

/etc/vsftpd.conf

. . .


. . .

La section du fichier fini devrait ressembler à ceci:

/etc/vsftpd.conf

# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
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

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Redémarrez le serveur pour que les modifications prennent effet:

sudo systemctl restart vsftpd

À ce stade, nous ne pourrons plus nous connecter avec un client de ligne de commande non sécurisé. Si nous essayions, nous verrions quelque chose comme:

Outputftp -p
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
ftp>

Ensuite, vérifions que nous pouvons nous connecter en utilisant un client qui supporte TLS.

Étape 7 - Test de TLS avec FileZilla

La plupart des clients FTP modernes peuvent être configurés pour utiliser le cryptage TLS. Nous montrerons comment se connecter à FileZilla en raison de sa prise en charge multiplate-forme. Consultez la documentation pour d’autres clients.

Lorsque vous ouvrez FileZilla pour la première fois, recherchez l’icône du Gestionnaire de site juste au-dessus du mot * Hôte *, l’icône la plus à gauche sur la rangée supérieure. Cliquez dessus:

image: https: //assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_site_manager_vsftpd_18_04.png [Capture d’écran du gestionnaire de site]

Une nouvelle fenêtre s’ouvrira. Cliquez sur le bouton * Nouveau site * dans le coin inférieur droit:

image: https: //assets.digitalocean.com/articles/vsftp-user/new-site.png [Bouton Nouveau site] + Sous * Mes sites *, une nouvelle icône avec les mots * Nouveau site * apparaîtra. Vous pouvez le nommer maintenant ou revenir plus tard et utiliser le bouton * Renommer *.

Remplissez le champ * Host * avec votre nom de domaine ou votre adresse IP. Dans le menu déroulant * Cryptage *, sélectionnez * Requérir un FTP explicite sur TLS *.

Pour * Type de connexion *, sélectionnez * Demander le mot de passe *. Entrez votre utilisateur FTP dans le champ * Utilisateur *:

image: https: //assets.digitalocean.com/articles/vsftpd_debian_10/vsftpd_settings.png [Onglet Paramètres généraux]

Cliquez sur * Connect * en bas de l’interface. Le mot de passe de l’utilisateur vous sera demandé:

image: https: //assets.digitalocean.com/articles/vsftp-user/user-pass.png [Dialogue de mot de passe]

Cliquez sur * OK * pour vous connecter. Vous devriez maintenant être connecté à votre serveur avec le cryptage TLS / SSL.

En cas de succès, vous recevrez un certificat de serveur ressemblant à ceci:

image: https: //assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filez_certificate_vsftpd.png [Dialogue de certificat de site]

Lorsque vous avez accepté le certificat, double-cliquez sur le dossier + fichiers + et faites glisser + upload.txt + vers la gauche pour confirmer que vous pouvez télécharger des fichiers:

image: https: //assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filez_file_test_vsftpd_18_04.png [Télécharger test.txt]

Ceci fait, cliquez avec le bouton droit de la souris sur la copie locale, renommez-la en + upload-tls.txt + et faites-la glisser vers le serveur pour confirmer que vous pouvez télécharger des fichiers:

image: https: //assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_file_upload_vsftpd_18_04.png [Renommer et télécharger]

Vous avez maintenant confirmé que vous pouvez transférer des fichiers en toute sécurité avec le protocole SSL / TLS activé.

Étape 8 - Désactivation de l’accès au shell (facultatif)

Si vous ne pouvez pas utiliser TLS en raison des exigences du client, vous pouvez gagner en sécurité en désactivant la possibilité pour l’utilisateur FTP de se connecter de toute autre manière. Un moyen relativement simple d’éviter ce problème consiste à créer un shell personnalisé. Cela ne fournira aucun cryptage, mais limitera l’accès d’un compte compromis aux fichiers accessibles par FTP.

Commencez par ouvrir un fichier nommé + ftponly + dans le répertoire + bin +:

sudo nano /bin/ftponly

Ajoutez un message indiquant à l’utilisateur pourquoi il ne parvient pas à se connecter:

/ bin / ftponly

#!/bin/sh
echo "This account is limited to FTP access only."

Enregistrez le fichier et quittez votre éditeur.

Modifiez les autorisations pour rendre le fichier exécutable:

sudo chmod a+x /bin/ftponly

Ouvrez la liste des shells valides:

sudo nano /etc/shells

Au bas ajouter:

/ etc / shells

. . .
/bin/ftponly

Mettez à jour le shell de l’utilisateur avec la commande suivante:

sudo usermod  -s /bin/ftponly

Maintenant, essayez de vous connecter à votre serveur en tant que * sammy *:

ssh sammy@

Vous devriez voir quelque chose comme:

OutputThis account is limited to FTP access only.
Connection to 203.0.113.0 closed.

Cela confirme que l’utilisateur ne peut plus «+ ssh +» sur le serveur et est limité à l’accès FTP uniquement.

Conclusion

Dans ce tutoriel, nous avons abordé la configuration de FTP pour les utilisateurs disposant d’un compte local. Si vous devez utiliser une source d’authentification externe, vous pouvez vous pencher sur la prise en charge de `+ vsftpd +’ par les utilisateurs virtuels. Cela offre un large éventail d’options via l’utilisation de PAM, les modules d’authentification enfichables, et constitue un bon choix si vous gérez des utilisateurs dans un autre système, tel que LDAP ou Kerberos.