Hébergement FTP · 15 min read · Dec 24, 2025

Hébergement Virtuel Avec PureFTPd Et MySQL (Incl. Gestion Des Quotas Et De La Bande Passante) Sur CentOS 7.0

Ce document décrit comment installer un serveur PureFTPd qui utilise des utilisateurs virtuels à partir d’une base de données MySQL au lieu d’utilisateurs système réels. Cela est beaucoup plus performant et permet d’avoir des milliers d’utilisateurs FTP sur une seule machine. En plus de cela, je vais montrer l’utilisation des quotas et des limites de bande passante de téléchargement/téléversement avec cette configuration. Les mots de passe seront stockés de manière cryptée sous forme de chaînes MD5 dans la base de données.

Pour l’administration de la base de données MySQL, vous pouvez utiliser des outils basés sur le web comme phpMyAdmin qui seront également installés dans ce guide. phpMyAdmin est une interface graphique confortable, ce qui signifie que vous n’avez pas à vous embêter avec la ligne de commande.

Ce tutoriel est basé sur CentOS 7.0. Vous devriez déjà avoir configuré un système CentOS 7 minimal de base.

Ce guide est destiné à être un guide pratique ; il ne couvre pas les bases théoriques. Elles sont traitées dans de nombreux autres documents sur le web.

Ce document est fourni sans garantie d’aucune sorte ! Je tiens à dire que ce n’est pas la seule façon de configurer un tel système. Il existe de nombreuses façons d’atteindre cet objectif, mais c’est la méthode que j’utilise.

1 Remarque Préliminaire

Dans ce tutoriel, j’utilise le nom d’hôte server1.example.com avec l’adresse IP 192.168.0.100. Ces paramètres peuvent différer pour vous, donc vous devez les remplacer là où cela est approprié.

2 Installer MySQL Et phpMyAdmin

Tout d’abord, nous activons le dépôt EPEL sur notre système CentOS car certains paquets que nous allons installer au cours de ce tutoriel ne sont pas disponibles dans les dépôts officiels de CentOS 7.0 :

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Ensuite, nous activons le dépôt EPEL sur notre système CentOS car de nombreux paquets que nous allons installer au cours de ce tutoriel ne sont pas disponibles dans le dépôt officiel de CentOS 7 :

yum -y install epel-release
yum -y install yum-priorities

Éditez /etc/yum.repos.d/epel.repo…

nano /etc/yum.repos.d/epel.repo

… et ajoutez la ligne priority=10 à la section [epel] :

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]

Ensuite, nous mettons à jour nos paquets existants sur le système :

yum update

Maintenant, nous pouvons installer MySQL et phpMyAdmin comme suit :

yum install mariadb mariadb-server phpmyadmin httpd php

Maintenant, nous configurons phpMyAdmin. Nous modifions la configuration d’Apache afin que phpMyAdmin autorise les connexions non seulement depuis localhost (en commentant tout dans le bloc et en ajoutant la ligne Require all granted) :

vi /etc/httpd/conf.d/phpMyAdmin.conf

de sorte que le fichier ressemble à ceci :

# phpMyAdmin - Navigateur MySQL basé sur le web écrit en php
#
# N'autorise que localhost par défaut
#
# Mais autoriser phpMyAdmin à quiconque autre que localhost doit être considéré
# dangereux à moins d'être correctement sécurisé par SSL

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin


#  
#     # Apache 2.4
#     
#       Require ip 127.0.0.1
#       Require ip ::1
#     
#   
#   
#     # Apache 2.2
#     Order Deny,Allow
#    # Deny from All
#     Allow from 127.0.0.1
     Options Indexes
     AllowOverride None
     Require all granted
#     Allow from ::1
#   





   
     # Apache 2.4
     
       Require ip 127.0.0.1
       Require ip ::1
     
   
   
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   


# Ces répertoires ne nécessitent pas d'accès via HTTP - pris depuis le tarball original
# phpMyAdmin en amont
#

    Order Deny,Allow
    Deny from All
    Allow from None



    Order Deny,Allow
    Deny from All
    Allow from None



    Order Deny,Allow
    Deny from All
    Allow from None


# Cette configuration empêche mod_security dans les répertoires phpMyAdmin de
# filtrer SQL etc. Cela peut casser votre implémentation mod_security.
#
#
#    
#        SecRuleInheritance Off
#    
#

Ensuite, nous créons les liens de démarrage système pour MySQL et Apache (de sorte que les deux démarrent automatiquement chaque fois que le système démarre) et démarrons les deux services. De plus, les deux services doivent être autorisés par le pare-feu :

firebase-cmd --permanent --zone=public --add-service=http  
firebase-cmd --permanent --zone=public --add-service=https  
firebase-cmd --reload
systemctl enable mariadb.service  
systemctl start mariadb.service
systemctl enable httpd.service  
systemctl start httpd.service

Créez un mot de passe pour l’utilisateur MySQL root (remplacez yourmariadbpassword par le mot de passe que vous souhaitez utiliser) :

mysql_secure_installation

[root@server1 ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: ligne 379: find_mysql_client: commande introuvable

NOTE : L’EXÉCUTION DE TOUTES LES PARTIES DE CE SCRIPT EST RECOMMANDÉE POUR TOUS LES SERVEURS MariaDB EN UTILISATION PRODUCTION !  VEUILLEZ LIRE CHAQUE ÉTAPE ATTENTIVEMENT !

Pour se connecter à MariaDB pour le sécuriser, nous aurons besoin du mot de passe actuel pour l’utilisateur root.  Si vous venez d’installer MariaDB, et que vous n’avez pas encore défini le mot de passe root, le mot de passe sera vide, donc vous devriez juste appuyer sur entrer ici. <–ENTRER
Entrez le mot de passe actuel pour root (appuyez sur entrer pour aucun) : <–ENTRER
OK, mot de passe utilisé avec succès, passage à la suite…

Définir le mot de passe root ? [Y/n] <–ENTRER
Nouveau mot de passe : <–yourmariadbpassword
Ressaisissez le nouveau mot de passe : <–yourmariadbpassword
Mot de passe mis à jour avec succès !
Rechargement des tables de privilèges..
… Succès !

Par défaut, une installation de MariaDB a un utilisateur anonyme, permettant à quiconque de se connecter à MariaDB sans avoir à avoir un compte utilisateur créé pour eux.  Ceci est destiné uniquement à des fins de test, et pour rendre l’installation un peu plus fluide.  Vous devriez les supprimer avant de passer à un environnement de production.

Supprimer les utilisateurs anonymes ? [Y/n] <–ENTRER
… Succès !

Normalement, root ne devrait être autorisé à se connecter que depuis ‘localhost’.  Cela garantit que quelqu’un ne peut pas deviner le mot de passe root depuis le réseau.

Interdire la connexion root à distance ? [Y/n] <–ENTRER
… Succès !

Par défaut, MariaDB est livré avec une base de données nommée ‘test’ à laquelle quiconque peut accéder.  Ceci est également destiné uniquement à des fins de test, et devrait être supprimé avant de passer à un environnement de production.

Supprimer la base de données de test et l’accès à celle-ci ? [Y/n] <–ENTRER

  • Suppression de la base de données de test…
    … Succès !
  • Suppression des privilèges sur la base de données de test…
    … Succès !

Recharger les tables de privilèges garantira que tous les changements effectués jusqu’à présent prendront effet immédiatement.

Recharger les tables de privilèges maintenant ? [Y/n] <–ENTRER
… Succès !

Nettoyage…

Tout est fait !  Si vous avez complété toutes les étapes ci-dessus, votre installation de MariaDB devrait maintenant être sécurisée.

Merci d’utiliser MariaDB !
[root@server1 ~]#

3 Installer PureFTPd Avec Support MySQL

Le paquet PureFTPd de CentOS prend en charge divers backends, tels que MySQL, PostgreSQL, LDAP, etc. Par conséquent, tout ce que nous avons à faire est d’installer le paquet PureFTPd normal :

yum install pure-ftpd

Ensuite, nous créons un groupe ftp (ftpgroup) et un utilisateur (ftpuser) auxquels tous nos utilisateurs virtuels seront mappés. Remplacez le groupe et l’ID utilisateur 2001 par un numéro qui est libre sur votre système :

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

Le service ftp doit être autorisé par le firewall-cmd comme suit :

firebase-cmd --permanent --zone=public --add-service=ftp  
firebase-cmd --reload

4 Créer La Base De Données MySQL Pour PureFTPd

Maintenant, nous créons une base de données appelée pureftpd et un utilisateur MySQL nommé pureftpd que le démon PureFTPd utilisera plus tard pour se connecter à la base de données pureftpd :

mysql -u root -p
CREATE DATABASE pureftpd;  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';  
FLUSH PRIVILEGES;

Remplacez la chaîne ftpdpass par le mot de passe que vous souhaitez utiliser pour l’utilisateur MySQL pureftpd. Toujours dans le shell MySQL, nous créons la table de base de données dont nous avons besoin (oui, il n’y a qu’une seule table !) :

USE pureftpd;
CREATE TABLE ftpd (  
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;
quit;

Comme vous l’avez peut-être remarqué, avec la commande quit; nous avons quitté le shell MySQL et sommes de retour dans le shell Linux.

Au fait, (je suppose que le nom d’hôte de votre système de serveur ftp est server1.example.com) vous pouvez accéder à phpMyAdmin sous http://server1.example.com/phpMyAdmin/ (vous pouvez également utiliser l’adresse IP au lieu de server1.example.com) dans un navigateur et vous connecter en tant qu’utilisateur pureftpd. Ensuite, vous pouvez jeter un œil à la base de données. Plus tard, vous pouvez utiliser phpMyAdmin pour administrer votre serveur PureFTPd.

5 Configurer PureFTPd

Éditez /etc/pure-ftpd/pure-ftpd.conf et assurez-vous que les lignes ChrootEveryone, MySQLConfigFile et CreateHomeDir sont activées et ressemblent à ceci :

vi /etc/pure-ftpd/pure-ftpd.conf
[...]
ChrootEveryone              yes
[...]
MySQLConfigFile               /etc/pure-ftpd/pureftpd-mysql.conf
[...]
CreateHomeDir               yes
[...]

Le paramètre ChrootEveryone fera en sorte que PureFTPd chroot chaque utilisateur virtuel dans son répertoire personnel afin qu’il ne puisse pas parcourir les répertoires et fichiers en dehors de son répertoire personnel. La ligne CreateHomeDir fera en sorte que PureFTPd crée un répertoire personnel d’utilisateur lorsque l’utilisateur se connecte et que le répertoire personnel n’existe pas encore.

Ensuite, nous modifions /etc/pure-ftpd/pureftpd-mysql.conf. Il devrait ressembler à ceci :

cp /etc/pure-ftpd/pureftpd-mysql.conf /etc/pure-ftpd/pureftpd-mysql.conf_orig  
cat /dev/null > /etc/pure-ftpd/pureftpd-mysql.conf  
vi /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLSocket      /var/lib/mysql/mysql.sock
#MYSQLServer     localhost
#MYSQLPort       3306
MYSQLUser       pureftpd
MYSQLPassword   ftpdpass
MYSQLDatabase   pureftpd
#MYSQLCrypt md5, cleartext, crypt() ou password() - md5 est TRÈS RECOMMANDÉ par rapport au cleartext
MYSQLCrypt      md5
MYSQLGetPW      SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetUID     SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetGID     SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetDir     SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
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")
MySQLGetQTASZ   SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTAFS   SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")

Assurez-vous de remplacer la chaîne ftpdpass par le vrai mot de passe pour l’utilisateur MySQL pureftpd dans la ligne MYSQLPassword ! Veuillez noter que nous utilisons md5 comme méthode MYSQLCrypt, ce qui signifie que nous stockerons les mots de passe des utilisateurs sous forme de chaîne MD5 dans la base de données, ce qui est beaucoup plus sécurisé que d’utiliser des mots de passe en texte clair !

Maintenant, nous créons les liens de démarrage système pour PureFTPd et le démarrons :

systemctl enable pure-ftpd.service  
systemctl start pure-ftpd.service

6 Peupler La Base De Données Et Tester

Pour peupler la base de données, vous pouvez utiliser le shell MySQL :

mysql -u root -p
USE pureftpd;

Maintenant, nous créons l’utilisateur exampleuser avec le statut 1 (ce qui signifie que son compte ftp est actif), le mot de passe secret (qui sera stocké de manière cryptée en utilisant la fonction MD5 de MySQL), l’UID et le GID 2001 (utilisez l’ID utilisateur et l’ID de groupe de l’utilisateur/groupe que vous avez créé à la fin de l’étape deux !), le répertoire personnel /home/www.example.com, une bande passante de téléversement et de téléchargement de 100 Ko/s (kilooctets par seconde), et un quota de 50 Mo :

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/www.example.com', '100', '100', '', '*', '50', '0');
quit;

Maintenant, ouvrez votre programme client FTP sur votre station de travail (quelque chose comme WS_FTP ou SmartFTP si vous êtes sur un système Windows ou gFTP sur un bureau Linux) et essayez de vous connecter. Comme nom d’hôte, vous utilisez server1.example.com (ou l’adresse IP du système), le nom d’utilisateur est exampleuser, et le mot de passe est secret.

Si vous parvenez à vous connecter - félicitations ! Sinon, quelque chose a mal tourné.

Maintenant, si vous exécutez

ls -l /home

vous devriez voir que le répertoire /home/www.example.com (répertoire personnel de exampleuser) a été créé automatiquement, et qu’il est possédé par ftpuser et ftpgroup (l’utilisateur/groupe que nous avons créé à la fin de l’étape deux) :

[root@server1 ~]# ls -l /home/  
total 0  
drwx------. 2 administrator administrator 59 Sep 26 10:35 administrator  
drwxr-xr-x. 2 ftpuser       ftpgroup      22 Sep 26 12:07 www.example.com  
[root@server1 ~]#

7 Administration De La Base De Données

Pour la plupart des gens, il est plus facile d’avoir une interface graphique pour MySQL ; par conséquent, vous pouvez également utiliser phpMyAdmin (dans cet exemple sous http://server1.example.com/phpMyAdmin/) pour administrer la base de données pureftpd.

Interface PHPMyAdmin.

Chaque fois que vous souhaitez créer un nouvel utilisateur, vous devez créer une entrée dans la table ftpd, donc je vais expliquer les colonnes de cette table ici :

Table ftpd :

  • User : Le nom de l’utilisateur virtuel PureFTPd (par exemple, exampleuser).
  • status : 0 ou 1. 0 signifie que le compte est désactivé, l’utilisateur ne peut pas se connecter.
  • Password : Le mot de passe de l’utilisateur virtuel. Assurez-vous d’utiliser la fonction MD5 de MySQL pour enregistrer le mot de passe crypté sous forme de chaîne MD5 :
    La table ftpd.
  • UID : L’ID utilisateur de l’utilisateur ftp que vous avez créé à la fin de l’étape deux (par exemple, 2001).
  • GID : L’ID de groupe du groupe ftp que vous avez créé à la fin de l’étape deux (par exemple, 2001).
  • Dir : Le répertoire personnel de l’utilisateur virtuel PureFTPd (par exemple, /home/www.example.com). S’il n’existe pas, il sera créé lorsque le nouvel utilisateur se connectera pour la première fois via FTP. L’utilisateur virtuel sera enfermé dans ce répertoire personnel, c’est-à-dire qu’il ne peut pas accéder à d’autres répertoires en dehors de son répertoire personnel.
  • ULBandwidth : Bande passante de téléversement de l’utilisateur virtuel en Ko/s (kilooctets par seconde). 0 signifie illimité.
  • DLBandwidth : Bande passante de téléchargement de l’utilisateur virtuel en Ko/s (kilooctets par seconde). 0 signifie illimité.
  • comment : Vous pouvez entrer n’importe quel commentaire ici (par exemple, pour votre administration interne) ici. Normalement, vous laissez ce champ vide.
  • ipaccess : Entrez ici les adresses IP qui sont autorisées à se connecter à ce compte FTP. * signifie que n’importe quelle adresse IP est autorisée à se connecter.
  • QuotaSize : Espace de stockage en Mo (pas Ko, comme dans ULBandwidth et DLBandwidth !) que l’utilisateur virtuel est autorisé à utiliser sur le serveur FTP. 0 signifie illimité.
  • QuotaFiles : nombre de fichiers que l’utilisateur virtuel est autorisé à enregistrer sur le serveur FTP. 0 signifie illimité.

8 FTP Anonyme

Si vous souhaitez créer un compte ftp anonyme (un compte ftp auquel tout le monde peut se connecter sans mot de passe), vous avez besoin d’un utilisateur et d’un groupe appelés ftp. Les deux ont été créés automatiquement lorsque vous avez installé le paquet pure-ftpd, donc vous n’avez pas besoin de les créer manuellement. Cependant, le répertoire personnel de ftp est /var/ftp par défaut, mais j’aimerais créer le répertoire ftp anonyme dans /home/ftp (les répertoires ftp des utilisateurs normaux sont également dans /home, par exemple /home/www.example.com). Mais bien sûr, vous pouvez utiliser le répertoire /var/ftp pour ftp anonyme, si vous le préférez.

Si vous souhaitez utiliser /home/ftp, ouvrez /etc/passwd et changez le répertoire personnel de l’utilisateur ftp de /var/ftp à /home/ftp (ne faites pas cela si vous souhaitez utiliser /var/ftp) :

vi /etc/passwd
[...]
#ftp:x:14:50:Utilisateur FTP:/var/ftp:/sbin/nologin
ftp:x:14:50:Utilisateur FTP:/home/ftp:/sbin/nologin
[...]

Ensuite, déplacez /var/ftp vers /home (ne faites pas cela si vous souhaitez utiliser /var/ftp) :

mv /var/ftp /home

Ensuite, nous créons le répertoire /home/ftp/incoming qui permettra aux utilisateurs anonymes de téléverser des fichiers. Nous donnerons au répertoire /home/ftp/incoming des permissions de 311 afin que les utilisateurs puissent téléverser, mais ne puissent pas voir ou télécharger de fichiers dans ce répertoire. Le répertoire /home/ftp aura des permissions de 555 qui permettent de voir et de télécharger des fichiers :

chown ftp:nobody /home/ftp  
cd /home/ftp  
mkdir incoming  
chown ftp:nobody incoming/  
chmod 311 incoming/  
cd ../  
chmod 555 ftp/

(Si vous souhaitez utiliser /var/ftp à la place, remplacez /home/ftp par /var/ftp dans les commandes ci-dessus.)

Les utilisateurs anonymes pourront se connecter, et ils seront autorisés à télécharger des fichiers depuis /home/ftp, mais les téléversements seront limités à /home/ftp/incoming (et une fois qu’un fichier est téléversé dans /home/ftp/incoming, il ne peut pas être lu ni téléchargé depuis là ; l’administrateur du serveur doit le déplacer dans /home/ftp d’abord pour le rendre disponible aux autres).

Maintenant, nous devons configurer PureFTPd pour ftp anonyme. Ouvrez /etc/pure-ftpd/pure-ftpd.conf et assurez-vous que vous avez les paramètres suivants dans celui-ci :

vi /etc/pure-ftpd/pure-ftpd.conf
[...]
NoAnonymous                 no
[...]
AntiWarez                   no
[...]
AnonymousBandwidth            8
[...]
AnonymousCantUpload         no
[...]

(Le paramètre AnonymousBandwidth est optionnel - il vous permet de limiter les bandes passantes de téléversement et de téléchargement pour les utilisateurs anonymes. 8 signifie 8 Ko/s. Utilisez n’importe quelle valeur que vous aimez, ou commentez la ligne si vous ne souhaitez pas limiter les bandes passantes.)

Enfin, nous redémarrons PureFTPd :

systemctl restart pure-ftpd.service

9 Liens

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.