Table des matières

, , ,

Attention ! Ce tutoriel ne fonctionne que pour les versions inférieures à 1.2.0 de proftpd, donc ne fonctionnera pas avec la version actuellement disponible dans les dépôts universe.

ProFTPd et MySQL et TLS SSL

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.

La procédure traitée sur cette page considère qu'une solution LAMP a déjà été installé sur votre machine. Pour l'installation d'une solution LAMP, suivez ce tutorial

Cette procédure installera sur votre machine :

Installation

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

le paquet se nomme proftpd-mod-mysql sur débian.

A la question “Lancer ProFTPd à partir d'inetd ou indépendamment ?”, répondez indépendamment, à moins de savoir ce que vous faites en choisissant inetd.

Pour l'utilisation de ProFTPd avec MySQL, je vous déconseille d'installer et d'utiliser l'interface graphique gproftpd. Sauf si vous voulez avoir un fichier de configuration compromis.

Configuration

La base de données 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;

Si votre serveur MySQL n'est pas sur la même machine que ProFTPd, remplacez localhost par le nom de la machine (du serveur MySQL) ou par *

Les droits “USAGE” suffisent au fonctionnement, cependant si vous souhaitez administrer les comptes en vous identifiant sur la base de données en tant que proftpd, il vous faut lui donner les droits de modifier les tables:

GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Le serveur FTP ProFTPd

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

Utilisation

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.

Gestion des utilisateurs

Ajout d'un utilisateur

Avec la configuration présente ici seul les uid et gid supérieurs à 1000 fonctionnent.

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.

Suppression d'un utilisateur

Voici un exemple pour supprimer l'utilisateur test créée précédemment.

DELETE FROM `ftpuser` WHERE `userid`='test';

Gestion des groupes

Affecter un utilisateur à un groupe

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');

Enlever un utilisateur d'un groupe

On reprend l'exemple ci dessus en enlevant l'utilisateur test du groupe group_test.

DELETE FROM `ftpgroup` WHERE `members`='test';

Gestion des quotas

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.

Ajouter une règle de quota

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');

Pour définir un quota illimité à un des champs, mettez une valeur négative ou nulle.

Les quotas de type all, class ou group ne définissent pas un quota pour chaque utilisateur mais un quota partagé par tous les utilisateurs concernés par cette règle.

Réinitialiser les quotas

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`;

Pour ceux ayant des problèmes pour l'utilisation des quotas

Chargement du module mod_quotatab_sql.c

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

Problème d'unités

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

Ajouter TLS SSL

Proftpd TLS & SSL

Références


Contributeur : Fengy

Basé sur « ProFTPD, MySQL et Quota » par lea-linux.org