Installer et configurer vsFTPd

vsFTPd (pour Very Secure FTP Daemon) s'annonce lui-même comme étant "probablement le plus sur et le plus rapide des serveurs FTP pour systèmes Unix".

La configuration portera essentiellement sur deux usages :

  • utilisation du FTP avec du SSL
  • utilisation du FTP avec des utilisateurs virtuels qui peuvent uloader

L'environnement est un serveur Ubuntu en version 12.04 LTS muni d'un noyau Linux en version 3.2.13.

1 – Installer vsFTPd

La version 2.3.5 est disponible sur les dépôts Ubuntu, l'installation est donc la plus aisée :

# apt-get install vsftpd

Et … voilà.

2 – Configurer vsFTPd

Le but ici est d'utiliser le serveur FTP uniquement avec des utilisateurs virtuels, et non avec les utilisateurs locaux du système Unix.

La configuration se trouve dans le fichier /etc/vsftpd.conf

2.1 – Configuration de base

Le fichier de configuration de base est plutôt restrictif et bien rempli, nous allons néanmoins y apporter quelques modifications.

anonymous_enable=NO

Par défaut, les accès anonymes sont autorisés. Cela ne nous intéresse pas, nous passons donc la directive à NO.

local_enable=YES

Cette option à YES permettra d'autoriser les utilisateurs locaux à utiliser le FTP, y compris les utilisateurs virtuels.

write_enable=NO

Cette option désactive l'écriture.

chroot_local_user=YES

Cet option activée permettra d'emprisonner l'utilisateur dans son propre répertoire afin d'éviter qu'il aille ailleurs.

nopriv_user=ftpsecure

Le démon vsftpd peut utiliser un utilisateur sans privilège. Par défaut, il utilisera nobody, comme tout autre démon : c'est pourquoi il vaut mieux lui dédié un utilisateur comme ftpsecure, qu'il faudra donc créer :

# useradd -r -s /bin/false ftpsecure
guest_enable=YES
guest_username=ftpvirtual

La première option active le map entre les utilisateurs virtuels et un utilisateur réel.

La deuxième indique le nom de cet utilisateur réel, ici ftpvirtual, qu'il faut créer et donc le répertoire utilisateur sera le répertoire de dépôt FTP de nos utilisateurs virtuels.

# useradd -m ftpvirtual

Il faut les droits en écriture sur ce répertoire, sous peine de ne pouvoir se connecter (restriction imposée par les versions récentes de vsftpd) :

# chmod a-w /home/ftpvirtual/
user_config_dir=/etc/vsftpd_user_conf

Ce paramètre permet d'activer la configuration par utilisateur, permettant ainsi d'attribuer des droits spécifiques comme la possibilité d'écrire, alors que c'est interdit dans la configuration de base.

Les configurations seront centralisées dans ce répertoire, qu'il faut donc créer :

# mkdir /etc/vsftpd_user_conf

Et voilà pour la configuration de base !

2.2 – Configurer SSL pour vsFTPd

Toujours dans le fichier /etc/vsftpd.conf, la configuration SSL est assez simple : il suffit d'activer SSL et de lui donner le couple de clé privée/publique (pour la génération de ces clés, voir l'article http://blog.moncoindunet.fr/linux/openssl-creer-un-certificat-auto-signe/).

Voici donc les trois directives à ajouter :

ssl_enable=YES
rsa_private_key_file=/etc/ssl/private/vsftpd.key.pem
rsa_cert_file=/etc/ssl/certs/vsftpd.cert.pem

Enregistrer et quitter, c'est bon !

2.3 – Configurer des utilisateurs virtuels

2.3.1 – Créer une base de données

Les utilisateurs virtuels avec leur mot de passe associé doivent se trouver dans une base de données de type Berkeley DB.

Le but est donc de créer un fichier texte pour ensuite le convertir.

Créer donc un fichier texte :

# vim vsftpd_logins.txt

Y mettre une suite d'utilisateurs/mot de passe séparés par un retour chariot :

user
password
user2
password2

Enregistrer le fichier et quitter.

Installer ensuite les outils de base de données Berkeley :

# apt-get install db-util

Convertir alors le fichier texte :

# db_load -T -t hash -f /etc/vsftpd_logins.txt /etc/vsftpd_login.db

Puis modifier les droits des deux fichiers pour un peu plus de discrétion :

# chmod 600 /etc/vsftpd_login.txt
# chmod 600 /etc/vsftpd_login.db

2.3.2 – Créer un fichier de règle PAM

La prochaine étape consiste à créer un fichier PAM pour utiliser cette base de données lors de l'authentification des utilisateurs.

Supprimer le fichier PAM existant :

# rm /etc/pam.d/vsftpd

Et en ouvrir un nouveau :

# vim /etc/pam.d/vsftpd

Y ajouter ces deux lignes :

auth required /lib/i386-linux-gnu/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/i386-linux-gnu/security/pam_userdb.so db=/etc/vsftpd_login

Enregistrer et quitter.

2.3.3 – Créer un fichier de configuration par utilisateur

Avec la configuration actuelle, les utilisateurs virtuels peuvent lire les fichiers présents dans le répertoire de dépôt FTP.

On peut vouloir donner plus de droits à un utilisateur, pour lui permettre par exemple d'uploader lui-même des fichiers.

Pour cela, chaque utilisateur virtuel devra avoir sa propre configuration située dans le répertoire /etc/vsftpd_user_conf.

Cette étape n'est pas obligatoire et ne concernent que les utilisateurs ayant des droits supérieurs aux droits de base, c'est à dire qui ont besoin de faire plus que simplement lire les fichiers de répertoire de dépôt FTP.

Editer le fichier de configuration d'un utilisateur virtuel :

# vim /etc/vsftpd_user_conf/user

Et y inscrire ces options :

anon_world_readable_only=NO

Permet de télécharger des fichiers qui ne sont pas seulement en lecture pour tous.

write_enable=YES

Permet les droits d'écriture.

anon_upload_enable=YES

Permet de pouvoir uploader des fichiers.

anon_mkdir_write_enable=YES

Permet de créer des dossiers.

anon_other_write_enable=YES

Permet d'autres opérations d'écriture comme supprimer ou renommer.

3 – Redémarrer et tester

3.1 – Redémarrer

Redémarrer le service vsftpd :

# service vsftpd restart
vsftpd stop/waiting
vsftpd start/running, process 32009

3.2 – Tester

Se connecter au serveur :

# ftp localhost
Connected to localhost.localdomain.
220 (vsFTPd 2.3.5)

Inscrire le nom et le mot de passe d'un utilisateur virtuel créé :

Name (localhost:aldur): user
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

C'est bon, la connexion est effectuée !

On peut faire un test de lecture :

ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x    2 1004     1004         4096 Dec 16 16:31 user
-rw-r--r--    1 0        0             458 Dec 16 15:27 hosts
226 Directory send OK.

On peut se déplacer dans un répertoire :

ftp> cd user
250 Directory successfully changed

Et y placer un fichier :

ftp> put resolv.conf
local: resolv.conf remote: resolv.conf
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
61 bytes sent in 0.00 secs (676.9 kB/s)

C'est OK ! On peut quitter :

ftp> bye
221 Goodbye.

Le serveur vsFTPd est maintenant installé, configuré et les utilisateurs virtuels peuvent désormais l'utiliser !

 


 

4 – Problèmes et solutions

4.1 – Emplacement des modules PAM

La connexion FTP échoue et ce message apparait dans les logs d'authentification :

vsftpd: PAM unable to dlopen(/lib/security/pam_userdb.so): /lib/security/pam_userdb.so: cannot open shared object file: No such file or directory
vsftpd: PAM adding faulty module: /lib/security/pam_userdb.so

C'est que le module PAM userdb n'est pas au bon endroit.

Il faut alors préciser le chemin correct dans le fichier /etc/pam.d/vsftpd (par exemple, dans mon cas il est dans /lib/i386-linux-gnu/security/ au lieu d'être habituellement dans /lib/security/).

4.2 – Droits en écriture sur le répertoire de dépôt

La connexion FTP se déroule bien mais  se termine sur ce message :

500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.

Il faut enlever les droits en écriture sur le répertoire racine de l'utilisateur réel (restriction imposée par les versions récentes de vsFTPd) :

# chmod a-w /home/ftpvirtual/

Posted

in

,

by

Comments

6 responses to “Installer et configurer vsFTPd”

  1. Christophe37 Avatar
    Christophe37

    Bonjour,

    Je suis sur un petit serveur embarqué linux, et nous souhaitons utiliser vsFTPd.
    Nous avons configuré le serveur pour utiliser le mode SSL et cela fonctionne parfaitement avec le client CoreFTP (sur le PC Windows) configurer lui aussi pour utiliser le SSL.

    Par contre nous avons constaté que cela fonctionne toujours aussi en utilisant l’invite de commande Windows avec la simple commande: ftp 192.168.42.20.
    Est-il possible d’empêcher le fonctionnement par cette méthode qui je suppose n’est pas sécurisé du coup.

    Merci

    1. Cyril Avatar
      Cyril

      Bonjour,
      Je n’ai pas eu l’occasion de tester, mais dans le fichier de configuration vsftpd (par exemple, /etc/vsftpd.conf), il est possible d’ajouter cette option :
      force_local_logins_ssl=YES
      Après redémarrage (service vsftpd restart), la connexion SSL ne devrait plus être possible.

  2. nabil Avatar
    nabil

    nabil@nabil-virtual-machine:~$ ftp localhost
    j’ai suivi les memes directives, mais
    Connected to localhost.
    220 (vsFTPd 3.0.2)
    Name (localhost:nabil): user
    530 Non-anonymous sessions must use encryption.
    Login failed.
    421 Service not available, remote server has closed connection
    ftp>

  3. Jojo Avatar
    Jojo

    Super tuto, je m’étais servi de la première version il y a quelques années. En appliquant ton tuto à la lettre je me suis heurté à deux problèmes résolus comme suit :

    Problème 1 : l’utilisateur n’était pas chrooté correctement.
    en effet, mon “user” devait etre chrooté dans /home/ftpvirtual/user. Pour que cela fonctionne j’ai du ajouter dans le fichier de configuration de l’utilisateur la directive :
    local_root=user
    cette dernière place le chroot du user dans le sous-dossier “user” de /home/ftpvirtual

    Suite à ca est apparu mon deuxième problème : impossible d’écrire dans le dossier chrooté.
    Pour résoudre cela :
    chown ftpvirtual /home/ftpvirtual/user

    Et voila

  4. houssam Avatar
    houssam

    Merci pour ce cours
    C’est bien détaillé
    Bon courage

    1. Cyril Avatar
      Cyril

      Merci 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *