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 14.04LTS.
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 :
UTILISER 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';
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 :
[...] # Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other |
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 redémarrage