Server FTP di rete con ProFTPD e utenti virtuali
Attenzione. Questa guida è da considerarsi abbandonata, per via del tempo trascorso dall'ultima verifica.
Potrà essere resa obsoleta, previa segnalazione sul forum, se nessuno si propone per l'adozione. |
Versioni Compatibili Debian 7 "wheezy" Debian 8 "jessie" |
Introduzione
In questa guida verrà spiegata la l'installazione e la configurazione di un server FTP all'interno della propria LAN utilizzando ProFTPD.
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).
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.
Premesso questo, per la procedura spiegata nei paragrafi seguenti si assumerà che:
- Gli indirizzi della propria rete siano del tipo 192.168.X.X .
- L'autenticazione avvenga esclusivamente attraverso utenti/gruppi virtuali.
Installazione
Per installare ProFTPD:
# apt-get install proftpd-basic
Operazioni preliminari
Prima di cominciare con la modifica dei file di configurazione di ProFTPD, bisogna scegliere la directory che conterrà le sotto-directory in cui ciascun utente potrà inviare/scaricare i propri file. In questa guida si prenderà come esempio la directory "/home/ftp-share". Creiamola:
# mkdir -p /home/ftp-share
Questa sarà anche la home directory degli utenti, ossia la directory in cui sono confinati durante la sessione FTP.
Utenti e gruppi virtuali
Gli utenti e gruppi virtuali non sono altro che normali utenti (o gruppi) con un proprio UID (o GID) ma con un'importante differenza rispetto agli "utenti canonici": la loro autenticazione è valida solo per ProFTPD.
Questo si ottiene separando completamente i file contenenti le credenziali di autenticazione per utenti/gruppi: il sistema utilizzerà i classici "/etc/passwd" e "/etc/group", ProFTPD creerà dei propri file e si baserà su questi ultimi per autenticare gli accessi.
La creazione di utenti/gruppi virtuali si ottiene attraverso il comando "ftpasswd".
Creare un utente virtuale
Iniziamo a creare gli utenti virtuali che avranno accesso al server FTP:
# ftpasswd --passwd --home /home/ftp-share --name pippo --shell /bin/false --uid 2001 --file /etc/proftpd/ftpd.passwd
Il precedente comando accetta diverse opzioni:
- --passwd
- Necessario affinché "ftpasswd" crei un utente virtuale.
- --home path_directory
- È la home directory dell'utente in cui gli sarà possibile accedere tramite FTP.
- --name nome
- Opzione necessaria per assegnare un nome all'utente virtuale.
- --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.
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.
Successivamente verrà chiesta la password di cui l'utente si servirà per l'accesso FTP.
Il precedente comando va impartito per ciascun utente. Ad esempio:
# ftpasswd --passwd --home /home/ftp-share --name pluto --shell /bin/false --uid 2002 --file /etc/proftpd/ftpd.passwd # ftpasswd --passwd --home /home/ftp-share --name minnie --shell /bin/false --uid 2003 --file /etc/proftpd/ftpd.passwd
le uniche modifiche riguardano esclusivamente il nome e l'UID, tutto il resto va lasciato inalterato.
Se si vuole una directory pubblica per condividerne il contenuto, è consigliato creare un ulteriore utente "ftp":
# ftpasswd --passwd --home /home/ftp-share --name ftp --shell /bin/false --uid 2000 --file /etc/proftpd/ftpd.passwd
L'utente "ftp" appena creato ha il solo scopo di assumere la proprietà della directory pubblica e, avendo UID pari a 2000, non ha niente a che vedere con l'utente "ftp" di sistema con UID uguale a 119 e utilizzato da ProFTPD per l'accesso anonimo.
La vita dell'"ftp" creato è limitata al solo file ftpd.passwd
da cui ProFTPD ricava le informazioni d'accesso.
Creare un gruppo virtuale
La creazione di un gruppo virtuale non è indispensabile ma risulta comoda per amministrare più agevolmente la configurazione di ProFTPD.
Nel successivo esempio verranno creati due gruppi virtuali:
- 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.
Nello specifico:
- Tutti apparterranno a "ftp-users".
- pippo, pluto e minnie apparterranno anche a "ftp-full".
- L'utente "ftp" (se creato) non apparterrà ad alcun gruppo.
Creiamo i gruppi virtuali:
# ftpasswd --group --file /etc/proftpd/ftpd.group --name ftp-users -m pippo -m pluto -m minnie --gid 3000 # ftpasswd --group --file /etc/proftpd/ftpd.group --name ftp-full -m pippo -m pluto -m minnie --gid 3001
Le opzioni utilizzate:
- --group
- Necessario affinché ProFTPD crei un gruppo virtuale.
- --file /etc/proftpd/ftpd.group
- Il percorso e il nome del file che conterrà le informazioni per ciascun gruppo virtuale.
- --name nome
- Il nome del gruppo.
- -m nomeutente
- Assegna al gruppo gli utenti specificati. L'opzione "-m" può essere utilizzata più volte.
- --gid GID
- Il GID del gruppo. Valgono le stesse considerazioni scritte per l'UID.
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":
# ftpasswd --group --delete-group --name nomedelgruppo --file /etc/proftpd/ftpd.group # ftpasswd --passwd --delete-user --name nomeutente --file /etc/proftpd/ftpd.passwd
- 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.
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:
# ftpasswd --passwd -l --name nomeutente --file /etc/proftpd/ftpd.passwd
Per sbloccarlo:
# ftpasswd --passwd -u --name nomeutente --file /etc/proftpd/ftpd.passwd
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:
# cat /etc/proftpd/ftpd.group # cat /etc/proftpd/ftpd.passwd
È consigliabile, inoltre, nascondere il loro contenuto a tutti fuorché a root:
# chmod 660 /etc/proftpd/ftpd.group /etc/proftpd/ftpd.passwd
Creare le directory
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:
$ ls -l /home ... ... drwxr-xr-x 4 root root 4096 dic 30 22:01 ftp-share
Directory private
Per ciascun utente appartenente al gruppo ftp-full eseguire i comandi:
# mkdir /home/ftp-share/nomeutente # chown UID:GID /home/ftp-share/nomeutente # chmod 770 /home/ftp-share/nomeutente
Ad esempio, per pippo:
# mkdir /home/ftp-share/pippo # chown 2001:2001 /home/ftp-share/pippo # chmod 770 /home/ftp-share/pippo
e per pluto:
# mkdir /home/ftp-share/pluto # chown 2002:2002 /home/ftp-share/pluto # chmod 770 /home/ftp-share/pluto
Praticamente le uniche modifiche riguardano il nome della directory e l'UID.
Il risultato sarà creare directory accessibili solo dal proprietario. Tutti gli altri (ovviamente escluso "root") non potranno accedervi.
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.
Creeremo, quindi, una directory in cui tutti potranno inviare o prelevare dati attraverso FTP: la chiameremo Pubblica
e si troverà all'interno di /home/ftp-share/
.
# mkdir /home/ftp-share/Pubblica # chown 2000:3000 /home/ftp-share/Pubblica # chmod 770 /home/ftp-share/Pubblica
Notare che i proprietari (utente:gruppo) della directory sono "ftp:ftp-users" specificati mediante i rispettivi UID/GID (2000:3000).
Configurazione
Una volta creati gli utenti e i gruppi virtuali, è necessario modificare la configurazione di ProFTPD per consentirgli l'accesso al server FTP.
La configurazione avverrà lasciando praticamente inalterato il file /etc/proftpd/proftpd.conf
(il file di configurazione principale) e creando file di configurazione separati all'interno della directory /etc/proftpd/conf.d/
: questo permetterà di mantenere ordinata la configurazione e renderla più leggibile in futuro.
Autenticazione
Il primo file da creare conterrà le direttive per permettere l'autenticazione mediante utenti/gruppi virtuali. Creiamo il file /etc/proftpd/conf.d/00Autenticazione.conf
e inseriamo al suo interno:
# Autenticazione permessa solo per utenti/gruppi virtuali AuthOrder mod_auth_file.c # Percorso dei file che contengono utenti/gruppi virtuali AuthGroupFile /etc/proftpd/ftpd.group AuthUserFile /etc/proftpd/ftpd.passwd
La spiegazione è abbastanza semplice:
- AuthOrder mod_auth_file.c
- Carica il modulo "mod_auth_file.c" in modo da permettere l'autenticazione solo per utenti virtuali.
- AuthGroupFile /etc/proftpd/ftpd.group
- Percorso e nome del file contenente i gruppi virtuali.
- AuthUserFile /etc/proftpd/ftpd.passwd
- Percorso e nome del file contenente gli utenti virtuali.
Login
Il secondo file conterrà le direttive per consentire (o negare) il login al server FTP. Creiamo il file 01Login.conf
contenente:
# Login solo dalla subnet 192.168. <Limit LOGIN> Order allow,deny Allow 192.168.0.0/16 DenyAll </Limit> # Login solo per gli utenti appartenenti al gruppo ftp-users <Limit LOGIN> Order allow,deny AllowGroup ftp-users DenyAll </Limit>
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.
Chiaramente adattate questa configurazione al vostro caso.
Direttive
Tutte le altre direttive saranno raccolte nel file 02Direttive.conf
contenente;
RequireValidShell off DefaultRoot ~ ftp-full PathDenyFilter \.[^/]*$ PathAllowFilter [[:print:]] AllowFilter "^[a-zA-Z0-9 ,]*$"
- 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
/home/ftp-share
(home directory durante la creazione dell'utente). - PathDenyFilter \.[^/]*$
- Impedisce l'invio di file che iniziano con un punto.
- PathAllowFilter [[:print:]]
- 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:
# service proftpd restart
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.
Per raggiungere questo obiettivo sarà necessario innanzitutto creare un utente (il povero paperino) ad accesso limitato e confinarlo nella directory pubblica /home/ftp-share/Pubblica/
:
# ftpasswd --passwd --home /home/ftp-share/Pubblica/ --name paperino --shell /bin/false --uid 4000 --file /etc/proftpd/ftpd.passwd
Creare un gruppo virtuale per raggruppare questo tipo di utenti. Chiamiamolo ftp-downonly e aggiungiamoci paperino:
# ftpasswd --group --name ftp-downonly --file /etc/proftpd/ftpd.group -m paperino --gid 4000
Bisognerà aggiungere paperino anche al gruppo ftp-users (come spiegato 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:
DefaultRoot ~ ftp-downonly
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:
<Directory /home/ftp-share/Pubblica> <Limit WRITE> DenyGroup ftp-downonly </Limit> </Directory>
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:
# service proftpd restart
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.
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:
# ftpquota --create-table --table-path /etc/proftpd/ftpquota.limittab --type=limit # ftpquota --create-table --table-path /etc/proftpd/ftpquota.tallytab --type=tally
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):
# 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
Si possono vedere gli effetti del comando precedente con:
# ftpquota --show-records --type limit --units Mb --table-path /etc/proftpd/ftpquota.limittab
che visualizzerà:
------------------------------------------- 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
Il contenuto di ftpquota.tallytab
può essere mostrato in modo simile:
# ftpquota --show-records --type tally --units Mb --table-path /etc/proftpd/ftpquota.tallytab ftpquota: (empty table)
Direttive
Assicurasi che nel file proftpd.conf
ci siano:
<IfModule mod_quotatab.c> QuotaEngine on </IfModule>
e poi creare il file /etc/proftpd/conf.d/04Quota.conf
con:
QuotaLimitTable file:/etc/proftpd/ftpquota.limittab QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab QuotaDisplayUnits Mb
Riavviare ProFTPD:
# service proftpd restart
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":
# 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
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":
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
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: 1.03/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
ftpquota.limittab
eftpquota.tallytab
- Cancellare il file
04Quota.conf
- Disabilitare la gestione delle quote con "QuotaEngine off" in
proftpd.conf
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:
# service proftpd restart
Guide correlate
Installare un server FTP con ProFTPD
Installare un server FTP con utenti virtuali su MySQL
Guida scritta da: S3v 14:03, 31 dic 2014 (CET) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |