Installation d’un serveur FTP Sécurisé pour votre entreprise

Installation d’un serveur FTP Sécurisé pour votre entreprise

Dans ce tutoriel nous allons lettre en place un serveur FTP sécurisé avec Pure-ftpd. Nous utiliserons une base MySQL pour gérer les utilisateurs, les quotas, … . Le tout avec une interface graphique ad-hoc.Si vous souhaitez avoir une interface pour gérer vos utilisateurs FTP, consulter ce tutoriel en urgence : Gérer vos utilisateurs FTP en Ajax.

Prérequis pour un serveur FTP Sécurisé

Pure-ftpd se veut à la fois simple, sécurisé dans sa configuration et puissant, de par le nombre de fonctionnalités qu’il propose. Contrairement à d’autres serveurs FTP comme Proftpd et vsftpd notamment, il est très facile à appréhender et convient donc parfaitement aux plus novices en systèmes Linux-like.

Néanmoins, facilité de configuration ne rime pas avec faiblesse ! Pure-ftpd est utilisé par de nombreuses entreprises. Nous pouvons par exemple citer OVH qui l’utilise en production.

Dans ses dernières versions, Pure-ftpd a été porté sur Iphone.

Pour réaliser ce tutoriel, vous aurez besoin :

  • D’une version de Ubuntu Server (ici 20.04 LTS)
  • Pure-FTPD-Mysql

Préparation d’Ubuntu Server

L’installation de Ubuntu Server ne sera pas détaillée ici. Avant de débuter l’installation de notre serveur FTP, nous allons effectués quelques modifications.

Modifier la coloration syntaxique de vi

Afin de rendre plus visible les fichiers de configuration que nous allons devoir éditer, j’ai modifié les couleurs de la syantaxe par défaut de vim en rajoutant à la fin du fichier cette ligne :

:colorscheme desert

Modifier la coloration syntaxique de vi

Assigner une IP statique au serveur FTP

Depuis le passage à Netplan pour configurer le réseau de la part d’Ubuntu, toute la configuration des interfaces réseaux se fait dans un fichier .yaml. Tout est centralisé dans /etc/netplan/.

Pour ma part le fichier de config des interfaces se trouve : /etc/netplan/00-installer-config.yaml

Rajouter ceci dans le fichier en adaptant à votre configuration réseau (attention à l’indentation)

Depuis le passage à Netplan pour configurer le réseau de la part d’Ubuntu, toute la configuration des interfaces réseaux se fait dans un fichier .yaml.

Puis utiliser cette commande  pour prendre en compte la modification :

netplan apply

Depuis le passage à Netplan pour configurer le réseau de la part d’Ubuntu, toute la configuration des interfaces réseaux se fait dans un fichier .yaml. Tout est centralisé dans /etc/netplan/

Désactiver AppArmor

AppArmor est une extension de sécurité (similaire à SELinux) qui devrait fournir une sécurité étendue. A mon avis, vous n’en avez pas besoin pour configurer un système sécurisé, et il cause généralement plus de problèmes que d’avantages (pensez-y après avoir fait une semaine de dépannage parce qu’un service ne fonctionnait pas comme prévu, et puis vous découvrez que tout était ok, seul AppArmor causait le problème). Par conséquent, je le désactive.

service apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils

AppArmor est une extension de sécurité (similaire à SELinux) qui devrait fournir une sécurité étendue. A mon avis, vous n'en avez pas besoin pour configurer un système sécurisé

Modifier /etc/apt/sources.list et mettre à jour votre installation Linux

Editez le fichier /etc/apt/sources.list. Puis commentez ou supprimez la ligne concernant le CD d’installation du fichier et assurez-vous que les dépôts universe et multiverse sont activés.

Ensuite mettez à jour votre installation :

apt-get update
apt-get upgrade

Pour installer les dernières mises à jour (s’il y en a). Si vous constatez qu’un nouveau noyau est installé dans le cadre des mises à jour, vous devez ensuite redémarrer le système :

reboot

Installation de MySQL

Pour gérer nos utilisateurs FTP et leurs propriétés (quota, bande passante, nombre de fichiers) nous allons utiliser une base MySQL.

sudo apt install mysql-server

Cela va installer MySQL sans vous demander de définir un mot de passe ou de faire d’autres changements de configuration.

Une fois cette installation effectuée, je vous conseille d’exécuter le script de sécurité. Ce script modifie certaines des options par défaut les moins sûres pour comme les connexions root distantes et les sample users.

sudo mysql_secure_installation

Une fois cette installation effectuée, je vous conseille d’exécuter le script de sécurité. Ce script modifie certaines des options par défaut les moins sûres pour comme les connexions root distantes et les sample users.

Vous serez guidé à travers une série d’invites où vous pourrez apporter quelques modifications aux options de sécurité de votre installation MySQL. La première invite vous demandera si vous souhaitez configurer le plugin Validate Password, que vous pouvez utiliser pour tester la solidité de votre mot de passe MySQL.

Si vous choisissez de mettre en place le plugin Validate Password, le script vous demandera de choisir un niveau de validation du mot de passe. Le niveau le plus fort – que vous pouvez sélectionner est 2. Il exigera que votre mot de passe comporte au moins huit caractères, dont un mélange de majuscules, de minuscules, de chiffres et de caractères spéciaux :

Que vous choisissiez ou non de configurer le plugin Validate Password, l’invite suivante vous demandera de définir un mot de passe pour l’utilisateur root de MySQL. Saisissez et confirmez le mot de passe  d’accès à votre instance MySQL.

Si vous avez utilisé le plugin Validate Password, vous recevrez des commentaires sur la force de votre nouveau mot de passe. Le script vous demandera si vous voulez continuer avec le mot de passe que vous venez de saisir ou si vous voulez en saisir un nouveau. En supposant que vous êtes satisfait de la force du mot de passe que vous venez d’entrer, saisissez Y pour poursuivre le script de sécurisation.

À partir de là, vous pouvez appuyer sur Y puis sur ENTER pour accepter les valeurs par défaut pour toutes les questions suivantes. Cela supprimera les utilisateurs anonymes et la base de données de test, désactivera les connexions root à distance, et chargera ces nouvelles règles afin que MySQL respecte les modifications que vous avez apportées.

Dans les systèmes Ubuntu fonctionnant sous MySQL 5.7 (et versions supérieure), l’utilisateur MySQL root est configuré pour s’authentifier en utilisant le plugin auth_socket par défaut plutôt qu’avec un mot de passe.  Même si cela semble plus pratique, certaines applications ne le supporte pas.

Afin d’utiliser un mot de passe pour se connecter à MySQL en tant que root, vous devrez changer sa méthode d’authentification de auth_socket à un autre plugin, tel que caching_sha2_password ou mysql_native_password. Pour ce faire, ouvrez l’invite MySQL depuis votre terminal et saisissez cette requête :

sudo mysql
SELECT user,authentication_string,plugin,host FROM mysql.user;

Afin d'utiliser un mot de passe pour se connecter à MySQL en tant que root, vous devrez changer sa méthode d'authentification de auth_socket à un autre plugin, tel que caching_sha2_password ou mysql_native_password.

Vous pouvez voir que l’utilisateur root s’authentifie effectivement en utilisant le plugin auth_socket. Pour affecter un mot de passe à l’utilisateur root, utiliser cette commande :

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

l'utilisateur root s'authentifie effectivement en utilisant le plugin auth_socket.

Info!!! J’ai privilégié la méthode mysql_native_password au lieu de caching_sha2_password afin de conserver une certaine compatibilité avec les applis PHP.

Maintenant si vous avez activé l’authentification par mot de passe pour root, vous devrez utiliser une commande différente pour accéder au shell MySQL.

mysql -u root -p

si vous avez activé l'authentification par mot de passe pour root, vous devrez utiliser une commande différente pour accéder au shell MySQL.

Vérifier le statut de MySQL

systemctl status mysql.service

Vous devriez voir une sortie qui ressemble à ça :

Vérifier le statut de MySQL

Pour une vérification supplémentaire, vous pouvez essayer de vous connecter à la base de données en utilisant l’outil mysqladmin qui est un client vous permettant d’exécuter des commandes administratives.

sudo mysqladmin -p -u root version

Pour une vérification supplémentaire, vous pouvez essayer de vous connecter à la base de données en utilisant l'outil mysqladmin qui est un client vous permettant d'exécuter des commandes administratives.

Installation de Pure-ftpd pour un serveur FTP Sécurisé

Nous allons installer la version mysql de Pure-ftpd, car nous utiliserons une authentification par base de données avec des utilisateurs virtuels. Cela se résume en une seule ligne.

apt-get install pure-ftpd-mysql

Nous allons installer la version mysql de Pure-ftpd, car nous utiliserons une authentification par base de données avec des utilisateurs virtuels.

Ensuite, nous créons un groupe ftp (ftpgroup) et un utilisateur (ftpuser) auxquels tous nos utilisateurs virtuels seront rattachés. Remplacez le group- et userid 2001 par un nombre disponible sur votre système :

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser

Pour connaitre les numéros de groupe et/ou d’utilisateurs disponible sur votre serveur, vous devez utiliser ces commandes.

cat /etc/passwd
cat /etc/group

Pour connaitre les numéros de groupe et/ou d’utilisateurs disponible sur votre serveur, vous devez utiliser ces commandes : cat /etc/passwd et cat /etc/group

Voilà c’est fait.

Configuration de la base de données

Création d’un utilisateur MySQL admin pour gérer la BDD FTP

Nous allons créer un utilisateur Mysql afin de ne pas utiliser l’utilisateur administrateur de Mysql pour administrer notre base de données utilisateurs FTP et lui affecter des droits d’admin.

Mysql -u root -p
CREATE USER admin_ftp@localhost IDENTIFIED BY ‘Mon-Password’;
GRANT ALL PRIVILEGES ON *.* TO admin_ftp@localhost WITH GRANT OPTION;
ALTER USER admin_ftp@localhost REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
SHOW GRANTS FOR admin_ftp@localhost;

Nous allons créer un utilisateur Mysql afin de ne pas utiliser l'utilisateur administrateur de Mysql pour administrer notre base de données utilisateurs FTP et lui affecter des droits d’admin.

  • MAX_QUERIES_PER_HOUR: Le nombre de requêtes qu’un compte peut émettre par heure

  • MAX_UPDATES_PER_HOUR: Le nombre de mises à jour qu’un compte peut émettre par heure

  • MAX_CONNECTIONS_PER_HOUR: Le nombre de fois qu’un compte peut se connecter au serveur par heure.
  • MAX_USER_CONNECTIONS: Le nombre de connexions simultanées autorisées.

Création de la base de données pour Pure-ftpd

On crée maintenant une base de données en donnant les droits sur cette base au nouvel utilisateur Mysql admin-ftp, créé précédemment :

CREATE DATABASE IF NOT EXISTS PUREFTPD_BDD;
GRANT ALL PRIVILEGES ON PUREFTPD_BDD.* TO admin_ftp@localhost;
SHOW DATABASES;

On crée maintenant une base de données en donnant les droits sur cette base au nouvel utilisateur Mysql admin-ftp, créé précédemment

Création de la table utilisateur pour Pure-ftpd

On crée une table utilisateur pour Pure-ftpd pour stocker les informations nécessaires. Voici son schéma :

USE PUREFTPD_BDD;
CREATE TABLE users (
User varchar(16) NOT NULL default '',
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default '',
Uid varchar(11) NOT NULL default ’-1’,
Gid varchar(11) NOT NULL default ’-1’,
Dir varchar(128) NOT NULL default '',
ULBandwidth smallint(5) NOT NULL default '0',
DLBandwidth smallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
ipaccess varchar(15) NOT NULL default '*',
QuotaSize smallint(5) NOT NULL default '0',
QuotaFiles int(11) NOT NULL default 0,
PRIMARY KEY (User),
UNIQUE KEY User (User)
) ENGINE=MyISAM;

On crée une table utilisateur pour Pure-ftpd pour stocker les informations nécessaires.

Description des champs de la table :

  • User : c’est l’identifiant qui sera utilisé lors d’une connexion et en plus se sera la clé primaire de la table.
  • Status : 0 signifie que le compte est désactivé et ne peut pas se connecter au serveur.
  • Password : c’est le mot de passe affiché en clair. Aucune méthode de cryptage n’est appliqué !
  • Uid : c’est un entier qui permet d’identifier un compte utilisateur créer sur votre serveur Linux. J’ai mit le 33 en nombre par défaut car il s’agit de l’utilisateur “www-data” qui est automatiquement créer lorsque vous installez votre serveur Apache. Pour connaître le numéro des groupes, affichez le fichier /etc/passwd et cherchez une ligne ressemblant à “www-data:x:33:33:www-data:/var/www:/bin/sh“.
  • Gid : C’est le même principe que précédemment à savoir le groupe utilisateur qui sera associé aux fichiers lorsqu’une connexion FTP sera ouverte. Pour connaître les groupes utilisateurs vous pouvez soit chercher dans le fichier /etc/group ou alors vous les trouverez également comme dans le fichier précédent à savoir 33:33 où le premier nombre est le Uid et le second le Gid.
  • Dir : Il s’agit du chemin absolu vers lequel le client sera en mesure d’écrire. Veillez à ce qu’il est les droits en écriture dans ce dossier au moins. De plus lorsque vous indiquez le chemin dans votre requête SQL Insert, veuillez à bien faire comme ceci : /chemin/dossier/puis/nom/dossier/ avec le / marquant bien la fin du chemin sinon des erreurs surviendront lors de la connexion au serveur.
  • ULBandwidth : Ce paramètre exprimé en Ko/s permet de définir la bande passante maximale en Upload (transfert du client au serveur) pouvant être atteinte par le client. Si vous mettez 0, cela sera considéré comme n’ayant aucune limite.
  • DLBandwidth : Ce paramètre exprimé en Ko/s permet de définir la bande passante maximale en Download (transfert du serveur au client) pouvant être atteinte par le client. Si vous mettez 0, cela sera considéré comme n’ayant aucune limite.
  • Comment : c’est un libre ou l’on peut saisir des informations, remarques.
  • Ip-access : * signifie que toute IP peut accéder à ce serveur ftp, entrer une adresse IP spécifique peut seulement permettre à cette IP de se connecter au serveur  pour cet utilisateur;
  • QuotaSize : permet de fixer une limite pour le compte de l’utilisateur qu’il ne pourra dépasser. Cette limite est exprimé en Mo et pour informations, 1Go = 1024 Mo.
  • QuotaFiles : Le nombre de fichiers qu’un utilisateur peut sauvegarder, 0 signifie aucune limite.

Configuration du serveur Pure-ftpd

Les fichiers de configuration du serveur Pure-ftpd se trouvent dans le répertoire /etc/pure-ftpd/. Il existe une multitude d’options pour paramétrer votre serveur FTP.

J’ai fait une compilation des options les plus intéressantes. Je serais sûrement amené à ajouter d’autres options en fonction des besoins.

Connexion à la base de données

Le paramétrage s’effectue dans ce fichier /etc/pure-ftpd/db/mysql.conf

Voici un exemple de configuration  :

##Paramètres de connexion a la base de données
#Optional : define the location of mysql.sock if the server runs on this host.
MYSQLSocket      /var/run/mysqld/mysqld.sock
#Mandatory : user to bind the server as.
MYSQLUser       USER_MYSQL_A_CREER
#Mandatory : user password. You must have a password.
MYSQLPassword   MON_MOT_DE_PASSE
#Mandatory : database to open.
MYSQLDatabase   NOM_BASE_DE_DONNEES
#Mandatory : how passwords are stored
#Valid values are : "cleartext", "argon2", "scrypt", "crypt", "sha1", "md5", "password" and "any"
#(« password" = MySQL password() function, which is sha1(sha1(password)))
MYSQLCrypt      md5
#Requêtes SQL permettant a Pure-FTPd de trouver les données dans la base
#Query to execute in order to fetch the password
MYSQLGetPW      SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
#Query to execute in order to fetch the system user name or uid
MYSQLGetUID     SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
#Query to execute in order to fetch the system user group or gid
MYSQLGetGID     SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
#Query to execute in order to fetch the home directory
MYSQLGetDir     SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
#Optional : query to get the maximal number of files
#Pure-FTPd must have been compiled with virtual quotas support.
MySQLGetQTAFS   SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
#Optional : query to get the maximal disk usage (virtual quotas)
#The number should be in Megabytes.
#Pure-FTPd must have been compiled with virtual quotas support.
MySQLGetQTASZ   SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
#Optional : bandwidth throttling.
#The server has to be compiled with throttling support.
#Values are in KB/s .
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "" OR ipaccess LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "" OR ipaccess LIKE "\R")

Option de fichier de configuration de Pure-Ftp

Les options sont créées sous forme de fichier dans le répertoire /etc/pure-ftpd/conf/. Voici quelques options importantes à définir lors de la mise en place de votre serveur FTP.

#Suppression de l'authentification UNIX
echo no > /etc/pure-ftpd/conf/UnixAuthentication
#Création d'un fichier CreateHomeDir, pour la création automatique du répertoire
echo yes > /etc/pure-ftpd/conf/CreateHomeDir
#Mettre un umask sur les dossiers et fichiers
echo "133 022" > /etc/pure-ftpd/conf/Umask
#Chrooter les comptes FTP
echo yes > /etc/pure-ftpd/conf/ChrootEveryone
#Forcer l'affichage des fichiers cachés
echo yes > /etc/pure-ftpd/conf/DisplayDotFiles
#Modifier le minimum UID pour se connecter (par defaut 1000)
echo 33 > /etc/pure-ftpd/conf/MinUID
#Cela permettra à PureFTPd de ne pas chercher les noms d'hôtes, ce qui peut accélérer considérablement les connexions et réduire l'utilisation de la bande passante.
echo "yes" > /etc/pure-ftpd/conf/DontResolve
#Protection anti-warez. Permet de réagir face à un répertoire accessible en écriture. A utiliser que si vous autoriser les connexions anonymes.
echo "yes" >/etc/pure-ftpd/conf/AntiWarez
#Limiter le nombre d’utilisateur du FTP à XX personnes
echo "30" >/etc/pure-ftpd/conf/MaxClientsNumber
#Limiter le nombre de connexion pour la même IP
echo "5" >/etc/pure-ftpd/conf/MaxClientsPerIP
#Temps d’inactivité en minute
echo "15" >/etc/pure-ftpd/conf/MaxIdleTime
#Interdit à l’utilisateur d’utiliser les commandes CHMOD
echo "no" >/etc/pure-ftpd/conf/NoChmod
#Classe les flux Syslog (facility) en FTP
echo "ftp" >/etc/pure-ftpd/conf/SyslogFacility
#Mettre à no si on utilise l’authentification via MySQL. Autorise l’authentification par module PAM.
echo "no" >/etc/pure-ftpd/conf/PAMAuthentication

A la fin de la configuration des paramètres de Pure-Ftp, il est nécessaire de redémarrer le service.

service pure-ftpd-mysql restart

Remplir la base de données et tester

Pour alimenter la base de données, vous pouvez utiliser le shell MySQL, puis insérer votre premier utilisateur :

mysql -u root -p
USE PUREFTPD_BDD;
INSERT INTO users ( User , status , Password , Uid , Gid , Dir , ULBandwidth , DLBandwidth , comment , ipaccess , QuotaSize , QuotaFiles ) VALUES ('guillaume', '1', MD5('guillaume'), '2001', '2001', '/home/guillaume', '1000', '1000', '', '', '50', '0');

Maintenant, nous créons l’utilisateur guillaume avec le statut 1 (ce qui signifie que son compte ftp est actif), le mot de passe secret (qui sera stocké crypté en utilisant la fonction MD5 de MySQL), l’UID et le GID 2001 (utilisez l’userid et le groupid de l’utilisateur/groupe que vous avez créé lors de l’installation des paquets Pure-Ftp), le répertoire home /home/guillaume, une bande passante de 1000 KB/sec. (kilo-octets par seconde), et un quota de 50 Mo.

Remplir la base de données et tester

Ouvrez maintenant votre programme client FTP sur votre poste de travail et essayez de vous connecter.  Si vous parvenez à vous connecter, félicitations ! Sinon, quelque chose n’a pas fonctionné.

vous devriez voir que le répertoire /home/xxxx (le répertoire personnel de l’utilisateur d’exemple) a été automatiquement créé, et qu’il appartient à ftpuser et ftpgroup (l’utilisateur/groupe que nous avons créé au début du tutoriel) :

ls -l /home

Ouvrez maintenant votre programme client FTP sur votre poste de travail et essayez de vous connecter.  Si vous parvenez à vous connecter, félicitations ! Sinon, quelque chose n'a pas fonctionné.

Dépannages et astuces

Les fichiers de log

En cas de dysfonctionnement, vous pouvez regarder dans les fichiers suivants pour effectuer un premier diagnostic :

  • /var/log/syslog avec la commande tail -n 100 /var/log/syslog | grep ftp
  • /var/log/auth.log

Si vous souhaitez activer le mode debug de  de Pure-FTPd, vous devez activer cette option :

#Enable debug log in pure-ftpd
echo 'yes' > /etc/pure-ftpd/conf/VerboseLog

Suivre l’activité du serveur

Pour connaitre les utilisateurs de connectés, la commande pure-ftpwho fait le job. Dans la sortie on y trouve le PID, l’utilisateur, la durée, la vitesse, son action, le fichier et l’adresse IP de l’utilisateur.

Maintenant en complément de ce tutoriel, nous verrons comment créer une interface graphique en bootstrap pour gérer nos utilisateurs plus facilement. La suite au prochain numéro.

Si vous souhaitez plus de renseignements ou connaitre toutes les options disponibles, je vous conseille de visiter l’excellent site de Pure-FTPd.

Signature manuelle Guillaume

Laisser un commentaire

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