déc 07

Le protocole FTP (File Transfert Protocole) est un moyen simple de partage, il permet de rendre accessible un espace disque à travers le web ou simplement d’un réseau local. Je vais vous décrire comment créer simplement un serveur de type FTP grâce à Very secure FTPd. VsFTPd est un logiciel sous licence GPL fortement axé sur la sécurité, d’ailleurs aucune faille n’a été trouvée à ce jour et c’est l’une des raisons de son utilisation par des entreprises telles que Suse, Red hat ou encore OpenBSD.

Very secure FTPd est un outil très complet, stable, sécurisé et performant à la fois. Il permet une gestion du serveur à la carte selon les besoins de l’administrateur, sa relative complexité ne doit surtout pas être un frein à son utilisation car au final on se rend bien compte que les multiples possibilités d’utilisations font de VsFTPd un logiciel puissant, hautement configurable. Sans nul doute, ce logiciel est ce qui se fait de mieux en la matière !

Dans le cadre de cet article, nous allons faire en sorte que l’espace disque soit partagé de deux manières. Un utilisateur que l’on nommera paul aura les droits suivants : lecture, écriture et suppression. Le deuxième qui s’appellera tom pourra uniquement avoir accès en lecture seule, il ne pourra en aucun cas uploader, déplacer où encore supprimer un fichier contrairement à paul. Autre point important, l’accès au serveur en anonyme sera tout simplement refusé par soucis de sécurité.

Important :

Cet article n’est en aucun cas un tutoriel complet ! La configuration présentée se trouve être celle que j’utilise, il s’agit d’une certaine façon d’un simple « pense bête ».  Vous voilà donc prévenu, en espérant tout de même que cet article vous aidera d’une manière ou d’une autre ;) .

Pré-requis :

Commencez par créer le répertoire qui contiendra tout les fichiers nécessaires :

# mkdir /etc/vsftpd

Installation :

Très simple, il vous suffit d’installer le paquet vsftpd.

# apt-get install vsftpd

Création d’un méta-utilisateur virtuel :

Imaginons que vous voulez que le répertoire /home/serveur_ftp soit la racine de votre serveur et bien sûr vous ne voulez en aucun cas qu’un utilisateur se balade ailleurs. Nous allons donc créer un meta-utilisateur virtuel, en prenant soin de lui créer un répertoire dans lequel il sera emprisonné « chrooté« . Ainsi Paul et Tom n’auront accès qu’au répertoire /home/serveur_ftp et ne pourrons pas remonter plus haut.

On crée le groupe ftp :

# groupadd ftp

Puis on ajoute l’utilisateur virtuel muftp (meta utilisateur ftp) en lui indiquant son répertoire :

# useradd -g ftp -d /home/serveur_ftp/ muftp

On crée ensuite véritablement le répertoire en changeant le propriétaire du dossier ainsi que les permissions :

# mkdir /home/serveur_ftp
# chown 'votre_login':ftp /home/serveur_ftp/

(votre_login étant votre nom d’utilisateur.)

# chmod 770 /home/serveur_ftp

Création de la base de donnée :

La base de donnée sera dans notre cas fort simple et se présentera sous cette forme :

Nom de l'utilisateur virtuel 1
Mot de passe de l'utilisateur virtuel 1
Nom de l'utilisateur virtuel 2
Mot de passe de l'utilisateur virtuel 2
...

On va  simplement créer un fichier login.txt et y inscrire la liste des utilisateurs virtuels et leurs mots de passe.

# gedit /etc/vsftpd/login.txt
paul
mot de passe de paul
tom
mot de passe de tom

Attention, le fichier login.txt doit obligatoirement se terminer par un retour à la ligne !

On assure ensuite sa protection :

# chmod 600 /etc/vsftpd/login.txt

Il va falloir convertir ce fichier en une base de donné au format « Berkeley db« , installez tout d’abord les paquets nécessaires à la création de celle-ci :

# apt-get install libdb4.4 db4.4-util db4.4-doc

Attention la version des paquets est peut être différente selon la distribution  utilisée !

Puis on convertit le fichier login.txt tout en modifiant les permissions :

# db4.4_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
# chmod 600 /etc/vsftpd/login.db

Par la suite si vous ajoutez des utilisateurs à votre base de donnée, il vous suffira de renouveler l’opération .

L’authentification des utilisateurs sera assurée par le service PAM, on va indiquer ou se trouve notre base de donnée. Créez tout d’abord le fichier vsftpd :

$ gedit ~/vsftpd

Recopiez ces deux lignes :

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/login

Puis placez celui-ci dans le bon répertoire :

# cp ~/vsftpd /etc/pam.d/vsftpd

Configuration du fichier vsftpd.conf :

La configuration se fait comme souvent sous les système Unix grâce à un simple fichier texte, il s’agit ici du fichier vsftpd.conf situé dans le répertoire /etc/. Bien sûr seul l’administrateur du système aura la permission d’éditer celui-ci.

Si ce n’est pas déjà fait, sauvegardez le fichier :

# cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

Recopiez ensuite ce fichier de configuration :

# Mode "standalone"
listen=YES
 
# Désactivation des connexions anonymes
anonymous_enable=NO
 
# Activation des connexions non-anonymes
local_enable=YES
 
# Activation des utilisateurs virtuels
guest_enable=YES
 
# Nom du "meta-utilisateur" virtuel
guest_username=muftp
 
# Chroot des utilisateurs virtuels
chroot_local_user=YES
 
# Activation du changement de propriétaire des fichiers uploadés
chown_uploads=YES
 
# Nom du propriétaire des fichiers uploadés (votre_login étant votre nom d'utilisateur.)
chown_username=votre_login
 
# Définition de umask
local_umask=000
 
# Désactivation des droits en écriture
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
 
# Message d'accueil
ftpd_banner=Bienvenue sur un serveur VsFtpd.
 
# Autorisation Xferlog
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
 
# Régularisation des connections
connect_from_port_20=YES
idle_session_timeout=600
data_connection_timeout=120
max_clients=200
max_per_ip=4
 
#
#
# Debian customization
#
# Some of vsftpd's settings don't fit the Debian filesystem layout by
# default.  These settings are more Debian-friendly.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
#

N’oubliez pas de renseigner la ligne « # Nom du propriétaire des fichiers uploadés« .

Gestion des permissions :

Peut-être l’avez vous remarqué, toutes les actions en écriture sont désactivées dans ce fichier de configuration. Mais alors comment faire par exemple pour autoriser l’upload d’un fichier ? Dans les faits, il suffit d’activer le service « per-user » et d’indiquer les permissions des utilisateurs dans un fichier texte propre à chacun d’entre eux. VsFTPd appliquera les règles décrites dans ces fichiers sans prendre compte de celles établies dans vsftpd.conf.

Comme dit précédemment il y aura deux types d’utilisateurs, Paul qui aura le droit de lire, d’écrire et de supprimer et Tom qui aura accès au serveur en lecture seule. Il faut donc indiquer à VsFTPd, les permissions des utilisateurs inscrits à notre base de donnée.

Commencez par ajouter la ligne suivante dans le fichier de configuration vsftpd.conf :

# Activation du per-user
user_config_dir=/etc/vsftpd/

Nous allons donner à Tom son droit de lecture :

# gedit /etc/vsftpd/tom
# Droit de lecture #
anon_world_readable_only=NO

Attribuons les droits de Paul :

# gedit /etc/vsftpd/paul
# Droit de lecture #
anon_world_readable_only=NO
 
# droit d'écriture #
write_enable=YES
anon_upload_enable=YES
 
# Création de dossiers #
anon_mkdir_write_enable=YES
 
# Droit de renommer, supprimer... #
anon_other_write_enable=YES

Pensez à redémarrer VsFTPd afin de prendre en charge les modifications :

# /etc/init.d/vsftpd restart

Test :

Il est temps d’utiliser votre serveur ! On va tout d’abord y ajouter un fichier et par la même occasion en créer un autre qui servira simplement à tester l’upload.

$ touch /home/serveur_ftp/test1
$ touch ~/test2

Ce test va permettre de voir clairement les différences entre les deux utilisateurs. Nous effectuerons plusieurs opérations : Téléchargement, suppression, envoie d’un fichier et pour finir création d’un répertoire.

Loggez vous en tant que tom :

~$ ftp localhost 21
# Connection au serveur grâce à la commande ftp localhost 21 #
Connected to localhost.
220 Bienvenue sur mon serveur FTP
Name (localhost:gnu): tom
331 Please specify the password.
Password:
230 Login successful.
# Connection au serveur. Name : tom Password : mot de passe de tom #
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
# Affichage du contenu présent dans le répertoire #
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r–r– 1 1000 1000 0 Dec 07 13:01 test1
226 Directory send OK.
ftp> get test1
# Téléchargement du fichier test1 #
local: test1 remote: test1
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for test1 (0 bytes).
226 File send OK.
ftp> delete test1
# Suppression du fichier test1 #
550 Permission denied.
ftp> put test2
# Envoie du fichier test2 #
local: test2 remote: test2
200 PORT command successful. Consider using PASV.
550 Permission denied.
ftp> mkdir tom/
# Création d’un repertoire tom/ #
550 Permission denied.
ftp> ls
# Affichage du contenu présent dans le répertoire #
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r–r– 1 1000 1000 0 Dec 07 13:01 test1
226 Directory send OK.
ftp> quit
# Déconnection #
221 Goodbye.

Loggez vous en tant que paul :

~$ ftp localhost 21
# Connection au serveur grâce à la commande ftp localhost 21 #
Connected to localhost.
220 Bienvenue sur mon serveur FTP
Name (localhost:gnu): paul
331 Please specify the password.
Password:
230 Login successful.
# Connection au serveur. Name : paul Password : mot de passe de paul #
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
# Affichage du contenu présent dans le répertoire #
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r–r– 1 1000 1000 0 Dec 07 12:56 test1
226 Directory send OK.
ftp> get test1
# Téléchargement du fichier test1 #
local: test1 remote: test1
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for test1 (0 bytes).
226 File send OK.
ftp> delete test1
# Suppression du fichier test1 #
250 Delete operation successful.
ftp> put test2
# Envoie du fichier test2 #
local: test2 remote: test2
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 File receive OK.
ftp> mkdir paul/
# Création d’un repertoire paul/ #
257 « /paul/ » created
ftp> ls
# Affichage du contenu présent dans le répertoire #
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxrwxrwx 2 1001 1001 4096 Dec 07 13:00 paul
-rw——- 1 1000 1001 0 Dec 07 13:00 test2
226 Directory send OK.
ftp> quit
# Déconnection #
221 Goodbye.

À travers ces deux exemples, on se rend bien compte des différentes permissions accordées aux utilisateurs. Ainsi tom n’a que le droit de lecture contrairement à paul qui a le droit de lire, d’écrire, de déplacer, de modifier et de supprimer. VsFTPd a donc bien passé outre son fichier de configuration en utilisant les droits indiqués dans  /etc/vsftpd/paul et /etc/vsftpd/tom.

Commandes VsFTPd :

Voici la liste des commandes indispensables à la gestion de votre serveur FTP :

# /etc/init.d/vsftpd stop (Stop VsFTPd)
# /etc/init.d/vsftpd start (Démarre VsFTPd)
# /etc/init.d/vsftpd restart (Stop et redémarre VsFTPd)
# /etc/init.d/vsftpd reload (Recharge les fichiers de configurations)

Important : Après la modification d’un fichier de configuration, n’oubliez pas de relancer VsFTPd.

Surveillance du serveur :

Il est tout à fait possible de savoir qui fait quoi sur le serveur en temps réel, il suffit de rentrer cette commande dans votre terminal :

# tail -f /var/log/vsftpd.log

Liens :

Page officielle de VsFTPd

VsFTPd sur andesi.org

Tutoriel sur debianaddict.org

Documentations sur labo-linux.org

Wiki sur fedora-fr.org

Wiki sur ubuntu-fr.org

écrit par David Lopes Ferreira

33 commentaires à “Installation d’un serveur FTP : VsFTPd”

  1. Benjamin Dit:

    Merci pour ce tuto, je vais l’essayer d’ici peu :)

  2. M.i.B Dit:

    Merci pour cet article, je suis sous intrepid mais je n’ai pas le paquet libdb3-util dans les dépôts peu être que la version a évoluée. Peux tu m’en dire plus.
    Merci d’avance.

  3. M.i.B Dit:

    je viens de voir la doc.ubuntu-fr.org
    qu’il faut ces paquets libdb4.4 db4.4-util db4.4-doc

  4. WeedFast Dit:

    @M.I.B : Merci pour l’info ;) En effet la version du paquet n’est pas la même…

  5. Seza Dit:

    J’avais fais un tuto très similaire à celui-çi il y a un an et demi. (http://www.paradoxal.org/blog/post/2007/06/02/Serveur-Debian-vsftpd)

    Çela fait plaisir de voir que de plus en plus de gens s’intéresse à vsftpd, c’est un très bon serveur très fiable malgré sa configuration parfois déroutante, c’est donc chouette de voir des variantes.

  6. WeedFast Dit:

    @Seza : J’utilise VsFTPd depuis mes débuts sous GNU/Linux… Et j’en suis pleinement satisfait ;) d’ailleurs je n’ai jamais testé autre chose que lui ! Dommage que je n’ai pas eu connaissance de ton tuto avant …

    N’ hesitez pas à me faire part de votre opinion sur cet article :) Surtout si vous trouvez des erreurs et/ou disfonctionnements.

  7. Seza Dit:

    Oui moi aussi exactement de même, certains de mes collègue lui préfère proftpd plus facile à configurer mais moins stable en revers.
    A l’époque j’avais pas mal galérer pour trouver des infos sur les utilisateurs virtuels avec vsftpd mais j’avais mal cherché surement car d’autre tuto du même genre plus ancien existe pourtant.
    Ce que j’aime c’est voir comment chacun mais sa petite sauce dedans :)

  8. WeedFast Dit:

    @Seza : Pour ma part j’avais suivi le tuto disponible sur le site andesi.org. Les utilisateurs virtuels sont en effet difficile à gérer surtout en ce qui concerne les permissions des fichiers uploadés. Il m’était au début impossible d’avoir accés à ces fichiers j’ai ensuite ajouté ces 2 régles :

    * anon_umask=000
    Ce qui permet d’avoir tout les droits sur les répertoires uploadés.

    * chown_uploads=YES
    * chown_username=votre_login
    Ce qui permet de modifier à la volé le propriétaire des fichiers uploadés.

    Je ne sais pas si cela à des conséquence négative sur le bon fonctionnement du serveur mais en tout cas cela fonctionne admirablement bien chez moi.

  9. M.i.B Dit:

    Salut WeedFast
    encore merci pour cet article car depuis que j’ai quitté FileZilla Server en 2006 du moins depuis je suis passé à Ubuntu 6.06, j’avais laissé tomber mon serveur ftp. Mais maintenant il va reprendre du service.

    Sinon je voudrai juste te dire que tu ne précises pas qu’il ne faut commenter tout le fichier
    /etc/pam.d/vsftpd

    avant d’ajouter:
    auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
    account required /lib/security/pam_userdb.so db=/etc/vsftpd/login
    sinon on ne peut pas se connecter au serveur.

  10. WeedFast Dit:

    @M.I.B : Que veux tu dire par commenter ? Mon fichier /etc/pam.d/vsftpd ne contient que c’est 2 lignes et l’ensemble fonctionne sans problème.
    J’avoue avoir du mal à comprendre ta phrase… Je suis fatigué (Bête ?) ce soir :)

    Merci pour ton commentaire ;)

  11. M.i.B Dit:

    Je veux dire que dans mon fichier était à l’origine comme ça
    # Standard behaviour for ftpd(8).
    auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

    # Note: vsftpd handles anonymous logins on its own. Do not enable
    # pam_ftp.so.

    # Standard blurb.
    @include common-account
    @include common-session

    @include common-auth
    auth required pam_shells.so
    et j’ai mis un # devant toutes les lignes
    je ne sais pas si j’ai bien fait, à toi de me le dire.

  12. WeedFast Dit:

    J’ai supprimer l’intégralité du fichier… En suivant un tutos bien sûr ! Et cela ne m’a pas posé de problème ;)

  13. Tony Dit:

    Bonsoir,

    J’ai suivi le tuto mais il a fallu que je remplace la ligne ci-dessous placé dans vsftpd.conf

    # Activation des connexions non-anonymes
    anon_enable=YES

    par

    # Activation des connexions non-anonymes
    local_enable=YES

    Si je pouvais avoir plus de précision à propos de ce changement que j’ai du faire.

    Merci, Tony.

  14. ButterflyOfFire Dit:

    J’ai découvert ton blog par pur hasard en cherchant un truc concernant Squid :)

    Excellent billet. J’ai longtemps rechigné à propos de vsFTPd même si je le trouve excellent mais très compliqué à configurer en effet.

    J’ai opté pour ProFTPd depuis un moment mais cela ne m’empêchera pas du tout de tester ton tuto. Merci Weedfast ;)

    Salutations amicales

  15. WeedFast Dit:

    @ Tony : Je regarde ça de suite car il est vrai que ce « anon_enable » fait louche…
    Edit : J’ai modifié le tutoriel, il semble que ce soit une faute venant de ma part.
    @ ButterflyOfFire : Merci, fais moi part de ton expérience ;)

  16. ButterflyOfFire Dit:

    Je suis un vrai looser :p je comprends un peu le principe de la configuration de vsftpd mais je n’arrive pas à le faire fonctionner. J’ai pourtant suivit le tuto du début jusqu’à la fin.

    J’ai peut être raté quelque chose car en faisant un nmap localhost, il semble que vsftpd n’est pas même lancé et le port 21 toujours libre. Bizarre.

  17. ButterflyOfFire Dit:

    Re … j’ai réussi à le faire démarrer ça fonctionne impec ;) je continue mes tests ;)

  18. WeedFast Dit:

    Merci pour vos retours ;)

  19. artefact Dit:

    Merci,

    Un très bon tutos qui fonctionne à merveille sur mon pc.

    Très didactique on « comprend » ce qui se passe quant on débute comme moi.

    Merci encore

  20. WeedFast Dit:

    @artefact : Merci pour ton commentaire, cela fait plaisir à lire d’autant que je me suis appliqué à rendre ce tutos simple d’accés.

  21. UbunBloX » Archives du Blog » X-VsFTPd Dit:

    [...] Installation d’un serveur FTP : VsFTPd [...]

  22. 21ch181 Dit:

    Bonjour,

    Tout d’abord un grand merci pour votre tuto qui est très clair. J’en avais essayé d’autres qui ne m’avaient pas emballé à l’exception de celui d’Andesi.
    Personnellement je l’ai combiné avec 2 autres tutos pour « fignoler » l’installation entre autre sur la partie SSL.

    J’ai toutefois noté une petite erreur qui n’est pas génante du tout pour le fonctionnement, mais quitte à être précis ….
    Dans cette ligne « sudo apt-get install libdb4.4 db4.4-util db4.4doc », il faut bien sur lire « db4.4-doc » à la place de db4.4doc » pour que la doc soit installée !

    Encore merci.

  23. WeedFast Dit:

    @21ch181: Corrigé ;) et merci pour l’info !!

  24. geo Dit:

    Bonjour,

    J’ai un soucis de connection sur le serveur je n’arrive pas a me connecter il me met « connection refused »
    Y’a t’il une manière particulière de ce connecter?

  25. wap Dit:

    J’ai exactement le même problême que toi geo. J’ai tout configuré exactement comme expliqué sur ce tuto (très clair, soit dit en passant), mais au moment de réaliser le test, ça ne fonctionne pas. Peut-être que je ne fais pas exactement ce qu’il faut. Où faut-il se connecter ? Dans Konsole ?
    Est-ce que quelqu’un peut expliquer comment se connecter de manière très claire, genre vas là, fais ça…
    Merci

  26. WeedFast Dit:

    @Wap @geo : Essayez de vous connecter via un logiciel tel que Gftp ou en entrant simplement l’IP du poste où est installé Vsftpd. Exemple : ftp 192.168.1.20

  27. beb Dit:

    je suis tombé sur ton tutoriel concernant l’instalation d’un serveur vsftpd.
    J’utilise un serveur Debian que je loue chez ovh pour faire divers tests.
    Ton tutoriel est super clair et pourtant je n’arrive pas me connecter:

    Quand je cherche à me connecter, j’ai une erreur 530 login incorrect.

    Aurais tu une petite idée, vers ou il faudrait que je cherche pour me connecter.

    Cordialement,

  28. WeedFast Dit:

    @beb : Si tu as suivi le tutoriel, je ne vois vraiment pas d’où provient cette erreur 530… N’ayant eu précédement aucune erreur de ce genre, je ne peux que te conseiller de regarder sur les liens présents en fin d’article. Bon courage ;)

  29. beb Dit:

    C’est tout bon! j’ai tout repassé en revu et j’ai fais une erreur dans le fichier pam!
    pffff!

    ça marche nickel!!!
    Merci pour ce tuto.

  30. Loctavian Dit:

    Très bon tuto, merci.

    Pour information, en date du 19 Juillet 2010 pour une installation sur Ubuntu Server 10.04, on ne peut plus utiliser les paquets :
    libdb4.4 db4.4-util db4.4-doc
    il faut donc les remplacer par :
    libdb4.8 db4.8-util db4.8-doc

  31. sebird Dit:

    Bonjour, cela fait 3 ou 4 tutos différents que j’essaye de configurer vsftpd… Sans les utilisateurs virtuels cela fonctionne nickel. Par contre dès que j’essaye de les configurer j’obtiens l’erreur 530 login incorrect. J’ai refait plus de 10X les tutos de a à z et je ne comprends pas d’où cela peut venir… J’ai fait un copier/coller de votre vsftpd.conf et de votre fichier pam sans succès… Auriez-vous une idée? Merci d’avance…

  32. jeandez Dit:

    Bonjour,
    j’ai suivi ce tuto, tout se passe bien, mais j’ai un soucis avec les test.
    j’obtiens cette erreur : local: test1: Permission denied et cela quelque soit l’utilisateur.

    ftp> get test1
    local: test1 remote: test1
    local: test1: Permission denied

    Merci de m’éclairer….

  33. twelgo Dit:

    Bonjour et tout d’abord je tient à te remercier pour ce tuto.

    De moi côté je suis au stade de « sebird » et « jeandez » avec l’erreur 530 ou un permission denied.

    J’ai vérifié un connexion en local sur localhost, vérifié les droits, vérifié les syntaxes et tester avec un filezilla à distance sur 3 logins différents.
    Toujours le même problème.

    Voici les logs Filezilla:

    Statut : Connexion établie, attente du message d’accueil…
    Réponse : 220 Bienvenue sur un serveur VsFtpd.
    Commande : USER usertest
    Réponse : 331 Please specify the password.
    Commande : PASS ****
    Réponse : 530 Login incorrect.
    Erreur : Erreur critique
    Erreur : Impossible d’établir une connexion au serveur

Laisser une Réponse