Comment configurer vsftpd pour un répertoire utilisateur sous Ubuntu 16.04

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 utilisateurs Internet 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, nous allons vous montrer comment configurer vsftpd pour permettre à un utilisateur de télécharger des fichiers dans son répertoire de départ à l’aide de FTP avec des informations de connexion sécurisées par SSL / TLS.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

  • * Un serveur Ubuntu 16.04 avec un utilisateur non root avec les privilèges + sudo + *: Vous pouvez en savoir plus sur la configuration d’un utilisateur avec ces privilèges dans notre https://www.digitalocean.com/community/tutorials/initial -server-setup-with-ubuntu-16-04 Guide [Configuration initiale du serveur avec Ubuntu 16.04].

Une fois que vous avez un serveur Ubuntu en place, vous êtes prêt à commencer.

Étape 1 - Installation de vsftpd

Nous allons commencer par mettre à jour notre liste de paquets et installer le démon vsftpd:

sudo apt-get update
sudo apt-get install vsftpd

Une fois l’installation terminée, nous copierons le fichier de configuration afin de pouvoir commencer avec une configuration vierge et enregistrer 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

Nous allons vérifier 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 vous ne rencontriez pas de règles de pare-feu vous bloquant au moment du test.

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.

Nous devrons ouvrir les ports 20 et 21 pour FTP, le port 990 pour plus tard lorsque nous activerons 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
sudo ufw status

Maintenant, nos règles de pare-feu ressemblent à 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, nous sommes prêts à passer à l’étape suivante.

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

Pour ce tutoriel, nous allons créer un utilisateur, mais vous en avez peut-être déjà un qui a 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, nous allons ajouter un utilisateur test:

sudo adduser

Attribuez un mot de passe lorsque vous y êtes invité et 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 cette opération avec les jails + chroot +. 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 se connecter uniquement 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, nous allons créer 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 +, définissez sa propriété et veillez à supprimer les autorisations d’écriture à l’aide des commandes suivantes:

sudo mkdir /home//ftp
sudo chown nobody:nogroup /home//ftp
sudo chmod a-w /home//ftp

Vérifions les permissions:

sudo ls -la /home/sammy/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 ..

Ensuite, nous allons créer le répertoire où les fichiers peuvent être téléchargés et attribuer la propriété à l’utilisateur:

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

Une vérification des autorisations sur le répertoire + files + 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, nous allons ajouter un fichier + test.txt + à utiliser lors des tests ultérieurs:

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

Maintenant que nous avons sécurisé le répertoire + ftp + et permis à l’utilisateur d’accéder au répertoire + fichiers +, nous allons maintenant nous concentrer sur la 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, nous devrons modifier certaines valeurs du fichier. Afin de permettre à l’utilisateur de télécharger des fichiers, nous décommenterons le paramètre + write_enable + afin que nous ayons:

/etc/vsftpd.conf

. . .
write_enable=
. . .

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

/etc/vsftpd.conf

. . .
chroot_local_user=
. . .

Nous ajouterons un + user_sub_token + afin d’insérer le nom d’utilisateur dans notre répertoire + local_root + afin que notre configuration fonctionne pour cet utilisateur et tous les futurs utilisateurs qui pourraient être ajoutés.

/etc/vsftpd.conf

Nous limiterons la gamme de ports pouvant être utilisés pour le FTP passif afin de nous assurer que suffisamment de connexions sont disponibles:

/etc/vsftpd.conf

Étant donné que nous prévoyons uniquement d’autoriser l’accès FTP au cas par cas, nous allons configurer la configuration de manière à ce que l’accès ne soit accordé à un utilisateur que lorsqu’il est explicitement ajouté à une liste plutôt que par défaut:

/etc/vsftpd.conf

+ userlist_deny + bascule la logique. Lorsqu’il est réglé sur “OUI”, l’accès FTP aux utilisateurs de la liste est refusé. Lorsqu’il est réglé sur «NON», seuls les utilisateurs de la liste sont autorisés à accéder. Lorsque vous avez terminé, enregistrez et quittez le fichier.

Enfin, nous allons créer et ajouter votre utilisateur au fichier. Nous allons utiliser l’indicateur + -a + pour ajouter au fichier:

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

Vérifiez bien qu’il a é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

Nous sommes maintenant prêts pour les tests.

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

Nous avons configuré le serveur pour autoriser uniquement l’utilisateur + sammy + à se connecter via FTP. Faisons en sorte que ce soit le cas.

  • Les utilisateurs anonymes ne devraient pas pouvoir se connecter *: Nous avons désactivé l’accès anonyme. Ici, nous allons tester cela en essayant de nous connecter anonymement. Si nous l’avons fait correctement, les utilisateurs anonymes devraient se voir refuser l’autorisation:

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 se connecter *: nous allons maintenant essayer de nous connecter en tant qu’utilisateur + sudo +. L’accès devrait également leur être refusé, et cela devrait se produire avant de pouvoir entrer 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
  • + sammy + devrait pouvoir se connecter, ainsi que lire et écrire des fichiers *: Ici, nous allons nous assurer que notre utilisateur désigné canconnect:

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>

Nous allons passer dans le répertoire + files in, puis utiliser la commande` + get` pour transférer le fichier de test créé précédemment sur notre machine locale:

cd files
get test.txt
Output227 Entering Passive Mode (203,0,113,0,169,12).
150 Opening BINARY mode data connection for test.txt (16 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (1588 bytes/s)
ftp>

Nous allons revenir immédiatement et essayer de télécharger le fichier avec un nouveau nom pour tester les autorisations d’écriture:

put test.txt upload.txt
Output227 Entering Passive Mode (203,0,113,0,164,71).
150 Ok to send data.
226 Transfer complete.
16 bytes sent in 0.000894 seconds (17897 bytes/s)

Fermer la connexion:

bye

Maintenant que nous avons testé notre configuration, nous allons prendre 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 activerons TTL / SSL pour fournir ce cryptage. La première étape consiste à créer les certificats SSL à utiliser avec vsftpd.

Nous allons utiliser + openssl + pour créer un nouveau certificat et utiliser l’indicateur + -days + pour le rendre valide pendant un an. Dans la même commande, nous allons ajouter une clé RSA privée de 2048 bits. Ensuite, 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.

Nous allons faire cela avec la commande suivante:

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 questions ci-dessous:

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 devriez avoir deux lignes commençant par + rsa_ +. Commentez-les pour qu’ils ressemblent à:

/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 pourrait 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 sur SSL et pour exiger l’utilisation de SSL pour le transfert de données et les connexions:

/etc/vsftpd.conf

Après cela, nous allons configurer 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

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

Maintenant, nous devons redémarrer 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:

ftp -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.
421 Service not available, remote server has closed connection
ftp>

Ensuite, nous vérifierons que nous pouvons nous connecter en utilisant un client prenant en charge 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 à l’aide de FileZilla en raison de son support multiplateforme. 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 en dessous du mot Fichier, l’icône la plus à gauche sur la rangée supérieure. Cliquez dessus:

image: http: //assets.digitalocean.com/articles/vsftp-user/site-manager.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: http: //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.

Vous devez remplir le champ "Hôte" avec le nom ou l’adresse IP. Dans le menu déroulant «Cryptage», sélectionnez «Requérir un FTP explicite sur TLS».

Pour «Type de connexion», sélectionnez «Demander un mot de passe». Indiquez l’utilisateur FTP que vous avez créé dans le champ «Utilisateur»:

image: http: //assets.digitalocean.com/articles/vsftp-user/site-config2.png [Onglet Paramètres généraux] + Cliquez sur «Connecter» au bas de l’interface. Le mot de passe de l’utilisateur vous sera demandé:

image: http: //assets.digitalocean.com/articles/vsftp-user/user-pass.png [Dialogue Mot de passe] + Cliquez sur “OK” pour vous connecter. Vous devriez maintenant être connecté à votre serveur avec le cryptage TLS / SSL.

image: http: //assets.digitalocean.com/articles/vsftp-user/site-cert.png [Dialogue de certificat de site] + Une fois le certificat accepté, double-cliquez sur le dossier + fichiers + et faites-le glisser. txt à gauche pour confirmer que vous êtes capable de télécharger des fichiers.

+ image: http: //assets.digitalocean.com/articles/vsftp-user/file-test.png [Télécharger le fichier test.txt] + Une fois cette opération effectuée, cliquez avec le bouton droit de la souris sur la copie locale, renommez-la pour la mettre en ligne- tls.txt` et faites-le glisser vers le serveur pour confirmer que vous pouvez télécharger des fichiers.

image: http: //assets.digitalocean.com/articles/vsftp-user/file-upload.png [Renommer et télécharger] + Vous avez maintenant confirmé que vous pouvez transférer des fichiers en toute sécurité et avec succès avec 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

Nous ajouterons un message indiquant à l’utilisateur pourquoi il ne parvient pas à se connecter. Coller dans ce qui suit:

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

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

En bas, ajoutez:

/ etc / shells

. . .
/bin/ftponly

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

sudo usermod sammy -s /bin/ftponly

Maintenant, essayez de vous connecter en tant que 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 voudrez peut-être examiner la prise en charge par vsftpd des 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.