This is an old revision of the document!
Table of Contents
Demone ProFTPD
TimesGMT
Per default i file vengono mostrati ai client con il timestamp modificato, riportandolo alla zona GMT. Se invece si vuole il timestamp effettivo (quello mostrato da ls -l) si mette in /etc/proftpd.conf:
# The TimesGMT option causes the server to report all # ls and MDTM times in GMT and not local time. TimesGMT off
ATTENZIONE: Sembra tuttavia che sia prassi consolidata fornire i timestamp in GMT ed è compito del client tradurre in localtime. Ad esempio Filezilla 3.52 mostra il timestamp corretto solo se ProFTP è impostato al valore predefinito TimesGMT on.
Password NIS
Se l'autenticazione avviene tramite NSS con password NIS o LDAP è indispensabile disattivare l'opzione PersistentPasswd:
# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords: PersistentPasswd off
Valid shell
La direttiva per poter eseguire FTP anche senza avere una shell valida (ad esempio per VirtualHost, ciascuno con un utente senza shell):
RequireValidShell off
La direttiva in Debian Wheezy può essere messa in un file a parte, ad esempio /etc/proftpd/conf.d/local.conf
File nascosti
In generale è il client che passa gli argomenti opportuni per chiedere il listing completo, anche dei file nascosti. È possibile tuttavia forzare ProFTPD a mostrare sempre i file nascosti con la direttiva:
ListOptions "-a"
ATTENZIONE: Debian imposta tale direttiva a -l nel file /etc/proftpd/proftpd.conf. Se la stessa direttiva viene definita successivamente (ad esempio in /etc/proftpd/conf.d/local.conf), questa viene ignorata in silenzio.
Disabilitare il chmod
Per evitare che qualcuno sia troppo permissivo sui file e directory caricate via FTP (il solito chmod 777) è possibile disabilitare tale comando dal server ftp. Ad esempio mettendo in /etc/proftpd/conf.d/local.conf:
<Global>
<Limit SITE_CHMOD>
DenyAll
</Limit>
</Global>
Chroot (jail directory)
Per limitare un utente all'interno di una directory si utilizza la direttiva DefaultRoot, ad esempio con queste due righe si chiude nella propria home directory gli utenti del gruppo web, che non appartengono al gruppo ftproot. Gli utenti di ftproot invece sono limitati alla directory /home:
DefaultRoot ~ web,!ftproot DefaultRoot /home ftproot
ATTENZIONE: nelle condizioni si specifica il nome del gruppo, non dell'utente. Se ci sono più condizioni separate da virgola, queste vengono considerate come unite da AND. Se si vuole specificare la direttiva per gruppi diversi, si deve ripetere la stessa direttiva:
DefaultRoot ~ pdf-web DefaultRoot ~ ftpusers
Supporto TLS
Per evitare che le password transitino in chiaro sulla rete è opportuno abilitare il protocollo TSL obbligatorio.
Certificato RSA (legacy)
RSA è l'algoritmo crittografico per le chiavi pubbliche più vecchio e compatibile utilizzato nei certificati SSL/TLS.
Let's Encrypt in origine forniva certificati con questo formato, per verificarlo si può usare il comando:
openssl x509 -in /etc/letsencrypt/live/domain/fullchain.pem -text -noout \
| grep "Public Key Algorithm"
Public Key Algorithm: rsaEncryption
Il modulo /usr/lib/proftpd/mod_tls.so era incluso nel pacchetto Debian proftpd-basic fino alla versione Debian 10 Buster, nelle versioni successive è fornito dal pacchetto opzionale proftpd-mod-crypto. Inoltre si deve verificare che in /etc/proftpd/modules.conf sia attiva la riga
LoadModule mod_tls.c
Quindi si può creare un file /etc/proftpd/conf.d/local.conf con dentro:
<IfModule mod_tls.c>
TLSEngine on
TLSOptions NoSessionReuseRequired
TLSLog /var/log/proftpd/tls.log
PassivePorts 49152 49252
#TLSECCertificateFile /etc/apache2/ssl/https.server.org.pem
TLSRSACertificateFile /etc/letsencrypt/live/www.texnet.it/fullchain.pem
TLSRSACertificateKeyFile /etc/letsencrypt/live/www.texnet.it/privkey.pem
TLSVerifyClient off
TLSRequired on
</IfModule>
Il certificato può essere autofirmato (analogo a quello utilizzato dal server web), oppure si possono utilizzare i Certificati Let's Encrypt (certbot). Quando il certificato Let's Encrypt viene aggiornato è necessario riavviare ProFTPD oppure no?
Definire il range delle PassivePorts consente di aprire il firewall (iptables) su un numero limitato di porte. Infatti utilizzando la cifratura TLS il modulo kernel nf_nat_ftp non è in grado di aprire in maniera dinamica la porta usata dal protocollo FTP per il trasferimento dei dati. Ci sono altre ricetta iptables per evitare di aprire in maniera permanente un range di porte, ma sono un po' più complicate da comprendere.
Il parametro NoSessionReuseRequired serve per i client (notabilmente Filezilla 3.39) che non riusano la connnessione SSL aperta per il controllo anche per il successivo trasferimento dati.
Certificato EC (moderno)
Ad oggi (2026) Let's Encrypt fornisce i certificati usando l'algoritmo crittografico Elliptic Curve (ECC), che fornisce sicurezza uguali a chiavi RSA più grandi e quindi minor sforzo computazionale. Una chiave EC da 256-bit offre una sicurezza comparabile ad una chiave RSA da 3072-bit.
Per verificare il formato del file in nostro possesso si può usare il comando:
openssl x509 -in /etc/letsencrypt/live/domain/fullchain.pem -text -noout \
| grep "Public Key Algorithm"
Public Key Algorithm: id-ecPublicKey
ProFTPD 1.3.8 su Debian 13 Trixie può usare questi certificati. Si deve ovviamente verificare che il modulo TLS sia caricato assicurandosi che in /etc/proftpd/modules.conf sia attiva la riga
LoadModule mod_tls.c
Quindi le direttive di configurazione sono diverse:
IfModule mod_tls.c>
TLSEngine on
TLSOptions NoSessionReuseRequired
#TLSOptions NoSessionReuseRequired UseImplicitSSL
TLSLog /var/log/proftpd/tls.log
PassivePorts 49152 49252
TLSECCertificateFile /etc/letsencrypt/live/domain/cert.pem
TLSECCertificateKeyFile /etc/letsencrypt/live/domain/privkey.pem
TLSCACertificateFile /etc/letsencrypt/live/domain/chain.pem
TLSVerifyClient off
TLSRequired on
</IfModule>
Come si vede ProFTPD deve accedere al certificato del server cert.pem e a quello intermedio chain.pem esplicitamente, non può leggere entrambi dal file fullchain.pem.
Le altre direttive circa PassivePorts ecc. restano invariate.
FTP over TLS: Explicit vs Implicit
Il supporto a FTP su TLS può essere implementato in due modi:
- Explicit: La connessione iniziale avviene in chiaro sulla porta 21/TCP e successivamnte viene negoziato esplicitamente il TLS.
- Implicit: La connessione avviene generalmente sulla porta 990/TCP direttamente in TLS.
Explicit
Dovrebbe essere la modalità consigliata.
Con il client FileZilla si può impostare come Encryption la modalità Require explicit FTP over TLS, in modo da essere sicuri che l'autenticazione avvenga su connessione cifrata. La porta predefinita del servizio è comunque la 21/TCP.
Con il client da riga di comando lftp si potrà usare un comando del tipo:
lftp -e "set ssl:verify-certificate false" -u ftp_username 'ftp_server.domain.org:21'
Implicit
La modalità Implicit può essere attivata anche sulla porta 21/TCP, sebbene questo contravvenga il principio di minima sorpresa; è sufficiente aggiungere l'opzione UseImplicitSSL a TLSOptions:
<IfModule mod_tls.c>
TLSOptions NoSessionReuseRequired UseImplicitSSL
</IfModule>
Con il client FileZilla si dovrà selezionare come Encryption la modalità Require implicit FTP over TLS, inoltre si dovrà esplicitamente indicare la porta 21/TCP e il client stesso emetterà un warning: Selected port usually in use by a different protocol.
Volendo utilizzare il client da riga di comando lftp si dovrà utilizzare una riga di comando del tipo:
lftp -e "set ssl:verify-certificate false" -u ftp_username 'ftps://ftp_server.domain.org:21'
