I. Introduction

Pure-ftpdServeur FTP Pure-ftpd(i) est un serveur FTP sécurisé et fiable pour les systèmes dérivés d'UNIX, sous licence BSD(ii). Le choix de l'utilisation du serveur Pure-ftpd repose sur sa facilité de configuration, de mise en place, contrairement à certains de ces concurrents et sur les nombreuses options de customisation qu'il offre.

Pure-FTPd était fondé sur Troll-FTPd écrit par Arnt Gulbrandsen alors qu'il travaillait chez Trolltech en 1995. Les contributeurs originaux étaient Janos Farkas, August Fullford, Ximenes Zalteca et Patrick Michael Kane. Le logiciel est désormais développé par l'équipe PureFTPd, Frank Denis étant l'initiateur et le mainteneur principal. PureFTPd est né d'une collecte des différents patchs non-officiels de Troll-FTPd réunis en un ensemble cohérent et des autres premières contributions de Frank Denis(iii).

II. Pourquoi Pure-ftpd ?

Pure-ftpd se veut à la fois simple dans sa configuration mais, en même temps, sécurisé et puissant, de part le nombre de fonctionnalités qu'il propose. Contrairement à ces concurrents les plus directs (Proftpd et vsftpd notamment), il est très facile à appréhender et convient donc parfaitement aux plus novices en systèmes Unix-like.
Néanmoins, facilité de configuration ne signifie pas faiblesse ! Pure-ftpd est utilisé par de nombreuses entreprises. Nous pouvons par exemple citer OVH qui l'utilise en production.
Dans ces dernières versions, Pure-ftpd a été porté sur Iphone.

III. Installation

Remarque : La méthode d'installation proposée dans cet article repose sur le fonctionnement de la distribution Debian et ses dérivés. Pour les autres distributions, veuillez vous reporter aux commandes de gestions des paquets implantées pour la distribution choisie.

L'installation du serveur FTP nécessite une base de données Mysql. Il est donc nécessaire d'installer également Mysql sur la machine.

III-1. Installation de Mysql

Pour installer un serveur de bases de données Mysql, se connecter en tant que root et lancer la commande suivante :

Installation du serveur de base de données
Sélectionnez

apt-get install mysql-server

L'installeur du serveur Mysql vous demande d'entrer un mot de passe pour l'utilisateur administrateur de la base de données (root). Entrez un mot de passe 2x et terminer l'installation. Voilà, votre serveur Mysql est installé !

III-2. Installation de Pure-ftpd

Il existe différentes versions de Pure-ftpd. Nous allons installer la version mysql, car nous utilisaterons une authentification par base de données avec les utilisteurs virtuels.

Installation de Pure-ftpd
Sélectionnez

apt-get install pure-ftpd-mysql

IV. Configuration de la base de données

Comme annoncé plus haut, nous allons configurer notre serveur FTP en se reposant sur une authentification par base de données. Il nous faut donc créer un utilisateur et une base de données pouvant accueillir les utilisateurs virtuels.

IV-1. Création de l'utilisateur Mysql

Nous allons créer un utilisateur Mysql afin de ne pas utiliser l'utilisateur administrateur de Mysql.

Connexion à la base de données en tant qu'administrateur de la base de données (root) :

Connexion à MySQL en ligne de commande
Sélectionnez

$ mysql -u root -p

Entrez le mot de passe administrateur Mysql que vous avez défini lors de l'installation du serveur de base de données. Vous êtes maintenant connecté en CLI au serveur Mysql, en tant qu'administrateur tout puissant. A présent, nous allons créer un nouvel utilisateur Mysql avec des droits restreints :

Création du user MySQL
Sélectionnez

CREATE USER 'USER_MYSQL_A_CREER'@'localhost' IDENTIFIED BY 'MON_MOT_DE_PASSE';
 
Sélectionnez

GRANT USAGE ON * . * TO 'USER_MYSQL_A_CREER'@'localhost' IDENTIFIED BY 'MON_MOT_DE_PASSE'
WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

IV-2. Création de la base de données pour Pure-ftpd

On crée une base de données en donnant les droits sur cette base au nouvel utilisateur Mysql :

Création de la baes de données
Sélectionnez

CREATE DATABASE IF NOT EXISTS NOM_BASE_DE_DONNEES;
Attribution des droits pour la base de données créée
Sélectionnez

GRANT ALL PRIVILEGES ON NOM_BASE_DE_DONNEES.* TO 'USER_MYSQL_A_CREER'@'localhost';

IV-3. Création de la table utilisateurs pour Pure-ftpd

On crée une table utilisateur pour Pure-ftpd et son schéma :

Création de la table users pour Pure-ftpd
Sélectionnez

CREATE TABLE users (User varchar(16) NOT NULL default '',
Password varchar(64) NOT NULL default '',
Uid varchar(11) NOT NULL default '',
Gid varchar(11) NOT NULL default '',
Dir varchar(128) NOT NULL default '',
PRIMARY KEY (User)
);

V. Configuration du serveur Pure-ftpd

Les fichiers de configuration du serveur Pure-ftpd se trouvent dans le répertoire /etc/pure-ftpd/.

V-1. Connexion à la base de données

A présent, nous allons configurer la connexion à la base de données.
Le fichier à éditer est /etc/pure-ftpd/db/mysql.conf .
Différentes méthodes de stockage des mots de passe en base sont proposées : cleartext, crypt, md5 et password.

Nous en profitons aussi pour spécifier que les mots de passe des comptes FTP devront être chiffrés(iv) (dans cet exemple en md5).
Le chiffrement des mots de passe s'explique facilement. En effet, s'il arrivait qu'une personne mal intensionnée ou qu'une faille permette d'accéder au contenu de la base de données, la personne aurait la possibilité de se connecter sans problème aux différents espaces de stockage FTP, grâce aux mots de passe en clair.

Le chiffrement des mots de passe offre donc une couche de sécurité dans le stockage des informations de connexion, car un hash a pour but d'être irréversible (en théorie).

Renseignez les champs suivants :

Configuration de Pure-ftpd pour la connexion à la base de données
Sélectionnez

# Mandatory : user to bind the server as.

MYSQLUser       USER_MYSQL_A_CREER

# Mandatory : user password. You must have a password.

MYSQLPassword   MON_MOT_DE_PASSE

# Mandatory : database to open.

MYSQLDatabase   NOM_BASE_DE_DONNEES

# Mandatory : how passwords are stored
# Valid values are : "cleartext", "crypt", "md5" and "password"
# ("password" = MySQL password() function)
# You can also use "any" to try "crypt", "md5" *and* "password"

MYSQLCrypt      md5

V-2. Suppirmer les connexions utilisateurs Unix

Par défaut, le serveur Pure-ftpd permet la connexion ftp grâce aux utilisateurs Unix de la machine. Nous allons supprimer cette option afin de sécuriser les accès aux ftp et n'autoriser que les connexions par les utilisateurs virtuels inclus dans la base.

Pour cela, nous allons dans le répertoire /etc/pure-ftpd/conf et éditons le fichier UnixAuthentication en plaçant sa valeur à "no" :

Suppression de l'authentification UNIX
Sélectionnez

echo no > /etc/pure-ftpd/conf/UnixAuthentication

V-3. Mettre un umask sur les dossiers et fichiers

Il peut être utile de changer les permissions des dossiers et fichiers sur un FTP. Avec Pure-ftpd, il est possible de définir un umask différent pour les dossiers et les fichiers. Cela se fait en créant un fichier Umask dans /etc/pure-ftpd/conf et en y écrivant les valeurs des umasks désirés, dans l'ordre fichier - dossier.

Umask
Sélectionnez

echo "133 022" > /etc/pure-ftpd/conf/Umask

Avec les umasks 133 et 022, les fichiers déposés sur le ftp auront comme droits 644 et les dossiers 755.

V-4. Chrooter les comptes FTP

Par défaut, en se connectant par ftp au serveur, il est possible de remonter dans l'arborescence, jusqu'au "/". Afin de restreindre l'accès aux utilisateurs ftp à leur répertoire racine personnel, il faut activer l'option "Chroot" dans la configuration de Pure-ftpd. Encore une fois, cela se fait par le biais un fichier dans le dossier /etc/pure-ftpd/conf :

Chrootage
Sélectionnez

echo yes > /etc/pure-ftpd/conf/ChrootEveryone

V-5. Forcer l'affichage des fichiers cachés

Il peut être utile de visualiser les fichiers cachés sur le système de fichiers, ces fameux fichiers commençant par un ".", comme par exemple les fichiers .htaccess que l'on peut trouver sur certains sites web. On peut forcer leur affichage en passant une nouvelle option au serveur Pure-ftpd. Dans ce cas, on crée un nouveau fichier de configuration dans /etc/pure-ftpd/conf :

Affichage des fichiers cachés
Sélectionnez

echo yes > /etc/pure-ftpd/conf/DisplayDotFiles

V-6. Cas particulier pour certaines applications web

Certaines applications web telles que Joomla offrent la possibilité d'installer des modules directement depuis le back-office. Un problème de permissions peut être rencontré pour installer ces modules. En effet, l'utilisateur pris en compte par l'application pour installer ces modules est l'utilisateur du serveur web, par exemple www-data s'il s'agit d'un serveur web apache.

Dans ce cas, donnez les droits à l'utilisateur du serveur web au niveau du répertoire web racine et à tout son contenu à l'aide de la commande "chown". Ensuite, pour que vous puissiez à la fois uploader sans problème et installer des modules depuis le back-office, autorisez le serveur Pure-ftpd à se connecter en tant que l'utilisateur du serveur web. Puis notez l'UID de l'utilisateur système du serveur web (www-data) et dire au serveur FTP qu'il autorise cet UID à se connecter. Encore une fois, tout se passe dans le répertoire /etc/pure-ftpd/conf. L'UID de www-data étant 33, il faut autoriser l'utilisateur 33 à se connecter :

Accès pour l'utilisateur web
Sélectionnez

echo 33 > /etc/pure-ftpd/conf/MinUID

V-7. Liste des Options disponibles

Pure-ftpd propose un nombre impressionnant d'options afin de customiser à souhiat son serveur FTP. Je vous invite à lire la documentationDocumentation de Pure-ftpd de Pure-ftpd.

En voici un extrait, présentant les options existantes :

Options de Pure-ftpd
Sélectionnez

--(switches sorted by ##GNU-style long switches## lexical order)--

-W  --allowanonymousfxp
-z  --allowdotfiles
-w  --allowuserfxp  
-O  --altlog                <format>:<log file>
-t  --anonymousbandwidth    <bandwidth (KB/s)>
-M  --anonymouscancreatedirs    
-i  --anonymouscantupload
-e  --anonymousonly 
-q  --anonymousratio        <upload ratio>:<download ratio>
-s  --antiwarez 
-r  --autorename

-S  --bind                  <ip address,port>
-b  --brokenclientscompatibility    

-A  --chrooteveryone
-9  --clientcharset         <charset>
-j  --createhomedir
-Z  --customerproof

-B  --daemonize 
-D  --displaydotfiles   
-H  --dontresolve   

-Y  --tls                   <0:no TLS | 1:TLS+cleartext | 2:enforce TLS |
                             3:enforce encrypted data channel as well>

-P  --forcepassiveip        <ip address>
-F  --fortunesfile          <file>
-8  --fscharset             <charset>

-h  --help  

-4  --ipv4only
-6  --ipv6only

-K  --keepallfiles

-l  --login                 <auth> or <auth>:<config file>
-1  --logpid                <file>
-L  --limitrecursion        <number:number>

-c  --maxclientsnumber      <number>
-C  --maxclientsperip       <number>
-k  --maxdiskusagepct       <percentage>
-I  --maxidletime           <time (min)>
-m  --maxload               <load>
-u  --minuid                <uid>

-N  --natmode
-E  --noanonymous   
-R  --nochmod
-G  --norename
-0  --notruncate

-v  --bonjour               <name>

-p  --passiveportrange      <minport:maxport>
-y  --peruserlimits         <per user max>:<max anonymous sessions>
-g  --pidfile               <path to pid file>
-X  --prohibitdotfilesread  
-x  --prohibitdotfileswrite 

-f  --syslogfacility        <facility>

-a  --trustedgid            <gid>
-V  --trustedip             <ip address>

-U  --umask                 <mask>
-o  --uploadscript
-T  --userbandwidth         <bandwidth (KB/s)> or [<up bw>]:[<down bw>]
-Q  --userratio             <upload ratio>:<download ratio>


La syntaxe des options ci-dessus est celle que l'on peut utiliser dans la commande de démarrage de Pure-ftpd.
Pour que ces options soient prises en compte à chaque démarrage du serveur, on utilise les fichiers de configuration comme présentés dans les sous-sections du titre V.
Par exemple, pour limiter le nombre de clients à 30 lors d'un démarrage du serveur, on utilise la commande avec l'option "-C 30"; Afin que cette commande soit prise en compte à chaque démarrage du serveur, il faut créer un fichier dans /etc/pure-ftpd/conf/ s'appelant : MaxClientsNumber et y spécifier le nombre d'utilisateurs désirés.

 
Sélectionnez

echo 30 > /etc/pure-ftpd/conf/MaxClientsNumber

VI. Création d'un utilisateur virtuel FTP

Nous allons, à présent, créer un utilisateur viruel afin de pouvoir nous connecter par FTP à notre serveur. Pour cela, il faut se connecter au CLI de Mysql avec l'utilisateur que l'on a créé tout à l'heure :

connexion au serveur MySQL
Sélectionnez

mysql -u USER_MYSQL_A_CREER -p

Il faut se rendre sur la bonne base de données :

Connexion à la base de données Pure-ftpd
Sélectionnez

use NOM_BASE_DE_DONNEES ;

Puis, on crée le nouvekl utilisateur virtuel. Les champs à renseigner sont : le nom de l'utilisateur, son mot de passe, l'UID autorisé (égal 33 si vous avez choisi www-data), le GID autorisé (égal 33 si vous avez choisi www-data) et enfin le chemin absolu du répertoire racine du compte FTP (exple : /home/titi/www/). Voici la requête SQL correspondant à ces informations :

Requête de création d'un utilisateur virtuel
Sélectionnez

INSERT INTO `users` ( `User` , `Password` , `Uid` , `Gid` , `Dir` )
VALUES ('toto', MD5( 'MOT_DE_PASSE_TOTO_FTP' ) , '33', '33', '/home/titi/www/');

Dans ce cas, l'utilisateur virtuel "toto" connecté en FTP possèdera comme répertoire racine le dossier www du home de l'utilisateur unix titi et ne pourra pas accéder plus haut dans l'arborescence système !

VII. Démarrage du serveur Pure-ftpd

Pure-ftpd peut être lancé de deux façons différentes : en tant que service (inetd) ou en tant que démon (init.d). La configuration du choix de démarrage se fait au niveau du fichier /etc/defaults/pure-ftpd-common.

fichier /etc/defaults/pure-ftpd-common
Sélectionnez

# STANDALONE_OR_INETD
# valid values are "standalone" and "inetd".
# Any change here overrides the setting in debconf.
STANDALONE_OR_INETD=standalone

VI-1. Inetd VS standalone daemon

Inetd est un démon qui active un service à la demande, lorsqu'un client tente de s'y connecter. Son avantage initial et principal est de n'allouer des ressources qu'en cas de besoin. En effet, contrairement aux démons qui utilisent des ressources système en continu par le biais de processus permanents parfois peu actifs, inetd écoute le port d'un service, dans l'attente d'une demande de connexion cliente. Lorsqu'une demande de connexion arrive, inetd active le service en lançant de nouveaux processus le temps de répondre aux requêtes clientes. Lorsque les connexions clientes sont terminées, les processus créés sont tués.

Du fait de son fonctionnement, inetd est souvent appelé "super-serveur" car il peut gérer à lui seul toutes les composantes serveur.

Il peut donc être intéressant d'utiliser inetd pour un service qui ne serait que rarement utilisé et/ou qui serait très gourmand en ressources afin de ménager votre machine. Cependant, le lancement du service prend du temps, la réponse à la requête cliente prend donc elle aussi plus de temps. C'est pourquoi, pour un service qui est utilisé fréquemment, la solution inetd n'est pas préconisée, le mode standalone est à privilégier.

VI-2. En tant que service : inetd

Pour démarrer le serveur Pure-ftpd en tant que service, il faut éditer le fichier /etc/defaults/pure-ftpd-common et placer le champ STANDALONE_OR_INETD à inetd :

Configuration du serveur en mode service
Sélectionnez

# STANDALONE_OR_INETD
# valid values are "standalone" and "inetd".
# Any change here overrides the setting in debconf.
STANDALONE_OR_INETD=inetd

Ensuite, pour démarrer et arrêter le serveur, utiliser la commande suivante :

Démarrage/arrêt des services
Sélectionnez

/etc/init.d/openbsd-inetd start
# ou
/etc/init.d/openbsd-inetd stop

VI-3. En tant que démon : init.d

Pour démarrer le serveur Pure-ftpd en tant que démon, il faut éditer le fichier /etc/defaults/pure-ftpd-common et placer le champ STANDALONE_OR_INETD à standalone :

Configuration du serveur en mode démon
Sélectionnez

# STANDALONE_OR_INETD
# valid values are "standalone" and "inetd".
# Any change here overrides the setting in debconf.
STANDALONE_OR_INETD=standalone

Ensuite, pour démarrer et arrêter le serveur, utiliser la commande suivante :

Démarrage/arrêt du démon pre-ftpd-mysql
Sélectionnez

/etc/init.d/pure-ftpd-mysql start
# ou
/etc/init.d/pure-ftpd-mysql stop

VIII. Conclusion

Comme vous avez pu le constater en lisant cet article, le serveur FTP Pure-ftpd est très simple à configurer grâce à son système de configuration nominal par fichiers et ses nombreuses options de customisation. Sur le site officiel de Pure-ftpd, vous trouverez la liste complète des différentes options existantes que l'on peut activer dans la configuration de Pure-ftpd. En conclusion, la simplicité de configuration, la grande flexibilité et la robustesse de ses connexions font de Pure-ftpd le serveur FTP idéal pour une utilisation personnalisée de qualité.

IX. Liens utiles

X. Remerciements

Un grand merci à pixelomilcouleurs pour la qualité de sa relecture.
Merci également à OVH, toujours aussi sympathique.