12 ottobre 2021

ProFTPd: FTP server su Linux usando Webmin

proFTPd

E' uno dei server FTP più diffusi per Linux, usato da una folta schiera di siti e progetti presenti su Internet per gestire il trasferimento di file. Qui su Wikipedia le schede di confronto con altri server FTP.

Installazione e configurazione di base con Webmin

Per molti amministratori di Linux, l'unico modo di procedere è via command line, configurando tutto a manina. Per quelli più pigri come me, a volte è più comodo e conveniente avere una interfaccia centrale un po' più grafica che predispone molti moduli e opzioni, secondo delle linee guida comuni.

Per i server senza GUI, questa interfaccia è Webmin, che guarda caso, dispone anche del modulo proFTPd nella sezione 'Server'.

Se non è installato, cercate nella lista dei moduli non utilizzati, premete il tasto "Installa modulo" e Webmin si preoccuperà dell'installazione e dell'attivazione del server, mettendolo tra i servizi avviati al boot.


 

Non è detto che le vostre esigenze siano proprio le stesse del creatore del modulo Webmin. Infatti ho scoperto che molte delle configurazioni descritte sotto le ho dovute configurare comunque da terminale, o dalla sezione 'Configurazione manuale dei file' del modulo Webmin.

Infatti, se avete dimestichezza con l'inglese, o se vi fidate dei traduttori automatici, vi consiglio la lettura della documentazione scritta dall'autore del modulo Webmin. Tra le decine di opzioni e di configurazioni  possibili, ha reso in forma grafica e 'assistita' quelli più utili ai suoi scopi e alle sue preferenze. Le altre dovrete smanettarle voi in qualche altro modo. Questo è uno dei motivi per scrivere la paginetta di blog con i miei appunti.

Opzionale: server virtuali

Dato che nella mia configurazione non ho necessità di gestire tanti siti diversi con lo stesso server, non ho configurato questa opzione. 
Per attivare questa opzione, sarà necessario disporre di più IP pubblici a cui associare dei nomi di server diversi, ma tutti afferenti alla stessa istanza di proFTPd. 

Webmin mette a disposizione una paginetta dedicata in cui configurare i settaggi specifici per i server virtuali da configurare. Le opzioni che valgono per tutti i server non vanno ripetuti, ma inseriti in una sezione 'Global' del file di configurazione.

Per tenere tutto in ordine, è consigliabile definire un file aggiuntivo di configurazione per ogni server virtuale. Questo è lo standard che segue anche il modulo Webmin.

Opzionale: utenti virtuali

Gli utenti di default di proFTPd sono gli utenti configurati nel vostro Linux: root, administrator, pippo, pluto e paperino. Per questi utenti potete stabilire se effettivamente possono collegarsi in FTP, quale directory utilizzare come 'Home', cosa possono fare o non fare e con che permessi.
 
Se dovete aprire l'accesso FTP ad utenti che non sono i vostri utenti di rete, ma clienti, collaboratori o semplicemente amici, non è necessario creare gli utenti come Users di Linux.
Per questa necessità proFTPd ha pensato di tenerli distinti dagli utenti 'veri' e li chiama utenti 'virtuali'.

Gli utenti virtuali hanno tutte le caratteristiche degli utenti veri, ma sono elencati altrove rispetto agli utenti di sistema, e invece di essere autenticati dal sistema, verranno autenticati dal server FTP.
 
Se sono tanti, potrebbero essere inseriti in una tabella di database, ad esempio, come in questo quesito di Stack Overflow.

Nel nostro caso, sono pochi, e a me basta un piccolo file dedicato, che è una delle opzioni consentite, come descritto in questa domanda posta su Stack Overflow (già sentito nominare?).
Questo file di configurazione specifico va indicato nel file di configurazione generale, insieme all'indicazione del modulo di autenticazione, come segue:

<IfModule mod_tls.c>
TLSEngine    on
TLSLog    /var/log/proftpd/tls.log
TLSProtocol    TLSv1.2
 

Per aggiungere gli utenti è necessario usare un programmino accessorio chiamato ftpasswd, nel quale indicheremo tutti i parametri che caratterizzano l'utente.
Di default il programmino ci chiederà la password, che cripterà secondo le nostre indicazioni, in modo che non sia leggibile da chi dovesse aprire il file, e aggiungerà un nuovo utente in coda al file.

# ftpasswd --passwd --file /etc/proftpd/virtual_users.passwd --sha512 --gid 99 --uid 99 --shell /sbin/nologin --name pincopallo --home /vhosts/example.net/site1/public_html

 
Non è garantito che gli utenti virtuali funzionino al primo colpo. Qui una interrogazione su Stack Overflow (Server Fault) per chiedere perché questi utenti si vedono negare l'accesso.

Chi può fare cosa

Per ogni utente è possibile definire limitazioni sui comandi disponibili. 
La gerarchia pensata dall'autore è, grosso modo:
Server -> Cartella/Directory -> Comandi -> Utenti
 
In questa ottica, si possono creare delle strutture gerarchiche per ogni server, dove per ciascuna cartella radice si elencano i comandi disponibili ai vari utenti. Il sistema è potente, ma anche abbastanza complesso.
Così è possibile creare scenari del tipo: 
  • cartelle in sola lettura
  • cartelle in sola scrittura
  • cartelle 'cieche' dove si può scrivere ma non vedere il contenuto caricato dagli altri
  • Server con determinati utenti e non altri, o restrizioni sugli IP di provenienza
  • cartelle con uno scrittore e scaricatori anonimi

Opzionale: NAT e collegamento PASV

 Se, come nel mio caso, il server FTP si trova dietro un firewall e senza un IP pubblico, dovrete configurare anche il NAT, ossia la mappatura tra IP pubblico e IP privato del server, e con questo, spesso anche il collegamento dati PASV, cioè la modalità di trasferimento per cui le porte vengono fornite dal server e non dal client.

Il collegamento passivo consente di semplificare la configurazione del firewall. Infatti sarà il server ad aprire le porte di trasferimento dati e a comunicarle al client. Sul firewall sarà necessario solo indicare un range di porte, tipicamente tra la 50000 e la 60000, su cui consentire traffico FTP Dati.

Trovate qui la documentazione ufficiale per configurare le opzioni NAT e firewall.

Opzionale: connessione crittografata e TLS

 Come saprete, l'FTP viene visto un po' male da chi si occupa di sicurezza. Infatti, nella sua versione orginale (e ormai arcaica) l'autenticazione FTP viene inviata in chiaro

Per ovviare a questa evidente falla di sicurezza che ci espone ad orecchie indiscrete, gli esperti del settore hanno pensato a due soluzioni diverse: SFTP, ossia FTP Sicuro, e FTP su TLS (Transport Layer Security).

FTP su TLS fa lo stesso percorso dell'HTTPS, ossia stabilisce prima una connessione crittografata e certificata, e poi prosegue con i comandi standard ma su un canale protetto.

Anche questa opzione è stata trascurata dal creatore del modulo Webmin, infatti per abilitarla dobbiamo andare a modificare a manina i file di configurazione, ad esempio dall'ultima paginetta del moduo.

Nel file di configurazione principale, proftpd.conf  attiviamo l'inclusione del modulo, e poi andiamo nel file di configurazione specifico ad impostare tutte le nostre preferenze. 


 

Qui trovate la documentazione ufficiale proFTPd del modulo TFS (in inglese).

Le prime voci sono autoesplicative:

<IfModule mod_tls.c>
TLSEngine    on
TLSLog    var/log/proftpd/tls.log
TLSProtocol    TLSv1.2

Negli esempi trovate abilitati anche SSLv.2 e v.3. Carissimi, sto scrivendo nel 2021, sconsiglio vivamente di attivare qualunque protocollo più antico di TLSv.1.2, pubblicato nel 2008, ormai più di dieci anni fa!

Ma chi ci assicura?

Per utilizzare il TLS serve un certificato. Trovate in circolazione le istruzioni per generare un certificato da command line, ma, dato che stiamo utilizzando Webmin, possiamo anche sfruttare le sue potenzialità in questo ambito.

Dalla pagina di configurazione principale di Webmin, tra gli ultimi sottomoduli, troviamo 'SSL Encryption', come mostrato nella sua documentazione.

Da questo modulo è possibile vedere il certificato auto-firmato di Webmin, richiedere nuovi certificati auto-firmati, configurare la propria centrale di autorità (CA), e anche chiedere certificati esterni a Let's Encrypt.

Nel mio caso, ho semplicemente copiato il percorso del certificato auto-firmato di Webmin, e l'ho riutilizzato pari pari in proFTPd.

TLSRSACertificateFile    /etc/webmin/miniserv.pem
TLSRSACertificateKeyFile    /etc/webmin/miniserv.pem

E' chiaro che, lato client, questo certificato viene segnalato come autentico ma non verificabile, e può richiedere un consenso esplicito da parte dell'utente per considerarlo attendibile. E' sicuramente più professionale chiedere un certificato Let's Encrypt per il nostro dominio, purché ci organizziamo anche per il suo rinnovo periodico. 

Alziamo l'asticella, o forse no

Purtroppo non tutti i client, e tanto più i loro operatori, sono in grado di operare o di configurare un canale protetto. Per questo motivo, è possibile lasciare opzionale sia il collegamento sicuro TLS del canale dei comandi FTP, che quello dei dati. Nel nostro caso, abbiamo lasciato commentato l'istruzione di configurazione che obbliga i client ad usare il TLS.

# Are clients required to use FTP over TLS when talking to this server?
#
#TLSRequired    on

Non bisogna dimenticare che se abbiamo scelto e configurato un trasferimento di tipo passivo o PASV, i collegamenti da proteggere sono due, quello dei comandi FTP e quello del trasferimento dei blocchi di dati. Sarebbe opportuno proteggere anche la seconda connessione, ma, ancora, non tutti i client hanno questo livello di sofisticazione. 

Bisticci con FileZilla

Ho collaudato il server FTP usando FileZilla da Windows, ma non tutto è filato liscio, in particolare da quando ho attivato il TLS.

Come documentato su StackOverflow e in altri blog non sempre il TLS risolve tutti i problemi, anzi a volte ne crea di nuovi.  

Stato:    Connessione stabilita, in attesa del messaggio di benvenuto...
Stato:    Inizializzazione TLS...
Stato:    Verifica del certificato in corso...
Stato:    Connessione TLS stabilita.
Stato:    Accesso effettuato
Stato:    Recupero elenco cartella di "/"...
Comando:    CWD /
Risposta:    250 comando CWD eseguito con successo
Comando:    TYPE I
Risposta:    200 Tipo impostato a I
Comando:    PASV
Risposta:    227 Entering Passive Mode (2,116,27,205,217,118).
Comando:    MLSD
Risposta:    150 Apertura della connessione dati in modalità BINARY per MLSD
Risposta:    425 Impossibile aprire la connessione dati: Operazione non permessa
Errore:    Non è stato possibile leggere il contenuto della cartella
Stato:    Recupero elenco cartella di "/"...
Comando:    CDUP
Risposta:    250 comando CDUP eseguito con successo

Come vedete dal tracciato, il comando MLSD fallisce. Lato proFTPd troverete l'errore corrispondente nel log TLS.

Una possibile soluzione sta nel rilassare le richieste che facciamo ai client TLS, esattamente come indicato nei commenti del file tls.conf

# ... or the same with relaxed session use for some clients (e.g. FireFtp)
TLSOptions        NoCertRequest EnableDiags NoSessionReuseRequired