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 root@IP_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 VOSTRO_UTENTE@IP_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 grok@indirizzo_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.