ProFTPd : authentification MySQL centralisée, FTPs (SSL) et SFTP sur Debian/Ubuntu

17 juin 2026 — par admin_libra

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

Références

Index complet

Tous les articles (46)

Date Article Tags
17/06/2026 APT : Guide complet de la gestion des paquets sous Debian et Ubuntu administration apt debian 17/06/2026 SHELL : Guide des commandes les plus usuelles et commandes couteau suisse awk bash commandes 17/06/2026 SUDO : implémentation et sécurisation des accès sur Debian/Ubuntu administration audit authentification 17/06/2026 ProFTPd : authentification MySQL centralisée, FTPs (SSL) et SFTP sur Debian/Ubuntu authentification debian ftp 09/06/2026 Fail2ban — configuration avancée et filtres personnalisés bruteforce debian fail2ban 07/06/2026 Docker : comment récupérer de l'espace disque cache conteneurs debian 07/06/2026 Graylog 7 — Centralisation et analyse de logs : l'alternative à ELK sur Debian/Ubuntu centralisation debian elk 07/06/2026 OpenZFS : tiering avec L2ARC et SLOG pour les workloads mixtes cache l2arc nvme 07/06/2026 Scripting Bash avancé — pièges, bonnes pratiques et optimisation automatisation bash bonnes-pratiques 07/06/2026 AppArmor sur Debian/Ubuntu : profils, modes et confinement applicatif apparmor audit confinement 07/06/2026 Durcissement SSH — au-delà des clés publiques 2fa authentification cryptographie 27/05/2026 LXD 6.x : orchestration de conteneurs Linux avec profils et clustering administration clustering conteneurs 27/05/2026 Keepalived — VIP flottante et load balancing sans matériel dédié debian failover haute-disponibilité 27/05/2026 Btrfs sur Linux — snapshots, sous-volumes et compression en pratique administration btrfs compression 21/05/2026 CVE-2026-42945 (NGINX Rift) : analyse et remédiation sur Debian/Ubuntu cve debian heap-overflow 21/05/2026 Tuning kernel Linux — paramètres sysctl essentiels pour la production debian kernel mémoire 21/05/2026 DRBD : réplication de blocs entre deux serveurs en temps réel cluster debian drbd 15/05/2026 CVE-2026-23918 — vulnérabilité Apache 2.4.66 : analyse et correctifs sur Debian/Ubuntu (hors Debian 11) apache cve debian 15/05/2026 CVE-2026-31431 (Copy Fail) — Analyse et remédiation sur Debian/Ubuntu algif_aead copy-fail cve 12/05/2026 Pacemaker et Corosync — cluster haute disponibilité Linux cluster corosync debian 12/05/2026 WireGuard : monter un VPN mesh entre plusieurs serveurs Linux chiffrement linux mesh 12/05/2026 Netdata — monitoring temps réel sans configuration complexe alertes dashboard linux 12/05/2026 nftables en pratique — remplacer iptables sur Debian/Ubuntu debian firewall iptables 12/05/2026 Podman : alternative rootless à Docker — installation et migration conteneurs docker kubernetes 02/05/2026 Prometheus et Grafana sur Debian — installation, configuration et dashboards pratiques alertmanager dashboard debian 02/05/2026 Ansible : automatiser la gestion de serveurs Linux avec des playbooks administration ansible automation 28/04/2026 ZFS sur Linux : snapshots, clones et RAID-Z en pratique administration compression filesystem 28/04/2026 eBPF sur Linux : observabilité et traçage kernel avec bpftrace et BCC bcc bpftrace diagnostic 23/04/2026 Analyse de la mémoire sur Linux — vmstat, free, smem diagnostic mémoire monitoring 23/04/2026 Sécurité Linux — Firewall iptables et nftables firewall iptables nftables 23/04/2026 ZFS sur Linux — Installation et gestion avancée administration filesystem stockage 23/04/2026 Gestion des services avec systemd sur Debian et Ubuntu administration debian services 23/04/2026 Gestion des ressources cgroups v1/v2 avec LXC cgroups conteneurs lxc 23/04/2026 Centralisation logs avec ELK Stack — Elasticsearch, Kibana, Filebeat elasticsearch elk filebeat 23/04/2026 Supervision avec Zabbix 7.0 LTS sur Debian/Ubuntu debian monitoring supervision 23/04/2026 Plusieurs versions PHP-FPM sur Apache Debian/Ubuntu apache debian php-fpm 23/04/2026 Sécurisation avancée PHP-FPM — Multi-VirtualHosts Apache/Nginx apache nginx php-fpm 23/04/2026 Optimisation PHP-FPM — Guide de tuning d'un pool optimisation performance php-fpm 29/07/2025 Docker sur Debian/Ubuntu : Installation, Configuration et Utilisation conteneurs debian docker 03/07/2025 Serveur VPN WireGuard sous linux réseau sécurité vpn 03/07/2025 Authentification par clé publique sur un serveur SSH authentification cryptographie sécurité 27/06/2025 Surveillance et diagnostic d’un serveur Linux avec vmstat, iotop et htop diagnostic htop monitoring 27/06/2025 Mémoire : Utilisation des Huge Pages et implémentation hugepages mémoire noyau 27/06/2025 Mémoire Swap et paramétrage swappiness mémoire noyau performance 18/06/2025 Installation et Configuration des Conteneurs LXC sur Linux administration conteneurs lxc 18/06/2025 Gestion des journaux avec syslog et journalctl administration journalctl logs