Product SiteDocumentation Site

11.4. Server di file NFS

NFS (Network File System) è un protocollo che consente l'accesso remoto ad un filesystem attraverso la rete. Tutti i sistemi Unix possono utilizzare questo protocollo: quando i sistemi Windows sono coinvolti dev'essere utilizzato Samba al suo posto.
NFS è uno strumento molto utile ma i suoi limiti devono essere tenuti a mente in maniera particolare quando sono interessati gli aspetti della sicurezza: tutti i dati attraversano la rete in chiaro (uno sniffer li può intercettare); il server impone le restrizioni d'accesso in base all'indirizzo IP del client (che può essere soggetto a spoofing); inoltre, quando ad una macchina client è garantito l'accesso ad una condivisione NFS mal configurata, l'utente root del client può ottenere accesso a tutti i file sulla condivisione (anche se questi appartengono ad altri utenti) perché il server considera affidabile il nome utente che riceve dal client (questa è una limitazione storica del protocollo).

11.4.1. Mettere in sicurezza NFS

Poiché NFS considera affidabili le informazioni che riceve dalla rete è vitale assicurarsi che solo le macchine autorizzate al suo utilizzo possano connettersi ai vari server RPC richiesti. 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.
Affinché NFS funzioni in modo ottimale possono essere richiesti altri servizi RPC, tra questi: rpc.mountd, rpc.statd e lockd. Questi servizi usano in maniera predefinita una porta casuale (assegnata dal portmapper): questo rende difficoltoso filtrare il traffico indirizzato a questi servizi. Gli amministratori della Falcot Corporation hanno trovato una soluzione a questo problema, di seguito descritta.
I primi due servizi sopra menzionati sono implementati attraverso programmi in spazio utente avviati rispettivamente con /etc/init.d/nfs-kernel-server e /etc/init.d/nfs-common. Forniscono opzioni di configurazione per forzare le porte: i file importanti da modificare per utilizzare sempre queste opzioni sono /etc/default/nfs-kernel-server e /etc/default/nfs-common.

Esempio 11.22. Il file /etc/default/nfs-kernel-server

# Number of servers to start up
RPCNFSDCOUNT=8

# Runtime priority of server (see nice(1))
RPCNFSDPRIORITY=0

# Options for rpc.mountd.
# If you have a port-based firewall, you might want to set up
# a fixed port here using the --port option. For more information, 
# see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS
# To disable NFSv4 on the server, specify '--no-nfs-version 4' here
RPCMOUNTDOPTS="--manage-gids --port 2048"

# Do you want to start the svcgssd daemon? It is only required for Kerberos
# exports. Valid alternatives are "yes" and "no"; the default is "no".
NEED_SVCGSSD=

# Options for rpc.svcgssd.
RPCSVCGSSDOPTS=

Esempio 11.23. Il file /etc/default/nfs-common

# If you do not set values for the NEED_ options, they will be attempted
# autodetected; this should be sufficient for most people. Valid alternatives
# for the NEED_ options are "yes" and "no".

# Do you want to start the statd daemon? It is not needed for NFSv4.
NEED_STATD=

# Options for rpc.statd.
#   Should rpc.statd listen on a specific port? This is especially useful
#   when you have a port-based firewall. To use a fixed port, set this
#   this variable to a statd argument like: "--port 4000 --outgoing-port 4001".
#   For more information, see rpc.statd(8) or http://wiki.debian.org/SecuringNFS
STATDOPTS="--port 2046 --outgoing-port 2047"

# Do you want to start the idmapd daemon? It is only needed for NFSv4.
NEED_IDMAPD=

# Do you want to start the gssd daemon? It is required for Kerberos mounts.
NEED_GSSD=
Applicate queste modifiche e riavviati i servizi, rpc.mountd utilizzerà la porta 2048 mentre rpc.statd si porrà in ascolto sulla porta 2046 ed utilizzerà la porta 2047 per le connessioni in uscita.
Il servizio lockd è gestito da un thread del kernel (processo leggero): questa funzionalità è compilata come modulo nei kernel Debian. Il modulo ha due opzioni che permettono di scegliere sempre la stessa porta: nlm_udpport e nlm_tcpport. Per far sì che queste opzioni siano usate sistematicamente dev'esserci un file /etc/modprobe.d/lockd simile a quello che segue:

Esempio 11.24. Il file /etc/modprobe.d/lockd

options lockd nlm_udpport=2045 nlm_tcpport=2045
Impostati questi parametri, diviene semplice controllare l'accesso al servizio NFS dal firewall in maniera precisa e particolareggiata filtrando l'accesso alle porte 111 e 2045 attraverso la 2049 (sia UDP che TCP).

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.
Il file di configurazione del server NFS, /etc/exports, elenca le directory che vengono rese disponibili attraverso la 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 questo file è piuttosto semplice:
/directory/da/condividere macchina1(opzione1,opzione2,...) macchina2(...) ...
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).
In via 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) è raccomandato di rendere esplicita questa impostazione.
In order to not give root access to the filesystem to any NFS client, all queries appearing to come from a root user are considered by the server as coming from the nobody user. This behavior corresponds to the root_squash option, and is enabled by default. The no_root_squash option, which disables this behavior, is risky and should only be used in controlled environments. The anonuid=uid and anongid=gid options allow specifying another fake user to be used instead of UID/GID 65534 (which corresponds to user nobody and group nogroup).
Sono disponibili altre opzioni: sono documentate nella pagina di manuale exports(5).

11.4.3. Client NFS

Così come avviene con altri filesystem, integrare una condivisione NFS nella gerarchia del sistema richiede il mount. Poiché questo filesystem ha le sue peculiarità sono necessari alcuni aggiustamenti al file /etc/fstab e alla sintassi del comando mount.

Esempio 11.25. Montare manualmente con il comando mount

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

Esempio 11.26. Condivisione NFS nel file /etc/fstab

arrakis.internal.falcot.com:/srv/shared /shared nfs rw,nosuid 0 0
The entry described above mounts, at system startup, the /srv/shared/ NFS directory from the arrakis server into the local /shared/ directory. Read-write access is requested (hence the rw parameter). The nosuid option is a protection measure that wipes any setuid or setgid bit from programs stored on the share. If the NFS share is only meant to store documents, another recommended option is noexec, which prevents executing programs stored on the share.
La pagina di manuale nfs(5) descrive tutte le opzioni dettagliatamente.