[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]
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.
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 |
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.
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.
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]
Infine, si assegna la parola d'ordine in modo da consentire l'accesso.
#
passwd tizio
[Invio]
...
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 |
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.
#!/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." #====================================================================== |
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]