Serveur FTPS (vsftpd) sur Debian — Accès limité à une IP & utilisateur tom
Procédure pas-à-pas : installation, TLS, confinement (chroot), liste blanche utilisateur, pare-feu (UFW), et tests WinSCP & FileZilla.
- Prérequis
- Installation des paquets
- Création de l’utilisateur
tom& arborescence - Certificat TLS (auto-signé)
- Configuration de
/etc/vsftpd.conf - Limiter l’accès à l’unique compte
tom - Pare-feu : autoriser seulement <IP_AUTORISEE>
- NAT & mode passif
- Tests : WinSCP & FileZilla
- Vérifications & dépannage
- Résumé sécurité
Variables à remplacer : <IP_AUTORISEE> (poste autorisé), <IP_SERVEUR> (IP du serveur Debian), <IP_PUBLIQUE_SERVEUR> (si derrière NAT).
1) Prérequis Debian 12/13
- Un serveur Debian avec droits sudo ou accès root.
- Nom d’utilisateur souhaité : tom.
- Adresse IP cliente autorisée :
<IP_AUTORISEE>. - Ports sortants ouverts côté client, et forwards corrects si NAT côté serveur.
2) Installation des paquets
sudo apt update && sudo apt -y upgrade sudo apt -y install vsftpd openssl ufw
3) Créer l’utilisateur tom & préparer son arborescence FTPS
Le dossier racine visible en FTPS sera /home/tom/ftp, non-modifiable, avec un sous-dossier upload/ pour écrire.
sudo adduser tom sudo mkdir -p /home/tom/ftp/upload sudo chown -R tom:tom /home/tom/ftp sudo chmod 550 /home/tom/ftp sudo chmod 750 /home/tom/ftp/upload
Pourquoi ces droits ? vsftpd refuse un chroot si le répertoire racine est modifiable par l’utilisateur. chmod 550 sur /home/tom/ftp corrige cela.
4) Générer un certificat TLS (auto-signé)
Pour la production, privilégie Let’s Encrypt. Ici on crée un certificat unique clé+cert :
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/vsftpd.pem \ -out /etc/ssl/private/vsftpd.pem \ -subj "/C=CA/ST=QC/L=Montreal/O=FTPS/OU=IT/CN=$(hostname -f)" sudo chmod 600 /etc/ssl/private/vsftpd.pem
5) Configurer vsftpd pour FTPS (TLS explicite) + confinement
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.backup
Remplace le contenu de /etc/vsftpd.conf par :
listen=YES listen_ipv6=NO # Accès & droits anonymous_enable=NO local_enable=YES write_enable=YES # Enfermement des utilisateurs locaux dans leur HOME chroot_local_user=YES # Racine FTP des utilisateurs (ici tom) : /home/<user>/ftp user_sub_token=$USER local_root=/home/$USER/ftp # Restreindre aux utilisateurs listés (whitelist) userlist_enable=YES userlist_file=/etc/vsftpd.userlist userlist_deny=NO # FTPS (FTP explicite via AUTH TLS) — on force TLS pour login & données ssl_enable=YES require_ssl_reuse=NO force_local_logins_ssl=YES force_local_data_ssl=YES rsa_cert_file=/etc/ssl/private/vsftpd.pem # Protocoles TLS recommandés ssl_sslv2=NO ssl_sslv3=NO ssl_tlsv1=NO ssl_tlsv1_1=NO ssl_tlsv1_2=YES ssl_tlsv1_3=YES # Mode passif (nécessaire derrière NAT/pare-feu) pasv_enable=YES pasv_min_port=40000 pasv_max_port=40100 # Si le serveur est derrière un NAT, décommente et renseigne l'IP publique : # pasv_address=<IP_PUBLIQUE_SERVEUR> # Bannière (optionnel) ftpd_banner=Bienvenue sur le serveur FTPS.
sudo systemctl restart vsftpd sudo systemctl enable vsftpd
6) Limiter l’accès à l’unique compte tom (liste blanche)
Avec userlist_deny=NO, seuls les utilisateurs listés dans /etc/vsftpd.userlist peuvent se connecter.
echo "tom" | sudo tee /etc/vsftpd.userlist
7) Pare-feu : autoriser uniquement <IP_AUTORISEE>
On autorise le port de contrôle 21/tcp et la plage passive 40000–40100/tcp pour la seule IP cliente autorisée.
sudo ufw allow from <IP_AUTORISEE> to any port 21 proto tcp sudo ufw allow from <IP_AUTORISEE> to any port 40000:40100 proto tcp sudo ufw default deny incoming sudo ufw enable sudo ufw status verbose
Alternative si tu utilises iptables (à adapter/persister selon ta stack) :
sudo iptables -A INPUT -p tcp -s <IP_AUTORISEE> --dport 21 -j ACCEPT sudo iptables -A INPUT -p tcp -s <IP_AUTORISEE> --dport 40000:40100 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 21 -j DROP sudo iptables -A INPUT -p tcp --dport 40000:40100 -j DROP
8) Si le serveur est derrière un NAT
- Ouvre/forwarde vers le serveur 21/tcp et 40000–40100/tcp.
- Renseigne
pasv_address=<IP_PUBLIQUE_SERVEUR>dans/etc/vsftpd.conf. - Redémarre : systemctl restart vsftpd.
9) Tests — WinSCP & FileZilla
Test avec WinSCP (Windows)
- Télécharge et installe depuis winscp.net.
- Nouvelle session :
- Protocole : FTP
- Chiffrement : FTP explicite sur TLS/SSL
- Hôte :
<IP_SERVEUR>, Port : 21 - Utilisateur :
tom, Mot de passe : (celui créé)
- Accepte le certificat TLS (auto-signé) au premier essai.
- Vérifie :
- Accès au répertoire
/home/tom/ftp. - Upload possible dans
/home/tom/ftp/upload. - Impossible de remonter au-dessus du
chroot.
- Accès au répertoire
Test avec FileZilla (Windows/Linux/macOS)
- Installe depuis filezilla-project.org.
- Gestionnaire de sites → Nouveau site :
- Protocole : FTP
- Chiffrement : Utiliser FTP explicite sur TLS si disponible
- Hôte :
<IP_SERVEUR>, Port : 21 - Type d’authentification : Normale
- Utilisateur :
tom, Mot de passe : (celui créé)
- Accepte l’avertissement du certificat TLS.
- Vérifie les mêmes points que pour WinSCP.
curl -v --ssl --ftp-ssl --user tom ftp://<IP_SERVEUR>/
10) Vérifications & Dépannage
systemctl status vsftpd
sudo journalctl -u vsftpd -e sudo tail -f /var/log/auth.log
- Échecs TLS « reuse » :
require_ssl_reuse=NOest déjà configuré. - Connexion bloquée : vérifie UFW/iptables (seule
<IP_AUTORISEE>doit passer). - Transferts qui stagnent : ports passifs ouverts (pare-feu) +
pasv_addresssi NAT. - Erreur chroot : assure-toi que
/home/tom/ftpn’est pas modifiable par tom (chmod 550).
11) Résumé sécurité
- FTP en clair désactivé — TLS obligatoire pour login & données.
- Liste blanche : seul l’utilisateur
tomest autorisé. - Confinement :
chroot_local_user=YES. - Pare-feu restrictif : accès depuis
<IP_AUTORISEE>uniquement. - Ports passifs bornés et documentés (40000–40100/TCP).
- Certificat TLS dédié (Let’s Encrypt recommandé en prod).

