ProFTPd est l’un des serveurs FTP les plus complets et les plus flexibles de l’écosystème Linux. Son architecture modulaire permet d’activer uniquement les fonctionnalités nécessaires : authentification via une base SQL, chiffrement TLS natif pour le FTPs (FTPS), ou encore support du protocole SFTP (SSH File Transfer Protocol) via le module mod_sftp.
Stocker les comptes FTP dans MySQL plutôt que dans /etc/passwd est particulièrement pertinent dans des environnements d’hébergement mutualisé ou multi-serveurs : les utilisateurs virtuels n’ont pas de compte système, la gestion est centralisée, et les mots de passe peuvent être rotés sans toucher à l’OS hôte. Couplé à un certificat SSL pour chiffrer les sessions FTPs, et au module mod_sftp pour exposer un accès SSH File Transfer Protocol sur un port dédié, ProFTPd couvre l’ensemble des besoins d’un service de transfert de fichiers sécurisé.
Cet article couvre l’installation complète sur Debian 12 (Bookworm) et Ubuntu 24.04 LTS : installation des paquets, création du schéma MySQL, configuration de l’authentification virtuelle avec mod_sql, chiffrement TLS pour FTPs, et activation de SFTP via mod_sftp.
1. Installation des paquets
ProFTPd est disponible directement dans les dépôts officiels Debian et Ubuntu. Le paquet proftpd-mod-mysql fournit le module d’authentification SQL :
apt update
apt install proftpd-basic proftpd-mod-mysql
Au moment de l’installation, debconf propose deux modes de fonctionnement : choisir standalone (recommandé). ProFTPd gère lui-même les connexions sans dépendre d’inetd.
# Vérifier le mode de fonctionnement
grep "^ServerType" /etc/proftpd/proftpd.conf
# Doit afficher : ServerType standalone
# Activer et démarrer le service
systemctl enable proftpd
systemctl start proftpd
systemctl status proftpd
2. Création de la base de données MySQL
ProFTPd utilisera des utilisateurs virtuels stockés en base : aucun compte système (/etc/passwd) n’est nécessaire.
mysql -u root -p
-- Création de la base et des tables
CREATE DATABASE proftpd CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE proftpd;
CREATE TABLE users (
userid VARCHAR(30) NOT NULL,
passwd VARCHAR(80) NOT NULL,
uid INT(11) NOT NULL DEFAULT 2000,
gid INT(11) NOT NULL DEFAULT 2000,
homedir VARCHAR(255) NOT NULL,
shell VARCHAR(255) NOT NULL DEFAULT '/bin/false',
active TINYINT(1) NOT NULL DEFAULT 1,
last_login DATETIME,
PRIMARY KEY (userid)
);
CREATE TABLE groups (
groupname VARCHAR(30) NOT NULL,
gid INT(11) NOT NULL DEFAULT 2000,
members VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (groupname)
);
-- Insérer un groupe par défaut
INSERT INTO groups (groupname, gid, members) VALUES ('ftpusers', 2000, '');
-- Créer l'utilisateur MySQL dédié à ProFTPd
CREATE USER 'proftpd'@'localhost' IDENTIFIED BY 'MotDePasseSQL_Securise!';
GRANT SELECT, INSERT, UPDATE ON proftpd.users TO 'proftpd'@'localhost';
GRANT SELECT ON proftpd.groups TO 'proftpd'@'localhost';
FLUSH PRIVILEGES;
Ajouter un premier utilisateur FTP. Le mot de passe doit être haché avec OpenSSL MD5 (format compatible ProFTPd avec SQLAuthTypes OpenSSL) :
# Générer le hash du mot de passe
openssl passwd -1 'MonMotDePasseFTP'
# Sortie : $1$aBcDeFgH$xxxxxxxxxxxxxxxxxxxxxxxxxxx
USE proftpd;
INSERT INTO users (userid, passwd, uid, gid, homedir, shell)
VALUES ('alice', '$1$aBcDeFgH$xxxxxxxxxxxxxxxxxxxxxxxxxxx', 2001, 2000, '/home/ftp/alice', '/bin/false');
QUIT;
# Créer le répertoire home de l'utilisateur FTP
mkdir -p /home/ftp/alice
chown -R nobody:nogroup /home/ftp
chmod 755 /home/ftp/alice
3. Configuration de l’authentification MySQL (mod_sql)
Le module mod_sql et son backend MySQL doivent être activés dans le fichier de modules :
# Vérifier que ces lignes sont décommentées dans /etc/proftpd/modules.conf
grep -E "mod_sql" /etc/proftpd/modules.conf
Si les lignes sont commentées, les décommenter :
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
Créer le fichier de configuration SQL dédié /etc/proftpd/sql.conf :
<IfModule mod_sql.c>
SQLBackend mysql
# OpenSSL pour les hashs MD5 générés avec openssl passwd -1
SQLAuthTypes OpenSSL Crypt
SQLAuthenticate users groups
# Connexion à la base MySQL (base@hôte utilisateur motdepasse)
SQLConnectInfo proftpd@localhost proftpd MotDePasseSQL_Securise!
# Colonnes des tables utilisateurs et groupes
SQLUserInfo users userid passwd uid gid homedir shell
SQLGroupInfo groups groupname gid members
# Filtrer les comptes désactivés
SQLUserWhereClause "active = 1"
# Enregistrer la date de dernière connexion
SQLLog PASS updateLastLogin
SQLNamedQuery updateLastLogin UPDATE "last_login=NOW() WHERE userid='%u'" users
</IfModule>
Inclure ce fichier et ajuster les paramètres globaux dans /etc/proftpd/proftpd.conf :
# Inclure la configuration SQL
Include /etc/proftpd/sql.conf
# Les utilisateurs virtuels n'ont pas de shell valide
RequireValidShell off
# Confiner chaque utilisateur dans son répertoire home
DefaultRoot ~
# Authentification uniquement via MySQL (désactive PAM/Unix)
AuthOrder mod_sql.c
# Valider la syntaxe et recharger
proftpd --configtest
# Doit afficher : Syntax check complete.
systemctl reload proftpd
4. Chiffrement TLS pour FTPs
FTPs ajoute une couche TLS au protocole FTP classique. La connexion s’établit sur le port 21, puis le canal de contrôle (et les données) est chiffré via TLS. C’est le mode Explicit TLS (STARTTLS), le plus courant.
4.1 Générer le certificat SSL
Pour un environnement de production exposé sur Internet, utiliser Let’s Encrypt :
apt install certbot
certbot certonly --standalone -d ftp.mondomaine.com
# Certificat : /etc/letsencrypt/live/ftp.mondomaine.com/fullchain.pem
# Clé privée : /etc/letsencrypt/live/ftp.mondomaine.com/privkey.pem
Pour un usage interne ou de test, un certificat auto-signé suffit :
openssl req -x509 -newkey rsa:4096 -sha256
-keyout /etc/ssl/private/proftpd.key
-out /etc/ssl/certs/proftpd.crt
-nodes -days 365
-subj "/CN=$(hostname -f)/O=MonOrganisation/C=FR"
# Permissions strictes sur la clé privée
chmod 640 /etc/ssl/private/proftpd.key
chmod 644 /etc/ssl/certs/proftpd.crt
4.2 Configurer mod_tls
Vérifier que le module est chargé dans /etc/proftpd/modules.conf :
LoadModule mod_tls.c
Créer /etc/proftpd/tls.conf :
<IfModule mod_tls.c>
TLSEngine on
TLSLog /var/log/proftpd/tls.log
# TLS 1.2 minimum — désactiver les versions obsolètes
TLSProtocol TLSv1.2 TLSv1.3
# Chemins certificat (adapter pour Let's Encrypt)
TLSRSACertificateFile /etc/ssl/certs/proftpd.crt
TLSRSACertificateKeyFile /etc/ssl/private/proftpd.key
# Forcer TLS sur le canal de contrôle et les données
TLSRequired on
# Ne pas demander de certificat client
TLSVerifyClient off
# Options complémentaires
TLSOptions NoCertRequest StdEnvVars
</IfModule>
Inclure dans proftpd.conf :
Include /etc/proftpd/tls.conf
Pour le mode passif FTPs, définir une plage de ports et les autoriser dans le pare-feu. Pour la gestion du pare-feu avec nftables, ouvrir les ports nécessaires :
# Dans proftpd.conf — plage de ports passifs
PassivePorts 49152 65534
# Avec nftables — autoriser FTP et les ports passifs
nft add rule inet filter input tcp dport 21 accept
nft add rule inet filter input tcp dport 49152-65534 accept
5. Support SFTP via mod_sftp
SFTP (SSH File Transfer Protocol) est un protocole distinct de FTP+TLS. Il fonctionne au-dessus de SSH2 et est supporté nativement par ProFTPd via mod_sftp, sans dépendre d’OpenSSH. Les mêmes utilisateurs MySQL peuvent s’authentifier en FTPs et en SFTP.
Note : si OpenSSH (
sshd) tourne sur le port 22, ProFTPd SFTP doit écouter sur un port différent (ex. 2222) pour éviter le conflit.
Activer le module dans /etc/proftpd/modules.conf :
LoadModule mod_sftp.c
Si les clés hôte SSH n’existent pas encore (serveur sans OpenSSH) :
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
ssh-keygen -t ecdsa -b 521 -f /etc/ssh/ssh_host_ecdsa_key -N ""
Ajouter une section VirtualHost SFTP dans /etc/proftpd/proftpd.conf :
<VirtualHost 0.0.0.0>
SFTPEngine on
Port 2222
SFTPLog /var/log/proftpd/sftp.log
# Clés hôte du serveur SFTP
SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPHostKey /etc/ssh/ssh_host_ecdsa_key
# Méthodes d'authentification autorisées
SFTPAuthMethods password
# Authentification via MySQL (même base que FTPs)
AuthOrder mod_sql.c
RequireValidShell off
DefaultRoot ~
# Limiter les algorithmes obsolètes
SFTPCiphers aes256-ctr aes192-ctr aes128-ctr
SFTPDigests hmac-sha2-256 hmac-sha2-512
</VirtualHost>
# Autoriser le port SFTP dans nftables
nft add rule inet filter input tcp dport 2222 accept
# Valider et recharger ProFTPd
proftpd --configtest && systemctl reload proftpd
# Tester la connexion SFTP
sftp -P 2222 alice@localhost
6. Sécurisation complémentaire
Protection brute-force avec Fail2ban
ProFTPd journalise les tentatives échouées dans /var/log/proftpd/proftpd.log. Activer le filtre dédié dans Fail2ban (voir l’article sur la configuration avancée de Fail2ban pour personnaliser les filtres) :
# /etc/fail2ban/jail.local
[proftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data,2222
logpath = /var/log/proftpd/proftpd.log
maxretry = 5
bantime = 3600
findtime = 600
systemctl reload fail2ban
fail2ban-client status proftpd
Limites et timeouts dans proftpd.conf
# Connexions simultanées par IP
MaxConnectionsPerHost 3
# Timeouts (en secondes)
TimeoutIdle 600
TimeoutLogin 120
TimeoutNoTransfer 600
# Interdire la commande SITE CHMOD (modification de permissions)
<Limit SITE_CHMOD>
DenyAll
</Limit>
# Masquer les informations de version dans la bannière
ServerIdent on "FTP Server ready."
À lire également
- Fail2ban — configuration avancée et filtres personnalisés — Protéger votre serveur ProFTPd contre les attaques brute-force avec des filtres Fail2ban personnalisés et des règles nftables.
- Durcissement SSH — au-delà des clés publiques — SFTP reposant sur SSH2, les bonnes pratiques de durcissement SSH s’appliquent directement au module mod_sftp de ProFTPd.
- nftables en pratique — remplacer iptables sur Debian/Ubuntu — Gérer les règles de pare-feu pour les ports FTP actif/passif, les plages de ports passifs et le port SFTP.
- Authentification par clé publique sur un serveur SSH — Activer l’authentification par clé publique dans ProFTPd via mod_sftp avec la directive SFTPAuthorizedUserKeys.