Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
proftpd_et_mysql [Le 21/10/2007, 17:38] 82.235.156.105 |
— (Version actuelle) | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | {{tag>feisty serveur reseau ftp}} | ||
- | ---- | ||
- | |||
- | ====== 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. | ||
- | |||
- | <note> | ||
- | 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 [[lamp|ce tutorial]] | ||
- | </note> | ||
- | |||
- | Cette procédure installera sur votre machine : | ||
- | *proftpd | ||
- | *proftpd-mysql | ||
- | |||
- | ===== Installation ===== | ||
- | |||
- | Pour installer le serveur FTP avec le support de MySQL, vérifiez d'abord que vos [[depots#universe_et_multiverse|dépôts Universe]] sont bien activés.\\ | ||
- | |||
- | Et ensuite, | ||
- | [[:tutoriel:comment_installer_un_paquet|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//. | ||
- | |||
- | <note importante> | ||
- | **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.** | ||
- | </note> | ||
- | |||
- | ===== 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 utile 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 : | ||
- | |||
- | <code sql> | ||
- | 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'; | ||
- | </code> | ||
- | |||
- | 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. | ||
- | |||
- | <code sql> | ||
- | GRANT USAGE ON proftpd.localhost TO proftpd@localhost IDENTIFIED BY 'password' WITH GRANT OPTION; | ||
- | </code> | ||
- | |||
- | <note> | ||
- | 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 * | ||
- | </note> | ||
- | |||
- | 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: | ||
- | <code sql> | ||
- | GRANT USAGE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION; | ||
- | </code> | ||
- | |||
- | |||
- | 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: | ||
- | <code sql> | ||
- | GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION; | ||
- | </code> | ||
- | |||
- | ==== Le serveur FTP ProFTPd ==== | ||
- | |||
- | On passe maintenant à la configuration de ProFTPd. | ||
- | Pour cela, on édite le fichier de configuration de ProFTPd : | ||
- | |||
- | [[:tutoriel:comment_editer_un_fichier|Éditez le fichier]] **/etc/proftpd/proftpd.conf** | ||
- | |||
- | Ensuite, trouvez et décommentez les lignes suivantes (en retirant les # au début de chaque ligne) : | ||
- | |||
- | <file> | ||
- | DefaultRoot ~ | ||
- | </file> | ||
- | <file> | ||
- | RequireValidShell off | ||
- | </file> | ||
- | |||
- | 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" | ||
- | |||
- | <file> | ||
- | <IfModule mod_sql.c> | ||
- | SQLBackend mysql | ||
- | </IfModule> | ||
- | </file> | ||
- | |||
- | 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. | ||
- | |||
- | <code> | ||
- | # 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,DELE 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 | ||
- | </code> | ||
- | |||
- | Et Finalement, on redemarre le serveur FTP. | ||
- | |||
- | <code bash> | ||
- | sudo /etc/init.d/proftpd restart | ||
- | </code> | ||
- | |||
- | ===== 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 === | ||
- | |||
- | 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. | ||
- | |||
- | <code sql> | ||
- | 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' ); | ||
- | </code> | ||
- | |||
- | //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. | ||
- | |||
- | |||
- | <code sql> | ||
- | DELETE FROM `ftpuser` WHERE `userid`='test'; | ||
- | </code> | ||
- | |||
- | |||
- | ==== 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**. | ||
- | |||
- | <code sql> | ||
- | INSERT INTO `ftpgroup` ( `groupname` , `gid` , `members` ) VALUES ('group_test', '5500', 'test'); | ||
- | </code> | ||
- | |||
- | === Enlever un utilisateur d'un groupe === | ||
- | |||
- | On reprend l'exemple ci dessus en enlevant l'utilisateur **test** du groupe **group_test**. | ||
- | |||
- | <code sql> | ||
- | DELETE FROM `ftpgroup` WHERE `members`='test'; | ||
- | </code> | ||
- | |||
- | ==== 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 : | ||
- | |||
- | <code sql> | ||
- | 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'); | ||
- | </code> | ||
- | |||
- | *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). | ||
- | |||
- | <note> | ||
- | Pour définir un quota illimité à un des champs, mettez une valeur négative ou nulle. | ||
- | </note> | ||
- | |||
- | <note importante> | ||
- | 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. | ||
- | </note> | ||
- | |||
- | === 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 : | ||
- | |||
- | <code sql> | ||
- | DELETE FROM `ftpquotatotal` WHERE `name`='test'; | ||
- | </code> | ||
- | |||
- | 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 : | ||
- | |||
- | <code sql> | ||
- | TRUNCATE TABLE `ftpquotatotal`; | ||
- | </code> | ||
- | |||
- | ===== Références ===== | ||
- | |||
- | * [[http://www.proftpd.org/|Site officiel de ProFTPd]] (en) | ||
- | * [[http://www.castaglia.org/proftpd/doc/contrib/ProFTPD-mini-HOWTO-SQL.html|Documentation plus complète sur ProFTPd et MySQL]] (en) | ||
- | |||
- | ------ | ||
- | //Contributeur : [[utilisateurs:Fengy|Fengy]]// | ||
- | |||
- | // Basé sur « [[http://www.lea-linux.org/cached/index/Reseau-partfic-proftpd_mysql.html| ProFTPD, MySQL et Quota]] » par lea-linux.org// |