Installation de Pure-FTP avec SSL et MySQL

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Pure-FTP est l'un des meilleurs logiciels serveur FTP, un excellent choix pour transférer des fichiers. Son niveau de sécurité est très bon, le paramétrage puissant. La prise en charge du SSL nous permettra de chiffrer les données transitant par Internet. Le fait qu'on puisse gérer les comptes grâce à une table MySQL sera très pratique pour automatiser plus tard la création des comptes.

Prérequis

  • Deux partitions dédiées au stockage et l'écriture des données.
  • Un certificat de sécurité
  • Apache, MySQL, PhpMyAdmin
  • plusieurs heures devant soi et du courage

En avant !

Structure de l'arborescence du FTP

Avant de se lancer dans l'installation du FTP, il faut s’interroger sur la structure qu'aura l' arborescence du FTP. Si l'on souhaite partager des médias, le plus simple est de dédier (au moins) une partition de grande taille à la lecture et d'ajouter une seconde partition plus petite dédiée à l'écriture, là où les utilisateurs pourrons uploader. Nous traiterons ce cas simple à titre d'exemple; il est possible par la suite d'ajouter des partitions.

Partition 1:

  • nom: sdb5
  • rôle: propose des médias en lecture seule.
  • contenu: trois répertoires de stockage, comme /logiciel, /film, /musique


Partition 2:

  • nom: sdb6
  • rôle: espace dédié à la lecture écriture.
  • contenu: un répertoire de stockage servant aux dépôts des utilisateurs, /depot

créons les répertoires nécessaires au montage de l'arborescence. Ceux sur lesquels seront montés les partitions... cd /mnt/ mkdir data mkdir depot

...et ajoutons ces lignes au fichier /etc/fstab pour monter les partitions au démarrage. #disques de stockage /dev/sdb5 /mnt/data ext3 user,rw,exec 0 0 /dev/sdb6 /mnt/depot ext3 user,rw,exec 0 0

Il faut maintenant intégrer les répertoires à la racine des deux partition à l’arborescence du ftp. Ceci se fait avec la puissante option bind du fichier /etc/fstab. Créons les répertoires cibles qui seront à la racine du ftp. cd /home/common/ mkdir ftp cd ftp mkdir logiciel; mkdir film; mkdir musique; mkdir depot

Puis ajoutons ces lignes au fichier fstab afin de monter l'arborescence au démarrage du serveur: #répertoires ftp avec option bind /mnt/data/logiciel /home/common/ftp/logiciel none bind 0 0 /mnt/data/film /home/common/ftp/film none bind 0 0 /mnt/data/musique /home/common/ftp/musique none bind 0 0 /mnt/depot/depot /home/common/ftp/depot none bind 0 0

Vérifier enfin si l'arborescence est correctement montée après redémarrage. shutdown -r now

Gestion des droits de l'arborescence de pure-ftp

Dans notre cas, les utilisateurs auront tous les mêmes droits: droit en lecture sur toute l'arborescence (sauf répertoire lost+find ) et droit en écriture dans le répertoire depot. Nous allons donc créer un nouvel utilisateur dans Debian muni de ces droits.

Pour ce faire on tape ce code: adduser pureftpd puis on répond aux questions ainsi: <pureftpd>, <pureftpd>, <pure-ftp>, <vide>, <vide>, <vide>, <vide>, o En consultant le fichier /etc/passwd, on peut relever l'Uid et le Gid de ce nouvel utilisateur. cat /etc/passwd Si l'utilisateur pureftpd est le deuxième à être créé, il lui est attribué les valeurs :Uid=1001 et Gid=1001. Ces valeurs serviront au moment des créations de compte ftp. Chaque compte paramétré avec ces Uid,Gid sera vu par le serveur comme le compte pureftpd.

Cette commande change le propriétaire du répertoire /mnt/depot de manière récursive. Le propriétaire devient l'utilisateur pureftpd, et le groupe root. Cela autorise l'écriture pour l'utilisateur du ftp. chown -R pureftpd:root /mnt/depot

Si on s’arrête là, les utilisateurs ont accès au répertoire lost+found. Ça n'est pas très propre. On corrige ce défaut avec la ligne suivante qui change le propriétaire de lost+found et le restitue au l'utilisateur root du groupe root. chown root:root /mnt/depot/lost+found

Préparation de l'installation, compilation et installation

D'abord nous allons télécharger les fichiers sources et les décompresser. Sur la page http://download.pureftpd.org/pub/pure-ftpd/releases/ est recensé les différentes version du logiciel. wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.36.tar.gz on décompresse ensuite l'archive obtenue. tar zxvf pure-ftpd-1.0.36.tar.gz

Après lecture de la doc officielle, http://download.pureftpd.org/pure-ftpd/doc/README , on installe les dépendances du logiciel: aptitude install libmysqlclient-dev libssl-dev build-essential

Puis on choisi les options de compilation qui nous intéresseront:

  • --with-tls : permet d'utiliser ce type de chiffrement
  • --with-certfile=/home/nomdedomaine.pem : indique au compilateur l'emplacement du certificat de chiffrement. Vérifier que le certificat nomdedomaine.pem est présent à l'emplacement indiqué.
  • --with-ftpwho: active la commande "ftp-who", pratique pour vérifier l'activité en temps réel
  • --with-language=french: défini le français comme langue
  • --with-mysql : les utilisateurs seront stocké dans une base MySQL
  • --with-cookie : permet d'utiliser un fichier fortunefile pour que le serveur affiche une phrase d'acceuil
  • --with-altlog: permet la journalisation dans différents formats, ceci sera utile plus tard au moment du monitoring.

On se place alors dans le répertoire des fichiers sources cd pure-ftpd-1.0.36 et on lance la compilation avec les options voulues: ./configure --with-tls --with-certfile=/home/nomdedomaine.pem --with-ftpwho --with-language=french --with-mysql --with-cookie --with-altlog Si tout s'est bien passé, on termine l’installation par un make puis enfin make install

Paramétrage MySQL

Il faut maintenant configurer l'accès à la base d'authentification. Concentrons nous d'abord sur le fichier de configuration /etc/pure-ftpd/db/mysql.conf.

Modifier ces lignes comme ceci pour définir un utilisateur, son mot de passe et le nom de la base: # Mandatory : user to bind the server as. MYSQLUser pureftpd

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

MYSQLPassword pureftpd

  1. Mandatory : database to open.

MYSQLDatabase pureftpd

et, pour maintenir un chiffrement des mot de passe tout en rendement possible la liaison que l'on aura a effectuer plus tard entre PhpBB et Pure-FTP, en choisi un chiffrement en md5: # Mandatory : how passwords are stored

  1. Valid values are : "cleartext", "crypt", "md5" and "password"
  2. ("password" = MySQL password() function)
  3. You can also use "any" to try "crypt", "md5" *and* "password"

MYSQLCrypt md5

Après ces changements on laisse le fichier mysql.conf.

Reste a créer la base. facile avec PhpMyAdmin.

  • nom de la base : pureftpd
  • nom de la table : pureftpd
  • Nombre de colonnes : 12
Paramètres de la base pureftpd
paramètre Type de variable
Nom type
User varchar(16)
status enum
Password varchar(64)
Uid varchar(11)
Gid varchar(11)
Dir varchar(128)
ULBandwidth smallint(5)
DLBandwidth smallint(5)
comment tinytext
ipaccess varchar(15)
QuotaSize smallint(5)
QuotaFiles int(11)

Pour finir, dans PhpMyAdmin, on créé un utilisateur pureftpd, mot de passe pureftpd, avec tout les droits sur la table, « tout cocher ».

Écriture et intégration d'un script de lancement du démon Pure-ftpd

Par soucis de commodité nous créons ce script dans le Bureau de l'utilisateur principal et nous le nommons pure-ftpd-startupscript. cd /hom/denis/Bureau nano pure-ftpd-startupscript Ce petit script comportera quatre lignes, la plus importante étant la ligne de commande de lancement de Prure-ftpd avec ses options. Ces trois autres lignes sont triviales: #!/bin/bash echo "lancement du daemon pure-ftpd"

echo "Fin du lancement de Pure-ftpd" On les colle dans pure-ftpd-startupscript et on enregistre les changements.

Le démon Pure-ftpd se lance via une ligne de commande qui est très puissante. Optimiser au mieux les options de cette ligne de commande nous permettra d'avoir un Pure-ftpd "sur mesure". La doc à consulter est toujours : http://download.pureftpd.org/pub/pure-ftpd/doc/README.

Voici un résumé des options qui nous intéressent le plus :

  • -c: nombre de clients simultanées. Dans notre cas on peut par exemple fixer la valeur à 50.
  • -A: Chroot everyone.
  • -B: en background (daemonization)
  • -C: nombre maximum de connexions par client. Choisir une valeur assez basse, par exemple 3, par mesure de sécurité, pour éviter qu'un utilisateur ne monopolise la bande passante montante du serveur.
  • -E: n'autorise que les utilisateurs authentifiés, interdit les connexions anonymes
  • -F: Fortune files, message d’accueil. Dans notre cas il se trouve ici : /home/common/fortunefile
  • -G: interdit le renommage
  • -K: autorise l'utilisateur à reprendre un upload mais lui interdit de l'effacer ou de le renommer
  • -l: méthode d'authentification et chemin vers le fichier de config de l'authentification. Dans notre cas, on active l'authentification msyql et on précise le chemin du fichier config comme ceci: mysql:/etc/pure-ftpd/db/mysql.conf
  • -O: Enregistre tout les transferts de fichiers dans un fichier journal particulier, dans un format alternatif. Quatre formats sont supportés: CLF (Apache-like), Stats, W3C and xferlog. Ici on peut rendre les logs de Pure-ftpd exploitables par AWStats avec la variable clf:/var/log/transfer.log .
  • -p: ports du mode passif . On choisi par exemple la plage de port 34343:34443.
  • -R: empêche les utilisateurs d'utiliser chmod
  • -Y: à 2, active l'explicite TLS

On obtiens donc la ligne de commande suivante: /usr/local/sbin/pure-ftpd -c 50 -A -B -C 3 -E -F /home/common/fortunefile -G -K -l mysql:/etc/pure-ftpd/db/mysql.conf -O clf:/var/log/transfer.log -p 34343:34443 -R -Y 2 & /!\ La rédaction de cette ligne de commande nécessite de la minutie. Il suffit d'une majuscule confondue avec une minuscule, un espace d'oublié pour générer une erreur. Les erreurs non fatales ne seront pas toujours signalées par un message d'erreur, mais le démon ne se lancera sans activer l'option erronée. Prudence donc. /!\

La version finale du fichier pure-ftpd-startupscript est donc: #!/bin/bash echo "lancement du daemon pure-ftpd" /usr/local/sbin/pure-ftpd -c 50 -A -B -C 3 -E -F /home/common/fortunefile -G -K -l mysql:/etc/pure-ftpd/db/mysql.conf -O clf:/var/log/transfer.log -p 34343:34443 -R -Y 2 & echo "Fin du lancement de Pure-ftpd" Rendre ce script executable: chmod +x pure-ftpd-startupscript L'intégration s'achève par l'ajout du lancement à la séquence de démarrage du serveur: cp pure-ftpd-startupscript /etc/init.d update-rc.d pure-ftpd-startupscript defaults

Dernier réglage: message d’accueil

Le dernier réglage concerne le message d'acceuil. Il suffit de créer le fichier/home/common/fortunefile et y enregistrer un texte de bienvenue. BIENVENUE sur le serveur FTP monsite.net

Le paramétrage est enfin fini. Passons à l'étape palpitante des tests.

Tester le fonctionnement de Pure-ftpd

Premier réflexe, redémarrer le système pour prendre en compte tout les réglages. shutdown -r now

Nous allons maintenant créer un compte de test. Plus haut nous avons paramétré Pure-ftp pour que le stockage du mot de passe sous forme de hash MD5. Nous avons donc besoin de calculer le hash MD5 du compte test. De nombreux sites internet proposent de le faire en ligne, dont celui ci: http://www.md5hashgenerator.com/index.php

  • mot de passe: test
  • hash md5: 098f6bcd4621d373cade4e832627b4f6

Ouvrons une session PhPMyAdmin et ouvrons la table pureftpd de la base pureftpd. Insérons une nouvelle ligne à remplir avec ces valeurs:

Paramètres du compte "test"
paramètre variable
User / varchar(16) test
status / enum 0
Password / varchar(64) 098f6bcd4621d373cade4e832627b4f6
Uid / varchar(11) 1001
Gid / varchar(11) 1001
Dir / varchar(128) /home/common/ftp
ULBandwidth / smallint(5) 0
DLBandwidth / smallint(5 0
comment / tinytext <vide>
ipccess / varchar(15) *
QuotaSize / smallint(5) 0
QuotaFiles / int(11) 0


Enregistrons cet utilisateur test. Le moment fatidique approche. A partir d'un poste du réseau local, ouvrons notre logiciel client FTP et paramétrons une nouvelle connexion ainsi:

Paramètres du compte "test" coté client ftp
paramètre variable
Hôte <adresse IP local du serveur FTP>
Port 21
Protocole FTP
Chiffrement Connexion FTP explicite sur TLS
Identifiant test
mot de passe test

Connectons nous maintenant au serveur ftp avec cette connexion. Si tout ce passe bien, on reçoit le certificat de sécurité qu'on doit valider, puis la connexion s'effectue, le message d’accueil s'affiche dans la console. La connexion établie, on peut lire tout les répertoires et uploader dans le répertoire /depot.

Conclusion

Une fois le système opérationnel, les utilisateurs ont un accès chiffré à votre serveur ftp. Le fait de gérer les comtpe sur une base MySQL permet aussi bien d'enregistrer des comptes automatiquement avec un code php que de les paramétrer manuellement en passant par PhpMyAdmin. Cependant, un problème de sécurité demeure: les mots de passe les plus faibles, stockés sous forme de hash MD5, ne résisterons pas au crackage.