Sous Linux, il existe de nombreux serveurs FTP. Les deux plus connus étant « proftpd » et « wu-ftpd ». J’ai choisi « Pure-FTPd », pour plusieurs raisons :
Il est réputé pour être sécurisé
Il dispose de beaucoup de fonctionnalités et d’options
Il est facile à configurer et à paramétrer
Il est possible de le connecter à MySQL ou à OpenLDAP pour la gestion des utilisateurs. Cela permet de mettre en place une interface Web pour le configurer et gérer les utilisateurs.
Installation classique de Pure-FTPd
Dans un premier temps, j’ai choisi de faire une installation classique de « Pure-FTPd » (sans le lien avec MySQL), pour me faire la main avec ce logiciel :
# aptitude install pure-ftpd
Remarque : Lors de l’installation, il faut choisir entre le mode « inetd » et « Serveur autonome ». J’ai choisi « Serveur autonome », car mon poste ne fera que cela et ce mode offre plus de possibilités de configuration (ex : Limitation des connexions selon l’IP).
Ensuite, j’ai choisi de ne pas autoriser le programme « pure-ftpwho » à s’exécuter avec les droits du super-utilisateur ».
Premier test avec les utilisateurs du système
Par défaut « Pure-FTPd » est directement fonctionnel avec les utilisateurs du système. Pour le tester, il suffit de se connecter sur l’adresse du serveur avec n’importe quel client ftp:
$ ftp AdresseDeMonServeur
Le répertoire ftp utilisé par défaut correspond au home de l’utilisateur.
Configuration
La configuration de « pure-ftpd » est assez spéciale, car elle utilise des paramètres passés en ligne de commande. Par exemple, par défaut la ligne de commande ressemble à :
Cependant pour faciliter ou améliorer la compréhension de la configuration, « pure-ftpd » utilise un fichier de configuration par option de la ligne de commande. Ces fichiers sont enregistrés dans le dossier « /etc/pure-ftpd/conf ». Ensuite, le programme « pure-ftpd-wrapper » se charge automatiquement de lire ces fichiers de configuration pour modifier les paramètres de la ligne de commande.
Par exemple, il est possible de modifier le nom du fichier contenant les logs en modifiant le fichier « /etc/pure-ftpd/conf/AltLog ». Pour prendre en compte la modification dans les fichiers de configuration, il faut lancer la commande suivante :
# /etc/init.d/pure-ftpd force-reload
Pour avoir la liste des fichiers de configuration qu’il est possible de créer ou de modifier et la syntaxe pour les renseigner, il faut faire « man pure-ftpd-wrapper ». Il faut faire attention à la case des caractères lors de la création des fichiers. Chaque fichier correspondant à une option de configuration que vous retrouverez au chapitre « Annexe » de ce document.
Par exemple, en créant le fichier « /etc/pure-ftpd/conf/ChrootEveryone » et en mettant « yes » sur sa première ligne, cela permet de « Chrooter » les utilisateurs. Pour info, cela ajoutera le paramètre « -A » sur la ligne de commandes après avoir rechargé la configuration.
Dans mon cas, j’ai créé les fichiers suivant :
Fichiers
Contenu
/etc/pure-ftpd/conf/ChrootEveryone
yes
/etc/pure-ftpd/conf/CreateHomeDir
Yes
/etc/pure-ftpd/conf/MaxDiskUsage
80
Création d’utilisateurs virtuels
Dans mon cas, je souhaite que les comptes du système soient dissociés des comptes d’accès au serveur FTP. Dans ce cas, il faut donc créer des utilisateurs virtuels.
Il faut donc commencer par créer un vrai compte système mais sans accès à celui-ci :
Ensuite, il faut créer les utilisateurs virtuels avec la commande suivante :
# pure-pw useradd toto -u ftpuser -d /LeDossierDeToto
Remarque : Le dossier « LeDossierDeToto » indiqué sera créé automatiquement à la première connexion si le fichier « /etc/pure-ftpd/conf/CreateHomeDir » contient « yes »
Il est possible de changer le mot de passe avec la commande suivante :
# pure-pw passwd toto
Il est possible de modifier un utilisateur avec la commande suivante :
# pure-pw usermod toto -d /UnautreDossierPourToto
Il est possible également de modifier directement le fichier « /etc/pure-ftpd/pureftpd.passwd »
ATTENTION : Après chaque création ou modification d’un utilisateur, il faut générer la base de données avec la commande suivante :
# pure-pw mkdb
Pour finir, il faut créer un lien symbolique pour activer l’authentification des utilisateurs virtuels :
# cd /etc/pure-ftpd/auth/
# ln -s ../conf/PureDB 50puredb
Remarque : Le dossier « /etc/pure-ftpd/auth/ » contient un lien symbolique pour chaque méthode d’authentification acceptée. Pour désactiver l’accès FTP aux comptes du système Linux, il faut mettre « no » dans le fichier « /etc/pure-ftpd/conf/PAMAuthentication » et recharger la configuration.
Gérer les utilisateurs de Pure-FTPd dans MySQL
Il faut commencer par créer un fichier de configuration lisible uniquement par root (chmod 600) pour des raisons de sécurité.
Ce fichier de configuration peut être enregistré n’importe où comme dans :
/etc/pureftpd-mysql.conf .
Exemple de fichier de configuration :
#MYSQLServer localhost
#MYSQLPort 3306
MYSQLSocket /tmp/mysql.sock
MYSQLUser root
MYSQLPassword rootpw
MYSQLDatabase pureftpd
MYSQLCrypt cleartext
MYSQLGetPW SELECT Password FROM users WHERE User="\L"
MYSQLGetUID SELECT Uid FROM users WHERE User="\L"
MYSQLGetGID SELECT Gid FROM users WHERE User="\L"
MYSQLGetDir SELECT Dir FROM users WHERE User="\L"
Ensuite, il faut lancer pure-ftpd avec l’option suivante :
Il est possible de mélanger une authentification avec MySQL et sur les comptes Unix :
# /usr/local/bin/pure-ftpd -login mysql:/etc/pureftpd-mysql.conf use -login unix
Pure-FTPd est très flexible et les utilisateurs peuvent être stockés dans une table SQL quelconque. Il faut simplement qu’elle contienne les informations suivantes :
Le login de l’utilisateur
Le mot de passe stocké au format : plaintext, MD5, crypt()ed ou MySQL’s password()
l’uid système sous forme numérique ou alphanumérique
le gid système sous forme numérique ou alphanumérique
Le chemin du répertoire utilisateur.
Voici un exemple de description de table :
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)
);
En fonction du nom de la table et des champs, il faut donc adapter le fichier de configuration « pureftpd-mysql.conf » :
MYSQLGetPW SELECT Password FROM users WHERE User="\L"
MYSQLGetUID SELECT Uid FROM users WHERE User="\L"
MYSQLGetGID SELECT Gid FROM users WHERE User="\L"
MYSQLGetDir SELECT Dir FROM users WHERE User="\L"
Pour chaque query, il faut utiliser les codes suivants :
\L représente le login
\I représente l’adresse IP du client
\P représente le port de connexion
\R représente l’adresse IP du client
Il est possible d’utiliser les codes précédents dans les requêtes SQL pour retrouver la bonne information.
Il est possible de supprimer les uid et gid des champs des tables et d’utiliser des valeurs par défaut avec les lignes suivantes dans le fichier « pureftpd-mysql.conf ». Exemple :
MYSQLDefaultUID 1000
MYSQLDefaultGID 1000
Il existe d’autres options facultatives :
MySQLGetQTAFS permet de déterminer le nombre de fichiers qu’un utilisateur peut enregistrer dans son dossier. Exemple :
MySQLGetQTAFS SELECT QuotaFiles FROM users WHERE User="\L" MySQLGetQTASZ permet de limiter la taille maximum en Mo, qu’un utilisateur peut mettre dans son dossier. Exemple :
MySQLGetQTASZ SELECT QuotaSize FROM users WHERE User="\L"
Il y a également deux options pour les ratios :
MySQLGetRatioUL SELECT ULRatio FROM users WHERE User="\L"
MySQLGetRatioDL SELECT DLRatio FROM users WHERE User="\L"
Deux options pour limiter la bande passante à l’upload et au dowload en KB/s :
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L"
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L"
Par défaut et pour des raisons de sécurité, il n’est pas possible de mettre un user "root" ou un iud/id à 0 comme utilisateur dans MySQL.
Annexe : Détail des switches de Pure-FTPd
Option CourteOption Gnu
Commentaire
-0—notruncate
Cette option permet de renommer automatiquement un fichier si un autre du même nom existe déjà sur le serveur.Cette option est incompatible avec les "Quotas virtuels"
-1—logpid
Log le PID de chaque session dans Syslog
-4—ipv4only
Écoute uniquement les connections IP V4
-6—ipv6only
Écoute uniquement les connections IP V6
-a —trustedgid
Seulement les membre du groupe peuvent se connecter.
-A—chrooteveryone
Chroot tous les utilisateurs
-B—daemonize
Démarrer le serveur en mode Standalone (en daémon)
-c —maxclientsnumber
Autorise au maximum clients à se connecter simultanément au serveur (Défaut = 50)
-C —maxclientsperip
Nombre maximum de connexions simultanées par client (adresse IP)
-d—verboselog
Envoie des messages de débugage dans Syslog (A utiliser seulement en cas de problème)Pour avoir également les log de réponses, il faut doubler ce paramètre.
-D—displaydotfiles
Affiche les fichiers commençant par un point (Paramètre à activer pour les puristes et à désactiver pour les simples utilisateurs)
-e—anonymousonly
Autorise uniquement les utilisateurs anonymes. A utiliser uniquement pour les sites FTP publiques.
-E—noanonymous
Autorise uniquement les utilisateurs authentifiés. Les utilisateurs anonymes sont interdits.
-f —syslogfacility
Indique la « facility » à utiliser pour syslog (Défaut = local2). « -f none » permet de désactiver les logs.
-F —fortunesfile
Affiche une ligne de texte aléatoire à la connexion en provenance du fichier « fortune file » (ex : Astuce du jour). Pour afficher un texte à la connexion, il faut également utiliser cette option.
-g —pidfile
Change l’adresse du fichier pid quand l serveur est exécuté en mode standalone. (Défaut = /var/run/pure-ftpd.pid)
-H —dontresolve
Par défaut, les noms pleinement qualifiés sont logués en faisant une requête DNS inverse sur l’adresse IP. Cette option permet d’éviter de rechercher le nom pleinement qualifié dans le but d’accélérer le temps de connexion. Cette option est donc conseillée pour les sites publiques très chargés.
-i —anonymouscantupload
Interdit l’accès en écriture sur le serveur (upload) pour les utilisateurs anonymes.
-I —maxidletime
Change la durée de connexion maximum en minutes (Défaut = 15)
-j—createhomedir
Crée automatiquement le home de l’utilisateur s’il n’existe pas.
-k —MaxDiskUsage
Interdit les chargements sur le serveur (upload) si la partition utilisée est chargée à plus de
-K—keepallfiles
Autorise les utilisateurs à charger des fichiers sur le serveur, mais les interdit de les renommer ou les supprimer.
-l —login or :
Ajoute une nouvelle règle d’authentification.
-L :—limitrecursion
Cette option permet d’éviter le nombre de fichiers listes et le nombre de niveau de recherches pour éviter les déni de services.(Défaut = 2000 fichiers et 5 niveaux de répertoire)
-m —maxload
Interdit les téléchargements anonymes si la charge du CPU atteint
-M—anonymouscancreatedirs
Autorise les utilisateurs anonymes à créer des répertoires.
-n :
Si le serveur supporte les quotas virtuels, cette option permet de les configurer
-N—natmode
Mode NAT
-O :—altlog :
Enregistre les logs des fichiers transférés dans un fichier spécifique. Plusieurs formats sont supportés : CLF (Apache-like), Stats, W3C and xferlog.Par exemple le format "Stats" ressemble à :
-p :—passiveportrange
Permet de modifier les ports sur lesquels le serveur Écoute
-P —forcepassiveip
Force l’adresse IP ou le nom de la machine pour le retour
-q :—anonymousratio :
Active les ratios pour les utilisateurs anonymes
-Q :—userratio :
Active les ratios pour tous les utilisateurs
-r—autorename
Ne jamais écraser un fichier existant. Le fichier est automatiquement renommé si c’est nécessaire.
-R—nochmod
Interdit aux utilisateurs d’utiliser les commandes CHMOD
-s—antiwarez
Interdit aux utilisateur anonymes de télécharger des fichiers
-T —userbandwidth or [] :[]
Active la limitation de la bande passante en kilobytes/seconds. Il est possible d’avoir une bande passante différente avec la syntaxe "-t [] :[]"
-t —anonymousbandwidth
Active la limitation de la bande passante en kbps pour les utilisateurs anonymes. Il est possible d’avoir une bande passante différente avec la syntaxe "-t [] :[]"
-u —minuid
Interdit les accès pour les utilisateurs ayant un uid inférieur à celui indiqué.
-U :—umask :
Change le mask de création des dossiers et des fichiers. (Défaut = 133.022)
-V —trustedip
Autorise les accès non anonymes seulement pour l’adresse IP spécifiée. Les autres adresses IP auront un accès anonyme.
-x—prohibitdotfileswrite
Interdit les utilisateurs anonymes à écrire des fichiers commençant par un point.
-X—prohibitdotfilesread
Interdit les utilisateurs anonymes à lire et écrire des fichiers commençant par un point.
-y : —peruserlimits :
Permet de limiter le nombre de sessiond simultanées qu’un utilisateur peut ouvrir (Défaut = 0 = illimités)
-z —allowdotfiles
Autorise les utilisateurs anonymes à lire les fichiers et les dossiers commençant par un point.
Exemple :
# /usr/local/sbin/pure-ftpd -y 3:20 -c 15 -C 5 -B 3 connexions maximum pour le même utilisateur
20 connexions maximum pour les utilisateurs anonymes
15 sessions maximum
5 connections maximum pour la même adresse IP du client
Serveur en mode daemon
Site réalisé sous Spip.
Merci à NFrance pour son hébergement gracieusement offert.
Tous les articles de ce site sont sous licence Creative Commons by-nc-sa (CC).