Server FTP di rete con ProFTPD e utenti virtuali: differenze tra le versioni

Verificata per Buster
(Verificata per Buster)
 
(25 versioni intermedie di 2 utenti non mostrate)
Riga 1: Riga 1:
{{Stub}}
{{Versioni compatibili|Wheezy|Jessie|Buster}}
{{Versioni compatibili}}
== Introduzione ==
== Introduzione ==
In questa guida verrà spiegata la l'installazione e la configurazione di un server FTP all'interno della propria LAN utilizzando ProFTPD.<br/>
In questa guida verrà spiegata la l'installazione e la configurazione di un server FTP all'interno della propria LAN utilizzando ProFTPD.<br/>
L'installazione di ProFTPD porta, di default, ad una autenticazione degli accessi basata sui file "/etc/passwd" e "/etc/group" presenti sul server. Questo significa che, per avere accesso al server FTP. l'amministratore del server deve creare un utente (con relativa home directory).<br/>
L'installazione di ProFTPD porta, di default, ad una autenticazione degli accessi basata sui file "/etc/passwd" e "/etc/group" presenti sul server. Questo significa che, per avere accesso al server FTP. l'amministratore deve creare un utente (con relativa home directory).<br/>
Questo approccio è, tipicamente, valido nel caso in cui gli accessi al server siano pochi e l'amministratore non debba preoccuparsi più di troppo di ciò che hanno in mente di fare gli utenti e dello spazio occupato da ciascuna home directory. All'aumentare delle utenze, però, i rischi legati alla sicurezza aumentano e serve trovare una strada più comoda per amministrare facilmente gli accessi.
Questo approccio è, tipicamente, valido nel caso in cui gli accessi al server siano pochi e l'amministratore non debba preoccuparsi più di troppo di ciò che hanno in mente di fare gli utenti e dello spazio occupato da ciascuna home directory. All'aumentare delle utenze, però, i rischi legati alla sicurezza aumentano e serve trovare una strada più comoda per amministrare facilmente gli accessi.


Riga 40: Riga 39:
;--shell /bin/false:L'utente non avrà una shell di login.
;--shell /bin/false:L'utente non avrà una shell di login.
;--uid ''UID'': Numero che rappresenta l'[[UID]] per l'utente virtuale. Importante notare che è attraverso l'UID che ProFTPD identifica un utente e non attraverso il suo nome. Questo porta alla naturale conclusione che è possibile creare utenti virtuali che hanno lo stesso nome degli utenti reali (se presenti) con possibilità di login sul server.<br/>La scelta dell'UID non ha particolari limitazioni ma è fortemente consigliato evitare UID pari a 0 o UID uguale a quello di utenti reali (presenti in "etc/passwd"); è invece possibile avere utenti virtuali con lo stesso UID.
;--uid ''UID'': Numero che rappresenta l'[[UID]] per l'utente virtuale. Importante notare che è attraverso l'UID che ProFTPD identifica un utente e non attraverso il suo nome. Questo porta alla naturale conclusione che è possibile creare utenti virtuali che hanno lo stesso nome degli utenti reali (se presenti) con possibilità di login sul server.<br/>La scelta dell'UID non ha particolari limitazioni ma è fortemente consigliato evitare UID pari a 0 o UID uguale a quello di utenti reali (presenti in "etc/passwd"); è invece possibile avere utenti virtuali con lo stesso UID.
;--file /etc/proftpd/ftpd.passwd:Il percorso e il nome del file che conterrà le informazioni per ciascun utente virtuale.
;--file ''/etc/proftpd/ftpd.passwd'':Il percorso e il nome del file che conterrà le informazioni per ciascun utente virtuale.


Successivamente verrà chiesta la password di cui l'utente si servirà per l'accesso FTP.
Successivamente verrà chiesta la password di cui l'utente si servirà per l'accesso FTP.
Riga 62: Riga 61:
=== Creare un gruppo virtuale ===
=== Creare un gruppo virtuale ===
La creazione di un gruppo virtuale non è indispensabile ma risulta comoda per amministrare più agevolmente la configurazione di ProFTPD.<br/>
La creazione di un gruppo virtuale non è indispensabile ma risulta comoda per amministrare più agevolmente la configurazione di ProFTPD.<br/>
Nel successivo esempio verrà creati due gruppi virtuali:
Nel successivo esempio verranno creati due gruppi virtuali:
;ftp-users:Raggrupperà '''tutti''' coloro che avranno accesso al server FTP.
;ftp-users:Raggrupperà '''tutti''' coloro che avranno accesso al server FTP.
;ftp-full:Raggruppa gli utenti con accesso FTP, con la possibilità di avere una propria directory sul server e di avere accesso completo alla directory pubblica.
;ftp-full:Raggruppa gli utenti con accesso FTP, con la possibilità di avere una propria directory sul server e di avere accesso completo alla directory pubblica.


Nello specifico:
Nello specifico:
* Tutti apparterranno a "ftp-fusers".
* Tutti apparterranno a "ftp-users".
* pippo, pluto e minnie apparterranno anche a "ftp-full".
* pippo, pluto e minnie apparterranno anche a "ftp-full".
* L'utente "ftp" (se creato) non apparterrà ad alcun gruppo.
* L'utente "ftp" (se creato) non apparterrà ad alcun gruppo.
Riga 84: Riga 83:
;--gid ''GID'':Il [[GID]] del gruppo. Valgono le stesse considerazioni scritte per l'UID.
;--gid ''GID'':Il [[GID]] del gruppo. Valgono le stesse considerazioni scritte per l'UID.


=== Cancellare un utente o un gruppo virtuale ===
=== Altre operazioni ===
;Cancellare un utente o un gruppo virtuale:
La rimozione di un utente o un gruppo virtuale può essere effettuata utilizzando l'opzione "--delete-user" o "--delete-group":
La rimozione di un utente o un gruppo virtuale può essere effettuata utilizzando l'opzione "--delete-user" o "--delete-group":
<pre>
<pre>
# ftpasswd --group --delete-group --name nomedelgruppo --file /etc/proftpd/ftpd.group
# ftpasswd --group --delete-group --name nomedelgruppo --file /etc/proftpd/ftpd.group
# ftpasswd --passwd --delete-user --name nomedutente --file /etc/proftpd/ftpd.passwd
# ftpasswd --passwd --delete-user --name nomeutente --file /etc/proftpd/ftpd.passwd
</pre>
 
;Aggiungere un utente a un gruppo:
Per aggiungere un utente a un gruppo '''già esistente''' bisogna modificare il file ''ftpd.group''. I diversi utenti appartenenti al gruppo sono separati da una virgola.<br/>
Aggiungiamo, ad esempio, ''paperino'' al gruppo ''ftp-users'':
ftp-users:x:3000:pippo,pluto,minnie''',paperino'''
 
;Bloccare un utente:
Nel caso si voglia bloccare temporaneamente l'accesso al server FTP di un particolare utente:
<pre>
# ftpasswd --passwd -l --name nomeutente --file /etc/proftpd/ftpd.passwd
</pre>
Per sbloccarlo:
<pre>
# ftpasswd --passwd -u --name nomeutente --file /etc/proftpd/ftpd.passwd
</pre>
 
=== ''ftpd.passw'' e ''ftpd.group'' ===
Questi due file appena creati possono essere visualizzati come un normale file di testo per controllare che tutto sia andato come ci si aspetta:
<pre>
# cat /etc/proftpd/ftpd.group
# cat /etc/proftpd/ftpd.passwd
</pre>
È consigliabile, inoltre, nascondere il loro contenuto a tutti fuorché a ''root'':
<pre>
# chmod 660 /etc/proftpd/ftpd.group /etc/proftpd/ftpd.passwd
</pre>
</pre>


Riga 94: Riga 120:
Il passo successivo consiste nel creare le directory personali di ciascun utente in quanto la directory home è stata creata da [[root]] e non ha permessi di scrittura per utenti diversi. Infatti:
Il passo successivo consiste nel creare le directory personali di ciascun utente in quanto la directory home è stata creata da [[root]] e non ha permessi di scrittura per utenti diversi. Infatti:
<pre>
<pre>
$ ls -l /home
...
...
drwxr-xr-x  4 root  root  4096 dic 30 22:01 ftp-share
drwxr-xr-x  4 root  root  4096 dic 30 22:01 ftp-share
</pre>
</pre>


=== Directory private ===
=== Directory private ===
Per ciascun utente appartenente al gruppo "ftp-virtuali" eseguire i comandi:
Per ciascun utente appartenente al gruppo ''ftp-full'' eseguire i comandi:
<pre>
<pre>
# mkdir /home/ftp-share/nomeutente
# mkdir /home/ftp-share/nomeutente
Riga 104: Riga 133:
# chmod 770 /home/ftp-share/nomeutente
# chmod 770 /home/ftp-share/nomeutente
</pre>
</pre>
Ad esempio, per "pippo":
Ad esempio, per ''pippo'':
<pre>
<pre>
# mkdir /home/ftp-share/pippo
# mkdir /home/ftp-share/pippo
Riga 110: Riga 139:
# chmod 770 /home/ftp-share/pippo
# chmod 770 /home/ftp-share/pippo
</pre>
</pre>
e per "pluto":
e per ''pluto'':
<pre>
<pre>
# mkdir /home/ftp-share/pluto
# mkdir /home/ftp-share/pluto
Riga 121: Riga 150:
=== Directory pubblica ===
=== Directory pubblica ===
Avere tutte directory private può già essere considerata una situazione ragionevole in molti contesti ma, più in generale, è auspicabile che esista una directory pubblica per condividere dati tra diversi utenti.<br/>
Avere tutte directory private può già essere considerata una situazione ragionevole in molti contesti ma, più in generale, è auspicabile che esista una directory pubblica per condividere dati tra diversi utenti.<br/>
Creeremo, quindi, una directory in cui tutti potranno inviare o prelavare dati attraverso FTP: la chiameremo <code>Pubblica</code> e si troverà all'interno di <code>/home/ftp-share/</code>.
Creeremo, quindi, una directory in cui tutti potranno inviare o prelevare dati attraverso FTP: la chiameremo <code>Pubblica</code> e si troverà all'interno di <code>/home/ftp-share/</code>.
<pre>
<pre>
# mkdir /home/ftp-share/Pubblica
# mkdir /home/ftp-share/Pubblica
Riga 127: Riga 156:
# chmod 770 /home/ftp-share/Pubblica
# chmod 770 /home/ftp-share/Pubblica
</pre>
</pre>
Notare che i proprietari (utente:gruppo) della directory sono "ftp:ftp-users" specificati mediante i rispettivi UID/GID.
Notare che i proprietari (utente:gruppo) della directory sono "ftp:ftp-users" specificati mediante i rispettivi UID/GID (2000:3000).


== Configurazione ==
== Configurazione ==
Una volta creati gli utenti e i gruppi virtuali, è necessario modificare la configurazione di ProFTPD per consentirne l'accesso al server FTP.<br/>
Una volta creati gli utenti e i gruppi virtuali, è necessario modificare la configurazione di ProFTPD per consentirgli l'accesso al server FTP.<br/>
La configurazione avverrà lasciando praticamente inalterato il file <code>/etc/proftpd/proftpd.conf</code> (il file di configurazione principale) e creando file di configurazione separati all'interno della directory <code>/etc/proftpd/conf.d/</code>: questo permetterà di mantenere ordinata la configurazione e renderla più leggibile in futuro.
La configurazione avverrà lasciando praticamente inalterato il file <code>/etc/proftpd/proftpd.conf</code> (il file di configurazione principale) e creando file di configurazione separati all'interno della directory <code>/etc/proftpd/conf.d/</code>: questo permetterà di mantenere ordinata la configurazione e renderla più leggibile in futuro.


Riga 151: Riga 180:
Il secondo file conterrà le direttive per consentire (o negare) il login al server FTP. Creiamo il file <code>01Login.conf</code> contenente:
Il secondo file conterrà le direttive per consentire (o negare) il login al server FTP. Creiamo il file <code>01Login.conf</code> contenente:
<pre>
<pre>
# Login solo dalla subnet 192.168.x.x
# Login solo dalla subnet 192.168.
<Limit LOGIN>
<Limit LOGIN>
   Order allow,deny
   Order allow,deny
Riga 158: Riga 187:
</Limit>
</Limit>


# Login solo per gli utenti appartenenti al gruppo ftp-virtuali
# Login solo per gli utenti appartenenti al gruppo ftp-users
<Limit LOGIN>
<Limit LOGIN>
  Order allow,deny
  Order allow,deny
Riga 165: Riga 194:
</Limit>
</Limit>
</pre>
</pre>
La prima direttiva permette l'accesso solo agli indirizzi IP "192.168.x.x" mentre la seconda permette il login solo al gruppi "ftp-virtuali". Un client che non soddisfa entrambe le condizioni non ha accesso al server FTP.<br/>
La prima direttiva permette l'accesso solo agli indirizzi IP "192.168.x.x" mentre la seconda permette il login solo al gruppo ''ftp-users''. Un client che non soddisfa entrambe le condizioni non ha accesso al server FTP.<br/>
Chiaramente adattate questa configurazione al vostro caso.
Chiaramente adattate questa configurazione al vostro caso.


Riga 171: Riga 200:
Tutte le altre direttive saranno raccolte nel file <code>02Direttive.conf</code> contenente;
Tutte le altre direttive saranno raccolte nel file <code>02Direttive.conf</code> contenente;
<pre>
<pre>
RequireValidShell      off
RequireValidShell   off
 
DefaultRoot          ~       ftp-full
 
PathDenyFilter      \.[^/]*$
PathAllowFilter      [[:print:]]


DefaultRoot    ~      ftp-full
AllowFilter          "^[a-zA-Z0-9 ,]*$"
</pre>
</pre>
;RequireValidShell:Necessaria per consentire il login senza possedere una [[shell]] valida (è stata impostata a "/bin/false").
;RequireValidShell:Necessaria per consentire il login senza possedere una [[shell]] valida (è stata impostata a "/bin/false").
;DefaultRoot ~ ftp-full:La home directory di chi appartiene al gruppo "ftp-full"; di default abbiamo scelto all'inizio che sia <code>/home/ftp-share</code> .
;DefaultRoot ~ ftp-full:La home directory di chi appartiene al gruppo ''ftp-full''; di default abbiamo scelto all'inizio che sia <code>/home/ftp-share</code> (home directory durante la creazione dell'utente).
;PathDenyFilter \.[^/]*$: Impedisce l'invio di file che iniziano con un punto.
;PathAllowFilter <nowiki>[[:print:]]</nowiki>: Permette solo di specificare caratteri stampabili per file/directory.
;AllowFilter "^[a-zA-Z0-9 ,]*$": Consente comandi FTP che contengono esclusivamente caratteri alfanumerici, lo spazio o la virgola.
== Test di funzionamento ==
Riavviare il server FTP:
<pre>
# service proftpd restart
</pre>
e connettersi con il proprio client FTP preferito specificando l'indirizzo IP del server, il proprio username e la password.
 
== Utenti ad accesso limitato ==
In alcuni casi potrebbe risultare utile fornire, solo a determinati utenti, l'accesso alla directory pubblica esclusivamente per prelevare dati.<br/>
Per raggiungere questo obiettivo sarà necessario innanzitutto creare un utente (il povero ''paperino'') ad accesso limitato e confinarlo nella directory pubblica <code>/home/ftp-share/Pubblica/</code>:
<pre>
# ftpasswd --passwd --home /home/ftp-share/Pubblica/ --name paperino --shell /bin/false --uid 4000 --file /etc/proftpd/ftpd.passwd
</pre>
Creare un gruppo virtuale per raggruppare questo tipo di utenti. Chiamiamolo ''ftp-downonly'' e aggiungiamoci ''paperino'':
<pre>
# ftpasswd --group --name ftp-downonly --file /etc/proftpd/ftpd.group -m paperino --gid 4000
</pre>
Bisognerà aggiungere ''paperino'' anche al gruppo ''ftp-users'' (come spiegato [[#Altre operazioni|nel paragrafo precedente (Aggiungere un utente a un gruppo)]]) per permettergli un accesso FTP al server.
 
Successivamente è necessario modificare il file ''02Direttive.conf'' aggiungendo la riga:
<pre>
DefaultRoot    ~      ftp-downonly
</pre>
Si nota ancora come la directory FTP in cui sono confinati gli utenti del gruppo ''ftp-downonly'' è la home specificata durante la creazione dell'utente (nel nostro caso è ''/home/ftp-share/Pubblica/'' .
 
Ultimo passo è la creazione del file ''/etc/proftpd/conf.d/03Directory.conf'' in cui inseriremo:
<pre>
<Directory /home/ftp-share/Pubblica>
  <Limit WRITE>
    DenyGroup ftp-downonly
  </Limit>
</Directory>
</pre>
con cui si impedisce a tutti coloro che fanno parte del gruppo ''ftp-downonly'' di scrivere nella directory o di modificare/eliminare file.
 
Riavviare infine il server FTP:
<pre>
# service proftpd restart
</pre>
 
== Quote ==
L'attivazione delle quote potrebbe rivelarsi indispensabile per limitare lo spazio utilizzabile da ciascun utente per conservare i propri file sul server; infatti di default, non c'è nessun limite ai byte o ai file che è possibile inviare al server FTP.<br/>
Nel caso in cui l'amministratore del server abbia già implementato le quote sul filesystem (quindi *non* le quote di ProFTPD), questa configurazione andrebbe bypassata oppure, per non incorrere in problemi, si dovrebbe evitare la creazione di utenti virtuali con lo stesso UID.
 
Leggere anche la guida [[Installare un server FTP con ProFTPD]] per maggiori informazioni sulla gestione delle quote e le pagine di documentazione lì riportate.
 
=== Le tabelle ===
Prima di tutto è indispensabile creare le due tabelle necessarie a ProFTPD:
<pre>
# ftpquota --create-table --table-path /etc/proftpd/ftpquota.limittab --type=limit
# ftpquota --create-table --table-path /etc/proftpd/ftpquota.tallytab --type=tally
</pre>
 
Quindi è il momento di decidere che tipo di quote assegnare e a quali utenti. In questo caso si assegnerà ad ogni utente un limite di 60 MB per i byte inviati (upload):
<pre>
# ftpquota --add-record --type limit --limit-type hard --quota-type user --name pippo --bytes-upload 60 --units Mb --table-path /etc/proftpd/ftpquota.limittab
# ftpquota --add-record --type limit --limit-type hard --quota-type user --name pluto --bytes-upload 60 --units Mb --table-path /etc/proftpd/ftpquota.limittab
# ftpquota --add-record --type limit --limit-type hard --quota-type user --name minnie --bytes-upload 60 --units Mb --table-path /etc/proftpd/ftpquota.limittab
</pre>
Si possono vedere gli effetti del comando precedente con:
<pre>
# ftpquota --show-records --type limit --units Mb --table-path /etc/proftpd/ftpquota.limittab
</pre>
che visualizzerà:
<pre>
-------------------------------------------
  Name: pippo
  Quota Type: User
  Per Session: False
  Limit Type: Hard
    Uploaded Mb:        60.00
    Downloaded Mb:      unlimited
    Transferred Mb:    unlimited
    Uploaded files:    unlimited
    Downloaded files:  unlimited
    Transferred files:  unlimited
-------------------------------------------
  Name: pluto
  Quota Type: User
  Per Session: False
  Limit Type: Hard
    Uploaded Mb:        60.00
    Downloaded Mb:      unlimited
    Transferred Mb:    unlimited
    Uploaded files:    unlimited
    Downloaded files:  unlimited
    Transferred files:  unlimited
-------------------------------------------
  Name: minnie
  Quota Type: User
  Per Session: False
  Limit Type: Hard
    Uploaded Mb:        60.00
    Downloaded Mb:      unlimited
    Transferred Mb:    unlimited
    Uploaded files:    unlimited
    Downloaded files:  unlimited
    Transferred files:  unlimited
 
</pre>
 
Il contenuto di <code>ftpquota.tallytab</code> può essere mostrato in modo simile:
<pre>
# ftpquota --show-records --type tally --units Mb --table-path /etc/proftpd/ftpquota.tallytab
ftpquota: (empty table)
</pre>
 
=== Direttive ===
Assicurasi che nel file <code>proftpd.conf</code> ci siano:
<pre>
<IfModule mod_quotatab.c>
QuotaEngine on
</IfModule>
</pre>
e poi creare il file <code>/etc/proftpd/conf.d/04Quota.conf</code> con:
<pre>
QuotaLimitTable file:/etc/proftpd/ftpquota.limittab
QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab
 
QuotaDisplayUnits Mb
</pre>
Riavviare ProFTPD:
<pre>
# service proftpd restart
</pre>
 
=== Test ===
Da un client proviamo a inviare qualche file al server FTP utilizzando, ad esempio, l'utente ''pippo'' e poi controlliamo la tabella "ftpquota.tallytab":
<pre>
# ftpquota --show-records --type tally --units Mb --table-path /etc/proftpd/ftpquota.tallytab
-------------------------------------------
  Name: pippo
  Quota Type: User
    Uploaded Mb:        1.61
    Downloaded Mb:      unlimited
    Transferred Mb:    unlimited
    Uploaded files:    0
    Downloaded files:  0
    Transferred files:  0
</pre>
Il comando mostra i byte inviati da ciascun utente (in questo caso solo ''pippo'' ha, per ora, inviato dati).
 
È utile sapere che anche il client può conoscere i byte inviati eseguendo il comando "site quota":
<pre>
ftp>site quota
200-La quota corrente per questa sessione è [corrente/limite]
200-Nome: pippo
200-Tipo Quota: Utente
200-Tipo Limite: Hard
200- Inviato Mb:   1.61/60.00
200- Scaricato Mb: illimitato
200- Trasferito Mb: illimitato
200- Inviato file: illimitato
200- Scaricato file: illimitato
200- Trasferito file: illimitato
</pre>
Proviamo anche a cancellare qualche file e rieseguiamo il controllo della quota disponibile per assicurarci che lo spazio utilizzato venga decrementato correttamente:
 
ftp>delete filevecchio
250 comando DELE eseguito con successo
ftp>site quota
200-La quota corrente per questa sessione è [corrente/limite]
200-Nome: pippo
200-Tipo Quota: Utente
200-Tipo Limite: Hard
200- Inviato Mb:   <span style="color:red">'''1.03'''</span>/60.00
200- Scaricato Mb: illimitato
200- Trasferito Mb: illimitato
200- Inviato file: illimitato
200- Scaricato file: illimitato
200- Trasferito file: illimitato
 
=== Rimuovere le quote ===
* Cancellare le tabelle <code>ftpquota.limittab</code> e <code>ftpquota.tallytab</code>
* Cancellare il file <code>04Quota.conf</code>
* Disabilitare la gestione delle quote con "QuotaEngine off" in <code>proftpd.conf</code>
 
== Eliminare la configurazione ==
Per eliminare la configurazione ottenuta leggendo questa guida e ritornare ad un server ProFTPD con configurazione iniziale, si può procedere facilmente sfruttando il fatto che le modifiche hanno toccato poco o nulla il file principale ''proftpd.conf'':
* Cancellare i file creati in ''/etc/proftpd/conf.d/''
* Cancellare il file ''/etc/proftpd/ftpd.group''
* Cancellare il file ''/etc/proftpd/ftpd.passwd''
* Rimuovere le modifiche eventualemten eseguite in ''/etc/proftpd/proftpd.conf''
* Riavviare ProFTPD:<pre># service proftpd restart</pre>
 
== Guide correlate ==
[[Installare un server FTP con ProFTPD]]<br/>
[[Installare un server FTP con utenti virtuali su MySQL]]
 
{{Autori
| Autore=[[Utente:S3v|S3v]] 14:03, 31 dic 2014 (CET)
}}
 
[[Categoria:FTP server]]
6 999

contributi