Table des matières

Pure-FTPd

Pure-FTPd est un serveur FTP (File Transfer Protocol ou protocole de transfert de fichier en français) utilisant donc le protocole FTP est permettant de d'envoyer et télécharger des fichiers depuis/vers un serveur.

Pré-requis

On va installer la variante MySQL qui permet de créer des utilisateurs virtuels dans une base de données. Il vous faudra donc un serveur SQL fonctionnel. Il vous faudra également un nom de domaine ainsi qu'un certificat TLS lié à ce domaine.

Installation

Installez Pure-FTPd :

aptitude install pure-ftpd-common pure-ftpd-mysql quota quotatool

Création de la base de donnée

Lancez mysql :

sudo mysql

Créez la base de données :

CREATE DATABASE pureftpd;

Créez l'utilisateur pure-ftpd et donnez-lui tous les droits sur la base (changez “motdepasse” par le mot de passe de votre choix) :

GRANT ALL privileges ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'motdepasse';

Rechargez les droits :

FLUSH privileges;

Sélectionnez la base créée :

USE pureftpd;

Créez la table des utilisateurs :

CREATE TABLE `users` (
  `ID` INT(11) NOT NULL AUTO_INCREMENT,
  `User` VARCHAR(32) NOT NULL DEFAULT '',
  `Password` VARCHAR(64) NOT NULL DEFAULT '',
  `Uid` INT(3) NOT NULL DEFAULT '500',
  `Gid` INT(3) NOT NULL DEFAULT '500',
  `Dir` VARCHAR(255) NOT NULL DEFAULT '',
  `QuotaSize` INT(4) NOT NULL DEFAULT '50',
  `Status` enum('0','1') NOT NULL DEFAULT '1',
  `ULBandwidth` INT(2) NOT NULL DEFAULT '100',
  `DLBandwidth` INT(2) NOT NULL DEFAULT '100',
  `Date` DATE NOT NULL DEFAULT '0000-00-00',
  `LastModif` VARCHAR(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`ID`),
  UNIQUE KEY `User` (`User`),
  KEY `Uid` (`Uid`),
  KEY `Gid` (`Gid`),
  KEY `Dir` (`Dir`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

Sortez :

exit;

Configuration de Pure-FTPd

Les fichiers de configurations se trouvent dans le répertoire /etc/pure-ftpd/conf et la configuration de l'accès à la base se trouve dans /etc/pure-ftpd/db/mysql.conf.

Ouvrez le fichier mysql.conf :

sudo nano /etc/pure-ftpd/db/mysql.conf

La configuration de Pure-FTPd est un peu spéciale. Chaque fichier de configuration correspond à un seul paramètre. Rentrez les commandes suivantes, en root :

echo "2" > /etc/pure-ftpd/conf/TLS
echo "No" > /etc/pure-ftpd/conf/CreateHomeDir
echo "/etc/letsencrypt/live/votredomaine/fullchain.pem /etc/letsencrypt/live/votredomaine/privkey.pem" > /etc/pure-ftpd/conf/CertFileAndKey               
echo "Yes" > /etc/pure-ftpd/conf/NoAnonymous
echo "No" > /etc/pure-ftpd/conf/PAMAuthentication
echo "54000 64000" > /etc/pure-ftpd/conf/PassivePortRange
echo "Yes" > /etc/pure-ftpd/conf/ChrootEveryone
echo "HIGH" > /etc/pure-ftpd/conf/TLSCipherSuite

Explication des paramètres :

Si vous avez besoin que vos utilisateurs puissent suivre les liens symboliques, ouvrez le fichier /etc/default/pure-ftpd-common et modifier la valeur de VIRTUALCHROOT de “false” à “true”.

Il vous faudra ouvrir les ports 21 et 54000 à 64000 en TCP.

Redémarrez Pure-FTPd afin de prendre en compte ces modifications :

sudo systemctl restart pure-ftpd-mysql.service

Création d'un utilisateur virtuel

Je vous conseille l'utilisation de phpMyAdmin pour la création d'un utilisateur. Insérez une nouvelle ligne dans la table users comme suit :

Je vais détailler les paramètres les moins compréhensible (User et Password, j'imagine que tout le monde a compris que c'est le nom d'utilisateur et le mot de passe) :

Pensez bien à sélectionner la fonction “Encrypt” pour le mot de passe, sinon vous ne pourrez pas vous connectez.

Gérer le multi-domaine

Tout ce qui suit est inutile si vous n'utilisez qu'un seul nom de domaine pour vous connecter à votre serveur FTP. Si vous avez plusieurs noms de domaine associés à votre serveur, cela va poser problème lors de connexion à Pure-FTPd car il ne gère qu'un certificat TLS, celui indiqué dans le fichier CertFileAndKey. Imaginons que vous avez 2 noms de domaine, domaine.fr et domaine.com. Si vous avez mis dans le fichier CertFileAndKey le certficat et la clé pour domaine.fr et que vous vous connectez en rentrant comme adresse du serveur domaine.com, vous aurez un message d'erreur car le certificat ne correspond pas à l'adresse du nom de domaine.

Pure-FTPd gère le multi-domaine via le programme pure-certd, mais il n'est fournit qu'à partir de la version 1.0.50 et c'est la version 1.0.49 qui est présente dans les dépôt Stable de Debian 11. Là vous avez 2 choix :

  1. Installer la version 1.0.50 présente dans les dépôts Testing. Vous allez vous retrouver avec des paquets provenant de Stable et d'autres de Testing, ce qui peut facilement provoquer des problèmes. Je déconseille donc cette méthode
  2. Recompiler la version 1.0.49 afin de rajouter le programme pure-certd. C'est la solution que nous allons choisir. Cette solution va nécessiter des certificats Let's Encrypt

Dépendances

Afin de pouvoir recompiler Pure-FTPd vous allez avoir besoin d'installer les programmes suivants :

sudo aptitude install apt-transport-https default-libmysqlclient-dev libcap-dev libldap2-dev libpam0g-dev libsodium-dev

Compilation de Pure-FTPd

Récupérez les sources :

apt source pure-ftpd-mysql

Rendez-vous dans le répertoire créé :

cd pure-ftpd-1.0.49

Ouvrez le fichier rules :

nano debian/rules

Pour ajouter le programme pure-certd, modifiez la ligne “sbin=” afin d'avoir comme suit :

sbin=pure-authd pure-ftpwho pure-uploadscript pure-quotacheck pure-ftpd pure-mrtginfo pure-certd

Lancez la configuration :

./configure --with-mysql --with-tls --with-everything

Puis la compilation :

dpkg-buildpackage -uc -us

Installez le paquet :

sudo dpkg -i ../pure-ftpd-mysql_1.0.49-4.1_amd64.deb

Configuration

Créez le fichier /bin/pure-cert-check.sh :

sudo nano /bin/pure-cert-check.sh

Ajoutez les lignes suivantes :

#!/bin/sh

#echo "$(env)" > /root/sni_log
echo 'action:strict'
echo 'cert_file:/etc/letsencrypt/live/'${CERTD_SNI_NAME}'/fullchain.pem'
echo 'key_file:/etc/letsencrypt/live/'${CERTD_SNI_NAME}'/privkey.pem'
echo 'end'

Ce script va servir à indiquer à Pure-FTPd quel certificat utiliser en fonction du nom de domaine utilisé pour la connexion.

Modifiez les droits pour que le propriétaire (root) puisse l'exécuter :

sudo chmod 700 /bin/pure-cert-check.sh

Ouvrez le fichier pure-ftpd-wrapper :

sudo nano /usr/sbin/pure-ftpd-wrapper

Après la ligne :

'NoTruncate' => ['-0'],

Ajoutez la ligne suivante :

'ExtCert' => [ '-3 %s', \&parse_string],

Ca va rajouter l'option ExtCert à Pure-FTPd.

Créez le fichier de configuration ExtCert et mettez comme valeur /var/run/ftpd-certs.sock :

echo "/var/run/ftpd-certs.sock" > /etc/pure-ftpd/conf/ExtCert

Cela va permettre à Pure-FTPd de récupérer le certificat du domaine via pure-certd

Supprimez le fichier CertFileAndKey :

sudo rm /etc/pure-ftpd/conf/CertFileAndKey

Créez le fichier systemd pour lancer pure-certd :

sudo nano /etc/systemd/system/pure-certd.service

Ajoutez les lignes suivantes :

[Unit]
Description=Start pure-certd Daemon
After=network.target
Before=pure-ftpd-mysql.service

[Service]
ExecStart=/usr/sbin/pure-certd --run /bin/pure-cert-check.sh --socket /var/run/ftpd-certs.sock --pidfile /var/run/pure-certd.pid
RestartSec=5
Restart=always

[Install]
WantedBy=multi-user.target

Activez le démarrage automatique de pure-certd :

sudo systemctl enable pure-certd.service

Démarrez pure-certd :

sudo systemctl start pure-certd.service

Redémarrez Pure-FTPd :

sudo systemctl restart pure-ftpd-mysql.service

La gestion du multi-domaine est activée.

Source : https://forum.howtoforge.com/threads/pure-ftpd-sni-with-letsencrypt.85488/#post-438345