[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 338.   Gestione di pagine HTML personali attraverso un accesso FTP

Nella parte dedicata al servizio HTTP, è descritto in che modo gli utenti di un nodo possono pubblicare delle pagine HTML attraverso la propria directory personale. Tuttavia, tali utenti potrebbero non avere accesso fisico all'elaboratore in questione, utilizzandolo solo in modo remoto. Per mezzo di un servente FTP potrebbero accedere come utenti reali per raggiungere la propria directory personale e caricare i dati da pubblicare.

Un po' diverso è il caso degli utenti a cui si vuole concedere solo l'accesso per pubblicare tali pagine HTML, senza altre possibilità. In pratica, a questi non si vuole permettere di usare programmi come Telnet, così come non gli si vuole permettere di accedere in alcun modo al resto del file system.

In questo capitolo si vuole mostrare come raggiungere un tale risultato, con l'ausilio del servente WU-FTP o con OpenBSD FTP, concedendo di accedere attraverso il protocollo FTP come utenti di tipo guest, in modo da non poter uscire dalla propria directory personale.

Nella sezione 311.3 viene descritto un problema differente, risolto con OpenBSD FTP.

338.1   Preparazione di WU-FTP

L'utente che accede con un cliente FTP e viene riconosciuto da WU-FTP come appartenente al tipo guest, può raggiungere solo quanto si dirama dalla propria directory personale, perché in quel punto il servente esegue un chroot(). Di conseguenza, il resto del file system, programmi compresi, diventa inaccessibile. Se nella directory personale ci sono collegamenti simbolici che puntano al di fuori di quella struttura, perdono di significato e divengono semplicemente collegamenti non più validi.

Si attribuisce a un utente la qualifica di tipo guest indicando un gruppo a cui questo appartiene nel file di configurazione /etc/ftpaccess. In pratica, è sufficiente creare un gruppo appositamente per questo, aggiungendo al file /etc/group un record simile a quello seguente, a cui abbinare tutti gli utenti che si vuole vengano trattati in questo modo dal servente FTP.

ftpguest:*:450:tizio,caio,sempronio

A questo punto si può dichiarare nel file /etc/ftpaccess che gli utenti di questo gruppo (ftpguest), siano da trattare come utenti di tipo guest.

guestgroup      ftpguest

L'utente di tipo guest, quando accede, è tagliato fuori dal resto del file system, per cui occorre che a partire dalla sua directory personale siano presenti alcuni programmi di servizio indispensabili (cp, tar, gzip,...), oltre alle librerie relative. In pratica occorre ricreare la stessa struttura della directory personale dell'utente FTP anonimo.

Generalmente, per motivi di sicurezza, la configurazione del servente WU-FTP è tale da impedire agli utenti guest di modificare i propri dati. Segue un pezzo del file /etc/ftpaccess che mostra in che modo risolvere la cosa.

compress        yes             all
tar             yes             all
chmod           yes             guest
delete          yes             guest
overwrite       yes             guest
rename          yes             guest
chmod           no              anonymous
delete          no              anonymous
overwrite       no              anonymous
rename          no              anonymous

338.2   Preparazione di OpenBSD FTP

Se si utilizza OpenBSD FTP la preparazione è più semplice. Gli utenti vanno elencati nel file /etc/ftpchroot, in modo che sia consentito loro di accedere esclusivamente al ramo della propria directory personale; inoltre, eventualmente si può usare anche l'opzione -A per impedire altri accessi standard.

338.3   Aggiunta di un nuovo utente

Per aggiungere un nuovo utente, è bene agire inizialmente nel modo consueto, attraverso l'uso di un programma di servizio apposito (è tanto più importante se si utilizzano le parole d'ordine oscurate).

adduser tizio[Invio]

Questo dovrebbe essere sufficiente a creare un nuovo utente, ma non basta per gli scopi che si vogliono raggiungere. Le fasi necessarie vengono descritte nelle sezioni successive, mentre il listato 338.9 contiene lo script che le svolge tutte in modo automatico.

338.3.1   Shell

L'utente FTP deve avere una shell valida, cioè una di quelle indicate nel file /etc/shells. Tuttavia, dal momento che non si vuole permettere a questi utenti di accedere in modo diverso dall'FTP, si può aggiungere tra le shell possibili anche il programma /bin/false, come si vede nell'esempio seguente che mostra il contenuto dell'ipotetico file /etc/shells.

/bin/bash
/bin/sh
/bin/csh
/bin/false

Quando questo è stato organizzato così, si può modificare la shell attribuita al nuovo utente in modo predefinito, attraverso il programma chsh.

chsh tizio[Invio]

Changing shell for tizio.

New shell: [/bin/bash]: /bin/false[Invio]

Shell changed.

338.3.2   Sistemazione della directory personale

La directory personale dell'utente appena creato, contiene i file e le directory che si trovano in /etc/skel/: lo scheletro della directory. È opportuno lasciare stare com'è la directory /etc/skel/ e modificare ciò che è stato fatto, altrimenti diventa poi difficile creare nuovi utenti di tipo normale che niente hanno a che vedere con le pagine HTML e gli utenti di tipo guest dell'FTP.

Si procede con la cancellazione della directory personale dell'utente creato (questo serve per eliminare sicuramente anche i file e le directory che iniziano con un punto).

rm ~tizio[Invio]

Quindi si ricrea la directory, volontariamente appartenente all'utente root; ciò garantisce che l'utente non possa modificarla, ma possa invece agire nella sottodirectory destinata a contenere le pagine HTML.

mkdir ~tizio[Invio]

A questo punto ci si deve occupare di ricreare le directory indispensabili per la gestione degli utenti FTP di tipo guest. Se la struttura corrispondente dell'FTP anonimo è contenuta nella stessa partizione in cui si trova la directory dell'utente, si possono usare opportunamente dei collegamenti fisici.

cp -dpRl ~ftp/bin ~tizio[Invio]

cp -dpRl ~ftp/etc ~tizio[Invio]

cp -dpRl ~ftp/lib ~tizio[Invio]

cp -l ~ftp/welcome.msg ~tizio[Invio]

Il file ~ftp/welcome.msg è inteso essere quello introduttivo che viene inviato all'utente quando si connette la prima volta.

È importante osservare che se i file da copiare non hanno il permesso di lettura per l'utente root, questi non possono essere copiati correttamente.

Infine si crea la directory public_html/, di proprietà dell'utente, assieme a un paio di collegamenti simbolici opportuni.

mkdir ~tizio/public_html[Invio]

chown tizio: ~tizio/public_html[Invio]

cd ~tizio[Invio]

ln -s public_html pub[Invio]

ln -s public_html html[Invio]

338.3.3   Parola d'ordine

Infine, si assegna la parola d'ordine in modo da consentire l'accesso.

passwd tizio[Invio]

...

Si osservi che nel caso si utilizzi OpenBSD FTP non serve mettere nulla nella directory usata per l'accesso anonimo, pertanto diversi passaggi mostrati qui sono altrettanto inutili.

338.3.4   Gruppo per gli utenti FTP di tipo «guest»

Come già spiegato, se si utilizza WU-FTP, l'utente deve essere aggregato al gruppo utilizzato per distinguere gli utenti di tipo guest, modificando il record corrispondente nel file /etc/group, in modo simile a quello mostrato qui sotto.

ftpguest:*:450:tizio,caio,sempronio

338.3.5   Completare le cose

In condizioni normali, i file ~ftp/etc/passwd e ~ftp/etc/group, quelli per cui si è creato un collegamento fisico nella directory del nuovo utente, non contengono le informazioni necessarie a permettere di tradurre UID e GID nei nomi corretti. Per farlo bisognerebbe agire su questi file manualmente. Essendo tutti collegati assieme allo stesso inode, basterebbe intervenire su uno per vedere aggiornati tutti gli altri riferimenti.

Si osservi che tali aggiornamenti devono essere fatti manualmente, perché l'uso di altri programmi potrebbe comportare la perdita del collegamento.

Listato 338.9. Tutte le fasi necessarie alla creazione di un utente che può accedere solo per l'aggiornamento delle proprie pagine personali, quando si utilizza WU-FTP. Con OpenBSD FTP, alcune cose possono essere semplificate, inoltre occorre aggiornare il file /etc/ftpchroot. Una copia di questo script dovrebbe essere disponibile anche qui: <allegati/a2/ftpguestadd.sh>.

#!/bin/sh
###
### ftpguestadd
###
##
## Variabili.
##
#
# Il punto di partenza delle directory personali.
#
DIRECTORY_PERSONALI=/home
#
# Il punto di partenza dell'FTP anonimo.
#
FTP_ANONIMO=/home/ftp
##
## Funzioni.
##
#
# Visualizza la sintassi corretta per l'utilizzo di questo script.
#
function sintassi () {
    echo ""
    echo "ftpguestadd <nome-utente>"
    echo ""
    echo "Il nome può avere al massimo otto caratteri."
}
#
# Spiega cosa fare in caso di errore.
#
function errore () {
    echo "Qualcosa è andato storto."
    echo "Probabilmente è il caso di cancellare la directory \
$DIRECTORY_PERSONALI/$1 e tutto il suo contenuto, oltre a eliminare \
l'utente $1 sia dal file /etc/passwd che da /etc/group."
    echo "Se si gestiscono le password shadow è bene utilizzare \
gli strumenti appositi per fare questo."
}
##
## Inizio.
##
#
# Verifica la quantità di argomenti.
#
if [ $# != 1 ]
then
    sintassi
    exit 1
fi
#
# Verifica che l'utente sia root.
#
if [ $UID != 0 ]
then
    echo "Questo script può essere utilizzato solo dall'utente root."
    exit 1
fi
#
# Crea l'utente in modo normale.
#
if adduser $1 > /dev/null
then
    echo "1 adduser $1"
else
    echo "! adduser non ha funzionato; forse l'utente $1 esiste già?"
    exit 1
fi
#
# Gli cambia la shell.
#
if chsh -s "/bin/false" $1 > /dev/null
then
    echo "2 chsh -s /bin/false $1"
else
    echo "! chsh non ha funzionato"
    errore
    exit 1
fi
#
# Cancella la directory personale dell'utente appena creato.
#
if rm -r $DIRECTORY_PERSONALI/$1 > /dev/null
then
    echo "3 rm -r --force $DIRECTORY_PERSONALI/$1"
else
    echo "! la cancellazione della directory \
$DIRECTORY_PERSONALI/$1 non ha funzionato"
    errore
    exit 1
fi
#
# Ricrea la directory personale, che così appartiene a root.
#
if mkdir $DIRECTORY_PERSONALI/$1 > /dev/null
then
    echo "4 mkdir $DIRECTORY_PERSONALI/$1"
else
    echo "! la creazione della directory \
$DIRECTORY_PERSONALI/$1 non ha funzionato"
    errore
    exit 1
fi
#
# Riproduce le directory dell'FTP anonimo.
#
if cp -dpRl $FTP_ANONIMO/bin $DIRECTORY_PERSONALI/$1 > /dev/null
then
    echo "5 cp -dpRl $FTP_ANONIMO/bin $DIRECTORY_PERSONALI/$1"
else
    echo "! la copia della directory $FTP_ANONIMO/bin non ha funzionato"
    errore
    exit 1
fi
if cp -dpRl $FTP_ANONIMO/etc $DIRECTORY_PERSONALI/$1 > /dev/null
then
    echo "6 cp -dpRl $FTP_ANONIMO/etc $DIRECTORY_PERSONALI/$1"
else
    echo "! la copia della directory $FTP_ANONIMO/etc non ha funzionato"
    errore
    exit 1
fi
if cp -dpRl $FTP_ANONIMO/lib $DIRECTORY_PERSONALI/$1 > /dev/null
then
    echo "7 cp -dpRl $FTP_ANONIMO/lib $DIRECTORY_PERSONALI/$1"
else
    echo "! la copia della directory $FTP_ANONIMO/lib non ha funzionato"
    errore
    exit 1
fi
if cp -l $FTP_ANONIMO/welcome.msg $DIRECTORY_PERSONALI/$1 > /dev/null
then
    echo "8 cp -l $FTP_ANONIMO/welcome.msg $DIRECTORY_PERSONALI/$1"
else
    echo "! la copia del file $FTP_ANONIMO/welcome.msg non ha funzionato"
    errore
    exit 1
fi
#
# Sistema altre cose nella directory personale dell'utente.
#
if cd $DIRECTORY_PERSONALI/$1 > /dev/null
then
    echo "9 cd $DIRECTORY_PERSONALI/$1"
else
    echo "! \"cd $DIRECTORY_PERSONALI/$1\" non ha funzionato"
    errore
    exit 1
fi
if mkdir public_html > /dev/null
then
    echo "10 mkdir public_html"
else
    echo "! \"mkdir public_html\" non ha funzionato"
    errore
    exit 1
fi
if chown $1: public_html > /dev/null
then
    echo "11 chown $1: public_html"
else
    echo "! \"chown $1: public_html\" non ha funzionato"
    errore
    exit 1
fi
if ln -s public_html pub > /dev/null
then
    echo "12 ln -s public_html pub"
else
    echo "! \"ln -s public_html pub\" non ha funzionato"
    errore
    exit 1
fi
if ln -s public_html html > /dev/null
then
    echo "12 ln -s public_html html"
else
    echo "! \"ln -s public_html html\" non ha funzionato"
    errore
    exit 1
fi
#
# Permette di inserire la password per l'utente.
#
passwd $1
#
# Promemoria.
#
echo "L'aggiunta dell'utente per l'accesso esclusivo con FTP è stata \
completata."
echo "E' importante ricordare di aggiungere tale utente \
al gruppo degli utenti FTP guest, altrimenti quando $1 accede al \
sistema con il suo cliente FTP, può percorre l'intero file system."
echo "Se l'inserimento della password è fallito, si può usare \
il programma \"passwd\" in modo autonomo."
#

338.4   Accesso da parte dell'utente

L'utente che da un elaboratore remoto vuole accedere per sistemare le proprie pagine HTML, può usare un programma cliente per l'FTP, identificandosi con il suo nominativo-utente e la sua parola d'ordine. Deve preoccuparsi di spostarsi nella directory public_html/, ma in tal caso può farlo anche usando il riferimento html, creato appositamente.

Volendo può usare Midnight Commander (ovvero mc) e per accedere basta il comando

cd ftp://utente@nome_di_dominio

come nell'esempio seguente dove l'utente tizio vuole accedere al nodo dinkel.brot.dg.

cd ftp://tizio@dinkel.brot.dg[Invio]

Successivamente, al momento opportuno, è Midnight Commander stesso a chiedere di inserire la parola d'ordine.

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome gestione_di_pagine_html_personali_attraverso_un_accesso_ftp.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!