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-releaseyum -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 updateMaintenant, nous pouvons installer MySQL et phpMyAdmin comme suit :
yum install mariadb mariadb-server phpmyadmin httpd phpMaintenant, 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
vi /etc/httpd/conf.d/phpMyAdmin.confde 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 --reloadsystemctl enable mariadb.service
systemctl start mariadb.servicesystemctl enable httpd.service
systemctl start httpd.serviceCré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-ftpdEnsuite, 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 ftpuserLe service ftp doit être autorisé par le firewall-cmd comme suit :
firebase-cmd --permanent --zone=public --add-service=ftp
firebase-cmd --reload4 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 -pCREATE 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.confMYSQLSocket /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.service6 Peupler La Base De Données Et Tester
Pour peupler la base de données, vous pouvez utiliser le shell MySQL :
mysql -u root -pUSE 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 /homevous 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.

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 :

- 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 /homeEnsuite, 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.service9 Liens
- PureFTPd : http://www.pureftpd.org/
- MySQL : http://www.mysql.com/
- phpMyAdmin : http://www.phpmyadmin.net/
- CentOS : http://centos.org/
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.