Module 2
Chapitre 02 - PureFTPd
1. Introduction
Pure-ftpd est un serveur ftp libre, sécurisé, de qualité et répondant aux standard du protocole FTP. Il tourne sur de nombreux systèmes tel que Linux, FreeBSD, NetBSD, OpenBSD, ISOS, EkkoBSD, BSDi, Solaris, Darwin, Tru64, Irix, AIX et HPUX.
Il possède de nombreux atouts tels que
le "chroot" des répertoires, le choix des ports pour le téléchargement
passif, le support du FXP (transfert entre deux serveurs FTP), le
réglage de la bande passante, le support des ratios, le support de ldap
/ mysql / postgreSQL / SSL pour l'authentification, et bien d'autres
choses encore.
2. Rappel sur le protocole FTP
Le protocole FTP (File Transfer Protocol) est, comme son nom l'indique, un protocole de transfert de fichiers. Celui-ci a été créé en 1971, et à cette époque on ne se souciait guère de la sécurité des données. De nos jours le protocole FTP est très répandu et sa lacune envers la sécurité persiste. En effet par défaut toutes les données passent en clair sur le réseau (nom d'utilisateur/mot de passe et données).
Le
protocole FTP agit au niveau de la couche 7 du modèle OSI, il est base
sur un modèle client serveur avec authentification via nom
d'utilisateur/mot de passe et écoute par défaut sur les ports 20
(données) et 21 (commandes).
3. FTP et la sécurité
Nous avons vu que les données transitent en clair sur le réseau, cela signifie qu'une personne mal intentionnée peut récupérer très aisément des noms d'utilisateurs/mot de passe.
Voici donc quelques précautions à prendre lorsque vous mettez en place un serveur FTP (nous exclurons ici le fait que le serveur soit directement vulnérable) :
Éviter d'implémenter un serveur FTP dans un réseau non commuté (un réseau contenant des Hubs).
Éviter d'implémenter un serveur FTP sur un serveur comportant des services critiques (DNS, MAIL...).
Éviter d'implémenter un serveur FTP sur un serveur comportant des données critiques/confidentielles.
Bloquer le compte root afin qu'il ne puisse pas se connecter au serveur FTP.
Solutions adoptables pour renforcer la sécurité :
L'utilisation d'utilisateurs virtuels (Voir ci-dessous).
Combiner le FTP avec le système de cryptage SSL/TLS (Voir le cours sur OpenSSL).
4. Introduction aux utilisateurs virtuels
Dans le cas ou une personne mal intentionnée arrive a récupérer le nom d'utilisateur/mot de passe d'un utilisateur (ceci est désastreux dans le cas du compte root), celui-ci aura accès au serveur FTP mais pire encore celui-ci pourra le cas échéant se connecter physiquement ou via SSH sur la machine !!!
La notion d'utilisateurs virtuels est très simple, il s'agit d'un utilisateur pouvant se connecter uniquement via FTP. Toutes connexions locales, SSH... lui seront refusées. Cependant les utilisateurs doivent posséder un UID/GID pour que le système puisse savoir si celui-ci a le droit de lire/écrire tel fichier/répertoire...
La méthode utilisée est la suivante :
Les utilisateurs possèdent l'UID d'un utilisateur système existant, celui-ci est souvent nommé ftpuser et en général ne possède pas de shell (ni de mot de passe). Il est évidemment possible de créer un utilisateur virtuel possédant le même UID que votre utilisateur système courant (afin de garder les mêmes accès). Le même principe est utilise pour le GID.
Chaque utilisateur virtuel possède un profil unique contenant ses limites de bande passante, ses quotas, ses horaires d'accès...
Dans
le cas où vous créez un utilisateur virtuel possédant le même nom
d'utilisateur/UID que votre utilisateur système, il peut être
intéressant de ne pas mettre le même mot de passe (changez une lettre
ou un chiffre).
5. Installation du serveur PureFTPd
Nous allons procéder à l'installation de PureFTPd via les sources, cependant vous pouvez tout à fait l'installer via un système de packages (portage, dpkg, rpm...).
La première étape consiste à récupérer les sources sur le site officiel :
ftp://ftp.pureftpd.org/pub/pure-ftpd/releases/
Une fois téléchargé, la procédure d'installation est la suivante :
# tar jxvf pure-ftpd-x.x.xxx.tar.bz2
# cd pure-ftpd-x.x.xxx
# ./configure --option1 --option2 ...
# make install-strip
Par défaut, les binaires seront installés dans /usr/local/(bin|sbin).
Voici les options du script configure que nous utiliserons :
Option | Effet |
--with-puredb | Active le support des utilisateurs virtuels |
--with-virtualchroot | Active les liens symboliques pour les utilisateurs chrootés |
--with-ftpwho | Active la commande ftpwho |
--with-altlog | Active les fichiers de log avancés |
--with-throttling | Active la gestion de la bande passante |
--with-peruserlimits | Active la gestion des limites par utilisateur |
--without-inetd | Désactive le support inetd (gain de place) |
D'autres options sont utilisables, la liste complète est disponible en tapant :
# ./configure --help
6. Lancement du serveur FTP
Nous avons vu dans le chapitre 4 qu'un utilisateur/groupe système devait être crée afin que les utilisateurs virtuels puissent avoir une identité sur le système
Voici les 2 lignes nécessaires à la création de cet utilisateur/groupe :
# groupadd ftpgroup
# useradd -g ftpgroup -d /dev/null -s /bin/false ftpuser
L'utilisateur système ftpuser se pourra jamais se connecter au système (home directory et shell invalide).
PureFTPd se lance de cette manière :
/usr/local/sbin/pure-ftpd -option1 arg1 -option2 arg2 -option3 ....
Voici les options que nous utiliserons :
Option | Effet |
-lpuredb:/fichier | Précise la base de comptes (/etc/pureftpd.pdb par défaut). |
-c N | Limite le nombre de connexions à N. |
-C N | Limite le nombre de connexions par IP à N. |
-E | Désactive les connexions anonymes. |
-O type:/chemin/vers/fichier | Active et spécifie le fichier de log ainsi que le type. |
7. Gestion des utilisateurs virtuels
Le fichier contenant les utilisateurs virtuels se nomme /etc/pureftpd.passwd, et voici son organisation :
Un utilisateur par ligne :
<account>:<mot de passe>:<uid>:<gid>:<gecos>:<home directory>:<upload bandwidth>:<download bandwidth>:<upload ratio>:<download ratio>:<max number of connections>:<files quota>:<size quota>:<authorized local Ips>:<refused local Ips>:<authorized client IPs>:<refused client Ips>:<time restrictions>
Les champs <account>, <mot de passe>, <uid>, <gid> et <home directory> sont obligatoires.
PureFTPd utilise la base de compte /etc/pureftpd.pdb qui est une version "compilée" de /etc/pureftpd.passwd.
Tout
comme pour les utilisateurs système, il est possible
d'ajouter/modifier/effacer un utilisateur à la main directement dans le
fichier, cependant l'utilisation des commandes suivantes facilite cette
tâche :
La commande pure-pw permet d'administrer le serveur, elle s'utilise de la manière suivante :
# pure-pw action [options]
Voici les différentes actions possibles :
Option | Effet |
useradd | Ajouter un utilisateur virtuel. |
usermod | Modifier un utilisateur virtuel. |
userdel | Supprimer un utilisateur virtuel. |
passwd | Modifier le mot de passe d'un utilisateur virtuel. |
show | Afficher le profil d'un utilisateur virtuel. |
list | Lister tous les utilisateurs virtuels. |
mkdb | Recréer la base de données PureFTPd (/etc/pureftpd.pdb) |
8. Les utilisateurs virtuels
Nous allons voir comment créer et gérer des utilisateurs virtuels.
8.1 Ajouter/Modifier un utilisateur virtuel
Voici la syntaxe de la commande d'ajout d'utilisateur :
# pure-pw useradd nom d'utilisateur options [-m]
A chaque ajout d'un utilisateur il faut recréer la base de données PureFTPd avec la commande :
# pure-pw mkdb
L'ajout de l'option '-m' lors de la création de l'utilisateur recrée automatiquement la base de données (plus besoin de taper 'pure-pw mkdb').
Voici les options que nous utiliserons :
Option | Effet |
-u | Précise l'UID de l'utilisateur virtuel (généralement celui de ftpuser). |
-g | Précise le GID de l'utilisateur virtuel (généralement celui de ftpgroup). |
-D | Précise le répertoire personnel de l'utilisateur. |
-d | Précise le répertoire personnel de l'utilisateur (celui-ci sera chrooter dans ce répertoire). |
-T | Précise le débit maximum (upload) de l'utilisateur. |
-t | Précise le débit maximum (download) de l'utilisateur. |
-y | Précise le nombre maximum de sessions simultanées que l'utilisateur peut ouvrir (threads). |
-z | Précise les heures de connexion de l'utilisateur (Exemple -z 1400-1800 entre 14h et 18h). |
-Q | Précise le ratio de l'utilisateur (download). |
-q | Précise le ratio de l'utilisateur (upload). |
Exemple :
# pure-pw useradd user1 -u ftpuser -g ftpgroup -d /ftp/ -y 3 -m
Cet exemple crée un utilisateur user1 ayant l'UID de ftpuser, le GID de ftpgroup, comme répertoire personnel /ftp/ (chroote) ainsi que trois connexions simultanées au maximum.
D'autres options sont disponibles en tapant :
$ pure-pw
Voici la syntaxe de la commande de modification d\u2019utilisateurs virtuels :
# pure-pw usermod login options [-m]
A chaque modification d'un utilisateur il faut recréer la base de données PureFTPd avec la commande :
# pure-pw mkdb
L'ajout de l'option '-m' lors de la modification de l'utilisateur recrée automatiquement la base de données (plus besoin de taper 'pure-pw mkdb').
Les options sont les mêmes que pour l'ajout d'un utilisateur.
Exemple :
# pure-pw usermod user1 -y 2 -m
Cet exemple modifie le nombre de connexions simultanées (2) de l'utilisateur user1.
8.2 Changer le mot de passe d'un utilisateur virtuel
Voici la syntaxe de la commande de changement de mot de passe d'un utilisateur :
# pure-pw passwd nom d'utilisateur [-m]
A chaque modification de mot de passe il faut recrée la base de données PureFTPd avec la commande :
# pure-pw mkdb
L'ajout de l'option '-m' lors de la modification de mot de passe recrée automatiquement la base de données (plus besoin de taper 'pure-pw mkdb').
Exemple :
# pure-pw passwd user1 -m
Cet exemple change le mot de passe de l'utilisateur user1.
8.3 Convertir un utilisateur système en utilisateur virtuel
Si vous souhaitez convertir votre utilisateur système en utilisateur virtuel, voici la procédure à suivre :
# pure-pwconvert nom d'utilisateur >> /etc/pureftpd.passwd
Exemple :
# pure-pwconvert user2 >> /etc/pureftpd.passwd
8.4 Supprimer un utilisateur virtuel
Voici la syntaxe de la commande de suppression d'utilisateurs virtuels :
# pure-pw userdel login [-m]
A chaque suppression d'un utilisateur il faut recréer la base de données PureFTPd avec la commande :
# pure-pw mkdb
L'ajout de l'option '-m' lors de la suppression d'un utilisateur recrée automatiquement la base de données (plus besoin de taper 'pure-pw mkdb').
Exemple :
# pure-pw userdel user1 -m
Cet exemple supprime l'utilisateur virtuel user1.
8.5 Afficher les informations relatives à un utilisateur virtuel
La commande suivante permet d'afficher les informations relatives à un utilisateur virtuel :
# pure-pw show nom d'utilisateur
Exemple :
# pure-pw show user1
Login : user1
Password : $1$zL.EEBKZ$MbyJUyqrAa3sT719arBbB0
UID : 1001 (ftpuser)
GID : 101 (ftpgroup)
Directory : /ftp
Full name :
Download bandwidth : 0 Kb (unlimited)
Upload bandwidth : 0 Kb (unlimited)
Max files : 0 (unlimited)
Max size : 0 Mb (unlimited)
Ratio : 0:0 (unlimited:unlimited)
Allowed local IPs :
Denied local IPs :
Allowed client IPs :
Denied client IPs :
Time restrictions : 0000-0000 (unlimited)
Max sim sessions : 2
8.6 Afficher la liste des utilisateurs virtuels :
La commande suivante permet de lister tous les utilisateurs virtuels du système :
# pure-pw list
9. Administration du serveur
9.1 Lister les utilisateurs connectes au serveur
La commande pure-ftpwho permet de lister les utilisateurs actuellement connectés au serveur ainsi que leurs actions.
Exemple :
# pure-ftpwho
+------+---------+-------+------+-------------------------------------------+
| PID | login |For/Spd| What | File/IP |
+------+---------+-------+------+-------------------------------------------+
| 6105 | user1 | 00:00 | DL | File.avi |
| '' | '' | 170K/s| '' | -> 62.39.155.70 |
+------+---------+-------+------+-------------------------------------------+
La commande pure-mrtg info permet de exporter un fichier MRTG (Graphique) sur l'utilisation du serveur.
9.2 Les fichiers de log
Le fichier de log des transferts est spécifié au démarrage du serveur (Voir Chapitre 6), par exemple si vous lancez le serveur de cette manière :
# pure-ftpd -option -option -O clf:/var/log/pureftpd.log
Le fichier de log sera /var/log/pureftpd.log (format clf).
Voici un extrait de fichier de log :
172.16.34.1 - luser [17/Aug/2004:10:32:42 +0100] "GET /home/luser/code/bash/yop/yop-1.0.sh" 200 2388
172.16.34.2 - ruser [17/Aug/2004:12:24:50 +0100] "PUT /data/incoming/Supinfo.avi" 200 612732928
D'autres informations (connexions, erreurs...) sont disponibles dans les fichiers /var/log/messages et syslog.
10. Utilisation de SSL/TLS
Nous allons voir comment configurer PureFTPd afin qu'il supporte le SSL. Cela permet de ne plus envoyer les noms d'utilisateurs et les mots de passe en clair sur le réseau. Par contre le canal de données n'est pas affecté par cette encryption, afin de ne pas apporter de baisse significative des performances et cela permet de faire du FXP (transfert entre deux serveurs FTP) entre des serveurs qui supportent SSL/TLS et d'autres qui ne le supportent pas.
Pour utiliser cette fonction, vous devez posséder le fichier "/etc/ssl/private/pure-ftpd.pem" qui contient la clé privée et le certificat du serveur. Vous pouvez changer l'emplacement de ce fichier en passant l'option "--with-certfile /chemin/vers/le/fichier" au script configure, ou alors si vous avez changé le chemin pour lesysconfdir, alors le fichier doit se trouver dans "<sysconfdir>/ssl/private/pure-ftpd.pem>. Notez bien que c'est le même fichier qui doit contenir la clé privée et le certificat du serveur. Il doit ressembler à cela :
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC+KU+laUdHceXk4ZWSH5nFJPd/TJjpZVuVgZ5FuS2/mkof8kOV
[ clé tronquée ]
SwWH5WI9d0CffE30Ab1VpDnzKRn1ncBfvh3GIdLBgtjy
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICoDCCAgmgAwIBAgIBADANBgkqhkiG9w0BAQQFADBFMQswCQYDVQQGEwJBVTET
[ certificat tronqué ]
QZ2/xw==
-----END CERTIFICATE-----
Pour démarrer le serveur avec le support des connexions SSL, vous devez utiliser le drapeau "-Y" ou "--tls", qui peut prendre les valeurs suivantes :
0 : le support pour SSL/TLS est désactivé, c'est la valeur par défaut
1 : les clients peuvent se connecter soit de manière traditionnelle, soit en utilisant une connexion SSL/TLS
2 : seules les connexions SSL/TLS sont acceptées
Exemple :
On possède le bon certificat pour notre serveur, et on veut
qu'il n'accepte que les connexions sécurisées.
On utilise donc cette commande pour le lancer :
# pure-ftpd ${pure-ftpd-options} -Y 2
ou bien :
# pure-ftpd ${pure-ftpd-options} --tls=2