Serveur FTP · 7 min read · Jan 31, 2026
Hébergement Virtuel Avec Proftpd Et MySQL (Incl. Quota) Sur Ubuntu 14.04LTS
Ce document décrit comment installer un serveur Proftpd 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 de quotas avec cette configuration. Ce tutoriel est basé sur Ubuntu 14.04LTS.
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 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 je choisis. Je ne donne aucune garantie que cela fonctionnera pour vous !
1 Note 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é.
Assurez-vous que vous êtes connecté en tant que root :
sudo su1.1 Changer Le Shell Par Défaut
/bin/sh est un lien symbolique vers /bin/dash, cependant nous avons besoin de /bin/bash, pas de /bin/dash. Par conséquent, nous faisons ceci :
dpkg-reconfigure dashInstaller dash comme /bin/sh ? <– Non
1.2 Désactiver AppArmor
AppArmor est une extension de sécurité (similaire à SELinux) qui devrait fournir une sécurité étendue. À mon avis, vous n’en avez pas besoin pour configurer un système sécurisé, et cela cause généralement plus de problèmes que d’avantages (pensez-y après avoir passé une semaine à résoudre des problèmes parce qu’un service ne fonctionnait pas comme prévu, et ensuite vous découvrez que tout allait bien, seul AppArmor causait le problème). Par conséquent, je le désactive.
Nous pouvons le désactiver comme ceci :
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils2 Installer MySQL Et phpMyAdmin
Tout cela peut être installé avec une seule commande :
apt-get install mysql-server mysql-client phpmyadmin apache2Vous serez invité à fournir un mot de passe pour l’utilisateur root de MySQL - ce mot de passe est valide pour l’utilisateur root@localhost ainsi que [email protected], donc nous n’avons pas besoin de spécifier un mot de passe root MySQL manuellement plus tard :
Nouveau mot de passe pour l’utilisateur MySQL “root” : <– votremotdepassemysql
Répétez le mot de passe pour l’utilisateur MySQL “root” : <– votremotdepassemysql
En plus de cela, vous verrez les questions suivantes :
Serveur web à reconfigurer automatiquement : <– apache2
Configurer la base de données pour phpmyadmin avec dbconfig-common ? <– Non
3 Installer Proftpd Avec Support MySQL
Pour Ubuntu, il existe un package proftpd-mod-mysql préconfiguré disponible. Installez-le en tant que démon autonome comme ceci :
apt-get install proftpd-mod-mysqlVous serez invité à répondre à la question suivante :
Exécuter proftpd : <– autonome
Ensuite, nous créons un groupe ftp (ftpgroup) et un utilisateur (ftpuser) auxquels tous nos utilisateurs virtuels seront mappés. Remplacez l’identifiant de groupe et d’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 proftpd" -g ftpgroup ftpuser4 Créer La Base De Données MySQL Pour Proftpd
Maintenant, nous créons une base de données appelée ftp et un utilisateur MySQL nommé proftpd que le démon proftpd utilisera plus tard pour se connecter à la base de données ftp :
mysql -u root -pCREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;Remplacez la chaîne password par le mot de passe que vous souhaitez utiliser pour l’utilisateur MySQL proftpd. Toujours dans le shell MySQL, nous créons les tables de base de données dont nous avons besoin :
USE ftp;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT='Table de groupe ProFTP';
CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum('user','group','class','all') NOT NULL default 'user',
per_session enum('false','true') NOT NULL default 'false',
limit_type enum('soft','hard') NOT NULL default 'soft',
bytes_in_avail bigint(20) unsigned NOT NULL default '0',
bytes_out_avail bigint(20) unsigned NOT NULL default '0',
bytes_xfer_avail bigint(20) unsigned NOT NULL default '0',
files_in_avail int(10) unsigned NOT NULL default '0',
files_out_avail int(10) unsigned NOT NULL default '0',
files_xfer_avail int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used bigint(20) unsigned NOT NULL default '0',
bytes_out_used bigint(20) unsigned NOT NULL default '0',
bytes_xfer_used bigint(20) unsigned NOT NULL default '0',
files_in_used int(10) unsigned NOT NULL default '0',
files_out_used int(10) unsigned NOT NULL default '0',
files_xfer_used int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '5500',
gid smallint(6) NOT NULL default '5500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) ENGINE=MyISAM COMMENT='Table utilisateur ProFTP';
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 utiliser l’adresse IP au lieu de server1.example.com) dans un navigateur et vous connecter en tant que proftpd. Ensuite, vous pouvez jeter un œil à la base de données. Plus tard, vous pouvez utiliser phpMyAdmin pour gérer votre serveur Proftpd.
5 Configurer Proftpd
Ouvrez /etc/proftpd/modules.conf…
vi /etc/proftpd/modules.conf… et activez les trois modules suivants :
| [...] # Installez l'un des proftpd-mod-mysql, proftpd-mod-pgsql ou tout autre # moteur de backend SQL pour utiliser ce module et le backend requis. # Ce module doit être chargé de manière obligatoire avant l'un des # backends SQL existants. LoadModule mod_sql.c [...] # Installez proftpd-mod-mysql et décommentez le précédent # module mod_sql.c pour l'utiliser. LoadModule mod_sql_mysql.c [...] # Installez l'un des backends SQL précédents et décommentez # le précédent module mod_sql.c pour l'utiliser LoadModule mod_quotatab_sql.c [...] |
Ensuite, ouvrez /etc/proftpd/proftpd.conf et commentez les lignes suivantes :
vi /etc/proftpd/proftpd.conf| [...] # |
Plus bas dans le fichier, ajoutez les lignes suivantes :
| [...] # # Cadres d'authentification alternatifs # #Include /etc/proftpd/ldap.conf #Include /etc/proftpd/sql.conf DefaultRoot ~ SQLBackend mysql # Les mots de passe dans MySQL sont cryptés en utilisant CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # utilisé pour se connecter à la base de données # nomdelabasededonnées@hôte utilisateur_de_base_de_données mot_de_passe_utilisateur SQLConnectInfo ftp@localhost proftpd password # Ici, nous disons à ProFTPd les noms des colonnes de la base de données dans la "usertable" # avec lesquelles nous voulons qu'il interagisse. Faites correspondre les noms avec ceux de la base de données SQLUserInfo ftpuser userid passwd uid gid homedir shell # Ici, nous disons à ProFTPd les noms des colonnes de la base de données dans la "grouptable" # avec lesquelles nous voulons qu'il interagisse. Encore une fois, les noms correspondent à ceux de la base de données SQLGroupInfo ftpgroup groupname gid members # définir l'UID et le GID min - sinon, ce sont 999 chacun SQLMinID 500 # créer le répertoire personnel d'un utilisateur à la demande s'il n'existe pas CreateHome on # Mettre à jour le compte chaque fois que l'utilisateur se connecte SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Mettre à jour modifié chaque fois que l'utilisateur télécharge ou supprime un fichier SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # Quotas d'utilisateur # =========== QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off [...] |
Assurez-vous de remplacer la chaîne password par le vrai mot de passe pour l’utilisateur MySQL proftpd dans la ligne SQLConnectInfo !
Ensuite, redémarrez Proftpd :
/etc/init.d/proftpd restartRecevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.