FTPS con vsftpd

Il protocollo FTP è, a ragione, abbastanza disprezzato dai SysAdmin.

Siccome è un protocollo molto vecchio, presenta dei comportamenti che non sono più adatti alle configurazioni attuali. Uno di questi è la trasmissione in chiaro delle credenziali.

Come per altri protocolli, è stata aggiunta la possibilità di utilizzare TLS come trasporto ottenendo il protocollo FTPS (RFC4217), che non va confuso con il protocollo SFTP

Questa guida parte da una configurazione funzionante di vsftpd su un server CentOS, ma è facilmente adattabile ad altri contesti.

Un client come FileZilla configurato per tentare FTPS e fare fallback in FTP che si connette ad un server FTP normale ha un comportamento di questo tipo:

Status: Connection established, waiting for welcome message...
Status: Insecure server, it does not support FTP over TLS.
Status: Connected
Status: Retrieving directory listing...

Vediamo, quindi, come attivare FTPS mantenendo comunque la compatibilità con i client FTP.

Per questo scopo si può riciclare il certificato ssl del web server condiviso anche dai servizi di posta elettronica.

La versione di vsftpd distribuita con CentOS è compilata con SSL, per altre versioni si può verificare con questo comando:

ldd /usr/sbin/vsftpd | grep libssl

che, se vsftpd supporta ssl, dà come output un riferimento a libssl.so.

Iniziamo quindi a modificare il file /etc/vsftpd/vsftpd.conf per aggiungere i parametri necessari.

Come prima cosa le chiavi SSL:

rsa_cert_file=/path/di/file.crt
rsa_private_key_file=/path/di/file.key

È anche possibile includere la chiave e il certificato in un unico file PEM e specificarlo nel primo dei due parametri, omettendo il secondo.

Quindi abilitiamo ssl con TLSv1 e disabilitiamo di protocolli SSL non sicuri:

ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

Configuriamo il comportamento nei confronti degli utenti:

allow_anon_ssl=NO

per disabilitare le connessioni anonime via FTPS;

force_local_data_ssl=NO

per non obbligare gli utenti ad utilizzare TLS per il trasferimento dei dati; se si mette YES in questo parametro gli utenti saranno obbligati ad utilizzare un client FTPS e non potranno più collegarsi in FTP;

force_local_logins_ssl=NO

stesso discorso come sopra, ma applicato allo scambio di credenziali.

Da ultimo alcuni parametri utili:

require_ssl_reuse=NO

per migliorare la compatibilità con alcuni client FTPS (dettagli qui);

ssl_ciphers=HIGH

per abilitare solamente i protocolli SSL più sicuri, per il significato del parametro vedere la pagina di manuale di ciphers(1).

Se il server è protetto da un firewall che analizza i pacchetti FTP per aprire selettivamente le porte per la modalità PASV questo trucco non funzionerà più perché con il trasporto TLS il firewall non è più in grado di ficcanasare nei pacchetti in transito.

In questo caso bisogna specificare in /etc/vsftpd/vsftpd.conf l’intervallo di porte da utilizzare per PASV, ad esempio

pasv_min_port=61000
pasv_max_port=61100

e aprire il medesimo intervallo di porte TCP nel firewall.

Ricaricata la configurazione di vsftpd, al primo collegamento si avrà la richiesta di conferma del certificato, questo è quello che appare in FileZilla 3.10.0.2

FileZilla connessione ftpsPer default le nuove versioni di questo client utilizzano TLS se disponibile, quindi il comportamento del client con il medesimo server in cui è stato abilito FTPS sarà questo:

Status: Connection established, waiting for welcome message...
Status: Initializing TLS...
Status: Verifying certificate...
Status: TLS connection established.
Status: Connected
Status: Retrieving directory listing...

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

Spazio per un commento