Cette page n'a pas encore d'étiquettes.
Apportez votre aide…

Ceci est une ancienne révision du document !



ProFTPd et MySQL

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 :

  • proftpd
  • proftpd-mysql

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

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.

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`)
) TYPE=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'
) TYPE=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'
) TYPE=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`)
) TYPE=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.localhost 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 *

Remarque sur cette dernière opération :

Lors de la création du nouvel utilisateur (ex: proftpd) une erreur s'est glissée dans la requête SQL.

Il faut remplacer "localhost" par "*" après la requète GRANT USAGE ON proftpd.localhost. En effet, l'astérisque permet de séléctionner toute les tables de la base de donnée proftpd.

Voici ci-dessous la version corrigée:

GRANT USAGE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Il semble qu'une autre erreur s'est glissée dans cette requête SQL. En effet, si on laisse uniquement le privilège USAGE, alors l'utilisateur proftpd ne pourra jamais mettre à jour les tables (gestion des compteurs), ni même faire le moindre SELECT. La version corrigée donne ceci:

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 est RequireValidShells et non RequireValidShell, il faut juste laisser commenter "RequireValidShells off" et rajouter "RequireValidShell off"

<IfModule mod_sql.c>
 SQLBackend            mysql
</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
SQLHomedirOnDemand 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

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.

Gestion des utilisateurs

Ajout d'un utilisateur

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 connection 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');
  • NOM : Nom de l'utilisateur, du groupe ou de la règle selon la valeur de TYPE.
  • TYPE : user si le quota s'applique à un utilisateur, group à un groupe, class à une classe (ici inutile), all à tous les utilisateurs.
  • SESSION : true si les quotas doivent être remis à zéro à chaque nouvelle session, false sinon. ('false' est conseillé).
  • LIMIT_TYPE : soft pour une mesure logicielle de la taille, hard pour une mesure hardware.
  • B_UP : Taille (en Mbytes) autorisé à être transféré sur le serveur.
  • B_DOWN : Taille (en Mbytes) autorisé à être téléchargé à partir du serveur.
  • B_TRANS : Taille (en Mbytes) autorisé à transféré sur et à partir du serveur (upload+download).
  • F_UP : Nombre de fichiers autorisé à être transféré sur le serveur.
  • F_DOWN : Nombre de fichiers autorisé à être téléchargé à partir du serveur.
  • F_TRANS : Nombre de fichiers autorisé à transféré sur et à partir du serveur (upload+download).
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é. 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`;

Allez dans le dossier de configuration proftpd

cd /etc/proftpd/

créé le dossier ssl

mkdir ssl

on ce déplace dedans

cd ssl/

on vas générer le certificat ssl

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out proftpd-rsa.pem -keyout proftpd-key.pem

on protège la key

chmod 440 proftpd-key.pem

on edite le fichier /etc/proftpd/proftpd.conf avec sont éditeur préférer pour rajouter cela a la fin du fichier

TLSEngine                     on

TLSRequired                             on

TLSRSACertificateFile               /etc/proftpd/ssl/proftpd-rsa.pem

TLSRSACertificateKeyFile       /etc/proftpd/ssl/proftpd-key.pem

TLSLog                                    /var/log/proftpd/tls.log

on cherche dans le fichier ceci

<IfModule mod_tls.c>
TLSEngine off
</IfModule>

et on le modifie comme cela

<IfModule mod_tls.c>
TLSEngine on
</IfModule>

on enregistre on ferme le fichier

et on restart proftpd

sudo /etc/init.d/proftpd restart

plus cas essayer

  • proftpd_et_mysql.1222173829.txt.gz
  • Dernière modification: Le 18/04/2011, 14:45
  • (modification externe)