Vsftpd è l'acronimo di Very Secure FTP Daemon:è uno dei server ftp più utilizzati su Linux e altri sistemi operativi simili a Unix. È open source e rilasciato con licenza GPL e supporta utenti virtuali e SSL per la crittografia
dei dati. In questo tutorial vedremo come installarlo e configurarlo su Linux.
In questo tutorial imparerai :
- Come installare vsftpd su Debian 10
- Come configurare vsftpd
- Come impostare l'utilizzo anonimo
- Come configurare l'accesso con utenti locali
- Come configurare utenti virtuali
- Come configurare ufw per consentire il traffico in entrata

Requisiti software e convenzioni utilizzati
Categoria | Requisiti, convenzioni o versione del software utilizzata |
---|---|
Sistema | Debian 10 (Buster) |
Software | vsftpd, openssl, libpam-pwdfile |
Altro | Autorizzazioni di root per installare e configurare vsftpd |
Convenzioni | # – richiede che i comandi linux dati vengano eseguiti con i privilegi di root direttamente come utente root o usando sudo command$ – richiede l'esecuzione di determinati comandi linux come un normale utente non privilegiato |
Installazione
Vsftpd è disponibile nei repository Debian ufficiali, quindi per installarlo possiamo usare il nostro gestore di pacchetti preferito; si tratta solo di sincronizzare i repository e installare il pacchetto. Entrambe le cose possono essere eseguite
eseguendo i seguenti comandi:
$ sudo apt-get update && sudo apt-get install vsftpd
Pochi secondi e il pacchetto verrà installato sul nostro sistema Debian. Gli script di installazione inclusi nel pacchetto si occuperanno anche di avviare il vsftpd servizio automaticamente ma dobbiamo ricordarci di riavviare o ricaricare il servizio ogni volta che cambiamo il file di configurazione. Per poter utilizzare gli utenti virtuali funzione fornita da vsftpd abbiamo anche bisogno di installare un altro pacchetto:
$ sudo apt-get install libpam-pwdfile
Vedremo il suo utilizzo nella sezione dedicata di questo tutorial.
Una volta installati i pacchetti necessari, possiamo procedere ulteriormente e configurare vsftpd:vedremo come farlo nella prossima sezione di questo tutorial.
Configurazione Vsftpd
Il file di configurazione di vsftpd è /etc/vsftpd.conf
. Se lo apriamo possiamo vedere le varie direttive già contenute in esso. Vediamo quali sono i più rilevanti per i casi più comuni.
Abilita accesso anonimo
L'accesso non autenticato al server, come utenti anonimi, è disabilitato per impostazione predefinita. Per abilitarlo, dobbiamo usare anonymous_enable
direttiva, che sul file di configurazione è posta alla riga 25
. Tutto quello che dobbiamo fare è impostarlo su YES
:
deve modificare l'istruzione in:
anonymous_enable=YES
Un'altra direttiva che potremmo voler cambiare è quella che ci permette di impostare una directory in cui vsftpd proverà a navigare dopo un accesso anonimo. La direttiva che ci permette di controllare questa impostazione è anon_root
. Diciamo che vogliamo che un utente anonimo acceda a /srv/ftp
directory per impostazione predefinita, scriveremmo:
anon_root=/srv/ftp
Tutti gli accessi anonimi sono mappati internamente a un utente designato, che, per impostazione predefinita, è ftp
. Per cambiare questa mappatura dobbiamo usare il ftp_username
opzione e impostarlo sul nome dell'utente a cui vogliamo mappare gli utenti anonimi.
Per impostazione predefinita, un utente anonimo non potrà scrivere nulla sul server, per ovvi motivi di sicurezza. Se si desidera modificare questo comportamento (non consigliato) ci sono alcune opzioni che devono essere modificate. Prima di tutto il generale write_enable
la direttiva deve essere impostata su YES
. Questa direttiva è commentata alla riga 31
del file di configurazione, quindi tutto ciò che devi fare è rimuovere il commento.
# Uncomment this to enable any form of FTP write command. write_enable=YES
Una volta abilitata questa direttiva, tutto ciò che dobbiamo fare è lavorare su altre due opzioni:anon_upload_enable
e anon_mkdir_write_enable
. Quando il primo è impostato su YES
un utente anonimo potrà caricare file, ma solo se l'utente su cui è mappato (come abbiamo detto, ftp, per impostazione predefinita) ha i permessi di scrittura sulla directory di destinazione. Per attivare questa opzione non dobbiamo fare altro che rimuovere il commento dalla riga 40
del file di configurazione:
# Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will # obviously need to create a directory writable by the FTP user. anon_upload_enable=YES
Il anon_mkdir_write_enable
direttiva, invece, se impostata su YES
consente agli utenti anonimi di creare nuove directory sul server, alle stesse condizioni che abbiamo visto sopra (l'utente sottostante sul server deve avere i permessi di scrittura sulla directory padre). La direttiva si trova alla riga 44
del file di configurazione:
# Uncomment this if you want the anonymous FTP user to be able to create # new directories. anon_mkdir_write_enable=YES
Ancora una volta, poiché la variabile è già impostata su YES
, affinché sia pertinente, tutto ciò che dobbiamo fare è rimuovere il commento da esso.
Per consentire agli utenti anonimi di eseguire anche altri tipi di operazioni di scrittura, come ad esempio rinominare o eliminazione una directory, dobbiamo usare un'altra direttiva che non è presente nel file di configurazione, anon_other_write_enable
e impostalo su YES
se quello sopra è il nostro comportamento desiderato:
anon_other_write_enable=YES
Accessi autenticati
Per consentire agli utenti del sistema locale di accedere al server ftp con la loro password di sistema, il local_enable
la direttiva deve essere impostata su YES
:questa è l'impostazione predefinita sul sistema Debian. La direttiva si trova alla riga 28
del demone
file di configurazione:
# Uncomment this to allow local users to log in. local_enable=YES
Per impostazione predefinita, quando un utente locale si autentica con successo, avrà la propria home directory come root. È tuttavia possibile specificare un punto di partenza alternativo utilizzando local_root
direttiva. Questa direttiva non è presente nel file di configurazione, quindi dobbiamo aggiungerla se vogliamo usarla. Per impostare il /srv/ftp
directory come root locale, per esempio, scriveremo:
local_root=/srv/ftp
Croot utenti locali
Come misura di sicurezza è possibile chroot ogni utente autenticato nella propria home directory. Per eseguire questo compito dobbiamo usare il chroot_local_user
direttiva:
chroot_local_user=YES
Quando questa funzione è abilitata, è possibile specificare un elenco di esclusioni, (un elenco di utenti che non devono essere sottoposti a chroot) utilizzando le seguenti direttive:
chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list
La prima direttiva è necessaria per attivare la funzionalità, l'altra per specificare la posizione del file contenente l'elenco di esclusione . Il file deve essere creato se non esiste già, altrimenti il login fallirà.
Come misura di sicurezza, quando un utente è in chroot, non dovrebbe essere in grado di scrivere nella directory di livello superiore del chroot. In tal caso, nelle versioni più recenti di vsftpd, un utente non sarà in grado di accedere e il server risponderà con il seguente messaggio:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Questo problema può essere risolto sostanzialmente in due modi. Questo primo consiste ovviamente nel fissare i permessi , negando all'utente l'accesso in scrittura alla directory di livello superiore del chroot e consentendogli di scrivere solo nelle sottodirectory.
Il secondo modo per risolvere il problema, se non ti interessano le possibili implicazioni sulla sicurezza, è quello di ignora questa restrizione , utilizzando la seguente direttiva:
allow_writeable_chroot=YES
Parlando di autorizzazioni, è importante tenere presente che l'umask predefinito per l'utente locale è impostato su 077
. Se questa impostazione è considerata troppo restrittiva, è possibile modificarla utilizzando il local_umask
direttiva. Questa direttiva è commentata alla riga 35
del file di configurazione:
# Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) #local_umask=022
Accedi con utenti virtuali
Una caratteristica interessante offerta da vsftpd è la possibilità di accedere utilizzando utenti virtuali . Un utente virtuale è un utente che non esiste realmente nel sistema, ma solo nel contesto dell'applicazione sftpd. Per abilitare questa funzione dobbiamo usare la seguente direttiva:
guest_enable=YES
Quando la funzione è attiva, tutti gli accessi non anonimi (quindi anche utenti reali/locali) vengono mappati all'utente specificato con il guest_username
direttiva, che per impostazione predefinita, come abbiamo già visto, è ftp .
Il passaggio successivo consiste nel creare un file contenente i nomi utente e le password degli utenti virtuali. Per generare una password con hash, possiamo usare openssl
ed emettere il seguente comando:
$ openssl passwd -1 Password: Verifying - Password: $1$pfwh3Jou$DQBiNjw8bBtDqys7ezTpr.
La passwd comando di openssl viene utilizzato per generare password hash (md5). Nell'esempio sopra, ci è stato chiesto di eseguire l'hashing della password e la sua conferma. Infine la password con hash viene generata e visualizzata sullo schermo.
Il nome utente, insieme alla password, deve essere inserito in un file, diciamo che è /etc/virtual_users.pwd
, nel seguente formato:
username:hashed_password
Quindi supponendo che il nostro utente virtuale si chiami "linuxconfig" scriveremo:
linuxconfig:$1$pfwh3Jou$DQBiNjw8bBtDqys7ezTpr.
L'operazione deve essere ripetuta per ogni utente virtuale che vogliamo configurare.
Ora dobbiamo creare il pam servizio che verrà utilizzato da vsftpd per autenticare gli utenti virtuali. Chiameremo il file vsftpd_virtual
e inseriscilo nel /etc/pam.d
directory. Il suo contenuto sarà il seguente:
#%PAM-1.0 auth required pam_pwdfile.so pwdfile /etc/vsftpd/virtual_users.pwd account required pam_permit.so
Come puoi vedere, abbiamo specificato nella prima riga il percorso del file contenente il nome utente e le password degli utenti virtuali. Tutto ciò che dobbiamo fare, ora, è istruire vsftpd a utilizzare questo "servizio" pam. Possiamo farlo con il pam_service_name
direttiva:
pam_service_name=vsftpd_virtual
A questo punto possiamo salvare il file di configurazione, riavviare il demone e verificare di poter accedere con l'utente virtuale appena creato.
Abilitazione del supporto SSL per la crittografia dei dati
Per impostazione predefinita, il supporto SSL è disabilitato su vsftpd, quindi i dati trasferiti non verranno crittografati. Per abilitare il supporto SSL dobbiamo utilizzare le seguenti direttive, che si trovano alle righe 149
a 151
del file di configurazione:
# This option specifies the location of the RSA certificate to use for SSL # encrypted connections. rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key ssl_enable=YES
La prima direttiva, rsa_cert_file
viene utilizzato per indicare il percorso del certificato RSA da utilizzare per le connessioni crittografate SSL. Il secondo, rsa_private_key
, invece, viene utilizzato per specificare la posizione della chiave privata RSA. Infine, il ssl_enable
viene utilizzata per abilitare l'uso della crittografia SSL.
L'esempio utilizza /etc/ssl/certs/ssl-cert-snakeoil.pem
e /etc/ssl/private/ssl-cert-snakeoil.key
file, ma quasi sicuramente ne vuoi usare uno dedicato.
Specifica dell'intervallo di porte per la modalità passiva
La modalità passiva FTP è l'impostazione predefinita su una nuova installazione di vsftpd, ma se vogliamo abilitarla esplicitamente possiamo utilizzare la seguente direttiva:
# Set to NO if you want to disallow the PASV method of obtaining a data connection # (passive mode). Default: YES pasv_enable=YES
Quando il server funziona in modalità passiva , invia al client un indirizzo IP e una porta che dovrebbe ascoltare per la connessione. Per impostazione predefinita, queste porte sono selezionate casualmente, tuttavia, poiché dobbiamo utilizzare un firewall sul nostro server, dobbiamo sapere quali porte dovremmo consentire il traffico completo. L'intervallo di porte da utilizzare può essere specificato con pasv_min_port
e pasv_max_port
direttive, ad esempio:
# The minimum port to allocate for PASV style data connections. Can be used to # specify a narrow port range to assist firewalling. pasv_min_port=10090 # The maximum port to allocate for PASV style data connections. Can be used to # specify a narrow port range to assist firewalling. Default: 0 (use any port) pasv_max_port=10100
Con la seguente configurazione il server utilizzerà un intervallo di porte che va da 10090
a 10100
.
Configurazione del firewall
Affinché il nostro server vsftpd funzioni correttamente, dobbiamo consentire il traffico attraverso le porte necessarie, alcune dobbiamo impostare le regole appropriate per il nostro firewall. In questo tutorial assumerò l'uso di ufw gestore firewall (firewall semplice).
La prima porta attraverso la quale vogliamo consentire il traffico è la porta 21
, che è la porta standard utilizzata dal protocollo FTP:
$ sudo ufw allow in 21/tcp
Come seconda cosa, dobbiamo consentire il traffico in entrata tramite l'intervallo di porte specificato che abbiamo impostato nella sezione precedente. Per specificare un intervallo di porte che possiamo eseguire:
$ sudo ufw allow in 10090:10100/tcp
Conclusioni
In questo articolo abbiamo visto come installare e configurare vsftpd su Debian 10 Buster. Abbiamo visto come impostare l'utilizzo anonimo e l'utilizzo degli utenti locali e come possiamo sfruttare gli utenti virtuali caratteristica fornita dal servizio. Poiché FTP non fornisce la crittografia dei dati, abbiamo visto come abilitare il supporto SSL e, infine, come configurare il firewall per consentire il traffico in entrata attraverso le porte necessarie. Per un elenco completo delle possibili direttive che possono essere utilizzate nel file di configurazione vsftpd, dai un'occhiata a vsftpd.conf manpage (VSFTPD.CONF(5)). Vuoi sapere come lavorare a livello di codice con un server FTP? Dai un'occhiata al nostro articolo su Come connettersi a un server FTP usando Python.