Product SiteDocumentation Site

11.4. Server di file NFS

NFS (Network File System (Filesystem di Rete)) è un protocollo che consente l'accesso remoto ad un filesystem attraverso la rete. Tutti i sistemi Unix possono utilizzare questo protocollo.
NFS è uno strumento molto utile ma, storicamente, ha sempre sofferto di molte limitazioni, la maggior parte delle quali sono state affrontate con la versione 4 del protocollo. Lo svantaggio è che l'ultima versione di NFS è più difficile da configurare quando si desidera fare uso di funzionalità di sicurezza di base come l'autenticazione e la crittografia di dati che si basa su Kerberos. E senza quelle, il protocollo NFS deve essere limitato a una rete locale fidata (trusted) in quanto i dati passano attraverso la rete in chiaro (una sniffer può intercettarli) ed i diritti di accesso sono concessi in base all'indirizzo IP del client (che può essere falsificato).

11.4.1. Mettere in sicurezza NFS

Se non si utilizzano le funzioni di sicurezza basate su Kerberos, è vitale assicurarsi che solo le macchine autorizzate all'uso di NFS possano connettersi ai vari server RPC richiesti, in quanto il protocollo di base si fida dei dati ricevuti dalla rete. Il firewall deve inoltre bloccare l'IP spoofing per prevenire che macchine esterne possano agire come una interna, e limitare l'accesso alle porte appropriate alle solo macchine che devono accedere alle condivisioni NFS.
Le vecchie versioni del protocollo richiedono altri servizi RPC che usano porte assegnate dinamicamente. Fortunatamente, con NFS versione 4, sono necessarie solo porta 2049 (per NFS) e 111 (per il portmapper) e sono quindi facili da filtrare sul firewall.

11.4.2. Server NFS

Il server NFS è parte del kernel Linux: nei kernel forniti da Debian è compilato come modulo. Se il server NFS è eseguito automaticamente all'avvio il pacchetto nfs-kernel-server dev'essere installato poiché contiene gli script di avvio necessari.
I file di configurazione del server NFS, /etc/exports e /etc/exports.d/, elencano le directory che vengono rese disponibili sulla rete (esportate). Per ogni condivisione NFS l'accesso è garantito solo alla lista di macchine fornita. Un controllo degli accessi più accurato può essere ottenuto con qualche opzione. La sintassi di questi file è piuttosto semplice:
/directory/da/condividere macchina1(opzione1,opzione2,...) macchina2(...) ...
Si noti che con NFSv4, tutte le directory esportate devono essere parte di un unica gerarchia e che la directory radice di quella gerarchia deve essere esportata e identificata con l'opzione fsid=0 oppure fsid=root.
Ogni macchina può essere identificata sia dal suo nome DNS che dal suo IP. È anche possibile specificare un intero insieme di macchine utilizzando una sintassi come *.falcot.com o un intervallo di indirizzi IP come 192.168.0.0/255.255.255.0 o 192.168.0.0/24.
Le directory sono rese disponibili in sola lettura in via predefinita (o con l'opzione ro). L'opzione rw permette l'accesso in lettura e scrittura. I client NFS si connettono tipicamente da una porta riservata a root (in altre parole inferiore a 1024): questa restrizione può essere sospesa con l'opzione insecure (l'opzione secure è implicita ma può essere resa esplicita, se necessario, per rendere le cose più chiare).
Per impostazione predefinita il server risponde ad una richiesta NFS unicamente quando l'operazione corrente sul disco è completata (opzione sync); questo comportamento può essere disabilitato con l'opzione async. La scrittura asincrona può aumentare un po' le prestazioni, ma diminuisce l'affidabilità poiché c'è il rischio di perdere dati nel caso in cui il server subisca un crash tra la conferma di scrittura e la reale scrittura sul disco. Poiché il valore predefinito è cambiato recentemente (rispetto al valore storico di NFS), si raccomanda di rendere esplicita questa impostazione.
Per non fornire l'accesso come root al file system, tutte le richieste dei client NFS sono considerate dal server come provenienti dall'utente nobody. Questo comportamento equivale ad utilizzare l'opzione root_squash abilitata di default. L'opzione no_root_squash, che disabilita questo comportamento, è rischiosa e dovrebbe essere usata solo in ambienti sicuri. Se tutti gli utenti devono essere visti come nobody, allora usare all_squash. Le opzioni anonuid=uid e anongid=gid permettono di specificare un altro utente fittizio da utilizzare al posto di UID/GID 65534 (che corrisponde all'utente nobody ed al gruppo nogroup).
Con NFSv4, è possibile aggiungere l'opzione sec per indicare il livello di protezione desiderato: sec=sys è l'impostazione predefinita senza particolari caratteristiche di sicurezza, sec=krb5 abilita solo l'autenticazione, sec=krb5i aggiunge protezione di integrità, e sec=krb5p è il livello più completo che comprende la tutela della privacy (con crittografia dei dati). Per questo lavoro bisogna lavorare alla configurazione di Kerberos (questo servizio non è coperto da questo libro).
Sono disponibili altre opzioni: sono documentate nella pagina di manuale exports(5).

11.4.3. Client NFS

Come per altri file system, l'integrazione di una condivisione NFS nella gerarchia del sistema richiede il montaggio (ed il pacchetto nfs-common ). Poiché questo file system ha le sue peculiarità, sono richieste alcune modifiche alla sintassi del comando mount e al file /etc/fstab.

Esempio 11.19. Montare manualmente con il comando mount

# mount -t nfs4 -o rw,nosuid arrakis.internal.falcot.com:/shared /srv/shared

Esempio 11.20. Condivisione NFS nel file /etc/fstab

arrakis.internal.falcot.com:/shared /srv/shared nfs4 rw,nosuid 0 0
La voce sopra descritta monta, all'avvio del sistema, la directory NFS /shared/ dal server arrakis nella directory locale /srv/shared/. È richiesto l'accesso in lettura e scrittura (da qui il parametro rw ). L'opzione nosuid è una misura di protezione che cancella qualsiasi bit setuid o setgid dai programmi memorizzati sulla condivisione. Se la condivisione NFS è destinata alla sola memorizzazione di documenti, un'altra opzione consigliata è noexec, che impedisce l'esecuzione dei programmi memorizzati sulla condivisione. Si noti che sul server, la directory shared non è una directory di primo livello ma si trova sotto la root export NFSv4 (ad esempio /export/shared).
La pagina di manuale nfs(5) descrive tutte le opzioni dettagliatamente.