[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 167.   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, concedendo di accedere attraverso il protocollo FTP come utenti di tipo guest, in modo da non poter uscire dalla propria directory personale.

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

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

167.2   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 password shadow).

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 167.6 contiene lo script che le svolge tutte in modo automatico.

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

167.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 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 verranno 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]

167.2.3   Parola d'ordine

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

passwd tizio[Invio]

...

167.2.4   Gruppo per gli utenti FTP di tipo «guest»

Come già spiegato, 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

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

Listato 167.6. Tutte le fasi necessarie alla creazione di un utente che può accedere solo per l'aggiornamento delle proprie pagine personali.


#!/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 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 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 file system."
    echo "Se l'inserimento della password è fallito, si può usare \
il programma passwd in modo autonomo."

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

167.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 parola d'ordine. 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 parola d'ordine al momento opportuno.

Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org

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

[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]