Linux

Serveur FTP avec Proftpd plus proftpd-mysql

Installation

[bash]apt-get install proftpd[/bash]

Edition de la configuration :

[bash]vi /etc/proftpd/proftpd.conf[/bash]

Nous allons modifier les options suivantes :

[bash]UseIPv6 off #Ne pas utiliser IPv6 si ce n’est pas nécessaire
DefaultRoot ~ #Le répertoire de destination par défaut des utilisateurs est leur propre home directory.
IdentLookups off #Désactive l’identification distante
RequireValidShell off #Permet la connexion des utilisateurs qui ne possèdent pas d’accès shell
IdentLookups off #Désactive l’identification distante
ServerIdent on « FTP Server ready. » #Message minimaliste affiché à la connexion
ShowSymlinks off #Ne pas afficher les liens symboliques
AllowStoreRestart on #Autoriser la reprise d’un upload de fichier (resuming)
AllowRetrieveRestart on #Autoriser la reprise d’un téléchargement de fichier[/bash]

Si vous ne parvenez pas à vous connecter, une parade consiste à désactiver le module sql postgres, en commentant avec # la ligne correspondante dans le fichier
/etc/proftpd/modules.conf :

[bash]vi /etc/proftpd/modules.conf
# LoadModule mod_sql_postgres.c[/bash]

Redémarrer le tout :

[bash]/etc/init.d/proftpd restart[/bash]

Proftpd-mysql

Par défaut, les comptes FTP sont ceux des utilisateurs de la machine. Dans le cas d’un serveur d’hébergement, il peut être intéressant de gérer les utilisateurs et groupes indépendamment. Le module proftpd-mysql permet de stocker ces informations dynamiquement dans une base de données MySQL.

[bash]apt-get install proftpd-mysql[/bash]

Il faut ensuite créer la structure de la base de données. Connectez-vous en root pour définir les droits d’accès :

[sql]CREATE DATABASE proftpd;
GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO ‘proftpd’@’localhost’
IDENTIFIED BY motdepasse_proftpd;
FLUSH PRIVILEGES;
Puis mettre en place les tables :

USE 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)
) TYPE=MyISAM COMMENT=’Table des groupes ProFTPD’;

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’;

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’;

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'[/sql]

Editez /etc/proftpd/proftpd.conf pour activer le support MySQL en vérifiant les identifiants de connexion :

 

[bash]# Cryptage
SQLAuthTypes Crypt
SQLAuthenticate users* groups*

# Identifiants de connexion
SQLConnectInfo proftpd@localhost proftpd motdepasse_proftpd

# Colonnes utilisées pour les utilisateurs
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLUserWhereClause « LoginAllowed = ‘true' »

# Colonnes utilisées pour les groupes
SQLGroupInfo ftpgroup groupname gid members

# Créer le répertoire home par défaut
SQLHomedirOnDemand on

# Mise à jour des compteurs de connexion
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE « count=count+1, accessed=now() WHERE userid=’%u' » ftpuser

# Mise à jour des compteurs de trafic
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE « modified=now() WHERE userid=’%u' » ftpuser

# Quota
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

# Requêtes SQL relatives aux 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;[/bash]

Redémarrez le service :

[bash]/etc/init.d/proftpd restart[/bash]

La gestion des utilisateurs dans ces tables étant relativement explicite d’après leur structure, celle-ci ne sera pas développée pour le moment. Reportez-vous à la Documentation Ubuntu Francophone si nécessaire.

Ajoutez un enregistrement dans la table ftpuser pour chaque utilisateur, le mot de passe étant encrypté par la fonction mysql ENCRYPT. Ajoutez un enregistrement dans la table ftpgroup pour chaque groupe. Le champ members contenant les logins (en texte) des membres de ce groupe.

Standard