Installare un server FTP con vsftpd su Debian 10

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:

  1. Un server con il sistema operativo Debian 10
  2. Un utente non-root di sistema con i privilegi sudo
  3. 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 attiva
  • 21 – per lo scambio di comandi tra il server e un client
  • 990 – per FTP implicito con SSL/TLS abilitato
  • 40000-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 protocollo FTP l’accesso a filesystem al di fuori del prorio chroot:
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 parametro local_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 mettessimo YES come il valore di questo parametro, allora tutti gli utenti presenti nel file di autorizzazione verrebbero negati all’uso dell’FTP, quindi mettiamo il valore NO
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!

Lascia un commento