GNU/Linux >> Tutoriels Linux >  >> Ubuntu

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

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. Ce tutoriel est basé sur Ubuntu 12.10.

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, ce qui signifie que vous n'avez pas à vous soucier de la ligne de commande.

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.

Assurez-vous d'être connecté en tant que root :

sudo su

1.1 Changer le shell par défaut

/bin/sh est un lien symbolique vers /bin/dash, cependant nous avons besoin de /bin/bash, pas de /bin/dash. C'est pourquoi nous procédons comme suit :

dpkg-reconfigure dash

Installer dash en tant que /bin/sh ? <-- Non

1.2 Désactiver AppArmor

AppArmor est une extension de sécurité (similaire à SELinux) qui devrait fournir une sécurité étendue. À mon avis, vous n'en avez pas besoin pour configurer un système sécurisé, et cela cause généralement plus de problèmes que d'avantages (pensez-y après avoir effectué une semaine de dépannage car un service ne fonctionnait pas comme prévu, puis vous découvrez que tout allait bien, seul AppArmor était à l'origine du problème). Je le désactive donc.

Nous pouvons le désactiver comme ceci :

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils

2 Installer MySQL et phpMyAdmin

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

apt-get 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 les questions suivantes :

Serveur Web à reconfigurer automatiquement :<-- apache2
Configurer la base de données pour phpmyadmin avec dbconfig-common ? <-- Non

3 Installer Proftpd avec le support MySQL

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

apt-get install 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 :

USE ftp;

CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default ''5500',
membres varchar(16) NOT NULL default '',
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT='ProFTP group table';

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'
) ENGINE=MyISAM;

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 default '0',
files_out_used int(10) unsigned NOT NULL default '0',
files_xfer_used int(10) unsigned NOT NULL default '0'
) ENGINE=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 par défaut '/sbin/nologin',
count int(11) NOT NULL par défaut '0',
accessed datetime NOT NULL par défaut '0000-00-00 00:00:00 ',
modified datetime NOT NULL default '0000-00-00 00:00:00',
CLÉ PRIMAIRE (id),
CLÉ UNIQUE ID utilisateur (ID utilisateur)
) MOTEUR =MyISAM COMMENT='Table utilisateur ProFTP';

quit;

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 :

[...]
# Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other
# SQL backend engine to use this module and the required backend.
# This module must be mandatory loaded before anyone of
# the existent SQL backeds.
LoadModule mod_sql.c [...] # Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c [...] # Install one of the previous SQL backends and decomment
# the previous mod_sql.c module to use this
LoadModule mod_quotatab_sql.c [...]

Ouvrez ensuite /etc/proftpd/proftpd.conf et commentez les lignes suivantes :

vi /etc/proftpd/proftpd.conf
[...]
#<IfModule mod_quotatab.c>
#QuotaEngine off
#</IfModule>
[...]

Plus bas dans le fichier, ajoutez les lignes suivantes :

[...]
#
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
#Include /etc/proftpd/sql.conf

DefaultRoot ~

SQLBackend              mysql
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users groups


# used to connect to the database
# [email protected] database_user user_password
SQLConnectInfo  [email protected] proftpd password


# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo     ftpuser userid passwd uid gid homedir shell

# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo    ftpgroup groupname gid members

# set min UID and GID - otherwise these are 999 each
SQLMinID        500

# create a user's home directory on demand if it doesn't exist
CreateHome on

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

SQLNamedQuery 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 "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, 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}'" ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

RootLogin off
RequireValidShell 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 restart

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
USE 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`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'exampleuser', 'secret', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', '');
quit;

(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 FileZilla, WS_FTP, SmartFTP ou gFTP) 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é créé automatiquement, et qu'il appartient à ftpuser et ftpgroup (l'utilisateur/groupe que nous avons créé à la fin de la deuxième étape) :

[email protected] :~# ls -l /home/
total 8
drwxr-xr-x 3 administrateur administrateur 4096 19 octobre 13:08 administrateur
drwx------ 2 ftpuser       ftpgroup      4096 18 avril 18:13 www.example.com
[email protected] :~#

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 :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 :c'est ok 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 :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 :dur 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.)

Quelques fichiers commençant par un . ont été créés par la dernière commande (useradd) dans le répertoire /home/anonymous_ftp. Nous n'en avons pas besoin, nous les supprimons :

cd /home/anonymous_ftp
rm -f .bash_logout
rm -f .profile
rm -f .bashrc

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
[...]
<Anonymous ~anonymous_ftp>
  User                                anonymous_ftp
  Group                               nogroup
  # We want clients to be able to login with "anonymous" as well as "ftp"
  UserAlias                        anonymous anonymous_ftp
  # Cosmetic changes, all files belongs to ftp user
  DirFakeUser        on anonymous_ftp
  DirFakeGroup on anonymous_ftp

  RequireValidShell                off

  # Limit the maximum number of anonymous logins
  MaxClients                        10

  # We want 'welcome.msg' displayed at login, and '.message' displayed
  # in each newly chdired directory.
  DisplayLogin                        welcome.msg
  DisplayChdir                        .message

  # Limit WRITE everywhere in the anonymous chroot
  <Directory *>
    <Limit WRITE SITE_CHMOD>
      DenyAll
    </Limit>
  </Directory>

  # Uncomment this if you're brave.
  <Directory incoming>
    # Umask 022 is a good standard umask to prevent new files and dirs
    # (second parm) from being group and world writable.
    Umask                                022  022
             <Limit READ WRITE SITE_CHMOD>
             DenyAll
             </Limit>
             <Limit STOR>
             AllowAll
             </Limit>
  </Directory>

</Anonymous>

Redémarrez enfin Proftpd :

/etc/init.d/proftpd restart

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/
  • Ubuntu :http://www.ubuntu.com/

Ubuntu
  1. Utilisateurs virtuels et domaines avec Postfix, Courier, MySQL et SquirrelMail (Ubuntu 14.04LTS)

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

  3. Utilisateurs virtuels et domaines avec Postfix, Courier, MySQL et SquirrelMail (Ubuntu 13.10)

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

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

Utilisateurs virtuels et domaines avec Postfix, Courier, MySQL et SquirrelMail (Ubuntu 12.10)

Hébergement virtuel avec vsftpd et MySQL sur Ubuntu 12.10

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 PureFTPd et MySQL (y compris la gestion des quotas et de la bande passante) sur Ubuntu 14.04LTS

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

Hébergement virtuel avec vsftpd et MySQL sur Debian Squeeze