© Copyright 2026 Ferrantino Francesco

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.
Ferrantino Francesco

Ferrantino Francesco

Cookie Policy

Leggi  informativa Cookie Policy
Il "Sito" utilizza i Cookie per rendere i propri servizi semplici e efficienti per l’utenza che visiona le pagine di franksoft.it

Disclaimer

L'autore degli articoli non si assume nessuna responsabilità per eventuali danni ai vostri dispositivi. Tutto ciò che viene spiegato è puramente a scopo dimostrativo.
Il presente sito non costituisce testata giornalistica in quanto non ha carattere periodico ed è aggiornato secondo la mia disponibilità e la reperibilità dei materiali ivi contenuti. Pertanto, non può essere considerato in alcun modo un prodotto editoriale ai sensi della Legge n. 62 del 7/03/2001.

Licenza

Tutte le immagini presenti nel sito appartengono ai rispettivi titolari e sono utilizzate senza alcuno scopo di lucro. Ogni eventuale violazione del copyright non è intenzionale.
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Non opere derivate 4.0 Internazionale.  Licenza Creative Commons