|

Apps – FTPx

J’avais à cœur de partager l’un des tous premiers services publiés pour un usage autre qu’interne. Avant de poursuivre, j’ai délibérément fait le choix de ne pas traiter dans ce même article les protocoles TFTP et SFTP. Ces derniers auront leurs propres billet.

Le transfert de données, notamment de fichiers date un peu. Si aujourd’hui l’échange de fichiers s’est banalisé ce n’était pas le cas dans les années 70. C’est pourquoi, il existe une RFC1 décrivant le protocole FTP2, File Transfert Protocol. Je passe sur l’histoire du protocole vous trouverez sur la toile (comme le disent si bien les milléniales de ma génération) tout ce qui vous faudra pour réaliser un exposé digne de ce nom.

La finalité de ce billet sera de voir le déploiement, implémentation et l’usage d’un service FTPx dans un environnement durci GNU.

Prérequis

Théorie – FTPx

Super ! Le titre annonce la couleur. Dis voir dans ton introduction t’aurais pas oublié une lettre ? Le FTPx c’est le FTP en plus cochon c’est ça ?

Excellente remarque. Sans déconner, soit je suis schizophrène ou en passe de le devenir. Je vais parler du protocole FTP et FTPS3 d’où la notion de FTPx. Ce qui nous amène à la conclusion que le FTPx n’est pas plus cochon pour échanger des fichiers que le FTP mais rien n’interdit d’avoir et d’échanger des fichiers cochons via ces deux protocoles.

A la différence du protocole FTP, le protocole FTPS est sécurisé par les protocoles (anciennement SSL) TLS. Le protocole FTPS est également décrit par une RFC.

Oui mais moi je fais du FeuTeuPeu Sécurisé avec SFTP. C’est pareil !

Toux doux bijoux ! Non pas du tout, c’est pas pareil et ça nous verrons la différence dans un autre billet.

Rentrons dans la théorie de chacun des protocoles FTP et FTPS.

FTP

Le protocole de communication FTP comme présenté succinctement plus haut permet d’échanger des fichiers sur le modèle client, serveur. Ce dernier possède deux modes de fonctionnement distinct.

  • Le mode actif
  • Le mode passif

Les deux modes de fonctionnement utilisent les connexions TCP garantissant ainsi l’intégrité des données échangées. Toutefois, il est important de préciser que ce n’est pas le protocole le plus sécurisé au monde puisque l’ensemble des informations transmissent ne sont pas chiffrées. Dans le cas d’authentification d’un utilisateur, il sera facile en « sniffant » les trames réseaux de trouver le login et mot de passe de ce dernier.

Mode actif

En mode actif, les ports utilisés sont le 21 et le 20. Le port 21 servira à initier la connexion entre le client et le serveur en transmettant les commandes. L’ensemble des données transiterons sur le port 20 du serveur vers le client ayant initié le jeu de commande.

Toutefois, ce mode de fonctionnement peut être contraignant. Comme nous pouvons le constater sur le schéma, le retour peut ne jamais arriver. Le serveur va effectuer le retour sur le port qui est spécifié par le client lors de l’exécution des commandes. Avec les firewalls d’aujourd’hui, il est donc plus que probable que le retour n’arrive jamais (qui autorise le port 20 en entrant par défaut ?). Il sera donc nécessaire d’ouvrir les flux nécessaires et le cas échéant de revoir côté client les politiques de NAT.

Mode passif

A contrario, le mode passif utilise uniquement le port 21. Le port 21 servira à initier la connexion entre le client et le serveur en transmettant les instructions (comme le mode actif). Toutefois c’est lors de la phase d’échange de données que le fonctionnement change, le serveur va déterminer le port que le client a utilisé lors de l’appel pour effectuer le transfert des datas durant toutes la durée des transactions.

Ainsi avec les firewalls nous sommes quasi assuré que les données seront reçu.

FTPS

Comme nous l’avons énoncé précédemment, le protocole à une grosse lacune puisque les données échangées ne sont pas chiffrées. Pour remédier à cela il est possible de chiffrer les données en utilisant le protocole FTPS, aussi appelé FTP over SSL.

Le principe est plutôt simple puisque le serveur FTP va à travers un certificats SSL/TLS chiffrer les données qui vont transiter. Ce dernier possède deux modes de fonctionnement distinct.

  • Mode implicite
  • Mode explicite

Les deux modes de fonctionnement utilisent les connexions TCP garantissant ainsi l’intégrité des données échangées point à point.

Mode Implicite

Le mode implicite rappel dans un sens le fonctionnement du protocole HTTPS. Les ports utilisés sont le 990 et le 989. Le port 990 servira à initier la connexion entre le client et le serveur en transmettant les commandes de manière chiffrée. L’ensemble des données transiterons sur le port 989 du serveur vers le client ayant initié le jeu de commande.

C’est une fois que la connexion est initiée que les données sont chiffrées. La phase de login est comprise dans l’échange sécurisé.

Ce mode bien qu’encore présent dans notre société se fait de plus en rare et est jugé comme obsolète. Effectivement toutes connexions initiées par des équipements qui ne prennent pas en charge le protocole SSL/TLS se feront drop ou reject par le serveur.

Mode Explicite

Le mode explicite lui vient palier au mode implicite en étant plus permissif tout en gardant un niveau de sécurité. Il n’est pas rare de parler du protocole FTPS explicite sous FTPES4. Le port de communication est le même que pour le protocole FTP, soit le port 21.

Effectivement comme ce dernier se veut permissif, si le poste client initie la connexion au serveur en spécifiant dans les commandes AUTH TLS ou AUTH SSL, les échanges qui suivront seront chiffrés et ce jusqu’à la fin de l’échange. Dans le cas contraire, si aucune commande de chiffrement n’est spécifiée suivant la configuration du serveur FTP, la connexion sera autorisée ou rejetée.

Pratique – FTPx

Maintenant que nous sommes un peu plus au fait du fonctionnement des différents modes et protocoles FTPx nous allons nous orienter vers l’implémentation d’un daemon FTP sur un environnement durci.

Nous utiliserons pour ça le paquet vsftpd5 qui offre une grande flexibilité, simplicité et sécurité. A ce jour, il me semble qu’une seule faille de sécurité a été découvert sur ce daemon depuis qu’il existe. Cette dernière a été patchée dans la foulée.

Une question serait légitime à cette étape.

Pourquoi se faire c***r à configurer un serveur FTP alors que ce n’est pas top niveau sécurité ? Pourquoi ne pas faire du FTPES à la rigueur ? En plus tu nous dis que la solution vsftp et flexible ?

Plusieurs raisons. La première, certains équipements spécifiques (souvent industriels) ne prennent pas en charge le SFTP ou FTP over SSL. Donc par exemple, des automates qui réalisent des relevés télémétriques à x K€ HT, il va être difficile de convaincre le client de changer tout son parc de machine pour un « soucis de sécurité ». Le risque est accepté. Dans d’autres cas, il est possible que des applications métiers (c’est de moins en moins le cas, mais on en trouve toujours) type ERP ne prennent pas en charge la partie TLS/SSL. Donc c’est un peu délicat pour les échanges de données inter applications. C’est pourquoi j’ai toujours préféré faire du FTP et non du FTPES.

Mais étant ici pour partager mon expérience, je suis également présent pour sortir de ma zone de confort et occuper mes soirées, mes nuits. C’est pourquoi nous traiterons les deux cas de configuration.

  • FTP en mode passif
  • FTPS en mode explicit

Pour des raisons de simplicité nous réaliserons les deux configurations sur le même environnements durci.

Nous allons partir du contexte suivant. Nous devons mettre à disposition un espace pour deux clients sur notre serveur FTP. Pour des raisons de sécurité, nous allons dédier pour nos clients deux disques d’un volume de 5Go. Nous assurerons l’étanchéités local des deux espaces clients. Nous considérons que les disques sont déjà montés (si besoin, Je vous invite à parcourir la section déjà documentée dans l’article LINUX – Disk & Part).

Installation

Installons le daemon vsftp

# dnf install vsftpd

Comme d’habitude, réalisons une copie du fichier de configuration par défaut.

$ sudo mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.ori

Editons un nouveau fichier de configuration et modifions celui-ci. Nous prendrons comme d’habitude le temps pour expliquer chaque ligne de configuration.

$ sudo vim /etc/vsfpd/vsftpd.conf

Nous ne souhaitons pas autoriser les connexions anonymes à notre serveur donc nous allons désactiver toutes les options relatives au « non » comptes.

Nous avons traiter la partie anonyme en désactivant toutes possibilités de connexions. Toutefois dans le cas des utilisateurs, il est à distinguer deux types :

  • Les utilisateurs locaux
  • Les utilisateurs virtuels

Nous ne traiterons que la première catégories. La seconde s’oriente plus dans un usage WEB ce qui n’est pas mon objectif puisque je souhaite faire du FTP et FTPS un service à la demande sur lequel j’aurai la main sur qui rentre ou non. La configuration ne changera pas des masses.

Il est donc nécessaire d’autoriser les connexions à nos utilisateurs locaux et d’autoriser l’écriture à travers les commandes FTP, de définir le mask à 022 pour la sécurité. De faire en sorte que les utilisateurs ne puissent pas sortir de leur « home » et d’aller là où ils ne devraient pas mais en les autorisant quand même à écrire dans les répertoires. De définir la liste des utilisateurs systèmes et locaux qui ne devrait pas se connecter.

Cette rubrique est dans un sens la rubrique foursitou (pas loin de boursylamotte) où nous allons référencer l’ensemble des paramètres propres au daemon, comme le timeout des sessions, la bannière, l’autorisation des commandes récursives, la partie réseau etc.

Je m’attarde toutefois sur le dernier paramètre concernant le flux data. Comme nous ne souhaitons pas faire de FTP en mode actif, nous désactivons ce dernier puisque c’est notre serveur qui définira les ports dynamiques qui seront autorisées. Dans le cas où nous souhaitions (nous faire c***r la b**e) faire du FTP en mode actif, l’argument devra être à YES.

Comme à notre habitude, nous allons garder un œil sur l’activité de notre daemon et de l’activité de nos usagers. Nous allons structurer nos journaux.

$ sudo mkdir /var/log/vsftpd
$ sudo chmod 700 /var/log/vsftpd

Le répertoire contiendra les journaux .log ainsi que les fichiers .xferlog.

Quelles différences me direz vous ?

Le fichier de log va venir tracer toutes les actions et événement sur notre daemon (connexion, navigation, commande ftp etc) tandis que le fichier xferlog va appliquer dans un standard commun au protocole xftpx les évènements propres au transfert des données.

  • Current-Time
  • Transfert-Time
  • Remote-Host
  • File-Size
  • Filename
  • Transfert-Type
  • Special-Action-Flag
  • Direction
  • Access-mode
  • Username
  • Service-Name
  • Authentication-Method
  • Authenticated-User-Id
  • Completion-Status

Dans notre fichier de configuration il sera donc nécessaire d’ajouter les lignes suivantes.

Qui dit log, dit nettoyage automatique des journaux. Sinon adieu l’espace de stockage et coucou l’incident multi-utilisateur ! Modifions donc le fichier de configuration déjà présent dans le répertoire de logrotate.d. Nous pourrions faire une copie mais comme ce dernier possède la configuration pour l’emplacement par défaut, je préfère commenter les lignes existantes.

$ sudo vim /etc/logrotate.d/vsftpd

Ce qui nous donne ci dessous un aperçu du contenu de nos deux fichiers de logs.

Nous voila débarrassés de la configuration générale de notre daemon vsftpd.

(Terminé ne veut pas dire opérationnel hein il manque des bouts)

Ajoutons le daemon à démarrer automatiquement lors du boot de notre bécane.

$ sudo systemctl enable vsftpd

Nous avons notre SELinux d’activé puisque notre environnement est durci. Il est donc nécessaire d’autoriser notre contexte.

# setsebool -P ftpd_full_access on

Ouvrons le port 21 sur notre firewall

# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -p TCP --dport 21 --sport 1024:65534 -j ACCEPT
# systemctl restart firewalld

Notre daemon VSFTP est fonctionnel, mais non opérationnel. Ci-dessous les configurations à apporter pour un FTP en mode passif et un FTPS en mode explicit.

Configuration FTP

Ajoutez les lignes suivantes dans le fichier de configuration vsftpd.conf

$ sudo vim /etc/vsftpd/vsftpd.conf

Je ne vais pas détailler les lignes de configuration. Les commentaires doivent je le pense faire le taf.

Configuration FTPES

En complément de la configuration réalisée précédemment pour autoriser les connexions FTP, nous allons « simplement » ajouter les lignes de configuration nécessaire à l’utilisation des protocoles SSL/TLS.

Naturellement et choses importantes, nous partons du principe que nous avons déjà notre certificat ainsi que notre clé privée. N’ayant pas les moyens de m’offrir un wildcard (*.erwanguillemard.com) et ne pouvant passer par un certificat Let’sEncrypt, j’utiliserai dans mon cas un certificat auto-signé. Pour ceux qui aurait besoin d’un petit coup de main pour la génération d’une CA et d’un certificat, je vous laisse un lien vers un autre article LINUX – Certificats.

Je laisse ci-dessous le fichier de configuration dans son intégralité.

Création d’un utilisateur

$ sudo adduser Customer1 --home-dir /mnt/customer1 --shell /sbin/nologin --badname
$ sudo passwd Customer1

Il sera nécessaire de configurer notre « jail » pour pas que notre utilisateur Customer1 se sauve de son home. En gros nous allons le restreindre. Dans le cas d’un jailbreak nous pouvons en tant que SysAdmin résumer la situation de la manière suivante.

Personnellement, la situation ne s’est jamais produite, mais une erreur de droit est vite arrivée. Il convient donc d’être vigilant. Dans le cas de plateforme mutualisée multi-utilisateurs, multi-clients. Il serait dommageable que Customer1 voit les données de Customer2 et vice-versa. Si tester, c’est douter, je vous recommande pour éviter les trois situations ci haut d’avoir une once de doute lors de la création des utilisateurs et de tenir une matrice des droits associés à chaque compte, groupe. 🙂

$ sudo chmod 2770 -R /mnt/customer
$ sudo chgrp Customer1 /mnt/customer1

Autorisons notre utilisateur à se connecter au service FTP/FTPS en l’ajoutant au groupe ftp.

$ sudo usermod -aG Customer1 ftp

Connexion

Bien, je crois que c’est le moment de nous connecter à notre serveur avec nos utilisateurs Customer 1 et Customer 2.

C’est un message plaisant. C’est toujours agréable de se prendre une salade de phalanges en pleine face ! Nous sommes certain du login et du mot de passe. Alors où est ce que ça m***e ??? Est-ce côté système ? Est-ce côté daemon dans la configuration ?

Il y a plusieurs pistes et je ne pourrai pas donner THE solution. Si nous avons la même configuration vous devriez vous en sortir.

Dans notre configuration du daemon vsftpd, l’argument check_shell doit être à NO. Cette option ne s’applique que dans le cas du non usage du PAM6. VSFTPD va vérifier le contenu du fichier /etc/shells pour les authentifications locales. Pour rappel, le fichier shells contient la liste des shells de connexion présent sur le système et si ces derniers sont valides. Sauf que voilà, pour des raisons de sécurité, nos utilisateurs ont pour shell /sbin/nologin (ils pourraient également être en /bin/false) puisque nous ne voulons surtout pas qu’ils puissent se connecter sur le système. Il nous suffira d’ajouter dans le fichier shells la ligne /sbin/nologin.

$ sudo vim /etc/shells

Recommençons la connexion à notre daemon ftp/ftps. Force est de constater que nous sommes connectés, que nous sommes bien restreint (chrooté dans notre jail). En un mot, un seul ça fonctionne !

Nous sommes bien authentifiés, toutefois comment bien faire la distinction entre l’utilisation du protocole FTP et du protocole FTPES ?

Pour répondre à cette question nous partons du principe suivant. L’utilisateur Customer1 va se connecter à notre serveur via le protocole FTP en mode passif, l’utilisateur Customer2 via le protocole FTPs en mode explicite passif. Notre serveur autorise les connexions FTP en parallèle des connexions FTPS.

Lors de l’ouverture de la session avec notre client FTP, si nous observons en temps réel les journaux d’événement de notre daemon nous pouvons constater la chose suivante.

La phase d’authentification se fait bien puisque nous avons la confirmation du succès de l’authentification par le OK LOGIN: Client. Toutefois les logs ne nous indiquent pas si les données échangées sont chiffrées ou non. Pour en avoir le cœur net, analysons les trames réseaux entre notre client FTP et notre serveur FTP.

La messe est dite en une capture. Nous retrouvons de manière plus verbeux les logs présents dans notre daemon vsftpd. Nous pouvons constater que l’ensemble des flux réseaux entre notre daemon et client se base exclusivement sur le protocole FTP (normal puisque que c’est ce que tu veux). Or, si nous revenons au début de notre billet, le gros désavantage du protocole FTP est qu’il ne chiffre pas les données qui transitent sur le réseau. Nous pouvons donc « admirer » le mot de passe en clair (en jaune sur l’image précédente) du compte Customer1.

Dans un premier temps si c’est la première fois que l’on échange avec ce serveur depuis notre client, nous avons un message nous demandant d’accepter la clé de chiffrement du serveur FTP. Ce qui est plutôt de bon augure.

Lors de l’ouverture de la session avec notre client FTP, si nous observons en temps réel les journaux d’événement de notre daemon nous pouvons constater la chose suivante.

Contrairement à la section précédente, nous avons (au delà d’une image bien plus grande) deux informations importantes nous indiquant que l’ensemble des échanges sont chiffrés entre notre client et le daemon FTP « AUTH TLS » – « 234 Proceed with negociation« . Plus loin, nous avons la confirmation du succès de l’authentification. Mais est ce que le mot de passe a été transmis en clair comme avec le protocole FTP ? Il nous faut de nouveau nous tourner vers le contenu des trames réseaux.

La réponse est non et heureusement. Sans quoi cela voudrait dire que la configuration de notre daemon laisse à désirer et que niveau sécurité ce n’est pas ça qui est ça. Nous constatons qu’en plus de l’usage du protocole FTP initial vient s’intercaler assez rapidement le protocole TLS dans sa version 1.3. Le login et mot de passe sont chiffrés et n’apparaissent pas en claire. Ce que nous permet également de conclure que la phase de chiffrement a été réalisé lors de l’initialisation de la connexion entre le client FTP et notre daemon FTP.

Conclusion

Nous avons démontré la différence entre les deux protocoles FTP et FTPES ainsi que comment implémenter ces derniers sur un environnement sécurisé.

Nous ne pouvons pas dire que le protocole FTPES est mieux que le FTP et inversement. Sur le plan sécurité naturellement que le protocole FTP over SSL est mieux. Mais dans l’usage pas forcément. Comme présenté au début de cet article, le contexte d’usage va nous orienter vers l’une ou l’autre configuration de notre daemon ftp.

Dans un principe de moindre mal, il conviendra alors de limiter un maximum la surface d’exposition de notre service publié FTP car ce dernier est le plus vulnérable. Rien n’empêche d’appliquer ces mécanismes au service publiés FTPs.

Toujours en prenant compte du contexte d’utilisation je recommande au minimum d’implémenter sur le firewall :

  • Activation de l’IPS
  • Activation de l’Application Control (fonctionnalité WatchGuard) sur une politique définit
  • Activation de la Géolocalisation sur la liste des pays autorisées à se connecter au service publié
  • Utilisation d’un proxy FTP

Au maximum et si possible sur le firewall :

  • Filtrer les adresses IP entrantes aux seules IP habilitées. (Généralement les IPs clientes).

Le risque zéro n’existe pas et il convient de mettre en place le maximum de mécanisme de sécurité, de maintenir ces dernières sur le plan opérationnel et analytique. D’un point de vu personnel, j’ai une forte tendance à ne pas utiliser (pour ne pas dire dénigrer) l’usage du protocole FTPS au détriment du protocole SFTP7. Vous me voyez venir avec mes gros sabots ? 🙂 Oui comme dit plus haut, je vais dédié un article rien que pour le SFTP pour ne pas tout mélanger et ainsi comparer les deux protocoles.

Le mot de la fin :

Transférer un séminariste via un cable link et voir en clair sous sa soutane le mot de passe « Carmélites4Ever », n’éteignez pas la console… Ah zut, qu’est ce qu’un cable link ?

Erwan GUILLEMARD

Sources

  1. RFC : Request For Comments ↩︎
  2. FTP : File Transfert Protocol ↩︎
  3. FTPS : File Transfert Protocol Secure ↩︎
  4. FTPES : File Transfert Protocol Explicit Secure ↩︎
  5. VSFTPD : Very Secure File Transfert Protocol Daemon ↩︎
  6. PAM : Pluggable Authentication Modules ↩︎
  7. SFTP : Secure File Transfert Protocol ↩︎