Nom : pure-ftpd
Version : 1.0.21
Page Officielle
Dépôt YUM : Fedora Extras


Plan



On peut avoir besoin d’installer un serveur FTP pour de multiples raisons, il existe sous linux de nombreux logiciels, on peut citer par exemple : proftpd, vsftpd, glftpd, pure-ftpd, … Dans toute cette jungle, difficile de s’y retrouver.

Il est difficile de prétendre qu’un serveur est meilleur que l’autre … car d’une part ces avis sont souvent subjectif (untel est meilleur … "mais c’est surtout parce que j’ai réussi à le configurer"), et d'autre part chacun à des atouts et des inconvénients.

Pure-ftpd à quelques atouts qui peuvent en faire un serveur FTP de prédilection. Dans cet exemple de configuration, il s’agira de mettre en place des utilisateurs virtuels, chrootés, avec des options de restrictions propres à chaque utilisateur.

1. Présentation

Selon l’auteur: “Pure-FTPd is a free (BSD), secure, production-quality and standard-conformant FTP server. It doesn't provide useless bells and whistles, but focuses on efficiency and ease of use. It provides simple answers to common needs, plus unique useful features for personal users as well as hosting providers.”
En effet, il très simple à configurer mais pas pour autant dénué de fonctions, bien au contraire.

Parmi les fonctions disponibles on y trouve de façon non exhaustive :
- limite du nombre d’utilisateurs
- limitation de la bande passante
- chroot des utilisateurs
- support du protocole FXP (File eXchange Protocol)
- support de plusieurs types d’authentification (Unix, PAM, LDAP, MySQL, PostgreSQL, utilisateurs virtuels)
- support des quotas
- limitation de la connexion en fonction du créneau horaire
- limitation du nombre de connexion par IP
- limitation du nombre de connexion par utilisateurs
- log via syslog
- autocréation du dossier personnel
- ratio upload/download
- support de TLS

2. Procédure d'installation sur une Fedora Core 5 ou 4

yum install pure-ftpd suffira pour installer l'application. Le dépôt extras doit être accessible.

3. Paramétrage

Le fichier de configuration est /etc/pure-ftpd/pure-ftpd.conf.
Le fichier est très bien commenté, ce qui améliore d’autant plus la facilité de paramétrage du serveur.
La syntaxe est très simple :

Paramètre            	valeur
# commentaire

La valeur peut être une valeur booléene (yes, no), un chemin d'accès vers un fichier (/etc/pure-ftpd/pureftpd.pdb), ou une valeur spécifique à un paramètre (Umask 133:022).

  • Description de quelques paramètres du fichier de conf

- Config Générale du serveur

ChrootEveryone		# permet de chrooter tout le monde
(mettre tout le monde dans un répertoire racine différent de la racine du serveur)
MaxClientsNumber	# Nombre total de client pouvant se connecter simultanément
Daemonize            	# Permet a pureftpd de tourner en arrière-plan 
MaxIdleTime		# Temps d’inactivité en minute avant déconnexion.
AltLog			# Permet la création d’un log supplémentaire dans un format défini
(Apache, w3c ou optimisé pour traitement  des statistiques)
UseFtpUsers		# Utilises le fichier /etc/ftpusers pour INTERDIRE l’accès au service

- Manipulations sur les fichiers/dossiers

NoChmod			# Interdit la modification des permissions des fichiers/dossiers
CreateHomeDir		# Autocréation des répertoires d’accueil s’ils ne sont pas présent
LimitRecursion		# Spécifie les limites de la commande ls
PerUserLimits		# Spécifie le nombre maximal de session par type d'utilisateurs
ProhibitDotFilesWrite 	# Interdit l’écriture ou effacement des fichiers commençant par un .
ProhibitDotFilesRead   	# Interdit la lecture des fichiers ou dossiers commençant par un .
MaxDiskUsage		# Interdit l’upload de fichiers si le disque est utilisé a plus de x %
NoRename                # Interdit aux utilisateurs la possibilité de renommer les fichiers.
Quota			# Active et spécifie les quotas des utilisateurs
KeepAllFiles		# Interdit la suppression des fichiers
(permet toutefois l’upload, et le "resume" des fichiers)
Umask			# Fixe les permissions des fichiers/dossiers crées par les utilisateurs
DisplayDotFiles		# Permet l’affichage systématique des fichiers/dossiers cachés

- Configuration réseau

MaxClientsPerIP		# Spécifie le nombre de connexion simultanées depuis une même IP
TrustedIP		# Autorise les connexions NON anonymes a partir de cette IP seulement
TLS			# Active et paramètre l’utilisation de TLS
 - 0 : n’accepte que les connexions non sécurisées
 - 1 : accepte les connexions sécurisées et non sécurisées
 - 3 : n’accepte que les connexions sécurisées
IPV4Only		# Désactive IPV6
IPV6Only		# Désactive IPV4
Bind			# Permet de spécifier une interface réseau et/ou un port à utiliser
DontResolve		# Ne fait pas de résolution DNS pour afficher des noms plutôt que des IP
 dans les logs (conseillé pour limiter les requêtes DNS)

- Configuration de l'authentification

LDAPConfigFile		# Fichier configurant l’accès pour authentification LDAP
MySQLConfigFile		# Fichier configurant l’accès pour authentification via MySQL
PGSQLConfigFile		# Fichier configurant l’accès pour authentification via PostGreSQL
PAMAuthentication	# Autorise l’authentification par module PAM.
PureDB			# Chemin vers la base de donnée des comptes virtuels
UnixAuthentication	# Utilisation de l’authentification standard Unix
(autorise ou non les utilisateurs normaux a s’authentifier) 

- Configuration de l'accès anonyme

AnonymousOnly		# Permet de n’autoriser que l’accès anonyme au serveur ftp
NoAnonymous		# Permet de désactiver l’accès anonyme au serveur ftp
AnonymousCantUpload	# Interdit l’upload aux utilisateurs anonymes
AnonymousCanCreateDirs	# Interdit la création de dossiers aux utilisateurs anonymes
AnonymousRatio		# Spécifie le ratio pour les utilisateurs anonymes ( upload download)
AllowAnonymousFXP	# Autorise l’utilisation du protocole FXP aux utilisateurs anonymes

- Options pour les utilisateurs authentifiés

AllowUserFXP		# Autorise l’utilisation du protocole FXP aux utilisateurs authentifiés
UserRatioUserRatio 	# Spécifie le ratio pour les utilisateurs authentifiés (upload download)
MinUID			# UID minimal des utilisateurs autorisés à s’authentifier

  • Paramétrage du fichier pour authentification avec des utilisateurs virtuels uniquement

- Paramètres à changer

MaxClientsNumber	50  --> MaxClientsNumber	10
MaxClientsPerIP		8   --> MaxClientsPerIP		3
NoAnonymous		no  --> NoAnonymous		yes
PAMAuthentication	yes --> PAMAuthentication	no
# PureDB	/etc/pure-ftpd/pureftpd.pdb --> PureDB	/etc/pure-ftpd/pureftpd.pdb

- Pamètres à vérifier

ChrootEveryone		yes
Daemonize		yes
SyslogFacility		ftp
DontResolve		yes  (on limite les résolutions DNS)

- Paramètres optionnels à configurer en fonction du comportement souhaité

MaxDiskUsage		99  --> MaxDiskUsage		95 
(limitation de la saturation du filesystem)
DisplayDotFiles		yes --> DisplayDotFiles		no
(On n'affiche pas les fichiers cachés automatiquement)
MaxIdleTime		15  --> MaxIdleTime		5
(5 minutes d'inactivité avant déconnexion)
AllowUserFXP		no  --> AllowUserFXP		yes
ProhibitDotFilesWrite 	no  --> ProhibitDotFilesWrite 	yes 
(interdiction de créer ou d'écrire dans les fichiers cachés)
ProhibitDotFilesRead   	no  --> ProhibitDotFilesRead   	yes 
(interdiction de lecture des fichiers cachés)
#NoChmod		yes --> NoChmod			yes
(les utilisateurs ne peuvent pas changer les permissions des fichiers/dossiers)
#KeepAllFiles		yes --> KeepAllFiles		yes
(Les utilisateurs ne peuvent pas supprimer de fichiers)
#NoRename		yes --> NoRename		yes
(Les utilisateurs ne pourront pas renommer les fichiers)
#IPV4Only		yes --> IPV4Only		yes
(Désactivation du support IPV6)

  • Préparation de la racine ftp

Les utilisateurs virtuels seront mappés à l'UID de ftpuser et au GID de ftpgroup.
Par ailleurs, le serveur ftp aura pour racine /var/ftproot

[root@rainbow ~]# groupadd ftpgroup
[root@rainbow ~]# useradd -g ftpgroup -d /dev/null -s /sbin/nologin ftpuser
[root@rainbow ~]# mkdir /var/ftproot
[root@rainbow ~]# chown ftpuser.ftpgroup /var/ftproot 
[root@rainbow ~]# chmod -w /var/ftproot
[root@rainbow ~]# ll -d /var/ftproot/ 
dr-xr-xr-x 2 ftpuser ftpgroup 4096 jun 25 13:30 /var/ftproot/
[root@rainbow ~]# grep ftpuser /etc/passwd
ftpuser:x:501:501::/dev/null:/sbin/nologin
[root@rainbow ~]# grep ftpgroup /etc/group
ftpgroup:x:501:

- groupadd : création du groupe ftpgroup
- useradd : création de l'utilisateur ftpuser avec pour home /dev/null et shell /sbin/nologin.
Cela interdit à l'utilisateur ftpuser la possibilité de se connecter à un shell (par ailleurs il n'a pas de mot de passe fixé)
- mkdir : création du dossier qui servira de racine pour le ftp
- chown : changement de l'utilisateur et du groupe propriétaire du dossier /var/ftproot
- chmod : Suppression des droits d'écriture (les uploads seront dans un sous dossier)
- ll & grep : simples vérifications de la préparation effectuée.

4. Gestion des utilisateurs virtuels

  • Ajout : pure-pw useradd login options

L'ajout, modification et la suppression des utilisateurs virtuels se font à l'aide de la commande pure-pw.

[root@rainbow ~]# pure-pw useradd toto -u ftpuser -d /var/ftproot -m
Password:
Enter it again:

-u : login de l'utilisateur dont on utilisera l'UID pour les utilisateurs virtuels
-d : Home directory de l'utilisateur virtuel (ici la racine ftp sans possibilité de remonter d'un niveau car il est chrooté)
-m : Mise à jour automatique de la base de donnée des utilisateurs virtuels (/etc/pure-ftpd/pureftpd.pdb)
Pure-pw demande automatiquement le mot de passe à attribuer a l'utilisateur.
Si -m est omis, pure-ftpd ne prendra pas en compte les modifications avant que la commande pure-pw mkdb ne soit executée. Cette remarque est également valable pour la modification ou la suppression des users.

  • Visualisation des informations : pure-pw show login
[root@rainbow ~]# pure-pw show toto
Login              : toto
Password           : $1$ofZvRzd0$MPGCXt.KZ5FGxfGeAgLLI/
UID                : 501 (ftpuser)
GID                : 501 (ftpgroup)
Directory          : /var/ftproot/./
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   : 0 (unlimited)

Le /./ à la fin du répertoire d'accueil permet de spécifier que l'utilisateur ne pourra pas remonter au dela de /var/ftproot. (il ne pourra donc pas aller dans /var)

  • Modification des propriétés de l'utilisateur : pure-pw usermod login options

Pour rajouter un commentaire (utilisateur de test) , une limitation de bande passante en download (8 ko/s), une limitation horaire (de 8h30 a 17h00) et 2 connexions simultanées maximum à l'utilisateur toto.

[root@rainbow ~]# pure-pw usermod toto -c "Utilisateur de test" -t 8 -z 0830-1700 -y 2 -m
 

-c : commentaire
-t : Limitation de la bande passante du download
-T : Limitation de la bande passante de l'upload
-n : quota en nombre de fichiers max
-N : quota en taille maximale utilisable
-i :
-I :
-r : IPs (ou noms d'hotes) autorisées d'ou l'utilisateur est autorisé à se connecter
-R : IPs (ou noms d'hotes) d'ou l'utilisateur n'est pas autorisé à se connecter
-z : Limitation horaire pendant laquelle l'utilisateur peut se connecter
-y : Nombre de sessions simultanées autorisées

  • Vérification des propriétés de l'utilisateur :
[root@rainbow ~]# pure-pw show toto
Login              : toto
Password           : $1$ofZvRzd0$MPGCXt.KZ5FGxfGeAgLLI/
UID                : 501 (ftpuser)
GID                : 501 (ftpgroup)
Directory          : /var/ftproot/./
Full name          : Utilisateur de test
Download bandwidth : 8 Kb (enabled)
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  : 0830-1700 (enabled)
Max sim sessions   : 2 (enabled)

Pour supprimer une option telle que la limitation de bande passante, il faut faire pure-pw usermod login -t ''

[root@rainbow ~]# pure-pw usermod toto -t '' -m
[root@rainbow ~]# pure-pw show toto | grep bandwidth
Download bandwidth : 0 Kb (unlimited)
Upload   bandwidth : 0 Kb (unlimited)

  • Changement d'un mot de passe : pure-pw passwd login
[root@rainbow ~]# pure-pw passwd toto -m
Password:
Enter it again:

  • Suppression d'un utilisateur : pure-pw userdel login
[root@rainbow ~]# pure-pw userdel toto
[root@rainbow ~]# pure-pw show toto
Unable to fetch info about user [toto] in file [/etc/pure-ftpd/pureftpd.passwd]
  • Ajout d'un utilisateur spécial pour l'upload

Cet utilisateur pourra écrire des fichiers dans le dossier upload du serveur ftp (/var/ftproot/upload du serveur). Ce sera son dossier d'accueil mais pourra remonter dans / du ftp (/var/ftproot).

[root@rainbow ~]# mkdir /var/ftproot/upload
[root@rainbow ~]# pure-pw useradd upload -u ftpuser -D /var/ftproot/./upload -m
[root@rainbow ~]# ll -d /var/ftproot/upload
drwxr-xr-x 2 ftpuser ftpgroup 4096 jun 25 16:24 /var/ftproot/upload/
Password:
Enter it again:

-D : Ne pas chrooter dans le dossier racine (la racine sera explicitement définie par /./ dans la ligne de commande.

Le dossier upload est bien autorisé en écriture pour ftpuser.

5. Suivi de l'activité du serveur

Le suivi se fait par la commande pure-ftpwho.

Dans la sortie on y trouve le PID, l'utilisateur, la durée, la vitesse, son action, le fichier et l'adresse IP de l'utilisateur.

On trouve également des infos dans /var/log/messages (sauf si syslogd a été configuré différemment).

[root@rainbow ~]# tail -f /var/log/messages | grep ftp
Jun 25 16:36:40 localhost pure-ftpd: (?@192.168.0.105) [INFO] New connection from 192.168.0.105
Jun 25 16:36:40 localhost pure-ftpd: (?@192.168.0.105) [INFO] upload is now logged in

6. Activation du service au démarrage

[root@rainbow ~]# chkconfig pure-ftpd on

7. Conclusion

Pure-ftpd est un serveur ftp très complet. Il se configure en quelques minutes. Il permet de mettre en place un serveur ftp très facilement sans toutefois négliger l'aspect sécuritaire (chroot, TLS, ...).
Par ailleurs, le respect des RFC concernant le protocole ftp est un gage de qualité.

8. Troubleshooting

En cas de dysfonctionnement, il faut regarder dans /var/log/messages. Le firewall de la Fedora bloque par défaut les ports utilisés par ftp (20 et 21), il faut penser à le configurer. Si le serveur ftp doit être utilisé derrière un routeur, il faut penser à faire une translation de port.
Attention également aux modes actif et passif.
En cas de problème de connexion, il faut essayer en local, puis depuis une machine dans le LAN et terminer enfin par une machine sur l'Internet afin de vérifier ou le blocage se situe.


Pour aller plus loin:

- Documentation sur le site de pure-ftpd
- Module Webmin pour Pure-ftpd
- Ajout d'une "fortune" (citation) au login des utilisateurs:

yum install fortune-bashfr --enablerepo=drpixel

Dans le fichier de conf, on modifie la variable FortunesFile

FortunesFile              /usr/share/games/fortune/bashfr_fortunes

Pure-ftpd doit être redémarrer

[root@rainbow ~]# service pure-ftpd restart

Voici le résultat :

[drpixel@rainbow SPECS]$ ftp localhost
Connected to rainbow.home.lan.
220 - - Welcome to Pure-FTPd [privsep] [TLS] - -
220-You are user number 1 of 10 allowed.
220-<<
220-<Avalon> j'ai même un anti virus que des hackers americain ont fait eux meme
220-<Avalon> ca s'appelle fire wall
220--- http://bashfr.org/?586
220->>

Beau résultat ! On peut bien entendu s'en tenir aux fortunes standard fournit par Fedora (yum install fortune-mod)