GNU/Linux >> Tutoriels Linux >  >> Debian

Hébergement virtuel avec Proftpd et MySQL (avec quota) sur Debian Lenny

Ce document décrit comment installer un serveur Proftpd qui utilise des utilisateurs virtuels d'une base de données MySQL au lieu d'utilisateurs système réels. Ceci est beaucoup plus performant et permet d'avoir des milliers d'utilisateurs ftp sur une seule machine. En plus de cela, je montrerai l'utilisation du quota avec cette configuration.

Pour l'administration de la base de données MySQL, vous pouvez utiliser des outils Web tels que phpMyAdmin qui seront également installés dans ce guide. phpMyAdmin est une interface graphique confortable qui signifie que vous n'avez pas à vous soucier de la ligne de commande.

Ce tutoriel est basé sur Debian Lenny (Debian 5.0). Vous devriez déjà avoir configuré un système Debian Lenny de base, comme décrit dans les sept premiers chapitres de ce tutoriel :https://www.howtoforge.com/perfect-server-debian-lenny-ispconfig2

Ce guide est conçu comme un guide pratique ; il ne couvre pas les arrière-plans théoriques. Ils sont traités dans de nombreux autres documents sur le Web.

Ce document est fourni sans garantie d'aucune sorte ! Je tiens à dire que ce n'est pas la seule façon de mettre en place un tel système. Il existe de nombreuses façons d'atteindre cet objectif, mais c'est la voie que je prends. Je n'émets aucune garantie que cela fonctionnera pour vous !

1 Remarque préliminaire

Dans ce tutoriel, j'utilise le nom d'hôte server1.example.com avec l'adresse IP 192.168.0.100. Ces paramètres peuvent différer pour vous, vous devez donc les remplacer le cas échéant.

2 Installer MySQL et phpMyAdmin

Tout cela peut être installé avec une seule commande :

aptitude install mysql-server mysql-client phpmyadmin apache2

Il vous sera demandé de fournir un mot de passe pour l'utilisateur root MySQL - ce mot de passe est valide pour l'utilisateur [email protected] ainsi que [email protected], nous n'avons donc pas besoin de spécifier manuellement un mot de passe root MySQL ultérieurement :

Nouveau mot de passe pour l'utilisateur "root" MySQL :<-- yourrootsqlpassword
Répétez le mot de passe pour l'utilisateur "root" MySQL :<-- yourrootsqlpassword

En plus de cela, vous verrez la question suivante :

Serveur Web à reconfigurer automatiquement :<-- apache2

3 Installer Proftpd avec le support MySQL

Pour Debian, un package proftpd-mysql préconfiguré est disponible. Installez-le en tant que démon autonome comme ceci :

aptitude installer proftpd-mod-mysql

La question suivante vous sera posée :

Exécutez proftpd :<-- autonome

Ensuite, nous créons un groupe ftp (ftpgroup) et un utilisateur (ftpuser) auxquels tous nos utilisateurs virtuels seront mappés. Remplacez le groupe et l'ID utilisateur 2001 par un numéro libre sur votre système :

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

4 Créer la base de données MySQL pour Proftpd

Nous créons maintenant une base de données appelée ftp et un utilisateur MySQL nommé proftpd que le démon proftpd utilisera plus tard pour se connecter à la base de données ftp :

mysql -u root -p
CREATE DATABASE ftp;
ACCORDER SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
ACCORDER SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIÉ PAR 'password' ;
FLUSH PRIVILEGES ;

Remplacez la chaîne password par le mot de passe que vous souhaitez utiliser pour l'utilisateur MySQL proftpd. Toujours sur le shell MySQL, nous créons les tables de base de données dont nous avons besoin :

UTILISER ftp ;
CREATE TABLE ftpgroup (
nom du groupe varchar(16) NOT NULL par défaut '',
gid smallint(6) NOT NULL par défaut '5500',
membres varchar(16) NOT NULL par défaut '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='Table de groupe ProFTP';
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 par défaut 'false',
limit_type enum('soft','hard') NOT NULL par défaut 'soft',
bytes_in_avail bigint( 20) unsigned NOT NULL par défaut '0',
bytes_out_avail bigint(20) unsigned NOT NULL par défaut '0',
bytes_xfer_avail bigint(20) unsigned NOT NULL par défaut '0',
files_in_avail int (10) unsigned NOT NULL par défaut '0',
files_out_avail int(10) unsigned NOT NULL par défaut '0',
files_xfer_avail int(10) unsigned NOT NULL par défaut '0'
) TYPE =MonISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user ',
bytes_in_used bigint(20) unsigned NOT NULL par défaut '0',
bytes_out_used bigint(20) unsigned NOT NULL par défaut '0',
bytes_xfer_used bigint(20) unsigned NOT NULL par défaut ' 0',
files_in_used int(10) unsigned NOT NULL par défaut '0',
files_out_used int(10) unsigned NOT NULL par défaut '0',
files_xfer_used int(10) unsigned NOT NULL par défaut '0'
) TYPE=MonISAM ;
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 par défaut '5500',
gid smallint(6) NOT NULL par défaut '5500',
homedir varchar(255) NOT NULL par défaut '',
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',
datetime modifiée NOT NULL par défaut '0000-00-00 00:00:00',
CLÉ PRIMAIRE (id),
CLÉ UNIQUE ID utilisateur (ID utilisateur)
) TYPE=MyISAM COMMENT='Table utilisateur ProFTP';
quitter ;

Comme vous l'avez peut-être remarqué, avec le renoncement; commande, nous avons quitté le shell MySQL et sommes de retour sur le shell Linux.

BTW, (je suppose que le nom d'hôte de votre système de serveur ftp est server1.example.com) vous pouvez accéder à phpMyAdmin sous http://server1.example.com/phpmyadmin/ (vous pouvez utiliser l'adresse IP au lieu de server1. example.com) dans un navigateur et connectez-vous en tant que proftpd. Ensuite, vous pouvez consulter la base de données. Plus tard, vous pourrez utiliser phpMyAdmin pour gérer votre serveur Proftpd.

5 Configurer Proftpd

Ouvrez /etc/proftpd/modules.conf...

vi /etc/proftpd/modules.conf

... et activez les trois modules suivants :

[...]# Installez proftpd-mod-mysql ou proftpd-mod-pgsql pour utiliser thisLoadModule mod_sql.c[...]# Install proftpd-mod-mysql pour utiliser thisLoadModule mod_sql_mysql.c[...]# Installez proftpd-mod-pgsql ou proftpd-mod-mysql pour utiliser thisLoadModule mod_quotatab_sql.c[...]

Ouvrez ensuite /etc/proftpd/proftpd.conf ; commentez la section quota et décommentez la ligne Include /etc/proftpd/sql.conf :

vi /etc/proftpd/proftpd.conf
[...]##QuotaEngine off#[...]## Cadres d'authentification alternatifs# #Include /etc/proftpd/ldap.confInclude /etc/proftpd/sql.conf[...]

Ouvrez ensuite /etc/proftpd/sql.conf et faites-le ressembler à ceci :

vi /etc/proftpd/sql.conf
## Exemple de configuration Proftpd pour l'authentification basée sur SQL.## (Ceci ne doit pas être utilisé si vous préférez une authentification SQL basée sur PAM)# ## Choisissez un backend SQL parmi MySQL ou PostgreSQL.# Les deux modules sont chargés dans la configuration par défaut, vous devez donc spécifier le backend# ou commenter le module inutilisé dans /etc/proftpd/modules.conf. # Utilisez 'mysql' ou 'postgres' comme valeurs possibles.##SQLBackend mysql##SQLEngine on#SQLAuthenticate on## Utilisez à la fois un mot de passe crypté ou en clair#SQLAuthTypes Crypt Plaintext## Utilisez un mot de passe crypté ou crypté#SQLAuthTypes Backend Crypt## Connection#SQLConnectInfo [email protected] proftpd_user proftpd_password## Décrit les deux tables d'utilisateurs/groupes##SQLUserInfo users userid passwd uid gid homedir shell#SQLGroupInfo groups groupname gid members#DefaultRoot ~SQLBackend mysql# Les mots de passe dans MySQL sont chiffrés à l'aide CRYPTSQLAuthTypes Texte brut CryptSQLAuthenticate groupes d'utilisateurs# utilisés pour se connecter à la base de données# [email protected] database_user user_passwordSQLConnectInfo [email protected] proftpd password# Ici, nous indiquons à ProFTPd les noms des colonnes de la base de données dans la "table utilisateur"# avec lesquelles nous voulons qu'il interagisse. Faites correspondre les noms avec ceux de dbSQLUserInfo ftpuser userid passwd uid gid homedir shell# Ici, nous indiquons à ProFTPd les noms des colonnes de la base de données dans le "grouptable"# avec lesquelles nous voulons qu'il interagisse. Encore une fois, les noms correspondent à ceux du dbSQLGroupInfo ftpgroup groupname gid membres# set min UID et GID - sinon ce sont 999 chaqueSQLMinID 500# créer le répertoire personnel d'un utilisateur à la demande s'il n'existe pasCreateHome on# Compte de mise à jour chaque fois que l'utilisateur se connecteSQLLog PASS updatecountSQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser# Mise à jour modifiée à chaque fois que l'utilisateur télécharge ou supprime un fichierSQLLog STOR,DELE modifiedSQLNamedQuery modified UPDATE "modified=now() WHERE userid=' %u'" ftpuser# Quotas utilisateur# ===========QuotaEngine onQuotaDirectoryTally onQuotaDisplayUnits MbQuotaShowQuotas onSQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name ='%{0}' AND quota_type ='%{1}'"SQLNamedQuery get-quota-tally SELECT "nom, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_ utilisé, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name ='%{0}' AND quota_type ='%{1}'"SQLNamedQuery update-quota-tally UPDATE "bytes_in_used =bytes_in_used + %{0}, bytes_out_used =bytes_out_used + %{1 }, bytes_xfer_used =bytes_xfer_used + %{2}, files_in_used =files_in_used + %{3}, files_out_used =files_out_used + %{4}, files_xfer_used =files_xfer_used + %{5} WHERE name ='%{6}' AND quota_type =' %{7}'" ftpquotatalliesSQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, % {7}" ftpquotatalliesQuotaLimitTable sql :/get-quota-limitQuotaTallyTable sql :/get-quota-tally/update-quota-tally/insert-quota-tallyRootLogin offRequireValidShell off

Assurez-vous de remplacer la chaîne password par le vrai mot de passe de l'utilisateur MySQL proftpd dans la ligne SQLConnectInfo !

Redémarrez ensuite Proftpd :

/etc/init.d/proftpd redémarrage

6 Remplir la base de données et tester

Pour remplir la base de données, vous pouvez utiliser le shell MySQL :

mysql -u root -p
UTILISER ftp ;

Nous créons d'abord une entrée dans la table ftpgroup. Il contient le nom du groupe, le groupid et le nom d'utilisateur du groupe/utilisateur ftp que nous avons créé à la fin de la deuxième étape (remplacez le groupid de manière appropriée si vous en utilisez un autre que 2001) :

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');

Nous en avons maintenant fini avec la table ftpgroup. Nous n'avons pas besoin de créer d'autres entrées ici. Chaque fois que vous créez un nouvel utilisateur ftp virtuel, vous le faites dans les tables ftpquotalimits et ftpuser. Créons donc notre premier utilisateur exampleuser avec un quota de 15Mo et le mot de passe secret (nous sommes toujours dans le shell MySQL) :

INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALEURS ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALEURS (1, 'exampleuser', 'secret', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', '');
quitter ;

(N'oubliez pas de remplacer correctement le groud- et l'ID utilisateur 2001 dans la dernière instruction INSERT si vous utilisez d'autres valeurs que dans ce tutoriel !)

Ouvrez maintenant votre programme client FTP sur votre poste de travail (quelque chose comme WS_FTP ou SmartFTP si vous êtes sur un système Windows ou gFTP sur un bureau Linux) et essayez de vous connecter. Comme nom d'hôte, vous utilisez server1.example.com (ou l'adresse IP du système), le nom d'utilisateur est exampleuser et le mot de passe est secret.

Si vous parvenez à vous connecter, félicitations ! Sinon, quelque chose s'est mal passé.

Maintenant, si vous exécutez

ls -l /home/

vous devriez voir que le répertoire /home/www.example.com (le répertoire personnel de l'utilisateur de l'exemple) a été automatiquement créé, et qu'il appartient à ftpuser et ftpgroup (l'utilisateur/groupe que nous avons créé à la fin de la deuxième étape) :

serveur1 :~# ls -l /home/
total 12
drwxr-xr-x 2 administrateur administrateur 4096 2009-02-16 13:18 administrateur
drwxr-xr-x 2 ftp          nogroup       4096 2009-06-09 17:37 ftp
drwx------ 2 ftpuser       ftpgroup      4096 2009-06-09 17:59 www.example.com
server1 :~#

7 Administration de la base de données

Pour la plupart des gens, c'est plus facile s'ils ont une interface graphique pour MySQL; par conséquent, vous pouvez également utiliser phpMyAdmin (dans cet exemple sous http://server1.example.com/phpmyadmin/) pour administrer la base de données ftp.

Chaque fois que vous créez un nouvel utilisateur, vous n'avez qu'à créer des entrées dans les tables ftpquotalimits et ftpuser donc je vais vous expliquer les colonnes de ces tables ici :

Table ftpuser :

Les colonnes importantes sont celles-ci (les autres sont gérées automatiquement par MySQL ou Proftpd, ne les remplissez donc pas manuellement !) :

  • userid :nom de l'utilisateur virtuel Proftpd (par exemple, exampleuser).
  • passwd :mot de passe non chiffré (c'est-à-dire en texte clair) de l'utilisateur.
  • uid :l'ID utilisateur de l'utilisateur ftp que vous avez créé à la fin de la deuxième étape (par exemple, 2001).
  • gid :le groupid du groupe ftp que vous avez créé à la fin de la deuxième étape (par exemple, 2001).
  • homedir :le répertoire personnel de l'utilisateur virtuel de Proftpd (par exemple, /home/www.example.com). S'il n'existe pas, il sera créé lors de la première connexion du nouvel utilisateur via FTP. L'utilisateur virtuel sera emprisonné dans ce répertoire personnel, c'est-à-dire qu'il ne pourra pas accéder à d'autres répertoires en dehors de son répertoire personnel.
  • shell :ce n'est pas grave si vous remplissez /sbin/nologin ici par défaut.

Tableau ftpquotalimits :

Les colonnes importantes sont celles-ci (les autres sont gérées automatiquement par MySQL ou Proftpd, ne les remplissez donc pas manuellement !) :

  • name :le nom de l'utilisateur virtuel de Proftpd (par exemple, exampleuser).
  • quota_type :utilisateur ou groupe. Normalement, nous utilisons user ici.
  • par_session :vrai ou faux. true signifie que les limites de quota ne sont valides que pour une session. Par exemple, si l'utilisateur dispose d'un quota de 15 Mo et qu'il a téléchargé 15 Mo pendant la session en cours, il ne peut rien télécharger de plus. Mais s'il se déconnecte et se reconnecte, il dispose à nouveau de 15 Mo disponibles. false signifie que l'utilisateur dispose de 15 Mo, qu'il se déconnecte et se reconnecte.
  • limit_type :rigide ou souple. Une limite de quota strict est une limite à ne jamais dépasser, tandis qu'un quota souple peut être temporairement dépassé. Normalement, vous utilisez fort ici.
  • bytes_in_avail :limite de téléchargement en octets (par exemple, 15728640 pour 15 Mo). 0 signifie illimité.
  • bytes_out_avail :limite de téléchargement en octets. 0 signifie illimité.
  • bytes_xfer_avail :limite de transfert en octets. La somme des chargements et des téléchargements qu'un utilisateur est autorisé à faire. 0 signifie illimité.
  • files_in_avail :limite de téléchargement dans les fichiers. 0 signifie illimité.
  • files_out_avail :limite de téléchargement dans les fichiers. 0 signifie illimité.
  • files_xfer_avail :limite de transfert dans les fichiers. 0 signifie illimité.

La table ftpquotatallies est utilisée par Proftpd en interne pour gérer les quotas afin que vous n'ayez pas à y faire d'entrées !

8 FTP anonyme

Si vous souhaitez créer un compte ftp anonyme (un compte ftp auquel tout le monde peut se connecter sans mot de passe), vous pouvez le faire comme ceci :

Nous créons d'abord un utilisateur et un groupe avec le nom anonyme_ftp. L'utilisateur a le répertoire personnel /home/anonymous_ftp :

groupadd -g 2002 anonyme_ftp
useradd -u 2002 -s /bin/false -d /home/anonymous_ftp -m -c "Utilisateur FTP anonyme" -g anonyme_ftp anonyme_ftp

(Remplacez 2002 par un identifiant de groupe/utilisateur qui est libre sur votre système.)

Ensuite, nous créons le répertoire /home/anonymous_ftp/incoming qui permettra aux utilisateurs anonymes d'uploader des fichiers :

mkdir /home/anonymous_ftp/incoming
chown anonyme_ftp:nogroup /home/anonymous_ftp/incoming

Et enfin, ouvrez /etc/proftpd/proftpd.conf et ajoutez-y les directives suivantes :

vi /etc/proftpd/proftpd.conf
[...]
 Utilisateur anonyme_ftp Groupe nogroup # Nous voulons que les clients puissent se connecter avec "anonyme" ainsi que " ftp" UserAlias ​​anonyme anonyme_ftp # Modifications cosmétiques, tous les fichiers appartiennent à l'utilisateur ftp DirFakeUser sur anonyme_ftp DirFakeGroup sur anonyme_ftp RequireValidShell off # Limiter le nombre maximum de connexions anonymes MaxClients 10 # Nous voulons que 'welcome.msg' s'affiche à la connexion et '.message' affiché # dans chaque répertoire nouvellement chdiré. DisplayLogin welcome.msg DisplayChdir .message # Limitez l'ECRITURE partout dans le chroot anonyme   DenyAll   # Décommentez ceci si vous êtes courageux.  # Umask 022 est un bon umask standard pour empêcher les nouveaux fichiers et répertoires # (deuxième paramètre) d'être accessibles en écriture par le groupe et le monde. Umask 022 022  DenyAll   AllowAll  

Redémarrez enfin Proftpd :

/etc/init.d/proftpd redémarrage

Désormais, les utilisateurs anonymes peuvent se connecter et télécharger des fichiers depuis /home/anonymous_ftp, mais les téléchargements sont limités à /home/anonymous_ftp/incoming (et une fois qu'un fichier est téléchargé dans /home/anonymous_ftp/incoming, il ne peut être ni lu ni téléchargé depuis là ; l'administrateur du serveur doit d'abord le déplacer dans /home/anonymous_ftp pour le rendre accessible aux autres).

(Veuillez noter :vous ne pouvez avoir qu'un seul compte FTP anonyme par adresse IP !)

9 références

Mandrake 10.1 - Proftpd + Authentification MySQL + Quotas Howto :http://www.khoosys.net/single.htm?ipg=848

  • Proftpd :http://www.proftpd.org
  • MySQL :http://www.mysql.com
  • phpMyAdmin :http://www.phpmyadmin.net
  • Debian :http://www.debian.org

Debian
  1. Hébergement virtuel avec Proftpd et MySQL (incl. Quota) sur Ubuntu 14.04LTS

  2. Comment configurer des conteneurs virtuels avec LXC et la prise en charge des quotas sur Debian 8

  3. Hébergement virtuel avec PureFTPd et MySQL (y compris la gestion des quotas et de la bande passante) sur CentOS 7.0

  4. Hébergement virtuel avec PureFTPd et MySQL (y compris la gestion des quotas et de la bande passante) sur Ubuntu 7.10 (Gutsy Gibbon)

  5. Hébergement virtuel avec Proftpd et MySQL (incl. Quota) sur Ubuntu 8.04 LTS

Hébergement virtuel avec PureFTPd et MySQL (y compris la gestion des quotas et de la bande passante) sur Ubuntu 12.10

Hébergement virtuel avec Proftpd et MySQL (incl. Quota) sur Ubuntu 12.10

Hébergement virtuel avec PureFTPd et MySQL (y compris la gestion des quotas et de la bande passante) sur Ubuntu 14.04LTS

Installation de Lighttpd avec prise en charge de PHP5 et MySQL sur Debian Lenny

Hébergement virtuel avec Proftpd et MySQL (avec quota) sur Debian Lenny

Hébergement virtuel avec vsftpd et MySQL sur Debian Squeeze