Nfs-kernel-server: condividere risorse tra macchine GNU/Linux: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1: Riga 1:
{{Versioni compatibili}}
{{Versioni compatibili}}
== Introduzione ==
== Introduzione ==
Uno dei modi più semplici per condividere risorse tra macchine GNU/Linux è l'uso di Network File System. Il funzionamento è semplice: una macchina server mette a disposizione la risorsa (ovvero una directory del proprio file system); altre macchine client vi accedono come fosse una directory del proprio file system.


Ora si vedranno entrambe le impostazioni, lato server e lato client.
NFS è l'acronimo di Network Filesystem, ovvero un filesystem utilizzato per montare cartelle remote sul proprio filesystem locale. L'utente in sintesi mette a disposizione una o più risorse (ovvero una directory del proprio file system) presenti su una delle sue macchine e le altre vi possono accedere come fosse una directory del proprio file system. In poche parole NFS permette di impostare un sistema di condivisioni simili a quello di Windows, o meglio, è Windows che ha "copiato" NFS per realizzare il suo sistema di condivisione.
Al di là di quest'aspetto 'estetico' il vantaggio principale consiste nel poter accedere alle risorse remote come se fossero risorse locali, cosa non possibile se si utilizzano protocolli come ftp/sftp o http (che sono alcuni dei protocolli sfruttati dalla funzione "Risorse --> Connetti al server"). In sintesi è possibile manipolare file e directory sfruttando tutte le possibilità che un normale file system offre.
A titolo d'esempio si cita la condivisione di calendari in Thunderbird; come noto è impossibile condvidere un calendario e/o una rubrica tramite protocollo sftp, menter risulta possibile usando ftp/http anche se l'operazione risulta macchinosa ed in ogni caso le credenziali sono trasmesse in chiaro. Usando NFS invece l'operazione non presenta differenze rispetto al caso in cui il calendario fosse stato salvato in una posizione realmente presente sul disco rigido della propria macchina.
 
Sia chiaro che ogni macchina può simultaneamente condividere alcune risorse che accedere a quelle presenti su altre macchine.
 
Nel seguito si vedrà come configurare sia la macchina che condivide le risorse (server) sia quelle che dovranno accedervi (client), tuttavia risulta opportuno esporre prima alcune considerazioni sulla sicurezza.
 
== Sicurezza ==
 
Nel caso di una piccola rete domestica/aziendale il discorso sicurezza lascia il tempo che trova, dato che di norma in questi casi hanno accesso alle macchine solo persone fidate. Se però così non fosse è bene essere consapevoli che la condivisione NFS non abbinata ad un sistema di autenticazione centralizzato, come kerberos o ldap, è causa di gravi vulnerabilità.
Con i vari protocolli di rete come ftp, sftp, ecc. è infatti necessario effettuare un'autenticazione presso il server ospitante le risorse (che poi queste credenziali siano trasmesse in chiaro o cifrate è un altro paio di maniche), mentre con NFS non viene fatta alcuna autenticazione "diretta". Una volta definite le risorse da esportare l'accesso a queste è regolato in base all'UID dell'utente; poiché gli UID degli utenti di base sono assegnati in modo crescente a partire da uno stesso numero (cioè 1000, almeno per debian e derivati), a meno che un utente non decida di cambiarli sua sponte, è evidente come l'accesso alle stesse sia tutt'altro che sicuro, per quanto in realtà sia possibile restringere l'accesso alle stesse in base all'indirizzo IP (accorgimento comunque non impossibile da aggirare).
Poiché su ogni macchina almeno un utente deve esistere, è chiaro per quanto detto che tutte le macchine hanno almeno un utente con lo stesso UID (a meno di modifiche fatte appositamente), cioè quello creato in fase d'installazione. Il risultato è che i vari utenti della rete potrebbero avere accesso a risorse cui non dovrebbero, o che comunque non gli interessano e contemporaneamente non avere accesso alle risorse che gli servono. Basta infatti che l'UID del nome_utente con cui ci si è autenticati sul PC 'A' coincida con uno di quelli associati ai nomi_utente del PC 'B'.
Esempio: due utenti possiedono entrambi un PC con sistema linux e decidono di mettere in rete le rispettive macchine per condividere alcune cartelle. L'utente 'A', che possiede il computer 'A' durante l'installazione di linux ha scelto come nome_utente 'tizio', mentre l'utente B proprietario del computer 'B' ha scelto come nome utente 'caio'. Di norma perché l'utente 'A' possa accedere alle risorse su 'B' è necessario che l'utente 'B' riveli la sua password ad 'A' in modo che 'A' possa creare sulla macchina 'A' un utente 'caio' grazie al quale accedere al PC 'B', oppure che l'utente 'B' crei un utente 'tizio' sul PC 'B' e che poi comunichi la relativa password all'utente 'A'.
Col filesystem NFS il controllo dell'accesso alle varie risorse non viene fatto su una coppia di credenziali "nome_utente+password", ma solo sugli UID degli utenti; poiché sia 'tizio' che 'caio' sono stati i primi utenti creati rispettivamente sui PC 'A' e 'B' è evidente che dovranno avere anche lo stesso UID, poiché come già detto linux associa di base UID=1000 al primo utente creato. Il risultato finale nella migliore delle ipotesi è che l'utente 'A' acceda alle sole risorse scelte da 'B' con i privilegi di 'B' invece che di 'A' (cioè quelli attribuiti da 'B' ad 'A') e viceversa. Nel peggiore dei casi, poiché quando si condivide una cartella vengono automaticamente condivise tutte le sotto cartelle, l'utente 'A' avrà accesso con i privilegi di 'B' (e viceversa) a cartelle cui normalmente non avrebbe dovuto avere accesso, il che può essere più o meno grave a seconda della sensibilità dei dati in esse contenute.
Come già detto inizialmente questo problema è normalmente puramente teorico, poiché nella maggior parte delle piccole LAN private l'accesso alla rete ed ai PC che la compongono è possibile solo a persone di fiducia e/o in ogni caso le risorse condivise non contegono dati particolarmente sensibili. Se però così non fosse, l'utente sarebbe costretto ad implementare o un sistema di autenticazione come kerberos/ldap oppure a '''RINUNCIARE''' all'uso di NFS.
 
== Impostazioni lato server ==
 
=== Installazione ===
 
Installare i pacchetti necessari:
 
<pre># apt-get install nfs-kernel-server portmap</pre>
 
=== Configurazione ===
 
==== Esempio 1 ====


== Impostazione lato server ==
{{Box|Convenzione|IP della macchina server: <code>192.168.1.10</code>; directory da condividere: <code>/media/storage</code>}}
{{Box|Convenzione|IP della macchina server: <code>192.168.1.10</code>; directory da condividere: <code>/media/storage</code>}}


Installare i pacchetti necessari:
<pre># apt-get install nfs-kernel-server portmap</pre>
Ora editare col vostro editor preferito (gedit, kate, vim, ...) il file <code>/etc/exports</code> ed aggiungere la seguente riga:
Ora editare col vostro editor preferito (gedit, kate, vim, ...) il file <code>/etc/exports</code> ed aggiungere la seguente riga:
<pre>/media/storage      192.168.1.0/24(rw,sync,no_subtree_check)</pre>
<pre>/media/storage      192.168.1.0/24(rw,sync,no_subtree_check)</pre>
Riga 30: Riga 54:
# exportfs -a</pre>
# exportfs -a</pre>


== Impostazione lato client ==
==== Esempio 2 ====
 
Editare il file <code>/etc/default/nfs-common</code> ed assicurarsi che le righe contenti le variabili <code>NEED_IDMAPD=</code> e <code>NEED_GSSD=</code> appaiano così:
 
<pre>
NEED_IDMAPD=yes
NEED_GSSD=no
</pre>
 
Editare il file <code>/etc/default/nfs-kernel-server</code> ed assicurarsi che la riga contente la variabile <code>NEED_SVCGSSD=</code> appaia così:
 
<pre>NEED_SVCGSSD=no</pre>
 
A questo punto è possibile definire le condivisioni editando il file <code>/etc/exports</code>. Leggendo il manuale si trova consigliato di definire sempre la cartella che fungerà da radice per tutte le altre, cioè quella che contiene tutte le altre che si desidera impostare. In pratica ogni riga del file <code>/etc/exports</code> descrive una cartella. Ad esempio inserendo le seguenti righe:
 
<pre>
/home 192.168.1.0/24(rw,fsid=0,no_subtree_check,sync)
/home/altro 192.168.1.0/24(rw,no_subtree_check,sync)
</pre>
 
Si condivide la cartella <code>/home</code> e tutte le sue sottocartelle. Specificare la sottocartella <code>/home/altro</code> è inutile a meno che questa non risieda fisicamente su un disco fisso diverso da <code>/home</code>. Si noti che se le risorse da esportare non sono tutte contenute dentro una medesima directory potrebbe essere conveniente rimontarle prima in un'altra cartella e poi esportare questa (si veda più avanti).
La dicitura 192.168.1.0/24 serve a restringere l'accesso alla risorsa <code>/home</code> alle sole richieste provenienti dagli indirizzi IP che vanno da 192.168.1.1 a 192.168.1.254. Una richiesta che per esempio dovesse provenire da 192.168.2.15 sarebbe rifiutata. Tra ( ) si indicano le opzioni:
 
* <code>rw</code>: abilità la cartella in lettura e scrittura, ammesso comunque che l'utente abbia il permesso di scrivere su quella cartella; indicando ro si limita la possibilità di scrivere anche per quegli utenti che se non accedessero da remoto avrebbero di norma il permesso di scrivere.
* <code>fsid=0</code>: identifica la cartella come radice per il filesystem da esportare. Una sola cartella può avere valore di fsid pari a 0.
* <code>no_subtree_check</code>: velocizza l'accesso alle risorse a scapito di un minimo aumento del rischio sicurezza.
* <code>sync</code>: impone sincronia tra client e server. L'alternativa è async, ma è meglio evitarla poiché in caso di crash o eventi imprevisti aumenta la probabilità di causare danni al filesystem.
 
Per rendere operative le modifiche al file <code>/etc/exports</code> eseguire:
 
<pre># /etc/init.d/nfs-kernel-server restart</pre>
 
 
== Impostazioni lato client ==
 
=== Installazione ===
 
Installare i pacchetti necessari
Installare i pacchetti necessari
<pre># apt-get install nfs-common portmap</pre>
<pre># apt-get install nfs-common portmap</pre>
creare la dirctory dove si vuol montare la directory condivisa, esempio: <code>/media/condivisa</code>
 
=== Configurazione ===
 
Una volta definite le risorse da condividere è possibile caricarle su un altro PC in modo permanente (statico) o su richiesta (dinamico). Il primo approccio è caratterizzato da un consumo di banda prolungato nel tempo, in quanto client e server devono costantemente scambiare informazioni (anche se non si utilizzano direttamente le risorse condivise), nel secondo invece il consumo di banda avviene solo quando si ha un effettivo accesso alle risorse.
Nel caso di una LAN è ragionevole supporre che la banda non sia un problema, ma nel caso di condivisioni attraverso internet il discorso potrebbe cambiare.
In generale se l'accesso alle risorse remote non è frequente è più logico utilizzare l'approccio dinamico.
 
==== Esempio 1 ====
 
Creare la dirctory dove si vuol montare la directory condivisa, esempio: <code>/media/condivisa</code>
<pre># mkdir /media/condivisa</pre>
<pre># mkdir /media/condivisa</pre>
editare il file <code>/etc/fstab</code> ed inserire
editare il file <code>/etc/fstab</code> ed inserire
Riga 55: Riga 124:
<pre># /etc/init.d/nfs-common start
<pre># /etc/init.d/nfs-common start
# mount -a</pre>
# mount -a</pre>
=== Esempio 2 ===
Sia che si voglia caricare le risorse remote in modo statico che dinamico, La prima cosa da fare è assicurarsi che sul PC client sia installato il pacchetto nfs-common, in caso contrario installarlo.
Editare il file /etc/default/nfs-common ed assicurarsi che la riga contente la variabile <code>NEED_IDMAPD=</code> appaia così:
<pre>NEED_IDMAPD=yes</pre>
Fatto ciò l'utente deve decidere se montare le risorse in modo statico o dinamico, NON È POSSIBILE adottare entrambe le soluzioni contemporaneamente.
'''IMPORTANTE''': si noti che sul PC cliente se si decide di montare le risorse remote sotto la cartella /home/nome_utente allora tutte le cartelle compariranno anche sul desktop, proprio come se fosse stato collegato un disco esterno o una chiavetta USB. È possibile aggirare il problema creando la cartella in un'altra posizione e poi creando un collegamento simbolico alla stessa nella cartella utente.
==== Metodo statico ====
Per montare staticamente una risorsa il comando da usare è il solito <code>mount</code>, infatti questo comando supporta una valanga di protocolli e filesystem, tra cui appunto NFS. Prima di montare le risorse remote è necessario creare il punto di mount locale, si supponga per esempio di voler montare le suddette risorse in <code>/home/nfs</code> (si sconsiglia di montare le risorse direttamente in cartelle già esistenti che contengono già altri file/cartelle, come <code>/home</code> o peggio <code>/</code>), ergo restando all'esempio:
<pre># mkdir /home/nfs</pre>
Fatto ciò è possibile montare le risorse remote digitando da terminale:
<pre># mount -t nfs4 indirizzo_server:/ /home/NFS</pre>
Dove con <code>indirizzo_server</code> si identifica il server con le risorse condivise; può essere nella forma di un IP (es.: 192.168.5.92) oppure di un alias (es.: <code>mioserver</code>, in tal caso come sempre si presuppone che il computer client sia in grado di risolvere correttamente l'alias). Si noti che si è scritto <code>indirizzo_server:/</code> e non <code>indirizzo_server:/home</code> poiché nel file <code>/etc/exports</code> del server la cartella <code>/home</code> è stata definita come radice (si ricorda che saranno esportate automaticamente anche tutte le sotto cartelle della cartella indicata col comando <code>mount</code>). A questo punto sarà sufficiente esplorare la cartella <code>/home/nfs</code> per vedere le risorse esportate.
Per smontare le risorse remote è sufficiente digitare:
<pre># umount /home/NFS</pre>
Se si desidera caricare automaticamente le risorse remote all'avvio del PC, evitando così di dover ridigitare ogni volta il precedente comando, è sufficiente editare il file <code>/etc/fstab</code> aggiungendo in coda la seguente riga:
<pre>indirizzo_server:/ /home/NFS nfs4 _netdev,auto 0 0</pre>
Dove <code>_netdev</code> e <code>auto</code> sono due opzioni che impongono rispettivamente di aspettare che i dispositivi di rete siano stati caricati e di caricare automanticamente le risorse remote presenti su indirizzo_server.
'''NOTA BENE''': qualora si decida di abbandonare il metodo statico per quello dinamico è evidente che prima cosa è necessario smontare tutte le risorse montate staticamente che si intende gestire dinamicamente, e poi eliminare (o commentare) la riga eventualmente aggiunta al file <code>/etc/fstab</code>.
==== Metodo dinamico ====
Per usare questo metodo è necessario il pacchetto autofs, pertanto se non installato procedere alla sua installazione:
<pre>apt-get install autofs5</pre>
A questo punto è necessario modificare il file <code>/etc/auto.master</code> aggiungendo una riga del tipo <code>/home/nfs /etc/auto.nfs</code>.
Questa riga dice che le risorse remote specificate nel file <code>/etc/auto.nfs<code> (naturalmente l'utente è liberissimo di scegliere un altro nome al posto di ''auto.nfs'', basta essere coerenti nel seguito) andranno montante all'interno della cartella <code>/home/nfs</code> (che deve esistere! Autofs non crea il punto di mount). Come già scritto nel caso statico si sconsiglia di montare le risorse direttamente in cartelle già esistenti che contengono già altri file/cartelle, come <code>/home</code> o peggio <code>/</code>. È possibile definire più tipi di risorse remote inserendo più righe, il punto è che per ognuna è necessario indicare il punto di mount e il file contenente le relative istruzioni.
A questo punto per quanto detto l'utente deve creare il suo file <code>auto.nfs</code> (o come è stato chiamato) usando il suo editor di testo preferito, ad esempio:
<pre># gedit /etc/auto.nfs</pre>
che ovviamente apparirà vuoto essendo appena stato creato dall'utente. Inserire la seguente riga:
<pre>nome_arbitrario -fstype=nfs4 indirizzo_server:/</pre>
Quanto appena scritto viene definito in gergo ''indirect map''. Osservando la riga si nota subito essere composta da tre parti:
# ''Key'': in questo esempio è <code>nome_arbitrario</code>, a sottolineare che trattasi di una parola qualsiasi a scelta dell'utente. È il nome della sottocartella di <code>/home/nfs/</code> in cui compariranno le risorse remote. Si badi bene che diversamente da quanto fatto in precedenza, la suddetta cartella viene creata al momento da autofs, quindi l'utente '''NON''' deve creare tale sottocartella in anticipo.
# ''Options'': banalmente la sezione delle opzioni, in questo caso una sola cioè <code>-fstype=nfs4</code>. È naturalmente possibile specificare più opzioni, basta separarle con una virgola.
# ''Location'': definisce il percorso per caricare le risorse remote. In quest'esempio è <code>indirizzo_server:/</code> (si ricordi che <code>/</code> non indica la radice del filesystem del server, ma la cartella definita come radice in <code>/etc/exports</code> sul server, cioè <code>/home</code> restando all'esempio), che come già ripetuto può essere sia un IP che un alias.
Prima di rendere operativo automount assicurarsi di aver smontato eventuali risorse statiche relative al server per cui abbiamo configurato ''auto.nfs''. Fatto ciò digitare:
<pre># /etc/init.d/autofs reload</pre>
Un modo per testare se le risorse remote vengono montate correttamente è digitare da terminale:
<pre>$ ls /home/NFS/nome_arbitrario</pre>
Se il comando restituisce l'elenco di file e cartelle contenute nella cartella <code>/home</code> del server significa che l'operazione di automount è andata a buon fine. Le risorse remote rimangono montate di base fino a 10 minuti dall'ultimo accesso alle stesse.
Nota Bene: digitare <code>ls /home/nfs/</code> non mostra nulla poiché il comando non è sufficiente ad innescare l'automount delle risorse remote, quindi viene mostrato il contenuto della sola cartella <code>nfs</code> che è vuota per costruzione (o meglio dovrebbe essere tale, visto che come già detto è sconsigliato montare risorse in una cartella contenente file e sotto cartelle). Per innescare l'automount serve proprio la parola chiave (la ''key'') indicata nel file <code>/etc/auto.nfs</code>, cioè <code>nome_arbitrario</code>.
Per lo stesso motivo in nautilus facendo click sulla cartella <code>/home/nfs</code> non apparirà nulla, bisogna invece cliccare su "vai --> posizione" e digitare <code>/home/nfs/nome_arbitrario</code> seguito da invio; in realtà anche questo non è detto che funzioni, in tal caso è d'obbligo l'uso del terminale digitando per esempio:
<pre>$ cd /home/NFS/nome_arbitrario</pre>
Fatto ciò le risorse risulteranno visibile anche in nautilus.


== Conclusioni ==
== Conclusioni ==
Riga 63: Riga 204:
::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::
[[Utente:xtow|xtow]]
[[Utente:xtow|xtow]]


[[Categoria:Condivisione_risorse]]
[[Categoria:Condivisione_risorse]]
[[Categoria:NFS]]
[[Categoria:NFS]]
3 155

contributi

Menu di navigazione