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.
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.
Installez Pure-FTPd :
aptitude install pure-ftpd-common pure-ftpd-mysql quota quotatool
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;
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
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.
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 :
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
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
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