Il termine FTP
è l’abbreviazione da File Transfer Protocol, uno dei protocolli più usati e sicuri per muovere i file tra un client e server.
Recentemente abbiamo avuto la necessità di avere un server remoto con il servizio FTP
attivo, ma la presente guida può essere tranquillamente utilizzata anche per installare l’FTP
su un server locale, basta che la macchina sia raggiungibile nella rete tramite un nome a dominio, oppure direttamente tramite l’IP assegnato alla stessa staticamente.
In questo articolo sotto forma di tutorial illustriamo la procedura di installazione e configurazione di un server FTP
realizzato con vsftpd
su un Debian 10 ed attiviamo il login e trasferimento di dati in modalità sicura tramite l’uso di SSL/TLS.
Indice
Requisiti
Per iniziare l’installazione assicuriamoci di avere:
- Un server con il sistema operativo Debian 10
- Un utente non-root di sistema con i privilegi
sudo
- Un editor di testo installato sul server. Qui consideriamo l’editor di testo
nano
Se abbiamo tutto quello elencato sopra, allora possiamo iniziare l’installazione e, quindi accediamo al server.
Installazione
Aggiorniamo la lista di pacchetti:
$ sudo apt update
Installiamo vsftpd
:
$ sudo apt install vsftpd
Una volta quando l’installazione è completata facciamo una copia di backup delle impostazioni di default del nostro appena installato vsftpd
ftp
server, così avremo sempre la possibilità di ripristinare le impostazioni portandole alla versione di default:
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
Ora possiamo procedere con l’apertura delle porte necessarie nel nostro Firewall.
Firewall
Noi usiamo il firewall UFW
e quindi consideriamo quello. Se non avete un Firewall, oppure il vostro firewall è diverso da UFW
, allora dovreste saltare questo passo.
In questo passo dobbiamo aprire le porte necessarie per il nostro server FTP tramite le quali avverrà lo scambio di comandi e il trasferimento di file. Le porte che intendiamo di aprire sono:
20
– per il trasferimento di dati in modalità di connessione attiva21
– per lo scambio di comandi tra il server e un client990
– perFTP
implicito con SSL/TLS abilitato40000-50000
– utilizziamo questo intervallo per le porte della modalità di connessione passiva
Prima di procedere verifichiamo lo status del nostro Firewall e ci assicuriamo che le porte da aprire non siamo già occupate o già aperte:
$ sudo ufw status
output:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
WWW Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
WWW Full (v6) ALLOW Anywhere (v6)
Nel output sopra si vede che sia permesso il solo traffico WEB e quello di SSH. Il vostro output, in base alle applicazioni abilitati, potrebbe essere diverso, ma nel nostro determinato caso vediamo che le porte che ci interessano non sono abilitate in quanto nessuno di quei servizi non utilizzano alcuna delle porte che attualmente ci interessano, quindi procediamo con l’apertura delle porte:
$sudo ufw allow 20/tcp
$sudo ufw allow 21/tcp
$sudo ufw allow 990/tcp
$sudo ufw allow 40000:50000/tcp
Verifichiamo di nuovo lo status del Firewall:
$ sudo ufw status
Ora abbiamo:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
WWW Full ALLOW Anywhere
20/tcp ALLOW Anywhere
21/tcp ALLOW Anywhere
990/tcp ALLOW Anywhere
40000:50000/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
WWW Full (v6) ALLOW Anywhere (v6)
20/tcp (v6) ALLOW Anywhere (v6)
21/tcp (v6) ALLOW Anywhere (v6)
990/tcp (v6) ALLOW Anywhere (v6)
40000:50000/tcp (v6) ALLOW Anywhere (v6)
Dall’output sopra si vede che le porte ora sono aperte. A questo punto il nostro server vsftpd
può comunicare nella rete e noi possiamo procedere con il passo successivo, ovvero quello di creare gli utenti per il nostro server ftp
.
Utente FTP
Prima di procedere vale a dire che sia più sicuro quando ogni utente ha una sua propria cartella-radice per il servizio FTP
, la quale sarà di proprietà dell’utente e a partire dalla quale l’utente può gestire un suo albero di filesystem. In vsftpd
tale funzionalità è implementata tramite chroot
. Quando chroot
è abilitato gli utenti di sistema per default saranno indirizzati ad utilizzare la propria home come la radice per l’FTP
. Però dato il modo in cui vsftpd
protegge la chroot
, la stessa non deve essere scrivibile dall’utente. E questo va bene per un utente chi deve connettersi al server e usarlo solo tramite l’FTP
, e non va bene invece se, ad esempio, un utente avendo l’accesso alla shell
avrebbe bisogno di scrivere nella sua home. Per evitare questo problema, invece di rimuovere i permessi di scrittura della home di utente noi creeremo dentro la home di ogni utente a chi vogliamo fare usufruire il servizio FTP
una directory dedicata al FTP
e la utilizziamo come chroot
per il vsftpd
, poi, dato che chroot
non deve essere scrivibile dall’utente, dentro questa cartella ne creeremo un altra, la chiamiamo data
e alla quale diamo all’utente i permessi di scrittura. Ecco il diagramma del filesystem che vogliamo implementare:

Supponiamo di voler creare un nuovo utente che si chiamerà alex e il quale vogliamo abilitare all’uso del’FTP
, quindi digitiamo il seguente comando:
$ sudo adduser alex
In risposta il sistema ci chiederà di creare una password per il nuovo utente, inventiamo e inseriamo tale password e per concludere premiamo il tasto Invio
.
Dentro la home dell’utente appena creato creiamo la cartella dedicata a l’FTP
:
$ sudo mkdir /home/alex/ftp
Definiamo il proprietario e il gruppo per la cartella appena creata:
$ sudo chown nobody:nogroup /home/alex/ftp
Rimuoviamo i permessi di scrittura:
$ sudo chmod a-w /home/alex/ftp
Verifichiamo i permessi:
$ sudo ls -la /home/alex/ftp
output:
total 8
dr-xr-xr-x 2 nobody nogroup 4096 Jul 15 15:47 .
drwxr-xr-x 3 alex alex 4096 Jul 15 15:47 ..
Procediamo creando la cartella data
di proprietà dell’utente alex, ovvero quella radice di albero di filesystem dell’utente, per la quale avrà i permessi di scrittura:
$sudo mkdir /home/alex/ftp/data
$sudo chown alex:alex /home/alex/ftp/data
Verifichiamo di nuovo i permessi:
$ sudo ls -la /home/alex/ftp
output:
total 12
dr-xr-xr-x 3 nobody nogroup 4096 Jul 15 16:32 .
drwxr-xr-x 3 alex alex 4096 Jul 15 16:31 ..
drwxr-xr-x 2 alex alex 4096 Jul 15 16:32 data
Perfetto! Ora procediamo con configurare l’accesso.
Configurazione accessi
La configurazione del vsftpd
si trova nel file /etc/vsftpd.conf
, apriamolo con l’editor nano
:
$ sudo nano /etc/vsftpd.conf
Ora troviamo le seguenti paramenti di configurazione e impostiamo i valori corretti. Se qualche parametro di quelli elencati di seguito dovesse mancare nel file di configurazione, allora aggiungiamolo manualmente. Se invece il parametro è presente ed è commentato, ovvero quando all’inizio della riga si trova il carattere cancelletto, allora basta cancellare tale carattere per scommentare la riga abilitando così il parametro ed esplicitare il suo valore.
- anonymous_enable
-
abilitare/disabilitare l’accesso anonimo (qui disabilitiamo)
anonymous_enable=NO
- local_enable
-
abilitare/disabilitare l’accesso per utenti locali di sistema (qui abilitiamo)
local_enable=YES
- write_enable
-
abilitare/disabilitare e consentire l’operazione di scrittura (qui abilitiamo)
write_enable=YES
- chroot_local_user
-
limitare l’accesso e l’uso di filesystem alla sola directory definita come
chroot
dell’utente che effettua il login , ovvero impedire agli utenti connessi tramite il protocolloFTP
l’accesso a filesystem al di fuori del proriochroot
:chroot_local_user=YES
- user_sub_token
-
questo parametro serve per poter generare automaticamente per ciascun utente il riferimento alla sua cartella radice, quella definita come il proprio
chroot
, è necessario per far funzionare correttamente il parametrolocal_root
user_sub_token=$USER
- local_root
-
definisce la radice
chroot
:local_root=/home/$USER/ftp
- pasv_min_port
-
definisce la porta la più “bassa” dell’intervallo delle porte per le connessioni passive (quella che abbiamo utilizzato nel’paragrafo Firewall):
pasv_min_port=40000
- pasv_max_port
-
definisce la porta la più “alta” dell’intervallo delle porte per le connessioni passive (quella che abbiamo utilizzato nel’paragrafo Firewall):
pasv_max_port=50000
Ora, per proteggere ancora di più il nostro server FTP
, facciamo in modo che al servizio potranno accedere solo gli utenti esplicitamente autorizzati ad utilizzarlo. Per realizzarlo creeremo un file dove elenchiamo tali utenti. Supponiamo voler di chiamare il file di autorizzaione vsftpd.users
ed averlo nella cartella /etc
. Quindi, continuiamo a modificare il file di configurazione già aperto /etc/vsftpd.conf
definendo i seguenti parametri:
- userlist_enable
-
abilitare/disabilitare l’uso della lista esplicita di utenti riconosciti da
vsftpd
(qui abilitiamo)userlist_enable=YES
- userlist_file
-
definisce il percorso al quale si trova la lista:
userlist_file=/etc/vsftpd.users
- userlist_deny
-
definisce per gli utenti appartenenti all lista di autorizzazione se sono autorizzati o meno ad utilizzo dell’
FTP
. Sarebbe da notare la semantica del parametro, la quale dice: “Gli utenti presenti nella lista di autorizzazione sono quelli a chi non è consentito usare il servizio“. Se mettessimoYES
come il valore di questo parametro, allora tutti gli utenti presenti nel file di autorizzazione verrebbero negati all’uso dell’FTP
, quindi mettiamo il valoreNO
userlist_deny=NO
A questo punto abbiamo finito con la configurazione di accessi al nostro FTP
server e, quindi salviamo le modifiche apportate premendo i tasti Ctrl+o
e poi Invio
, usciamo dal editor nano
premendo i tasti Ctrl+x
.
Ora aggiungiamo l’utente alex
nel file di autorizzazione per l’FTP
:
$ echo "alex" | sudo tee -a /etc/vsftpd.users
Nel comando abbiamo utilizzato il flag -a
il quale serve per aggiungere una riga nel file e non sovrascrivere il contenuto eventualmente già esistente.
Verifichiamo che l’utente sia stato effettivamente aggiunto nel file:
$ cat /etc/vsftpd.users
output:
alex
Per rendere le modifiche apportate attive riavviamo il servizio vsftpd
:
$ sudo service vsftpd restart
Bene, abbiamo finito con la configurazione iniziale del server FTP
basato su vsftpd
.
Crittografia
Siccome il nostro FTP
al momento non crittografa ne i dati in transito ne le credenziali di utente, per farlo attiviamo TLS/SSL tramite openssl
.
Nel caso in cui openssl
non sia ancora installato, lo installiamo:
$ sudo apt install openssl
Procediamo con la creazione di certificato per il nostro vsftpd
per un periodo di 3650
giorni (10 anni), definito dal valore della chiave -days
:
$ sudo openssl req -newkey rsa:2048 -days 3650 -x509 -nodes -out /etc/ssl/certs/vsftpd.cert.pem -keyout /etc/ssl/private/vsftpd.key.pem
Una volta inserito il comando sopra e premuto il tasto Invio
, saremo indirizzari a rispondere alle domande necessarie per produrre il certificato:
Country Name (2 letter code) [AU]: IT
State or Province Name (full name) [Some-State]: Vostra_Provincia
Locality Name (eg, city) []: Vostra_Città
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Vostra_Società
Organizational Unit Name (eg, section) []: Nome_Dipartimento (Esempio: Dipartimento IT)
Common Name (e.g. server FQDN or YOUR name) []: ip_del_vostro_server
Email Address []: E-mail dell'amministratore
E’ da notare che compilare i campi Organizational Unit Name
e Email Address
sia facoltativo e quindi i valori di quei campi possono essere vuoti, dunque se non si vuole compilarli, allora basta premere il tasto Invio
nel momento in qui compare la relativa domanda.
Una volta quando il certificato è creato, procediamo con configurare vsftpd
per usare TLS/SSL
, quindi apriamo di nuovo il file di configurazione /etc/vsftpd.conf
:
$ sudo nano /etc/vsftpd.conf
Procediamo con l’inserimento manuale in fondo al file di paramteri mancanti e modifica di valori dei parametri già esistenti, assicurandoci che gli stessi non siano commentati, altrimenti scommentiamole:
- rsa_cert_file
-
definisce il percorso al certificato. Questo parametro dovrebbe esistere già e, quindi dobbiamo solo scrivere il valore corretto:
rsa_cert_file=/etc/ssl/certs/vsftpd.cert.pem
- rsa_private_key_file
-
definisce il percorso alla chiave privata. Anche questo parametro dovrebbe esistere già e, allora anche qui dobbiamo solo scrivere il valore corretto:
rsa_private_key_file=/etc/ssl/private/vsftpd.key.pem
- ssl_enable
-
abilitare/disabilitare l’uso di
SSL/TLS
ssl_enable=YES
- allow_anon_ssl
-
abilitare/disabilitare l’accesso anonimo con
SSL/TLS
allow_anon_ssl=NO
- force_local_data_ssl
-
definisce se i dati che vengono trasmessi devono essere crittografati o no (qui attivaimo la crittografia di dati)
force_local_data_ssl=YES
- force_local_logins_ssl
-
definisce se le credenziali di accesso a
FTP
devono essere crittografati o no (qui attivaimo la crittografia di credenziali)force_local_logins_ssl=YES
- ssl_tlsv1
-
definisce se si deve usare il protocollo TLS
ssl_tlsv1=YES
- ssl_sslv2
-
definisce se si deve usare il protocollo SSL della versione 2
ssl_sslv2=NO
- ssl_sslv3
-
definisce se si deve usare il protocollo SSL della versione 3
ssl_sslv3=NO
- require_ssl_reuse
-
definisce se si deve richiedere il riutilizzo di SSL. (qui non lo richiediamo in quanto attualmente ancora ci sono molti di quei FTP client i quali potrebbero “rompersi” da questo)
require_ssl_reuse=NO
- ssl_ciphers
-
definisce il livello di crittografia (qui definiamo il livello altro in modo da usare le chiavi con una lunghezza minima 128 bits)
ssl_ciphers=HIGH
Attenzione! E’ da notare che una volta quando riavviamo il servizio vsftpd
tutto quanto il traffico viene crittografato e quindi tutti quei client FTP
che non supportano TLS
non potranno più stabilire una connessione!
Verifichiamo che la parte finale del file di configurazione del vsftpd
sia così:
# This option specifies the location of the RSA certificate to use for SSL # encrypted connections. rsa_cert_file=/etc/ssl/certs/vsftpd.cert.pem rsa_private_key_file=/etc/ssl/private/vsftpd.key.pem ssl_enable=YES allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=NO ssl_ciphers=HIGH
Salviamo le modifiche e usciamo da nano
.
Riavviamo il servizio FTP
:
$ sudo systemctl restart vsftpd
A questo punto abbiamo finito, il server FTP
con vsftpd
è configurato ed è pronto per l’utilizzo!