Cet 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
- Configuration du pare-feu
- Configuration de SELinux
- Installation
- Création d’un utilisateur
- Configuration du serveur
- Mise en service et premier test
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
Ping : Installer un serveur FTP avec VsFTPd sous CentOS - My Tiny Tools