Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

14.2. FTP

Le protocole de transfert de fichiers (File Transfer Protocol, FTP) est l'un des protocoles les plus anciens et des plus couramment utilisés sur Internet de nos jours. Son but est de permettre un transfert fiable entre ordinateurs hôtes sur un réseau sans que l'utilisateur ait besoin de se connecter directement à l'hôte distant ou ne possède de connaissances sur l'utilisation d'un système distant. Il permet aux utilisateurs d'accéder à des fichiers sur des systèmes distants en utilisant un ensemble standard de commandes simples.
Cette section énonce les bases du protocole FTP et présente vsftpd, qui est le serveur FTP préféré sur Red Hat Enterprise Linux.

14.2.1. Le protocole de transfert de fichiers

FTP utilise une architecture client-serveur pour transférer des fichiers en utilisant le protocole réseau TCP. Comme FTP est une protocole relativement ancien, l'authentification du nom d'utilisateur et du mot de passe n'est pas chiffrée. Pour cela, FTP est considéré comme un protocole non sécurisé et ne doit pas être utilisé sauf si absolument nécessaire. Cepedant, FTP est si répandu sur Internet qu'il est souvent requis pour partager des fichiers avec le public. Ainsi, les administrateurs doivent avoir connaissanece des caractéristiques uniques de FTP.
Cette section décrit comment configurer vsftpd pour établir des connexions sécurisées par TLS et comment sécuriser un serveur FTP à l'aide de SELinux. Un bon protocole de substitution de FTP est sftp, de la suite d'outils OpenSSH. Pour obtenir des informations sur la configuration d'OpenSSH et sur le protocole SSH en général, veuillez consulter le Chapitre 10, OpenSSH.
Contrairement à la plupart des protocoles utilisés sur internet, FTP requiert de multiples ports réseau pour fonctionner correctement. Lorsqu'une application cliente FTP initie une connexion vers un serveur FTP, celle-ci ouvre le port 21 sur le serveur — qui est également appelé port des commandes. Ce port est utilisé pour exécuter toutes les commandes sur le serveur. Toutes les données requises du serveur sont retournées vers le client via un port de données. Le numéro de port pour les connexions de données et la manière par laquelle celles-ci sont initialisées dépendent de si le client requiert les données en mode actif ou passif.
Ce qui suit définit les modes :
mode actif
Le mode actif est la méthode d'origine utilisée par le protocole FTP pour transférer des données vers l'application cliente. Lorsqu'un transfert de données en mode actif est initié par le client FTP, le serveur ouvre une connexion sur le port 20 du serveur pour l'adresse IP ainsi qu'un port aléatoire, non privilégié (supérieur à 1024), spécifié par le client. Cet arrangement signifie que la machine cliente doit être autorisée à accepter des connexions sur tout port supérieur à 1024. Avec l'augmentation des réseaux non sécurisés, comme internet, l'utilisation de pare-feux pour protéger les machines clientes s'est répandue. Comme les pare-feux du côté client refusent souvent des connexions entrantes en provenance de serveurs FTP en mode actif, un mode passif a été conçu.
mode passif
Le mode passif, tout comme le mode actif, est initié par l'application cliente FTP. Lorsque des données sont requises du serveur, le client FTP indique qu'il souhaite accéder aux données en mode passif et le serveur fournit l'adresse IP ainsi qu'un port aléatoire, non-privilégié (supérieur à 1024) sur le serveur. Le client se connecte ensuite à ce port sur le serveur pour télécharger les informations requises.
Même si le mode passif résout des problèmes d'interférences du pare-feu côté client avec les connexions de données, il peut également compliquer l'administration du pare-feu côté serveur. Vous pouvez réduire le nombre de ports ouverts sur un serveur en limitant la plage de ports non-privilégiés sur le serveur FTP. Cela simplifie également le processus de configuration des règles du pare-feu pour le serveur.

14.2.2. Serveur vsftpd

Le démon vsftpd (Very Secure FTP Daemon) a été conçu dès le début pour être rapide, stable, et surtout sécurisé. vsftpd est le seul serveur FTP autonome distribué avec Red Hat Enterprise Linux, grâce à sa capacité de gestion efficace et sécurisée de grands nombres de connexion.
Le modèle de sécurité utilisé par vsftpd offre trois aspects principaux :
  • Une importante séparation entre les processus privilégiés et non-privilégiés — les processus séparés gèrent différentes tâches, et chacun de ces processus est exécuté avec les privilèges minimaux requis pour la tâche.
  • Les tâches qui requièrent des privilèges élevés sont gérées par des processus avec le minimum des privilèges nécessaires — en tirant profit des compatibilités trouvées dans la bibliothèque libcap, les tâches qui requièrent normalement la totalité des privilèges root peuvent être exécutées de manière plus sécurisée à partir d'un processus moins privilégié.
  • La plupart des processus sont exécutés dans une prison chroot — lorsque c'est possible, les processus sont « change-rooted » sur le répertoire en cours de partage ; ce répertoire est ensuite considéré comme une prison chroot. Par exemple, si le répertoire /var/ftp/ est le répertoire principal partagé, vsftpd réassigne /var/ftp/ au nouveau répertoire root, nommé /. Ceci prévient toute activité pirate potentielle d'une personne malveillante sur tous les répertoires qui ne sont pas contenus dans le nouveau répertoire root.
L'utilisation de ces pratiques de sécurité a l'effet suivant sur la manière dont vsftpd traite les requêtes :
  • Le processus parent est exécuté avec le minimum de privilèges requis — le processus parent calcule dynamiquement le niveau de privilèges requis pour minimiser le niveau de risques. Les processus enfants gèrent les interactions directes avec les clients FTP et sont exécutés avec aussi peu de privilèges que possible.
  • Toutes les opérations nécessitant une élévation de privilèges sont gérées par un petit processus parent — tout comme avec le serveur HTTP Apache, vsftpd lance des processus enfants non privilégiés pour gérer les connexions entrantes. Ceci permet au processsus parent privilégié d'être aussi petit que possible et de gérer un nombre de tâches relativement faible.
  • Le processus parent se méfie de toutes les requêtes des processus enfants non privilégiés — Les communications avec les processus enfants sont reçues via un socket, et la validité des information en provenance d'un processus enfant est vérifiée avant qu'une action ne soit déclenchée.
  • La plupart des interactions avec des clients FTP sont gérées par des processus enfants non privilégiés dans une prison chroot — comme ces processus enfants ne sont pas privilégiés et ont uniquement accès au répertoire partagé, tout processus ayant échoué n'autorisera une personne malveillante à n'accéder qu'aux fichiers partagés.

14.2.2.1. Démarrage et arrêt de vsftpd

Pour démarrer le service vsftpd dans la session actuelle, veuillez saisir ce qui suit dans l'invite de shell en tant qu'utilisateur root :
~]# systemctl start vsftpd.service
Pour arrêter le service dans la session actuelle, saisissez ce qui suit en tant qu'utilisateur root :
~]# systemctl stop vsftpd.service
Pour redémarrer le service vsftpd, veuillez exécuter la commande suivante en tant qu'utilisateur root :
~]# systemctl restart vsftpd.service
Cette commande arrête puis démarre immédiatement le service vsftpd, ce qui est la manière la plus efficace de faire en sorte que les changements entrent en vigueur après avoir modifié le fichier de configuration de ce serveur FTP. De manière alternative, vous pouvez utiliser la commande suivante pour redémarrer le service vsftpd, uniquement s'il est déjà en cours d'exécution :
~]# systemctl try-restart vsftpd.service
Par défaut, le service vsftpd n'est pas lancé automatiquement pendant l'initialisation. Pour configurer le service vsftpd pour qu'il soit lancé pendant le démarrage, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
~]# systemctl enable vsftpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
Pour obtenir des informations supplémentaires sur la gestion des services système sur Red Hat Enterprise Linux 7, veuillez consulter le Chapitre 9, Gérer les services avec systemd.

14.2.2.2. Lancer de multiples copies de vsftpd

De temps à autres, un ordinateur est utilisé pour servir de multiples domaines FTP. Cette technique est nommée multihoming (multiréseaux). Une manière d'effectuer un multihome en utilisant vsftpd consiste à exécuter de multiples copies du démon, chacune avec son propre fichier de configuration.
Pour faire ceci, commencez par assigner toutes les adresses IP à des périphériques réseau ou à des alias de périphériques réseau sur le système. Pour obtenir davantage d'informations sur la configuration des périphériques réseau, des alias de périphériques, ainsi que des informations sur les scripts de configuration réseau, veuillez consulter le Guide de mise en réseau Red Hat Enterprise Linux 7.
Esuite, le serveur DNS des domaines FTP devra être configuré pour faire référence à la machine qui convient. Pour obtenir des informations sur BIND, le protocole d'implémentation DNS utilisé sur Red Hat Enterprise Linux, ainsi que sur ses fichiers de configuration, veuillez consulter le Guide de mise en réseau Red Hat Enterprise Linux 7.
Pour que vsftpd réponde à des requêtes sur différentes adresses IP, de multiples copies du démon doivent être en cours d'exécution. Pour faciliter le lancement de multiples instances du démon vsftpd, une unité spéciale du service systemd (vsftpd@.service) pour lancer vsftpd en tant que service instancié est fournie dans le paquet vsftpd.
Afin de pouvoir utiliser cette unité du service, un fichier de configuration vsftpd séparé pour chaque instance du serveur FTP requise devra être créé et placé dans le répertoire /etc/vsftpd/. Remarquez que chacun de ces fichiers de configuration doit posséder un nom unique (tel que /etc/vsftpd/vsftpd-site-2.conf) et doit uniquement être accessible en lecture et écriture par l'utilisateur root.
Dans chaque fichier de configuration pour chaque serveur FTP écoutant sur un réseau IPv4, la directive suivante doit être unique :
listen_address=N.N.N.N
Remplacez N.N.N.N par une adresse IP unique pour le site FTP servi. Si le site utilise IPv6, veuillez utiliser la directive listen_address6 à la place.
Une fois que de multiples fichiers de configuration sont présents dans le répertoire /etc/vsftpd/, des instances individuelles du démon vsftpd peuvent être lancées par la commande suivante en tant qu'utilisateur root :
~]# systemctl start vsftpd@configuration-file-name.service
Dans la commande ci-dessus, remplacez configuration-file-name par le nom unique du fichier de configuration du serveur requis, tel que vsftpd-site-2. Remarquez que l'extension .conf du fichier de configuration ne doit pas être incluse dans la commande.
Si vous souhaitez lancer plusieurs instances du démon vsftpd à la fois, vous pouvez utiliser un fichier d'unité cible systemd (vsftpd.target), qui est fourni dans le paquet vsftpd. Cette cible systemd entraîne le lancement d'un démon indépendant vsftpd pour chaque fichier de configuration vsftpd qui se trouve dans le répertoire /etc/vsftpd/. Veuillez exécuter la commande suivante en tant qu'utilisateur root pour activer la cible :
~]# systemctl enable vsftpd.target
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.target to /usr/lib/systemd/system/vsftpd.target.
La commande ci-dessus configure le gestionnaire de services systemd pour qu'il lance le service vsftpd (avec les instances configurées du serveur vsftpd) pendant l'initialisation. Pour lancer le service immédiatement, sans redémarrer le système, veuillez exécuter la commande suivante en tant qu'utilisateur root :
~]# systemctl start vsftpd.target
Veuillez consulter la Section 9.3, « Travailler avec des cibles Systemd » pour obtenir des informations supplémentaires sur la manière d'utiliser des cibles systemd pour gérer les services.
Les autres directives pouvant être altérées sur une base « par serveur » incluent :
  • anon_root
  • local_root
  • vsftpd_log_file
  • xferlog_file

14.2.2.3. Chiffrer des connexions vsftpd en utilisant TLS

Dans le but de contrer la nature non sécurisée inhérente de FTP, qui transmet les noms d'utilisateur, mots de passe, et données sans chiffrement par défaut, le démon vsftpd peut être configuré pour utiliser le protocole TLS afin d'authentifier les connexions et de chiffrer tous les transferts. Remarquez qu'un client FTP prenant en charge TLS est nécessaire pour communiquer avec vsftpd avec TLS activé.

Note

SSL (« Secure Sockets Layer ») est le nom d'une ancienne implémentation du protocole de sécurité. Les nouvelles versions sont appelées TLS (« Transport Layer Security »). Seules les nouvelles versions (TLS) doivent être utilisées car SSL connaît de graves défaillances de sécurité. La documentation incluse avec le serveur vsftpd, ainsi que les directives de configuration utilisées dans le fichier vsftpd.conf, utilisent le nom SSL lorsqu'elles font référence à des sujets liés à la sécurité, mais TLS est pris en charge et est utilisé par défaut lorsque la directive ssl_enable est paramétrée sur YES.
Veuillez définir la directive de configuration ssl_enable du fichier vsftpd.conf sur YES pour activer la prise en charge TLS. Les paramètres par défaut des autres directives liées à TLS qui sont automatiquement activés lorsque l'option ssl_enable est activée elle-même, fournissent une installation TLS relativement bien configurée. Ceci exige, entre autre, d'utiliser le protocole TLS v1 pour toutes les connexions (l'utilisation des versions non sécurisées du protocole SSL est désactivée par défaut) ou de forcer toutes les connexions non anonymes à utiliser TLS pour envoyer des mots de passe et des transferts de données.

Exemple 14.3. Configurer vsftpd pour utiliser TLS

Dans cet exemple, les directives de configuration désactivent explicitement les versions plus anciennes du protocole de sécurité SSL dans le fichier vsftpd.conf :
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
Redémarrez le service vsftpd après avoir modifié sa configuration :
~]# systemctl restart vsftpd.service
See the vsftpd.conf(5) manual page for other TLS-related configuration directives for fine-tuning the use of TLS by vsftpd.

14.2.2.4. Politique SELinux pour vsftpd

La politique SELinux gouvernant le démon vsftpd (ainsi que d'autres processus ftpd) définit un contrôle d'accès obligatoire qui est, par défaut, basé sur le moins d'accès requis. Dans le but d'autoriser le démon FTP à accéder à des fichiers ou répertoires spécifiques, des étiquettes appropriées devront leur être assignés.
Par exemple, pour être en mesure de partager des fichiers de manière anonyme, l'étiquette public_content_t doit être assignée aux fichiers et répertoires à partager. Vous pouvez effectuer ceci en utilisant la commande chcon en tant qu'utilisateur root :
~]# chcon -R -t public_content_t /path/to/directory
Dans la commande ci-dessus, veuillez remplacer /path/to/directory par le chemin du répertoire sur lequel vous souhaitez assigner l'étiquette. De même, si vous souhaitez paramétrer un répertoire pour téléverser des fichiers, vous devrez assigner l'étiquette public_content_rw_t à ce répertoire en particulier. En outre, l'option du booléen SELinux allow_ftpd_anon_write doit être paramétrée sur 1. Veuillez utiliser la commande setsebool en tant qu'utilisateur root pour cela :
~]# setsebool -P allow_ftpd_anon_write=1
Si vous souhaitez que les utilisateurs locaux puissent accéder à leur répertoire personnel via FTP, ce qui est le paramètre par défaut sur Red Hat Enterprise Linux 7, l'option du booléen ftp_home_dir doit être définie sur 1. Si vsftpd est autorisé à être exécuté en mode autonome, ce qui est également le cas par défaut sur Red Hat Enterprise Linux 7, l'option ftpd_is_daemon devra également être définie sur 1.
See the ftpd_selinux(8) manual page for more information, including examples of other useful labels and Boolean options, on how to configure the SELinux policy pertaining to FTP. Also, see the Red Hat Enterprise Linux 7 SELinux User's and Administrator's Guide for more detailed information about SELinux in general.

14.2.3. Ressources supplémentaires

Pour obtenir davantage d'informations sur vsftpd, veuillez consulter les ressources suivantes.

14.2.3.1. Documentation installée

  • /usr/share/doc/vsftpd-version-number/ directory — Remplacez version-number par la version installée du paquet vsftpd. Ce répertoire contient un fichier README avec des informations de base sur le logiciel. Le fichier TUNING contient des conseils de réglage de base des performances et le répertoire SECURITY/ contient des informations sur le modèle de sécurité employé par vsftpd.
  • Pages de manuel liées à vsftpd — il existe des pages de manuel pour le démon et les fichiers de configuration. Ci-dessous figure une liste des pages de manuel les plus importantes.
    Applications du serveur
    • vsftpd(8) — Describes available command-line options for vsftpd.
    Fichiers de configuration
    • vsftpd.conf(5) — Contains a detailed list of options available within the configuration file for vsftpd.
    • hosts_access(5) — Describes the format and options available within the TCP wrappers configuration files: hosts.allow and hosts.deny.
    Interaction avec SELinux
    • ftpd_selinux(8) — Contains a description of the SELinux policy governing ftpd processes as well as an explanation of the way SELinux labels need to be assigned and Booleans set.

14.2.3.2. Documentation en ligne

À propos de vsftpd et de FTP en général
  • http://vsftpd.beasts.org/ — la page du projet vsftpd est un bon emplacement pour trouver la documentation la plus récente et contacter l'auteur du logiciel.
  • http://slacksite.com/other/ftp.html — Ce site web fournit une explication détaillée des différences entre les modes FTP actifs et passifs.
Documentation Red Hat Enterprise Linux
  • Guide de mise en réseau Red Hat Enterprise Linux 7 — Le Guide de mise en réseau de Red Hat Enterprise Linux 7 documente les informations pertinentes à la configuration et à l'administration des interfaces réseau et des services réseau sur ce système. Il fournit une introduction à l'utilitaire hostnamectl et explique comment l'utiliser pour afficher et définir des noms d'hôtes sur la ligne de commande localement et à distance.
  • Guide de l'utilisateur et de l'administrateur SELinux Red Hat Enterprise Linux 7 — le Guide de l'utilisateur et de l'administrateur SELinux Red Hat Enterprise Linux 7 décrit les principes de base de SELinux et documente en détails comment configurer et utiliser SELinux avec divers services, tels que Apache HTTP Server, Postfix, PostgreSQL, ou OpenShift. Celui-ci explique comment configurer les permissions d'accès SELinux pour les services système gérés par systemd.
  • Guide de sécurité Red Hat Enterprise Linux 7 — le Guide de sécurité Red Hat Enterprise Linux 7 assiste les utilisateurs et administrateurs dans leur apprentissage des processus et pratiques de sécurisation de leurs stations de travail et serveurs contre des intrusions locales et distantes, les exploitations, et autres activités malicieuses. Celui-ci explique également comment sécuriser des services de système critiques.
Documents RFC pertinents
  • RFC 0959Demande de commentaires (RFC de l'anglais Request For Comments) d'origine du protocole FTP formulée par IETF.
  • RFC 1123 — la petite section concernant FTP étend et clarifie la demande RFC 0959.
  • RFC 2228 — extensions de sécurité FTP. vsftpd implémente le mini sous-ensemble qu'il faut pour prendre en charge les connexions TLS et SSL.
  • RFC 2389 — propose des commandes FEAT et OPTS.
  • RFC 2428 — prise en charge IPv6.