[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


201. Gestione di pagine HTML personali attraverso un accesso FTP

Nei capitoli precedenti, trattando del servente Apache, si è visto in che modo gli utenti di un nodo possano 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 del 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à. Per intenderci, a questi non si vuole permettere di usare programmi come `telnet' o `rlogin', e nello stesso modo non gli si vuole permettere di accedere in alcun modo al resto del filesystem.

Questo capitolo vuole mostrare in che modo raggiungere questo risultato, concedendo di accedere attraverso FTP come utenti di tipo `guest', in modo da non poter uscire dalla propria directory personale.

201.1 Utente FTP di tipo «guest»

L'utente che accede con un cliente FTP e viene riconosciuto 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 filesystem, 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.

201.1.1 Attribuzione del tipo «guest» a un utente

Utilizzando il servente WU-FTP, 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,semproni

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

201.1.2 Programmi e librerie indispensabili

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

201.1.3 Permettere a questi utenti di modificare i propri dati

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
...

201.2 Aggiunta di un nuovo utente

Per aggiungere un nuovo utente, è bene agire inizialmente nel modo consueto, attraverso l'uso di un programma di utilità apposito (è tanto più importante se si utilizzano le password shadow).

adduser tizio[Invio]

Questo dovrebbe essere sufficiente a creare un nuovo utente, ma non basta per gli scopi che si vogliono raggiungere.

201.2.1 Shell

L'utente FTP di tipo `guest' 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.

201.2.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 home 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'; questo garantirà che l'utente non potrà modificarla, ma potrà agire solo 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 in lettura per l'utente `root', questi non verranno copiati correttamente.

Infine si crea la directory `public_html/', di proprietà dell'utente, e 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]

201.2.3 Password

Infine, si assegna la password in modo da consentire l'accesso.

passwd tizio[Invio]

...

201.2.4 Gruppo per gli utenti FTP di tipo «guest»

Come si era già detto, 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,semproni

Naturalmente, tutte queste fasi della creazione dell'utente, a parte la modifica del file `/etc/group', potrebbero essere raccolte in uno script, come quello seguente:

#!/bin/bash
#======================================================================
# 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 utilizzano 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 adesso apparterrà 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 accederà al \
sistema con il suo cliente FTP, potrà percorre l'intero filesystem."
    echo "Se l'inserimento della password è fallito, si può usare \
il programma passwd in modo autonomo."

#======================================================================

201.2.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 conterranno 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, basta intervenire su uno per vedere aggiornati tutti gli altri riferimenti.

201.3 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 password. Dovrà preoccuparsi di spostarsi nella directory `public_html/', ma potrà 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

Sarà Midnight Commander stesso a chiedere di inserire la password al momento opportuno.

Analogamente, si può usare Netscape indicando l'URI `ftp://tizio@dinkel.brot.dg' (per seguire lo stesso esempio). Se tutto va bene, quando la connessione inizia viene richiesta la password. Per caricare dati con Netscape occorre utilizzare il comando `File'/`Upload File'. In pratica si seleziona il menu `File' e quindi si seleziona la voce `Upload File'. Naturalmente, Netscape non si presta a fare altre operazioni, quali la cancellazione di file o la creazione di sottodirectory. Per questo occorre usare un programma per l'FTP di tipo tradizionale.

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]