Introduzione

FTP, acronimo di File Transfer Protocol, è un protocollo di rete che una volta era ampiamente utilizzato per lo spostamento di file tra un client e un server. Da allora è stato sostituito da metodi più veloci, più sicuri e più convenienti per il trasferimento dei file.

FTP è ancora utilizzato, quando hai bisogno di FTP, tuttavia, vsftpd è una scelta eccellente. Ottimizzato per sicurezza, prestazioni e stabilità, vsftpd offre una protezione efficace contro molti problemi di sicurezza riscontrati in altri server FTP ed è l'impostazione predefinita per molte distribuzioni Linux.

In questo tutorial, configureremo vsftpd su Ubuntu 18.04 LTS per consentire a un utente di caricare i file nella sua directory home usando FTP con credenziali di accesso garantite da SSL/TLS.

Se il vostro intento è installare VSFTP su di un server in remoto continuate a leggere, altrimenti se volete installare VSFTP sul vostro computer locale saltate il primo paragrafo "Connessione al Server" e leggere il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno della password per l'autenticazione.

Per connettersi al server come utente root digitare questo comando:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare il primo parametro:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

Siete ora connessi al vostro server, siete pronti per iniziare l'installazione di VSFTP su Ubuntu 18.04 LTS.

Installare VSFTP

VSFTP è disponibile di default nel repository ufficiale di Ubuntu.
Aggiornare l'elenco dei pacchetti:

sudo apt update

Installare VSFTPD:

sudo apt install vsftpd

Una volta completata l'installazione, copiare il file di configurazione in modo che possiamo iniziare con una configurazione vuota, salvando l'originale come backup:

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

Configurare il Firewall (UFW)

Controllare lo stato del firewall per vedere se è abilitato. Se lo è, assicurarsi che il traffico FTP sia consentito in modo che le regole del firewall non blocchino i test.

Controllare lo stato del firewall:

sudo ufw status

Dovreste ricevere un messaggio di output simile al seguente:


Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Aggiungere regole per il traffico FTP.

Aprire le porte 20 e 21 per FTP, la porta 990 per il TLS e le porte 40000 e 50000 per l'intervallo di porte passive che intendiamo impostare nel file di configurazione:

sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw status

Controllare nuovamente il firewall per visualizzare le nuove porte aperte:
Dovreste ricevere un messaggio di output simile al seguente:


Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
990/tcp                    ALLOW       Anywhere
20/tcp                     ALLOW       Anywhere
21/tcp                     ALLOW       Anywhere
40000:50000/tcp            ALLOW       Anywhere
OpenSSH (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)

Configurare la directory per un utente

Creare un utente FTP dedicato, potreste già avere un utente che ha bisogno di un accesso FTP. Consigliamo comunque di creare un nuovo utente fino a quando non avrete configurato e testato questa configurazione.

Creare un nuovo utente:

sudo adduser grok

Assegnare una password quando richiesto.

L'FTP è generalmente più sicuro quando gli utenti sono limitati a una directory specifica. VSFTPD limita un utente con le prigioni chroot. Quando chroot è abilitato, gli utenti locali per impostazione predefinita sono limitati alla loro directory home.

Creare una directory ftp per servire come chroot:

sudo mkdir /home/grok/ftp

Impostare il proprietario della cartella:

sudo chown nobody:nogroup /home/grok/ftp

Rimuovere i permessi di scrittura:

sudo chmod a-w /home/grok/ftp

Verificare i permessi:

sudo ls -la /home/grok/ftp

Dovreste ricevere un messaggio di output simile al seguente:


total 8
dr-xr-xr-x 2 nobody nogroup 4096 Apr 18 20:44 .
drwxr-xr-x 3 grok  grok   4096 Apr 18 21:09 ..

Creare una cartella per i file da caricare (upload):

sudo mkdir /home/grok/ftp/files

Impostare il proprietario della nuova cartella:

sudo chown grok:grok /home/grok/ftp/files

Verificare i permessi:

sudo ls -la /home/grok/ftp

Dovreste ricevere un messaggio di output simile al seguente:


total 12
dr-xr-xr-x 3 nobody nogroup 4096 Apr 18 20:44 .
drwxr-xr-x 5 grok  grok   4096 Apr 18 21:09 ..
drwxr-xr-x 2 grok  grok   4096 Apr 18 21:08 files

Creare un file di test:

echo "vsftpd file di test" | sudo tee /home/grok/ftp/files/test.txt

Configurare l'accesso FTP

Consentire a un singolo utente con un account shell locale di connettersi con FTP.
Verificare le due impostazioni chiave che dovrebbero essere già impostate di default nel file di configurazione vsftpd.conf.

Aprire il file di configurazione di vsftpd:

sudo nano /etc/vsftpd.conf

...
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
...

Successivamente, consentire all'utente di poter caricare dei file rimuovendo il commento (se è commentato) dal parametro write_enable:


...
write_enable=YES
...

Rimuovere anche il commento da chroot_local_user per impedire all'utente connesso tramite FTP di accedere a qualsiasi file o comando esterno alla struttura della directory:


...
chroot_local_user=YES
...

Aggiungere i seguenti parametri in modo che la nostra configurazione funzioni per questo utente e per eventuali futuri utenti aggiuntivi.
Aggiungere queste impostazioni alla fine del file:


...
user_sub_token=$USER
local_root=/home/$USER/ftp

Limitare anche il numero di porte che possono essere utilizzate per l'FTP passivo per assicurarci che siano disponibili connessioni sufficienti:


...
pasv_min_port=40000
pasv_max_port=50000

ATTENZIONE: Durante la configurazione del firewall, abbiamo aperto le porte che impostiamo qui per l'intervallo di porte passive. Se si modificano i valori, assicurarsi di aggiornare le impostazioni del firewall.

Per consentire l'accesso FTP caso per caso, impostiamo la configurazione in modo che gli utenti abbiano accesso solo quando sono esplicitamente aggiunti a un elenco:


...
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

userlist_deny quando è impostato su YES, gli utenti della lista sono negati l'accesso FTP. Quando è impostato su NO, solo gli utenti nell'elenco possono accedere.

Salvare e chiudere il file.
Per salvare il file con l'editor di testo nano, premere Ctrl+O, quindi premere Invio per confermare il nome del file da scrivere. Per chiudere il file, premere Ctrl+X.)

Infine, aggiungiamo il nostro utente a /etc/vsftpd.userlist:

echo "grok" | sudo tee -a /etc/vsftpd.userlist

Verificare che sia stato aggiunto correttamente:

cat /etc/vsftpd.userlist

Dovreste ricevere un messaggio di output simile al seguente:


...
grok

Riavviare il daemon di vsftpd per caricare le modifiche alla configurazione:

sudo systemctl restart vsftpd

Test dell'accesso FTP

Abbiamo configurato il server per consentire solo all'utente grok di connettersi tramite FTP. Assicurarsi che funzioni come previsto.

Gli utenti anonimi non devono connettersi, abbiamo disabilitato l'accesso anonimo.
Agli utenti anonimi dovrebbe essere negata l'autorizzazione.
Aprire un'altra finestra di terminale ed eseguire il seguente comando. Assicurati di sostituire 103.1.233.1 con l'indirizzo IP pubblico del vostro server:

ftp -p 103.1.233.1

Dovreste ricevere un messaggio di output simile al seguente:


Connected to 103.1.233.1.
220 (vsFTPd 3.0.3)
Name (103.1.233.1:root): anonymous
530 Non-anonymous sessions must use encryption.
Login failed.
421 Service not available, remote server has closed connection
ftp> 

Chiudere la sessione, scrivere:

bye

Se invece si prova ad accedere con un'altro utente con privilegi sudo:

ftp -p 103.1.233.1

Dovreste ricevere un messaggio di output simile al seguente:


Connected to 103.1.233.1.
220 (vsFTPd 3.0.3)
Name (103.1.233.1:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>

Chiudere la sessione, scrivere:

bye

L'utente grok, invece dovrebbe essere in grado di connettersi, leggere e scrivere file:

ftp -p 103.1.233.1

Dovreste ricevere un messaggio di output simile al seguente:


Connected to 103.1.233.1.
220 (vsFTPd 3.0.3)
Name (103.1.233.1:default): grok
331 Please specify the password.
Password: your_user's_password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Entrare nella directory in cui sono presenti dei file e usiamo il get comando per trasferire il file di prova che abbiamo creato in precedenza sul nostro computer locale:

cd files
get test.txt

Dovreste ricevere un messaggio di output simile al seguente:


227 Entering Passive Mode (195,201,18,78,176,56).
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
17 bytes received in 0.00 secs (218.4416 kB/s)

Successivamente, carichiamo il file con un nuovo nome per testare le autorizzazioni di scrittura:

put test.txt upload.txt

Dovreste ricevere un messaggio di output simile al seguente:


227 Entering Passive Mode (195,201,18,78,161,23).
150 Ok to send data.
226 Transfer complete.
17 bytes sent in 0.00 secs (353.2247 kB/s)

Chiudere la connessione:

bye

Proteggere i trasferimenti

Poiché FTP non crittografa alcun dato in transito, incluse le credenziali dell'utente, abiliteremo TLS/SSL per fornire tale crittografia. Il primo passo è creare i certificati SSL da utilizzare con vsftpd.

Utilizzare openssl per creare un nuovo certificato e utilizzare il parametro -days per renderlo valido per un anno. Nello stesso comando, aggiungere una chiave RSA privata a 2048 bit. Impostando sia i parametri -keyoute e -out per lo stesso valore, la chiave privata e il certificato sarà situato nello stesso file:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

Vi verrà richiesto di fornire informazioni sull'indirizzo per il certificato. Inserire le proprie informazioni.

Dovreste ricevere un messaggio di output simile al seguente:


Generating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:MI
Locality Name (eg, city) []:Milano
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Noviello
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: INDIRIZZO_IP_DEL_TUO_SERVER
Email Address []:

Una volta creati i certificati, aprire nuovamente il file di configurazione di vsftp:

sudo nano /etc/vsftpd.conf

Verso la fine del file, commentare le due righe che iniziano con rsa_:


...
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
...

Aggiungere le seguenti linee che puntano al certificato e alla chiave privata appena creata:


...
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
...

Imporre l'utilizzo di SSL, cambiare ssl_enable in YES:


...
ssl_enable=YES
...

Successivamente, aggiungere le seguenti righe per negare esplicitamente le connessioni anonime su SSL e per richiedere SSL sia per il trasferimento dei dati che per i login:


...
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
...

Quindi, configurare il server per utilizzare TLS, il successore di SSL.
Aggiungere le seguenti righe:


...
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
...

Infine, richiedere suite di crittografia "alte", che attualmente significano lunghezze chiave uguali o superiori a 128 bit:


...
require_ssl_reuse=NO
ssl_ciphers=HIGH
...

Quindi, di seguito, un riepilogo gli ultimi parametri aggiunti nel file di configurazione:


...
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.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

Salvare e chiudere il file.
Per salvare il file con l'editor di testo nano, premere Ctrl+O, quindi premere Invio per confermare il nome del file da scrivere. Per chiudere il file, premere Ctrl+X.)

Riavviare il servizio di vsftpd affinché le modifiche abbiano effetto:

sudo systemctl restart vsftpd

A questo punto, non saremo più in grado di connetterci con un client della riga di comando non sicuro:
L'utente grok, invece dovrebbe essere in grado di connettersi, leggere e scrivere file:

ftp -p 103.1.233.1

Connected to 103.1.233.1.
220 (vsFTPd 3.0.3)
Name (103.1.233.1:default): grok
530 Non-anonymous sessions must use encryption.
Login failed.
421 Service not available, remote server has closed connection

Test dell'accesso TLS con FileZilla

I client FTP più moderni possono essere configurati per utilizzare la crittografia TLS.

Aprire FileZilla, File -> Gestore Siti -> Nuovo Sito

Compilare il campo Host con il nome o l'indirizzo IP. Sotto il menu a discesa Crittografia, selezionare Richiedi FTP esplicito su TLS.

Per Tipo di accesso, selezionare Richiedi password. Inserire il proprio nome utente FTP nel campo Utente.

Fare clic su Connetti nella parte inferiore dell'interfaccia. Vi verrà chiesta la password dell'utente:

Fare clic su OK per connettersi. Ora dovreste essere connessi al vostro server con la crittografia TLS/SSL.

Appena connessi, vi verrà chiesto di accettare un certificato del server.

Dopo aver accettato il certificato, fare doppio clic sulla cartella files e trascinare upload.txt sinistra per confermare che si è in grado di scaricare i file.

Al termine, fare clic con il pulsante destro del mouse sulla copia locale, rinominarla upload-tls.txt e trascinarla di nuovo sul server per confermare che è possibile caricare i file:

È confermato che è possibile trasferire in modo sicuro e con successo i file con SSL/TLS abilitato.

Disabilitare accesso alla shell

Se non è possibile utilizzare TLS a causa dei requisiti del client, è possibile ottenere una certa sicurezza disabilitando la possibilità per l'utente FTP di accedere in qualsiasi altro modo.
Un modo relativamente semplice per impedirlo è creare una shell personalizzata. Questo non fornirà alcuna crittografia, ma limiterà l'accesso di un account compromesso ai file accessibili via FTP.

Apri un file chiamato ftponly nella directory bin:

sudo nano /bin/ftponly

Aggiungere un messaggio che informa l'utente del perché non è in grado di accedere:


#!/bin/sh
echo "Questo account è limitato solo all'accesso FTP."

Salvare e chiudere il file.
Per salvare il file con l'editor di testo nano, premere Ctrl+O, quindi premere Invio per confermare il nome del file da scrivere. Per chiudere il file, premere Ctrl+X.)

Modificare le autorizzazioni per rendere eseguibile il file:

sudo chmod a+x /bin/ftponly

Aprire l'elenco di shell valide:

sudo nano /etc/shells

Alla fine aggiungere:


...
/bin/ftponly

Salvare e chiudere il file.
Per salvare il file con l'editor di testo nano, premere Ctrl+O, quindi premere Invio per confermare il nome del file da scrivere. Per chiudere il file, premere Ctrl+X.)

Aggiornare la shell dell'utente con il seguente comando:

sudo usermod grok -s /bin/ftponly

Provare ad accedere al server come grok:

ssh [email protected]_ip_del_server

Dovreste ricevere un messaggio di output simile al seguente:


...
This account is limited to FTP access only.
Connection to 195.201.18.78 closed.

Conferma che l'utente non può più accedere tramite ssh al server ed è limitato esclusivamente all'accesso FTP.

L'installazione e configurazione di VSFTPD su Ubuntu 18.04 LTS è terminata.