ProFTPD Quota Mysql
>>> Debian 8.6 & ProFTPD
Version PDF

Cet article fait suite à l’article 320 "ProFTPD". Dans cet article vous allez apprendre à configurer ProFTPD et MySQL pour gérer une base d’utilisateurs virtuels. Puis dans un second temps, vous découvrirez comment mettre en place des quotas gérer par MySQL.


Sommaire :

I) Introduction
II) Installation
III) Configuration de ProFTPD
1) Configuration de proftpd.conf
2) Configuration de modules.conf
IV) Configuration de la base de données
1) Création de ftpgroup et ftpuser
2) Création de la BDD MySQL pour ProFTPD
V) Configuration de ProFTPD - SUITE
1) Configuration de sql.conf
VI) Gestion des utilisateurs et des groupes virtuels
1) Ajout d’un utilisateur
2) Suppression d’un utilisateur
3) Affecter un utilisateur à un groupe
4) Enlever un utilisateur d’un groupe
5) Supprimer un groupe
6) Test de connexion
VII) Mise en place des quotas
1) Configuration de sql.conf
2) Ajouter une règle de quotas
3) Réinitialiser un quota
4) Supprimer une règle de quota


I) Introduction

Haut de page

Si vous avez beaucoup d’utilisateurs à ajouter sur votre serveur FTP ou tout simplement la nécessité de pouvoir ajouter/supprimer des utilisateurs facilement sans devoir créer un utilisateur local pour chacun d’entre eux, il est alors intéressant de lier ProFTPd avec une base de donnée MySQL. Dans un deuxième temps, nous mettrons en place le module "mod_quotatab_sql" qui vous permettra de configurer des quotas par utilisateur ou par groupe.

II) Installation

Haut de page

 pour commencer, vous devez installer les paquets suivants :

aptitude install proftpd-basic proftpd-mod-mysql mysql-server mysql-client phpmyadmin apache2
  • Lors de l’installation de "mysql-server", celui-ci va vous demander de configurer le mot de passe "root" de la base de données.
  • Puis de confirmer.
  • Ensuite lors de l’installation de "ProFTPD" vous propose deux modes :
    • Inetd
    • Standalone
  • ProFTPD peut être lancé soit en tant que service depuis INETD, soit comme un serveur indépendant. Chaque méthode a ses avantages. Pour quelques connexions par jour, il est suggéré de lancer ProFTPD depuis INETD afin de préserver les ressources du système. Au contraire, avec un trafic plus important, il est recommandé d’exécuter ProFTPD indépendamment pour éviter de démarrer un nouveau processus pour chaque connexion entrante.
  • Lors de l’installation de "phpmyadmin" celui-ci vous demandera si le serveur web est "Apache2" ou "lighttp". Choisissez "Apache2".
  • Pour finir, "phpmyadmin" vous demandera s’il "dbconfig-common" doit configurer une BDD. Choisissez "Non".

 Voilà votre serveur est prêt à être configuré.

III) Configuration de ProFTPD

Haut de page

1) Configuration de proftpd.conf

 Commencer par éditer le fichier proftpd.conf.

vim /etc/proftpd/proftpd.conf

 Modifiez les lignes comme l’exemple suivant :

UseIPv6                         off
ServerName                      "Deb-Idum-LAB"
ShowSymlinks                    off

<IfModule mod_quotatab.c>
QuotaEngine on
</IfModule>

 Décommentez les lignes suivantes :

DefaultRoot                     ~
RequireValidShell               off
Include /etc/proftpd/sql.conf

2) Configuration de modules.conf

 Éditez le fichier "modules.conf".

vim /etc/proftpd/modules.conf

 Décommentez les lignes suivantes :

LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
LoadModule mod_quotatab_sql.c

 Nous avons pas encore configuré le fichier "sql.conf", mais on reviendra le configurer après.

IV) Configuration de la base de données

Haut de page

1) Création de ftpgroup et ftpuser

 Créez le groupe "ftpgroup" et l’utilisateur "ftpuser" auquel tous nos utilisateurs virtuels seront mappés.

groupadd ftpgroup
useradd -s /bin/false -d /bin/null -g ftpgroup ftpuser

2) Création de la BDD MySQL pour ProFTPD

 Connectez-vous à MySQL en root.

mysql -u root -p

 Vous devez obtenir ceci :

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43
Server version: 5.5.54-0+deb8u1 (Debian)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 Créez la base de données "proftpd" :

  • Remplacez "password", par votre propre mot de passe.
CREATE DATABASE proftpd;
GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

 Sélectionnez la base de données "proftpd".

USE proftpd;

 Le message suivant vous indique qu’il a bien prit votre demande :

Database changed

 Créez la table "ftpgroup", qui permettra de stocker les groupes virtuels pour ProFTPD.

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='ProFTP groupe table';

 Créez la table "ftpuser", qui permettra de stocker les utilisateurs virtuels pour ProFTPD.

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',
LoginAllowed enum('true','false') NOT NULL default 'true',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
)ENGINE=MyISAM COMMENT='ProFTP user table';

 Créez ensuite la table "ftpquotalimits", qu’on utilisera dans la deuxième partie de l’article pour mettre en place les quotas.

CREATE TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwcXVvdGFsaW1pdHM8L2NvZGU+"></span> (
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bmFtZTwvY29kZT4="></span> varchar(30) default NULL,
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cXVvdGFfdHlwZTwvY29kZT4="></span> enum('user','group','class','all') NOT NULL default 'user',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cGFyX3Nlc3Npb248L2NvZGU+"></span> enum('false','true') NOT NULL default 'false',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bGltaXRfdHlwZTwvY29kZT4="></span> enum('soft','hard') NOT NULL default 'soft',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdXBfbGltaXQ8L2NvZGU+"></span> float NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfZG93bl9saW1pdDwvY29kZT4="></span> float NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdHJhbnNmZXJfbGltaXQ8L2NvZGU+"></span> float NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdXBfbGltaXQ8L2NvZGU+"></span> int(10) unsigned NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfZG93bl9saW1pdDwvY29kZT4="></span> int(10) unsigned NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdHJhbnNmZXJfbGltaXQ8L2NvZGU+"></span> int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM COMMENT='Table des quotas ProFTPD';

 Créez pour finir la table "ftpquotatotal", qu’on utilisera aussi dans la deuxième partie de l’article.

CREATE TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwcXVvdGF0b3RhbDwvY29kZT4="></span> (
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bmFtZTwvY29kZT4="></span> varchar(30) NOT NULL default '',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cXVvdGFfdHlwZTwvY29kZT4="></span> enum('user','group','class','all') NOT NULL default 'user',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdXBfdG90YWw8L2NvZGU+"></span> float NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfZG93bl90b3RhbDwvY29kZT4="></span> float NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdHJhbnNmZXJfdG90YWw8L2NvZGU+"></span> float NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdXBfdG90YWw8L2NvZGU+"></span> int(10) unsigned NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfZG93bl90b3RhbDwvY29kZT4="></span> int(10) unsigned NOT NULL default '0',
<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdHJhbnNmZXJfdG90YWw8L2NvZGU+"></span> int(10) unsigned NOT NULL default '0'
)ENGINE=MyISAM COMMENT='Table des compteurs des quotas ProFTPD';

 Quittez "MySQL".

quit;

 Si vous vous connectez sur "phpmyadmin", vous pourrez observer visuellement ce que vous avez créez dans la base de données "ProFTPD" :

  • Pour vous connecter à "phpmyadmin", tapez l’adresse suivante dans votre navigateur :
http://ADRESSE_IP_DE_VOTRE_SERVEUR/phpmyadmin

V) Configuration de ProFTPD - SUITE

Haut de page

1) Configuration de sql.conf

Comme indiqué précédemment, nous revenons sur la configuration de ProFTPD avec la modification du fichier "sql.conf".

 Éditez le fichier "sql.conf"

vim /etc/proftpd/sql.conf

 Décommentez les lignes suivantes :

SQLBackend      mysql
SQLAuthenticate on

 Ajoutez les lignes suivantes :

SQLAuthTypes Plaintext Crypt
SQLMinID        500

# Pour creer un dossier utilisateur dans /home
CreateHome on

# Pour bloquer les utilisateurs dans leur répertoire personnel
DefaultRoot ~
# Pour interdire le login "root"
RootLogin off

# Pour autoriser les shells non valide
RequireValidShell off

 Ajoutez maintenant la partie connexion à la base de donnée :

  • proftpd@localhost : "proftpd" correspond au nom de la base de données et localhost correspon à l’adresse IP/hostname du serveur MySQL.
  • proftpd : Correspond à l’utilisateur pour se connecter à la base de données.
  • password : Correspond au mot de passe pour se connecter à la base de données.
# Connexion

SQLConnectInfo proftpd@localhost proftpd password

 Ensuite ajoutez les lignes suivantes :

#
# Definit les tables utilisateur et groupe
#
SQLUserInfo 	ftpuser userid passwd uid gid homedir shell
SQLGroupInfo    ftpgroup groupname gid members

# Mettre à jour le champ date "Accessed", a chaque fois que l'utilisateur se connecte. Incrémente aussi le champ "count".

SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Mettre à jour le champ date "modified", a chaque fois que l'utilisateur ajoute ou supprime un fichier

SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# Activation des Logs concernant le traffic entre proftpd et mysql

SQLLogFile /var/log/proftpd/mysql.log
LogFormat auth "%v [%P] %h %t \"%r\" %s"
LogFormat write "%h %l %u %t \"%r\" %s %b"
ExtendedLog /var/log/proftpd/access.log WRITE,READ writ

 Redémarrez le service "ProFTPD".

service proftpd restart

VI) Gestion des utilisateurs et des groupes virtuels

Haut de page

1) Ajout d’un utilisateur

 Pour ajouter un utilisateur, connectez-vous à MySQL en "root" :

mysql -u root -p

 Sélectionnez la base de données "proftpd"

USE proftpd;

 Tapez la commande MySQL suivante pour ajouter l’utilisateur "user-test" avec un mot de passe "abc". Cet utilisateur aura accès seulement au répertoire "/home/user-test" avec les droits de l’utilisateur (UID) 5500, et de groupe (GID) 5500, sans shell "/bin/false".

  • LoginAllowed : Est mise à "true" pour autoriser la connexion de cet utilisateur, à "false" pour l’interdire.
  • count : Représente le nombre d’authentifications effectués par cet utilisateur.
  • accessed : La date du dernier accès.
  • modified : La date de la dernière écriture.
INSERT INTO <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwdXNlcjwvY29kZT4="></span> ( <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aWQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dXNlcmlkPC9jb2RlPg=="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cGFzc3dkPC9jb2RlPg=="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dWlkPC9jb2RlPg=="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Z2lkPC9jb2RlPg=="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+aG9tZWRpcjwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c2hlbGw8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Y291bnQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YWNjZXNzZWQ8L2NvZGU+"></span> , <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bW9kaWZpZWQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+TG9naW5BbGxvd2VkPC9jb2RlPg=="></span> ) VALUES ('', 'user-test', ENCRYPT('abc'), '5500', '5500', '/home/user-test', '/bin/false', '', '', '', 'true' );

2) Suppression d’un utilisateur

Pour supprimer l’utilisateur "user-test", tapez les commandes MySQL suivantes :

DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwdXNlcjwvY29kZT4="></span> WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dXNlcmlkPC9jb2RlPg=="></span>='user-test';
DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwZ3JvdXA8L2NvZGU+"></span> WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bWVtYmVyczwvY29kZT4="></span>='user-test';

3) Affecter un utilisateur à un groupe

 Pour affecter l’utilisateur "user-test" au groupe "group-test" avec les droits de groupe (GID) du groupe 5500, tapez la commande MySQL suivante :

INSERT INTO <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwZ3JvdXA8L2NvZGU+"></span> ( <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Z3JvdXBuYW1lPC9jb2RlPg=="></span> , <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Z2lkPC9jb2RlPg=="></span> , <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bWVtYmVyczwvY29kZT4="></span> ) VALUES ('group-test', '5500', 'test');

4) Enlever un utilisateur d’un groupe

 Pour enlever l’utilisateur "test" du groupe "group-test", tapez la commande MySQL suivante :

DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwZ3JvdXA8L2NvZGU+"></span> WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bWVtYmVyczwvY29kZT4="></span>='user-test';

5) Supprimer un groupe

 Pour supprimer le groupe "group-test", tapez la commande suivante :

DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwZ3JvdXA8L2NvZGU+"></span> WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Z3JvdXBuYW1lPC9jb2RlPg=="></span>='group-test';

6) Test de connexion

Depuis le début de cet article, vous modifiez des fichiers, complétez la table MySQL. Pour résumer les différentes actions réalisées :

  • Vous avez configuré le serveur ProFTPD
  • Vous avez commencé la configuration du module Quota par SQL
  • Vous avez mis en place les utilisateurs virtuels, gérer dans une base de données MySQL.

Il est temps de faire votre premier test, à ce stade de l’article, vous devez être capable de vous connecter avec l’utilisateur "user-test". Voici le journal de mon Filezilla :

Vous pourrez aussi remarquer que lors de la première connexion de l’utilisateur, son répertoire personnel est ajouté automatiquement dans "/home".

Maintenant que l’on est rassuré, notre serveur FTP fonctionne ainsi que la gestion des utilisateurs virtuels. Passons à la dernière étape de cet article, la mise en place de quota géré dans la base de données MySQL.

VII) Mise en place des quotas

Haut de page

1) Configuration de sql.conf

 Nous allons terminer la configuration du module "quota_sql". Éditez votre fichier "sql.conf".

vim /etc/proftpd/sql.conf

 Ajoutez les lignes suivantes :

## Gestion des quotas :
# Activation des modules

QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

# Definit la table "ftpquotalimits"

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}'"

# Definit la table "ftpquotatotal"

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}'"

# Permet de mettre à jour la table "ftpquotatotal"

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

Pour information :

  • La table "ftpquotalimits" contient la description des quotas.
  • La table "ftpquotatotal" contient les statistiques d’utilisation correspondant aux règles des quotas définis dans la table "ftpquotalimits". Cette table permet à ProFTPd de gérer les quotas.

 Redémarrer le service "ProFTPD".

service proftpd restart

2) Ajouter une règle de quotas

 Pour ajouter une règle de quotas, connectez-vous à MySQL en "root" :

mysql -u root -p

 Sélectionnez la base de données "proftpd"

USE proftpd;

 Tapez la requête suivante pour ajouter la règle :

INSERT INTO <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwcXVvdGFsaW1pdHM8L2NvZGU+"></span> ( <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bmFtZTwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cXVvdGFfdHlwZTwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cGFyX3Nlc3Npb248L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bGltaXRfdHlwZTwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdXBfbGltaXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfZG93bl9saW1pdDwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdHJhbnNmZXJfbGltaXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdXBfbGltaXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfZG93bl9saW1pdDwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdHJhbnNmZXJfbGltaXQ8L2NvZGU+"></span> )
VALUES ( 'NOM' , 'TYPE', 'SESSION', 'LIMIT_TYPE', 'B_UP', 'B_DOWN', 'B_TRANS', 'F_UP', 'F_DOWN', 'F_TRANS');

Voici l’explication des valeurs :

  • 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 la valeur conseillé).
  • LIMIT_TYPE : "soft" pour une mesure logicielle de la taille, "hard" pour une mesure hardware.
  • B_UP : Taille (en Mbytes) autorisé à être uploadé sûr le serveur.
  • B_DOWN : Taille (en Mbytes) autorisé à être downloadé à partir du serveur.
  • B_TRANS : Taille (en Mbytes) autorisé à transféré à sûr et à partir du serveur (upload+download).
  • F_UP : Nombre de fichiers autorisé à être uploadé sur le serveur.
  • F_DOWN : Nombre de fichiers autorisé à être downloadé à partir du serveur.
  • F_TRANS : Nombre de fichiers autorisé à transféré à sûr et à partir du serveur (upload+download).

 Pour être plus concret voici un exemple, ou l’on souhaite appliquer un quota à l’utilisateur "user-test" afin de le limiter son upload à 15000 octets et son download à 10000 octets.

INSERT INTO <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwcXVvdGFsaW1pdHM8L2NvZGU+"></span> ( <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bmFtZTwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cXVvdGFfdHlwZTwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cGFyX3Nlc3Npb248L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bGltaXRfdHlwZTwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdXBfbGltaXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfZG93bl9saW1pdDwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdHJhbnNmZXJfbGltaXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdXBfbGltaXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfZG93bl9saW1pdDwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdHJhbnNmZXJfbGltaXQ8L2NvZGU+"></span> )
VALUES ( 'user-test' , 'user', 'false', 'hard', '15000', '10000', '0', '0', '0', '0');

 Si nous testons le quotas en essayant de faire un upload d’un fichier ISO de 659MO, voici ce que nous affiche Filezilla :

 Deuxième exemple, on souhaite cette fois limiter le téléchargement de l’utilisateur "user-test" à 2 fichiers.

INSERT INTO <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwcXVvdGFsaW1pdHM8L2NvZGU+"></span> ( <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bmFtZTwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cXVvdGFfdHlwZTwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cGFyX3Nlc3Npb248L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bGltaXRfdHlwZTwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdXBfbGltaXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfZG93bl9saW1pdDwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Ynl0ZXNfdHJhbnNmZXJfbGltaXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdXBfbGltaXQ8L2NvZGU+"></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfZG93bl9saW1pdDwvY29kZT4="></span>, <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfdHJhbnNmZXJfbGltaXQ8L2NvZGU+"></span> )
VALUES ( 'user-test' , 'user', 'false', 'hard', '0', '0', '0', '0', '2', '0');

 Si nous testons le quotas en essayant de faire un téléchargement de 3 fichiers, voici ce que nous affiche Filezilla lors du téléchargement pour le troisième fichier :

3) Réinitialiser un quota

 Pour réinitialiser un quota entièrement, tapez la commande MySQL suivante :

  • Remplacez "user-test" par le nom de votre utilisateur.
DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwcXVvdGF0b3RhbDwvY29kZT4="></span> WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bmFtZTwvY29kZT4="></span>='user-test' AND <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cXVvdGFfdHlwZTwvY29kZT4="></span>='user';

 Vous pouvez aussi réinitialiser un seul quota :

  • Par exemple, nous souhaitons réinitialiser seulement la valeur "files_down_total" correspondant au nombre de te fichier téléchargé.
UPDATE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwcXVvdGF0b3RhbDwvY29kZT4="></span> SET <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZmlsZXNfZG93bl90b3RhbDwvY29kZT4="></span>="0" WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bmFtZTwvY29kZT4="></span>="user-test";

4) Supprimer une règle de quota

 Pour supprimer une règle de quota, vous devez d’abord réinitialiser le quota puis supprimer la règle. Tapez les commandes MySQL suivantes :

DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwcXVvdGF0b3RhbDwvY29kZT4="></span> WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bmFtZTwvY29kZT4="></span>='user-test' AND <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cXVvdGFfdHlwZTwvY29kZT4="></span>='user';
DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZnRwcXVvdGFsaW1pdHM8L2NvZGU+"></span> WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bmFtZTwvY29kZT4="></span>='user-test' AND <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cXVvdGFfdHlwZTwvY29kZT4="></span>='user';
 
 
 
 
 
Commentaires :

  •  Droit dossier apache / proftpd    > 17 mai 2017 20:58, par Vincent Toitot

    Bonjour !
    Merci pour ce super tuto !

    j’ai un soucis en voulant utiliser proftpd avec les dossiers public_html dans les dossiers /home. je n’arrive pas a donner des droits qui permettent d’utiliser les dossiers avec apache et avec Filezila.
    Merci !!