====== 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
* MYSQLUser doit avoir pour valeur le nom de l'utilisateur créé pour accéder à la base.
* MYSQLPassword doit avoir pour valeur le mot de passe de l'utilisateur.
* MYSQLDatabase doit avoir pour valeur le nom de la base de donnée
* MYSQLCrypt doit avoir pour valeur la méthode de chiffrement des mots de passe des utilisateurs. Choisissez "crypt"
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 :
* TLS : activation de la couche TLS pour la connexion FTP. 0 désactive TLS, 1 autorise la connexion sans et avec TLS et 2 n'autorise que la connexion avec TLS
* CreateHomeDir : crée automatiquement un répertoire home pour chaque utilisateur virtuel. J'ai déactivé cette option
* CertFileAndKey : certificat et clé TLS de votre nom de domaine générés avec [[serveur_hebergement:apache2:let_s_encrypt_certbot_et_ssl_sur_debian|Let’s Encrypt]]. Remplacez domaine.fr par votre nom de domaine
* NoAnonymous : désactive les connexions d'utilisateurs non authentifiés. J'ai activé cette option
* PAMAuthentication : active la connexion des utilisateurs locaux. J'ai désactivé cette option
* PassivePortRange : plage de port pour les connexions en [[https://fr.wikipedia.org/wiki/File_Transfer_Protocol#%C3%89tablissement_des_connexions|mode passif]]
* ChrootEveryone : restreint les utilisateurs à leur répertoire home. J'ai activé cette option.
* TLSCipherSuite : [[https://fr.wikipedia.org/wiki/Suite_cryptographique|suites cryptographique]] à utiliser. HIGH désigne les suites avec le niveau de sécurité le plus élevé.
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 [[serveur_hebergement:bases_de_donnees:phpmyadmin|phpMyAdmin]] pour la création d'un utilisateur.
Insérez une nouvelle ligne dans la table users comme suit :
{{:serveur_hebergement:pasted:20221111-203442.png}}
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) :
* ID correspond au numéro de création de votre utilisateur
* UID et GID doivent correspondre à un [[https://fr.wikipedia.org/wiki/User_identifier|UID]] et [[https://fr.wikipedia.org/wiki/Groupe_(Unix)|GID]] d'un utilisateur réel. Il faut que l'utilsateur/group ait accès au répertoire de l'utilisateur virtuel que vous êtes en train de créer
* Dir est le répertoire auquel aura accès l'utilisateur virtuel
* QuotaSize, ULBandwidth et DLBandwidth sont des limites de quota et bande passante que vous pouvez imposer à l'utilisateur.
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 :
- 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
- 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]]