Installer un serveur FTP avec VsFTPd sous CentOS

FTPCet article décrit la mise en place d’un serveur FTP avec VsFTPd (Very Secure FTP Daemon) sur un serveur de réseau local tournant sous CentOS. FTP a été pendant longtemps la manière la plus simple pour échanger des fichiers sur Internet. Même si le protocole reste encore extrêmement populaire – notamment dans le cadre des hébergements web mutualisés – on peut considérer qu’il est obsolète, au vu des considérations de sécurité comme les mots de passe qui transitent en clair.

La raison pour laquelle je le présente quand-même ici, c’est que je m’en sers toujours dans un contexte bien précis, en combinaison avec Ghost4Linux, pour stocker l’image Ghost d’un poste client comme celui d’une salle informatique dans une école. Ghost4Linux requiert un serveur FTP local pour stocker une image ISO, et c’est donc ce que nous allons mettre en place. Sous CentOS, nous avons le choix entre ProFTPd et VsFTPd, et c’est ce dernier que nous allons utiliser.

FTP actif et FTP passif

Avant de mettre les mains à la pâte, une petite explication sur les deux modes de transfert de fichiers FTP.

Le mode FTP actif, c’est le mode par défaut des clients FTP. Dans un premier temps, une session TCP est initiée sur le port 21 du serveur. Une fois la session établie et l’authentification FTP acceptée, le serveur établit une session TCP depuis le port 20 vers un port dynamique du client.

Le mode FTP passif est conseillé à partir du moment où les clients peuvent se trouver derrière un pare-feu. Dans ce mode, toutes les initialisations de sessions TCP se font à partir du client. Là aussi, le client établit une première session TCP sur le port 21. La session est établie, l’authentification est acceptée, et à partir de là, on demande au serveur de se mettre en attente de session TCP grâce à la commande PASV. Le client peut alors établir une seconde session TCP sur un port dynamique vers le serveur.

Le numéro de port dynamique est transmis du serveur vers le client suite à la commande PASV. On peut réduire la plage de ports en configurant le serveur FTP de manière appropriée, et c’est ce que nous allons faire ici.

Configuration du pare-feu

Le pare-feu nécessite une configuration un peu particulière avec le protocole FTP. Pour permettre l’accès au serveur, nous devons faire trois choses.

  • charger le module ip_conntrack_ftp
  • ouvrir le port 21 en TCP
  • ouvrir les ports 50001 à 50010 en TCP pour le mode passif

Voici à quoi cela ressemble concrètement dans mon script de pare-feu.

...
IPT=/usr/sbin/iptables
MOD=/usr/sbin/modprobe
...
# FTP
$MOD ip_conntrack_ftp
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 50001:50010 -j ACCEPT
...

Configuration de SELinux

Si l’on utilise SELinux en mode renforcé sur le serveur, il suffit de modifier la valeur par défaut du booléen ftpd_full_access comme ceci.

# setsebool -P ftpd_full_access 1

À partir de là, SELinux ne nous posera aucun problème.

Installation

Le serveur VsFTPd est fourni par les dépôts officiels de Red Hat et de CentOS.

# yum install vsftpd

Création d’un utilisateur

Je vais créer un utilisateur install pour mon serveur local d’images Ghost. Cet utilisateur n’est pas censé se connecter directement au système. Les images Ghost seront stockées en-dessous de /srv/ftp/install, le répertoire utilisateur correspondant que je dois créer au préalable.

# mkdir -pv -m 0770 /srv/ftp/install
mkdir: created directory ‘/srv/ftp’
mkdir: created directory ‘/srv/ftp/install’
# useradd -c "G4L User" -d /srv/ftp/install -s /sbin/nologin install
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
# chown -R install:install /srv/ftp/install/
# passwd install
Changing password for user install.
New password: **********
Retype new password: **********
passwd: all authentication tokens updated successfully.

Configuration du serveur

La configuration de VsFTPd s’effectue dans le fichier /etc/vsftpd/vsftpd.conf. Avant d’aller plus loin, nous allons sauvegarder la configuration par défaut.

# cd /etc/vsftpd/
# cp vsftpd.conf vsftpd.conf.orig

À partir de là, nous allons modifier ou ajouter quelques directives. Pour commencer, on va désactiver les connexions anonymes.

anonymous_enable=NO

Ensuite, on va descendre vers la fin du fichier et définir la configuration de notre utilisateur.

chroot_local_user=YES
userlist_enable=YES
userlist_deny=NO
check_shell=NO
userlist_file=/etc/vsftpd/vsftpd.user_list
allow_writeable_chroot=YES

Cette dernière stance mérite quelques explications.

  • La directive chroot_local_user=YES interdit aux utilisateurs de quitter l’arborescence de leur répertoire utilisateur pour se balader un peu partout dans le système.
  • La directive userlist_enable=YES active une liste d’utilisateurs.
  • Dans la configuration par défaut, la liste spécifie les utilisateurs auxquels on interdit l’accès au serveur. Nous allons faire le contraire avec userlist_deny=NO et créer une liste qui contiendra un seul utilisateur autorisé.
  • La directive check_shell=NO est nécessaire lorsqu’un utilisateur doit pouvoir se connecter alors même qu’il ne dispose d’aucun shell de connexion.
  • Le fichier spécifié par la directive userlist_file contiendra la liste avec les utilisateurs autorisés à se connecter.

Les listings récursifs sont autorisés.

ls_recurse_enable=YES

Notre serveur utilise uniquement l’IPv4, ce que nous allons préciser ici.

listen=YES
listen_ipv6=NO

Ici, on peut activer le mode FTP passif et définir la plage de ports dynamiques.

pasv_enable=YES
pasv_min_port=50001
pasv_max_port=50010

Étant donné qu’un utilise le mode FTP passif, on peut commenter ou supprimer la ligne suivante.

# connect_from_port_20=YES

Un peu plus bas, on pourra supprimer le doublon userlist_enable=YES et désactiver l’utilisation des encapsuleurs TCP.

tcp_wrappers=NO

Au total, notre fichier /etc/vsftpd/vsftpd.conf ressemble à ceci.

# /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
chroot_local_user=YES
userlist_enable=YES
userlist_deny=NO
check_shell=NO
userlist_file=/etc/vsftpd/vsftpd.user_list
allow_writeable_chroot=YES
ls_recurse_enable=YES
listen=YES
listen_ipv6=NO
pasv_enable=YES
pasv_min_port=50001
pasv_max_port=50010
pam_service_name=vsftpd
tcp_wrappers=NO

Il ne reste plus qu’à créer le fichier /etc/vsftpd/vsftpd.user_list censé contenir la liste des utilisateurs autorisés à se connecter à VsFTPd.

# echo install > /etc/vsftpd/vsftpd.user_list

Mise en service et premier test

Activer et démarrer le serveur VsFTPd.

# systemctl enable vsftpd
# systemctl start vsftpd

Pour tester le serveur localement, on pourra utiliser un client FTP comme ncftp ou lftp. Avant de le lancer, on va lui fournir un fichier test à se mettre sous la dent.

# echo "Ceci est un test FTP" > /srv/ftp/install/test
# chown install:install /srv/ftp/install/test

À présent, on peut initier une connexion en tant qu’utilisateur install.

# ncftp -u install localhost
NcFTP 3.2.5 (Feb 02, 2011) by Mike Gleason 
(http://www.NcFTP.com/contact/).

Copyright (c) 1992-2011 by Mike Gleason.
All rights reserved.

Connecting to localhost...
(vsFTPd 3.0.2)
Logging in...
Password requested by localhost for user "install".

    Please specify the password.

Password: *********

Login successful.
Logged in to localhost.
ncftp / > ls
test
ncftp / > cat test
Ceci est un test FTP

ncftp / > bye

 

Ce contenu a été publié dans CentOS, Documentation Microlinux, avec comme mot(s)-clé(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

Une réponse à Installer un serveur FTP avec VsFTPd sous CentOS

  1. Ping : Installer un serveur FTP avec VsFTPd sous CentOS - My Tiny Tools

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.