VSFTPD (Very Secure FTP Daemon) è un server FTP leggero e molto usato su Linux. In questa guida lo installiamo su Debian e lo configuriamo in modo sicuro: utente dedicato senza shell, accesso limitato alla cartella di archivio e trasferimenti cifrati tramite FTPS (TLS).
Installazione e configurazione vsftpd
frank@debian:~$ su -
root@debian:~# apt install vsftpd ssl-cert
root@debian:~# systemctl status vsftpd
root@debian:~# systemctl start vsftpd
root@debian:~# systemctl enable vsftpd
root@debian:~# cp /etc/vsftpd.conf /etc/vsftpd.conf_bck
Gestione utente NVR
Creare l’utente nvr solo per FTP (senza shell)Creare un utente dedicato che non possa accedere via SSH, questo limita l’uso dell’account al solo servizio FTP.
root@debian:~# adduser nvr --shell /usr/sbin/nologin
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for nvr
Enter the new value, or press ENTER for the default
Full Name []: nvr
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
Il comando seguente aggiunge /usr/sbin/nologin all’elenco delle shell valide presenti nel file /etc/shells. Questo è necessario perché vsftpd permette l’autenticazione solo agli utenti che hanno una shell riconosciuta come valida dal sistema.
root@debian:~# echo /usr/sbin/nologin >> /etc/shells
In pratica:
- echo /usr/sbin/nologin: stampa il percorso della shell
- >> /etc/shells: lo aggiunge in fondo al file senza sovrascriverlo
L’utente può autenticarsi via FTP ma non può aprire una sessione shell interattiva (SSH o login locale) aumentando la sicurezza. L’utente esiste nel sistema ma non può fare login interattivo, vsftpd può comunque usarlo per l’autenticazione FTP.
Impostare la cartella archivio e i permessi
La cartella /mnt/archivio deve essere accessibile all’utente nvr e impostare owner e permessi coerenti con il tipo di accesso sola lettura o scrittura per upload:root@debian:~$ mkdir -p /mnt/archivio
root@debian:~$ chown nvr:nvr /mnt/archivio -R
root@debian:~$ chmod 755 /mnt/archivio
Altrimenti se serve fare l'upload dei file:
root@debian:~$ chmod 775 /mnt/archivio
Il comando chmod 755 /mnt/archivio assegna i permessi di lettura ed esecuzione a tutti gli utenti, ma consente la scrittura solo al proprietario della directory. È adatto quando gli utenti devono solo consultare o scaricare i file.
Il comando chmod 775 /mnt/archivio permette invece anche la scrittura agli utenti appartenenti allo stesso gruppo del proprietario. È utile quando è necessario consentire l’upload dei file oltre alla semplice lettura.
Configurazione desiderata (utente dedicato + FTPS)
Usare un utente FTP dedicato (esempio nvr) limitato alla cartella /mnt/archivio, con autenticazione cifrata tramite FTPS (TLS) e senza accesso al resto del filesystem.
anonymous_enable=NO (disabilitare accesso anonimo)
local_enable=YES (abilitare utenti locali FTP)
write_enable=YES (se il NVR deve caricare file)
chroot_local_user=YES (utente bloccato nella sua root)
local_root=/mnt/archivio
allow_writeable_chroot=YES (se la root è scrivibile)
ssl_enable=YES + force_local_logins_ssl=YES + force_local_data_ssl=YES
modalità passive mantenuta: porte 30000–30100
root@debian:~$ nano /etc/vsftpd.conf
# VSFTPD - Config per utente NVR chroot + FTPS
# Standalone su IPv4 (più semplice da gestire)
listen=YES
listen_ipv6=NO
# Niente anonimo
anonymous_enable=NO
# Utenti locali abilitati (user nvr)
local_enable=YES
# Serve per upload (se il NVR deve scrivere)
write_enable=YES
local_umask=022
# Messaggi directory e orario locale
dirmessage_enable=YES
use_localtime=YES
# Log
xferlog_enable=YES
# Porta 20 per active mode (ok lasciarla)
connect_from_port_20=YES
# Timeout (opzionale)
idle_session_timeout=900
# Chroot: utente bloccato nella cartella archivio
chroot_local_user=YES
# Root FTP (dove deve vedere il filesystem)
local_root=/mnt/archivio
# Necessario se la root chroot risulta scrivibile
allow_writeable_chroot=YES
# Modalità PASSIVE (fondamentale con NAT/firewall)
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30100
# Jail directory di default
secure_chroot_dir=/var/run/vsftpd/empty
# PAM
pam_service_name=vsftpd
# FTPS (TLS) - credenziali e dati cifrati
ssl_enable=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES
# Disabilita protocolli vecchi
ssl_sslv2=NO
ssl_sslv3=NO
# Certificati (puoi lasciare snakeoil per test LAN)
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
Riavviare il servizio vsftpd:
root@debian:~$ systemctl restart vsftpd
Log server FTP
root@debian:~# journalctl -u vsftpd -n 50 --no-pager
Feb 14 07:43:28 debian systemd[1]: Starting vsftpd.service - vsftpd FTP server...
Feb 14 07:43:28 debian systemd[1]: Started vsftpd.service - vsftpd FTP server.
Feb 14 07:47:13 debian systemd[1]: Stopping vsftpd.service - vsftpd FTP server...
Feb 14 07:47:13 debian systemd[1]: vsftpd.service: Deactivated successfully.
Feb 14 07:47:13 debian systemd[1]: Stopped vsftpd.service - vsftpd FTP server.
Feb 14 07:47:13 debian systemd[1]: Starting vsftpd.service - vsftpd FTP server...
Feb 14 07:47:13 debian systemd[1]: Started vsftpd.service - vsftpd FTP server.
Client FTP
Consiglio di usare Filezilla altrimenti lftp da riga di comando su Linux:frank@laptop01:~$ lftp -u nvr ftp://192.168.122.120 -e "set ftp:ssl-force true; set ssl:verify-certificate no;"
Password:
lftp nvr@192.168.122.120:~> ls
-rw-r--r-- 1 1001 1001 802539 Feb 13 21:56 MyGuidaHomeLAB.pdf
lftp nvr@192.168.122.120:~/>
Con set ftp:ssl-force true obblighi lftp a usare TLS quindi la comunicazione FTP avviene in modo cifrato e i dati non viaggiano in chiaro sulla rete.
Con set ssl:verify-certificate no invece disattivi solo il controllo del certificato: la connessione resta cifrata ma il client non verifica se il server è realmente affidabile tipico dei certificati self-signed.
Per verificare che vsftpd stia realmente utilizzando il certificato snakeoil è sufficiente confrontare il certificato presente sul server con quello presentato durante la connessione FTPS.
Controlliamo prima il certificato locale sul server:$ openssl x509 -in /etc/ssl/certs/ssl-cert-snakeoil.pem \
-noout -subject -dates -fingerprint -sha256
Poi analizziamo il certificato esposto dal server durante l’handshake TLS sul client:
$ openssl s_client -connect 192.168.122.120:21 -starttls ftp \
| openssl x509 -noout -subject -dates -fingerprint -sha256
Se subject, date e fingerprint coincidono significa che vsftpd sta effettivamente utilizzando il certificato /etc/ssl/certs/ssl-cert-snakeoil.pem.


