<h2>But de ce document</h2>
<p class="spip">Ce document me sert de mémo pour <strong class="spip">installer le serveur FTP « Pure-FTPd </strong> » sur une Debian stable (Sarge).</p>

<h2>Pré-requis</h2>
<p class="spip">Avoir installé une Debian Sarge de Base :
<br /></p>
<li> cf mon autre document sur ce sujet : <a href="http://www.coagul.org/article.php3?id_article=337" class="spip_out">http://www.coagul.org/article.php3 ?id_article=337</a>
<h2>Choix d’un serveur FTP</h2>
<p class="spip">Sous Linux, il existe de nombreux serveurs FTP. Les deux plus connus étant « <strong class="spip"> proftpd </strong> » et « <strong class="spip">wu-ftpd</strong> ». J’ai choisi « <strong class="spip">Pure-FTPd</strong> », pour plusieurs raisons :
<br /></p>
<li> Il est réputé pour être sécurisé
<br /><li> Il dispose de beaucoup de fonctionnalités et d’options
<br /><li> Il est facile à configurer et à paramétrer
<br /><li> 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.
<h2>Installation classique de Pure-FTPd</h2>
<p class="spip">Dans un premier temps, j’ai choisi de faire une installation classique de « <strong class="spip">Pure-FTPd</strong> » (sans le lien avec MySQL), pour me faire la main avec ce logiciel :</p>

<p class="spip"><code class='spip_code' dir='ltr'># aptitude install pure-ftpd        </code></p>

<p class="spip">Remarque : Lors de l’installation, il faut choisir entre le mode « <strong class="spip"> inetd </strong> » 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).</p>

<p class="spip">Ensuite, j’ai choisi de ne pas autoriser le programme « pure-ftpwho » à s’exécuter avec les droits du super-utilisateur ».</p>

<h2>Premier test avec les utilisateurs du système</h2>
<p class="spip">Par défaut « <strong class="spip">Pure-FTPd</strong> » 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:</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ ftp AdresseDeMonServeur</code></p>

<p class="spip">Le répertoire ftp utilisé par défaut correspond au home de l’utilisateur.</p>

<h2>Configuration</h2>
<p class="spip">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 à :</p>

<p class="spip"><code class='spip_code' dir='ltr'>pure-ftpd -l pam -u 1000 -E -O clf:/var/log/pure-ftpd/transfer.log -B</code></p>

<p class="spip">Cependant pour faciliter ou améliorer la compréhension de la configuration, « <strong class="spip">pure-ftpd</strong> » utilise un fichier de configuration par option de la ligne de commande. Ces fichiers sont enregistrés dans le dossier « <strong class="spip">/etc/pure-ftpd/conf</strong> ». Ensuite, le programme « <strong class="spip">pure-ftpd-wrapper</strong> » se charge automatiquement de lire ces fichiers de configuration pour modifier les paramètres de la ligne de commande.</p>

<p class="spip">Par exemple, il est possible de modifier le nom du fichier contenant les logs en modifiant le fichier « <strong class="spip">/etc/pure-ftpd/conf/AltLog</strong> ». Pour prendre en compte la modification dans les fichiers de configuration, il faut lancer la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'># /etc/init.d/pure-ftpd force-reload</code></p>

<p class="spip">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.</p>

<p class="spip">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.</p>

<p class="spip">Dans mon cas, j’ai créé les fichiers suivant :</p>

<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Fichiers</strong></th><th scope='col'><strong class="spip">Contenu</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>/etc/pure-ftpd/conf/ChrootEveryone</td><td>yes</td></tr>
<tr class="row_odd"><td>/etc/pure-ftpd/conf/CreateHomeDir</td><td>Yes</td></tr>
<tr class="row_even"><td>/etc/pure-ftpd/conf/MaxDiskUsage</td><td>80</td></tr>
</tbody>
</table>
<h2>Création d’utilisateurs virtuels</h2>
<p class="spip">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.</p>

<p class="spip">Il faut donc commencer par créer un vrai compte système mais sans accès à celui-ci :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># groupadd ftpgroup<br />
# useradd -g ftpgroup -d /dev/null -s /etc ftpuser</code></div>
<p class="spip">Ensuite, il faut créer les utilisateurs virtuels avec la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'># pure-pw useradd toto -u ftpuser -d /LeDossierDeToto</code></p>

<p class="spip">Remarque : Le dossier « LeDossierDeToto » indiqué sera créé automatiquement à la première connexion si le fichier « /etc/pure-ftpd/conf/CreateHomeDir » contient « yes »</p>

<p class="spip">Il est possible de changer le mot de passe avec la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'># pure-pw passwd toto</code></p>

<p class="spip">Il est possible de modifier un utilisateur avec la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'># pure-pw usermod toto -d /UnautreDossierPourToto</code></p>

<p class="spip">Il est possible également de modifier directement le fichier « /etc/pure-ftpd/pureftpd.passwd »</p>

<p class="spip"><strong class="spip">ATTENTION</strong> : Après chaque création ou modification d’un utilisateur, il faut générer la base de données avec la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'># pure-pw mkdb</code></p>

<p class="spip">Pour finir, il faut créer un lien symbolique pour activer l’authentification des utilisateurs virtuels :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># cd /etc/pure-ftpd/auth/<br />
# ln -s ../conf/PureDB 50puredb</code></div>
<p class="spip">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.</p>

<h2>Gérer les utilisateurs de Pure-FTPd dans MySQL</h2>
<p class="spip">Il faut commencer par créer un fichier de configuration lisible uniquement par root (chmod 600) pour des raisons de sécurité.</p>

<p class="spip">Ce fichier de configuration peut être enregistré n’importe où comme dans :
<br /></p>
<li> /etc/pureftpd-mysql.conf .
<p class="spip">Exemple de fichier de configuration :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>#MYSQLServer    localhost<br />
#MYSQLPort      3306<br />
MYSQLSocket     /tmp/mysql.sock<br />
MYSQLUser       root<br />
MYSQLPassword   rootpw<br />
MYSQLDatabase   pureftpd<br />
MYSQLCrypt      cleartext<br />
MYSQLGetPW      SELECT Password FROM users WHERE User="\L"<br />
MYSQLGetUID     SELECT Uid FROM users WHERE User="\L"<br />
MYSQLGetGID     SELECT Gid FROM users WHERE User="\L"<br />
MYSQLGetDir     SELECT Dir FROM users WHERE User="\L"</code></div>
<p class="spip">Ensuite, il faut lancer pure-ftpd avec l’option suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'># /usr/local/bin/pure-ftpd -login mysql:/etc/pureftpd-mysql.conf </code></p>

<p class="spip">Il est possible de mélanger une authentification avec MySQL et sur les comptes Unix :</p>

<p class="spip"><code class='spip_code' dir='ltr'># /usr/local/bin/pure-ftpd -login mysql:/etc/pureftpd-mysql.conf use -login unix</code></p>

<p class="spip">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 :
<br /></p>
<li> Le login de l’utilisateur
<br /><li> Le mot de passe stocké au format : plaintext, MD5, crypt()ed ou MySQL’s password()
<br /><li> l’uid système sous forme numérique ou alphanumérique
<br /><li> le gid système sous forme numérique ou alphanumérique
<br /><li> Le chemin du répertoire utilisateur.
<p class="spip">Voici un exemple de description de table :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>CREATE TABLE users (<br />
  User varchar(16) NOT NULL default '',<br />
  Password varchar(64) NOT NULL default '',<br />
  Uid varchar(11) NOT NULL default '',<br />
  Gid varchar(11) NOT NULL default '',<br />
  Dir varchar(128) NOT NULL default '',<br />
  PRIMARY KEY  (User)<br />
);<br />
</code></div>
<p class="spip">En fonction du nom de la table et des champs, il faut donc adapter le fichier de configuration « pureftpd-mysql.conf » :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>MYSQLGetPW   SELECT Password FROM users WHERE User="\L"<br />
MYSQLGetUID  SELECT Uid FROM users WHERE User="\L"<br />
MYSQLGetGID  SELECT Gid FROM users WHERE User="\L"<br />
MYSQLGetDir  SELECT Dir FROM users WHERE User="\L"</code></div>
<p class="spip">Pour chaque query, il faut utiliser les codes suivants :
<br /></p>
<li> \L représente le login
<br /><li> \I représente l’adresse IP du client 
<br /><li> \P représente le port de connexion
<br /><li> \R représente l’adresse IP du client
<p class="spip">Il est possible d’utiliser les codes précédents dans les requêtes SQL pour retrouver la bonne information.</p>

<p class="spip">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 :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>MYSQLDefaultUID 1000<br />
MYSQLDefaultGID 1000</code></div>
<p class="spip">Il existe d’autres options facultatives :
<br /></p>
<li> MySQLGetQTAFS permet de déterminer le nombre de fichiers qu’un utilisateur peut enregistrer dans son dossier. Exemple :
<p class="spip"><code class='spip_code' dir='ltr'>MySQLGetQTAFS  SELECT QuotaFiles FROM users WHERE User="\L"</code>
<br /></p>
<li> MySQLGetQTASZ permet de limiter la taille maximum en Mo, qu’un utilisateur peut mettre dans son dossier. Exemple :
<p class="spip"><code class='spip_code' dir='ltr'>MySQLGetQTASZ  SELECT QuotaSize FROM users WHERE User="\L"</code></p>

<p class="spip">Il y a également deux options pour les ratios :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>MySQLGetRatioUL SELECT ULRatio FROM users WHERE User="\L"<br />
MySQLGetRatioDL SELECT DLRatio FROM users WHERE User="\L"</code></div>
<p class="spip">Deux options pour limiter la bande passante à l’upload et au dowload en KB/s :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L"<br />
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L"</code></div>
<p class="spip">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.</p>

<h2>Annexe : Détail des switches de Pure-FTPd</h2>
<table class="spip">
<tbody>
<tr class="row_even"><td><strong class="spip">Option Courte</strong><strong class="spip">Option Gnu</strong></td><td><strong class="spip">Commentaire</strong></td></tr>
<tr class="row_odd"><td>-0&mdash;notruncate</td><td>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"</td></tr>
<tr class="row_even"><td>-1&mdash;logpid  </td><td>Log le PID de chaque session dans Syslog</td></tr>
<tr class="row_odd"><td>-4&mdash;ipv4only</td><td>Écoute uniquement les connections IP V4</td></tr>
<tr class="row_even"><td>-6&mdash;ipv6only</td><td>Écoute uniquement les connections IP V6</td></tr>
<tr class="row_odd"><td>-a <gid>&mdash;trustedgid <gid></td><td>Seulement les membre du groupe <gid> peuvent se connecter.</td></tr>
<tr class="row_even"><td>-A&mdash;chrooteveryone  </td><td>Chroot tous les utilisateurs</td></tr>
<tr class="row_odd"><td>-B&mdash;daemonize </td><td>Démarrer le serveur en mode Standalone (en daémon)</td></tr>
<tr class="row_even"><td>-c <Nb>&mdash;maxclientsnumber <Nb></td><td>Autorise au maximum <Nb> clients à se connecter simultanément au serveur (Défaut = 50)</td></tr>
<tr class="row_odd"><td>-C <Nb>&mdash;maxclientsperip</td><td>Nombre maximum de connexions simultanées par client (adresse IP)</td></tr>
<tr class="row_even"><td>-d&mdash;verboselog</td><td>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.</td></tr>
<tr class="row_odd"><td>-D&mdash;displaydotfiles </td><td>Affiche les fichiers commençant par un point (Paramètre à activer pour les puristes et à désactiver pour les simples utilisateurs) </td></tr>
<tr class="row_even"><td>-e&mdash;anonymousonly </td><td>Autorise uniquement les utilisateurs anonymes. A utiliser uniquement pour les sites FTP publiques.</td></tr>
<tr class="row_odd"><td>-E&mdash;noanonymous</td><td>Autorise uniquement les utilisateurs authentifiés. Les utilisateurs anonymes sont interdits.</td></tr>
<tr class="row_even"><td>-f <facility>&mdash;syslogfacility <facility></td><td>Indique la « facility » à utiliser pour syslog (Défaut = local2). « -f none » permet de désactiver les logs.</td></tr>
<tr class="row_odd"><td>-F <fortune file>&mdash;fortunesfile <file></td><td>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.</td></tr>
<tr class="row_even"><td>-g <pid file>&mdash;pidfile <path to pid file></td><td>Change l’adresse du fichier pid quand l serveur est exécuté en mode standalone. (Défaut = /var/run/pure-ftpd.pid)</td></tr>
<tr class="row_odd"><td>-H &mdash;dontresolve</td><td>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.</td></tr>
<tr class="row_even"><td>-i &mdash;anonymouscantupload</td><td>Interdit l’accès en écriture sur le serveur (upload) pour les utilisateurs anonymes.</td></tr>
<tr class="row_odd"><td>-I <timeout>&mdash;maxidletime <time (min)></td><td>Change la durée de connexion maximum en minutes (Défaut = 15)</td></tr>
<tr class="row_even"><td>-j&mdash;createhomedir</td><td>Crée automatiquement le home de l’utilisateur s’il n’existe pas.</td></tr>
<tr class="row_odd"><td>-k <pourcentage>&mdash;MaxDiskUsage       <pourcentage></td><td>Interdit les chargements sur le serveur (upload) si la partition utilisée est chargée à plus de <pourcentage></td></tr>
<tr class="row_even"><td>-K&mdash;keepallfiles</td><td>Autorise les utilisateurs à charger des fichiers sur le serveur, mais les interdit de les renommer ou les supprimer.</td></tr>
<tr class="row_odd"><td>-l <authentication>&mdash;login <auth> or <auth> :<config file></td><td>Ajoute une nouvelle règle d’authentification.</td></tr>
<tr class="row_even"><td>-L <max files> :<max depth>&mdash;limitrecursion        <number:number></td><td>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)</td></tr>
<tr class="row_odd"><td>-m <cpu load>&mdash;maxload <load></td><td>Interdit les téléchargements anonymes si la charge du CPU atteint <cpu load></td></tr>
<tr class="row_even"><td>-M&mdash;anonymouscancreatedirs    </td><td>Autorise les utilisateurs anonymes à créer des répertoires.</td></tr>
<tr class="row_odd"><td>-n <max files> :<max size></td><td>Si le serveur supporte les quotas virtuels, cette option permet de les configurer</td></tr>
<tr class="row_even"><td>-N&mdash;natmode</td><td>Mode NAT</td></tr>
<tr class="row_odd"><td>-O <format> :<log file>&mdash;altlog <format> :<log file></td><td>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 à :<date> <session id> <user> <ip> <U or D> <size> <duration> <file></td></tr>
<tr class="row_even"><td>-p <first port> :<last port>&mdash;passiveportrange <minport:maxport></td><td>Permet de modifier les ports sur lesquels le serveur Écoute</td></tr>
<tr class="row_odd"><td>-P <ip address or host name>&mdash;forcepassiveip <ip></td><td>Force l’adresse IP ou le nom de la machine pour le retour</td></tr>
<tr class="row_even"><td>-q <upload ratio> :<download ratio>&mdash;anonymousratio <upload> :<download></td><td>Active les ratios pour les utilisateurs anonymes</td></tr>
<tr class="row_odd"><td>-Q <upload ratio> :<download ratio>&mdash;userratio <upload> :<download></td><td>Active les ratios pour tous les utilisateurs</td></tr>
<tr class="row_even"><td>-r&mdash;autorename</td><td>Ne jamais écraser un fichier existant. Le fichier est automatiquement renommé si c’est nécessaire.</td></tr>
<tr class="row_odd"><td>-R&mdash;nochmod</td><td>Interdit aux utilisateurs d’utiliser les commandes CHMOD</td></tr>
<tr class="row_even"><td>-s&mdash;antiwarez </td><td>Interdit aux utilisateur anonymes de télécharger des fichiers</td></tr>
<tr class="row_odd"><td>-T <bandwidth>&mdash;userbandwidth         <kbps> or [<up bw>] :[<down bw>]</td><td>Active la limitation de la bande passante en  kilobytes/seconds. Il est possible d’avoir une bande passante différente avec la syntaxe  "-t [<upload>] :[<download>]"</td></tr>
<tr class="row_even"><td>-t <bandwidth>&mdash;anonymousbandwidth    <kbps></td><td>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 [<upload>] :[<download>]"</td></tr>
<tr class="row_odd"><td>-u <uid>&mdash;minuid <uid></td><td>Interdit les accès pour les utilisateurs ayant un uid inférieur à celui indiqué.</td></tr>
<tr class="row_even"><td>-U <umask for files> :<umask for dirs>&mdash;umask <mask> :<mask></td><td>Change le mask de création des dossiers et des fichiers. (Défaut = 133.022)</td></tr>
<tr class="row_odd"><td>-V <ip address>&mdash;trustedip <ip></td><td>Autorise les accès non anonymes seulement pour l’adresse IP spécifiée. Les autres adresses IP auront un accès anonyme.</td></tr>
<tr class="row_even"><td>-x&mdash;prohibitdotfileswrite </td><td>Interdit les utilisateurs anonymes à écrire des fichiers commençant par un point.</td></tr>
<tr class="row_odd"><td>-X&mdash;prohibitdotfilesread  </td><td>Interdit les utilisateurs anonymes à lire et écrire des fichiers commençant par un point.</td></tr>
<tr class="row_even"><td>-y <max user logins> :<max anonymous logins> &mdash;peruserlimits <max> :<max></td><td>Permet de limiter le nombre de sessiond simultanées qu’un utilisateur peut ouvrir (Défaut = 0 = illimités)</td></tr>
<tr class="row_odd"><td>-z &mdash;allowdotfiles</td><td>Autorise les utilisateurs anonymes à lire les fichiers et les dossiers commençant par un point.</td></tr>
</tbody>
</table>
<p class="spip">Exemple :</p>

<p class="spip"><code class='spip_code' dir='ltr'># /usr/local/sbin/pure-ftpd -y 3:20 -c 15 -C 5 -B</code>
<br /></p>
<li> 3 connexions maximum pour le même utilisateur
<br /><li> 20 connexions maximum pour les utilisateurs anonymes 
<br /><li> 15 sessions maximum
<br /><li> 5 connections maximum pour la même adresse IP du client
<br /><li> Serveur en mode daemon
<h2>Autres liens</h2>
<p class="spip">La documentation officielle :
<br /></p>
<li> <a href="http://www.pureftpd.org/project/pure-ftpd/doc" class="spip_out">http://www.pureftpd.org/project/pure-ftpd/doc</a>
<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.1</td><td>16/11/05</td><td>Création par Tony GALMICHE</td></tr>
<tr class="row_odd"><td>0.2</td><td>20/08/06</td><td>Mise en ligne</td></tr>
</tbody>
</table>