Cette page traite la procédure à suivre pour installer un serveur FTP en utilisant ProFTPd avec la gestion des quotas et des utilisateurs par la base de données MySQL.
Le fait d'utiliser l'authentification de ProFTPd par base de données vous permet, par exemple, de faire une page PHP de configuration ou d'administrer facilement vos comptes FTP via l'interface Web de PhpMyAdmin.
Cette procédure installera sur votre machine :
Pour installer le serveur FTP avec le support de MySQL, vérifiez d'abord que vos dépôts Universe sont bien activés.
Et ensuite, installez les paquets proftpd proftpd-mysql
Je considère ici que la base de données utilisée pour ProFTPd s'appelle proftpd et que le nouvel utilisateur se nommera proftpd avec comme mot de passe password. Cependant les trois valeurs peuvent être modifiées selon votre choix.
Ensuite, il faut créer la base de données et les tables utiles pour la gestion des utilisateurs et des quotas. Pour cela, connectez vous à votre serveur MySQL (soit par ligne de commande ou par PhpMyAdmin pour ceux qui ont du mal avec SQL) et insérez ces lignes :
CREATE DATABASE `proftpd`; USE proftpd; -- -- Table structure for table `ftpgroup` -- 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 des groupes ProFTPD'; -- -- Table structure for table `ftpquotalimits` -- CREATE TABLE `ftpquotalimits` ( `name` VARCHAR(30) DEFAULT NULL, `quota_type` enum('user','group','class','all') NOT NULL DEFAULT 'user', `par_session` enum('false','true') NOT NULL DEFAULT 'false', `limit_type` enum('soft','hard') NOT NULL DEFAULT 'soft', `bytes_up_limit` FLOAT NOT NULL DEFAULT '0', `bytes_down_limit` FLOAT NOT NULL DEFAULT '0', `bytes_transfer_limit` FLOAT NOT NULL DEFAULT '0', `files_up_limit` INT(10) UNSIGNED NOT NULL DEFAULT '0', `files_down_limit` INT(10) UNSIGNED NOT NULL DEFAULT '0', `files_transfer_limit` INT(10) UNSIGNED NOT NULL DEFAULT '0' ) Engine=MyISAM COMMENT='Table des quotas ProFTPD'; -- -- Table structure for table `ftpquotatotal` -- CREATE TABLE `ftpquotatotal` ( `name` VARCHAR(30) NOT NULL DEFAULT '', `quota_type` enum('user','group','class','all') NOT NULL DEFAULT 'user', `bytes_up_total` FLOAT NOT NULL DEFAULT '0', `bytes_down_total` FLOAT NOT NULL DEFAULT '0', `bytes_transfer_total` FLOAT NOT NULL DEFAULT '0', `files_up_total` INT(10) UNSIGNED NOT NULL DEFAULT '0', `files_down_total` INT(10) UNSIGNED NOT NULL DEFAULT '0', `files_transfer_total` INT(10) UNSIGNED NOT NULL DEFAULT '0' ) Engine=MyISAM COMMENT='Table des compteurs des quotas ProFTPD'; -- -- Table structure for table `ftpuser` -- 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 '/bin/false', `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', `LoginAllowed` enum('true','false') NOT NULL DEFAULT 'true', PRIMARY KEY (`id`) ) Engine=MyISAM COMMENT='Table des utlisateurs ProFTPD';
Finalement, il ne reste plus qu'à créer un nouvel utilisateur possédant seulement les droits de lire les données de la base proftpd.
Pour cela, utilisez cette commandes dans votre serveur MySQL.
GRANT USAGE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
On passe maintenant à la configuration de ProFTPd. Pour cela, on édite le fichier de configuration de ProFTPd :
Éditez le fichier /etc/proftpd/proftpd.conf
Ensuite, trouvez et décommentez les lignes suivantes (en retirant les # au début de chaque ligne) :
DefaultRoot ~
RequireValidShell off
Attention dans le fichier /etc/proftpd/proftpd.conf, la valeur doit être RequireValidShell et non RequireValidShells, il faut donc laisser commenté “RequireValidShells off” et rajouter “RequireValidShell off”
<IfModule mod_sql.c> SQLBackend mysql </IfModule>
————————- Avec Quota engine sur on ca fonctionne mieux
<IfModule mod_quotatab.c> QuotaEngine on </IfModule>
On rajoute ces lignes à la fin du fichier tout en faisant attention de modifier le nom et le mot de passe de l'utilisateur MySQL dans la troisième ligne. # Mod MySQL # ========= # Les mots de passe sont cryptes dans la base avec la fonction ENCRYPT (MySQL) SQLAuthTypes Crypt SQLAuthenticate users* groups* # Modifiez cette ligne selon l'utilisateur et le mot de passe definit plutot SQLConnectInfo proftpd@localhost proftpd password # On donne a ProFTPd le nom des colonnes de la table usertable SQLUserInfo ftpuser userid passwd uid gid homedir shell SQLUserWhereClause "LoginAllowed = 'true'" # On donne a ProFTPd le nom des colonnes de la table "grouptable" SQLGroupInfo ftpgroup groupname gid members # Creer le repertoire home de l'utilisateur si il n'existe pas CreateHome on # Met a jour les compteurs a chaque connection d'un utilisateur SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Met a jour les compteurs a chaque upload ou download d'un utilisateur SQLLog STOR,RETR modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # Mod quota # ========= QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on # Definit les requetes SQL pour que ProFTPd recupere les infos sur les quotas SQLNamedQuery get-quota-limit SELECT "name, quota_type, par_session, limit_type, bytes_up_limit, bytes_down_limit, bytes_transfer_limit, files_up_limit, files_down_limit, files_transfer_limit FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_up_total, bytes_down_total, bytes_transfer_total, files_up_total, files_down_total, files_transfer_total FROM ftpquotatotal WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_up_total = bytes_up_total + %{0}, bytes_down_total = bytes_down_total + %{1}, bytes_transfer_total = bytes_transfer_total + %{2}, files_up_total = files_up_total + %{3}, files_down_total = files_down_total + %{4}, files_transfer_total = files_transfer_total + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatotal SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatotal QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally # Gestion des logs # ================ # Enregistre les requetes SQL dans /var/log/proftpd/mysql.log SQLLogFile /var/log/proftpd/mysql.log # Enregistre les authentifications LogFormat auth "%v [%P] %h %t \"%r\" %s" ExtendedLog /var/log/proftpd/auth.log AUTH auth # Enregistre les acces aux fichiers LogFormat write "%h %l %u %t \"%r\" %s %b" ExtendedLog /var/log/proftpd/access.log WRITE,READ write
Ensuite, trouvez et décommentez les lignes suivantes dans modules.conf (en retirant les # au début de chaque ligne) :
LoadModule mod_sql.c LoadModule mod_sql_mysql.c
Et Finalement, on redemarre le serveur FTP.
sudo /etc/init.d/proftpd restart
Maintenant que la configuration est faite, nous allons voir comment gérer les utilisateurs à travers la base de données.
Je vous conseille d'utiliser PhpMyAdmin pour ceux qui ne connaissent pas le langage SQL.
Voici un exemple de la création de l'utilisateur test avec un mot de passe pwd. Cet utilisateur aura accès au repertoire /home/ftp/test avec les droits de l'utilisateur (UID) 5500, et de groupe (GID) 5500, sans shell (/bin/false).
La valeur 'LoginAllowed' est mise à true pour autoriser la connexion de cet utilisateur, à false pour l'interdire.
INSERT INTO `ftpuser` ( `id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed` , `modified`, `LoginAllowed` ) VALUES ('', 'test', ENCRYPT('pwd'), '5500', '5500', '/home/ftp/test', '/bin/false', '', '', '', 'true' );
count représente le nombre d'authentifications effectués par cet utilisateur.
accessed représente la date du dernier accès.
modified représente la date de la dernière écriture.
Voici un exemple pour supprimer l'utilisateur test créée précédemment.
DELETE FROM `ftpuser` WHERE `userid`='test';
Voici un exemple pour affecter l'utilisateur test au groupe group_test avec les droits de groupe (GID) du groupe 5500.
INSERT INTO `ftpgroup` ( `groupname` , `gid` , `members` ) VALUES ('group_test', '5500', 'test');
On reprend l'exemple ci dessus en enlevant l'utilisateur test du groupe group_test.
DELETE FROM `ftpgroup` WHERE `members`='test';
La table ftpquotalimits contient la description des quotas.
La table ftpquotatotal contient les statistiques d'utilisation correspondant aux règles des quotas défini dans la table ftpquotalimits. Cette table permet à ProFTPd de gérer les quotas.
On exécute la requête suivante :
INSERT INTO `ftpquotalimits` ( `name`, `quota_type`, `par_session`, `limit_type`, `bytes_up_limit`, `bytes_down_limit`, `bytes_transfer_limit`, `files_up_limit`, `files_down_limit`, `files_transfer_limit` ) VALUES ( 'NOM' , 'TYPE', 'SESSION', 'LIMIT_TYPE', 'B_UP', 'B_DOWN', 'B_TRANS', 'F_UP', 'F_DOWN', 'F_TRANS');
Il suffit de supprimer l'entrée correspondante à la règle devant être réinitialisée. Par exemple si on veut effacer les règles de quota de l'utilisateur test, on exécute la requête SQL suivante :
DELETE FROM `ftpquotatotal` WHERE `name`='test';
Si vous voulez réinitialiser tous les quotas, par exemple tous les mois, faites une tâche cron se connectant sur le serveur et exécutant la requête suivante :
TRUNCATE TABLE `ftpquotatotal`;
Apparemment, plusieurs personnes ont du mal avec les quotas, certains n'arrivant pas à l'utiliser.
Premièrement, vérifiez que le module est bien chargé. Pour ce faire, il faut éditer le fichier /etc/proftpd/modules.conf
Il faut rechercher cette ligne …
#LoadModule mod_quotatab_sql.c
… et la dé-commenter pour obtenir ceci :
LoadModule mod_quotatab_sql.c
Si vous ne l'aviez pas, rajoutez-la .
Et Finalement, on redemarre le serveur FTP.
sudo /etc/init.d/proftpd restart
Il semblerait que certains problème d'unités existent. Chez certaines personnes la valeur à entrer dans les champs des limites de quota doivent être exprimées en octets et non en Mo … Ce qui fait que,par exemple, pour une limite de 100 Mo, il se peut que vous aillez à inscrire la valeur 104857600 (qui correspond au nombre exact d'octets compris dans 100 Mo)
Pour convertir, faites : nombre de Mo multiplié par 1048576
Contributeur : Fengy
Basé sur « ProFTPD, MySQL et Quota » par lea-linux.org