NFS - Read only mount - all_squash

Questo l'ennesimo argomento molto semplice ma che, per  un errore di interpretazione (davvero fesso), mi ha fatto perdere le ore...

SERVER_1) (file server, 192.168.0.100)
Ci sono le home degli utenti e i loro siti web. Tutti gli utenti ci possono accedere via ssh dall'interno di una rete privata.

SERVER_2) (web server, 192.168.0.200)
Vorrei poter visualizzare tutti i siti web degli utenti presenti su SERVER _1.

Entrambi i server hanno CENTOS (in varie versioni)

Su SERVER_1 attivo il servizio nfs e, in /etc/exports permetto l'esportazione dell'intera home solo verso SERVER_2 in questo modo

ro -> Read Only
sync -> (default per la mia versione di nfs) A ogni modifica del file system (che non ci sarà visto che è read only) esegue il commit.
root_squash -> mappa l'utente uid/gid 0 con l'utente anonimo.
all_squash -> mappa tutti gli utenti con l'utente anonimo.
anonuid=5050 e anongid=5050 -> al posto di mappare root e tutti gli utenti con l'utente anonimo, li mappo con l'utente con uid 5050 e con gid 5050. Questo utente (su SERVER_1) può leggere tutti i file/directory dei siti web degli utenti.

Su SERVER_2 metto in fstab

nolock -> Disabilito il lock dei file.
ro -> Read Only.
noacl -> Non esporto le acl.
noexec -> Non si possono eseguire i file eseguibili.
nosuid -> Non si può alzare il livello dei privilegi.
bg -> Non si blocca il client in fase di montaggio, se per qualche motivo il server nfs non è disponibile. (forka un processo figlio in background).
_netdev -> montalo solo se la rete è attiva. *

Una volta effettuato il montaggio vedrò il file system correttamente.

Sul client (SERVER_2), non c'è bisogno di attivare nè rpcbind (portmap), nè rpc.statd (nfslock) nè tantomeno nfs (rpc.mountd, nfsd rpc.rquotad rpc.svcgssd)

La procedura, come si può vedere, è semplicissima. Il fatto è che, quando poi accedo in SERVER_2 alla directory montata, vedo tutti i file e le cartelle con privilegi/proprietari come in SERVER_1. Questo è normale, è sempre stato così con NFS e in passato l'ho sempre usato insieme a NIS  (ypbind) in modo da esportare anche sui client i medesimi UID/GID del server.
In questo caso però ho effettuato un all_squash, ovvero ho mappato tutti gli uid/gid con l'utente anonimo, anzi con l'utente con uid 5050 e gid 5050 nel mio caso. Non so per quale motivo quindi mi aspettavo che, in fase di montaggio su SERVER_2, avrei visto tutti i file e cartelle avere come proprietario uid 5050 e gid 5050. Questo però è proprio completamente errato: ciò che viene mappato con uid 5050 e gid 5050 è l'utente con cui accedi a quei file, indipendentemente da quello che stai usando. File e cartelle mantengono invece i loro permessi/proprietari originali come su SERVER_1.

In sostanza se su SERVER_1 ho un file così

Montato via nfs su SERVER_2 coi parametri appena visti (all_squash, root_squash,anoinuid=5050,anongid=5050),

Questo perchè root (o anche tutti gli altri utenti su SERVER_2) accedono a home_nfs come l'utente con uid e gid 5050 su SERVER_1, che quindi non ha permessi su quel file.

Se su SERVER_1 cambio i permessi in questo modo

(l'utente apache,gruppo apache è quello che su SERVER_1 ha uid e gid 5050).

Allora su SERVER_2 vedrò

*Montaggio NFS in fase di boot - Centos 6 (SysVinit)

Il root file system (/) viene montato durante il processo di inizializzazione dal boot loader al quale viene specificato (root=) quale partizione è quella di root.
Il resto dei file system viene montato, sempre durante l'inizializzazione, col comando "mount -a" andando a leggere il file /etc/fstab per la configurazione.
Chiaramente non è possibile effettuare il montaggio di un file system nfs così presto durante il boot in quanto la scheda di rete potrebbe non essere ancora avviata. Col flag "_netdev" stiamo dicendo al sistema di non effettuare il montaggio fino a che la rete non diventi disponibile.

E' possibile servirsi del demone "netfs" per effettuare i montaggi di tutti quei file system remoti e configurati in /etc/fstab. Questo processo viene eseguito dopo l'inizializzazione delle interfaccie di rete ed effettua internamente una serie di controlli (lo script è molto semplice da leggere).

Il problem di netfs (/etc/init.d/netfs) è che fa partire il servizio rpcbind (in caso cerchi di montare file system nfs) e poi, almeno nel mio caso, lancia dei comandi (innoqui) sulle logical volume manager.  Secondo me rpcbind non serve per un client che deve fare un montaggio di un file system nfs senza preoccuparsi degli id-utente, e le lvm non sono un file system remoto, per cui dovrebbe lasciarle stare.
Per questi motivi io preferisco non servivmene e inserire alla fine nel processo di boot (/etc/rc.local) il comando /bin/mount -a che rilegge il file /etc/fstab e cerca di rimontare tutti i file system.

Montaggio in fase di boot - Centos 7 (systemd)

systemd internamente si occupa del montaggio di tutti i tipi di file system in fase di boot. E' in grado di riconoscere un file system di tipo nfs e di comportarsi di conseguenza (quindi effettua il montaggio solo dopo che la rete diventa disponibile): Per questo motivo non è indispensabile aggiungere in /etc/fstab il flag "_netdev" anche se metetterlo male non fa.

Risulta altresì interessante capire come systemd effettua i vari mount dei file system. Le unità interessate dal processo sono quelle col suffisso .mount che vengono richiamate da vari target.
Nel mio caso avvio il sistema col "graphical.target": Con questo comando si può vedere quali sono le sue dipendenze.

Le untià .mount si possono editare e configurare come tutte le altre. Come penso il 99% delle persone però, io continuo a utilizzare /etc/fstab. In fase di boot (o quando il demone viene ricaricato, systemctl daemon-reload ), dinamicamente, systemd legge /etc/fstab e converte le direttive che vi ci trova,  in unità native di systemd.
Come si può vedere si trovano anche i target per i montaggi nfs: In questo caso root-mnt.mount (per prova ho messo il punto di montaggio in /root/mnt).
In /etc/fstab è anche possibile specificare come options delle direttive specifiche per systemd. Per approfondire meglio guardare:
http://www.freedesktop.org/software/systemd/man/systemd.mount.html

 

Print Friendly, PDF & Email