NFS
| Fiche express | |
|---|---|
| Type | Partage de fichiers réseau (Unix/Linux) |
| Paquet (RHEL) | nfs-utils
|
| Ports | 2049/tcp+udp (NFS), 111/tcp+udp (portmapper/rpcbind) |
| Fichier d'export | /etc/exports
|
| Voir aussi | Debian NFS · Options NFS · Selinux NFS |
NFS (Network File System) permet de partager un répertoire entre systèmes Unix/Linux au niveau du système de fichiers, avec des sémantiques proches d'un accès local. Cette page couvre l'installation RHEL/CentOS, l'usage courant et un point sécurité important sur les exports mal restreints. Pour l'installation Debian, voir Debian NFS ; pour la référence complète des options d'export, Options NFS ; pour le contexte SELinux, Selinux NFS.
Présentation
À partir de la version 4, NFS gère correctement les IO concurrentes. L'option de montage
sync force la synchronisation des écritures avec le serveur à chaque opération ;
par défaut, les IO ne sont pas synchronisées (comportement asynchrone, plus rapide mais
moins sûr en cas de coupure).
Ports réseau
NFS nécessite l'ouverture de :
- port 2049 : port principal du service NFS lui-même
- port 111 : service portmap/rpcbind, qui fait correspondre les services RPC (dont NFS)
à des ports dynamiques
Installation (serveur)
yum -y install nfs-utils
chkconfig nfs on
reboot
# /etc/exports
/home/ client.example.com(rw,sync,no_wdelay,insecure_locks,no_root_squash)
Le détail de chaque option d'export (no_root_squash, sync,
insecure…) est dans Options NFS.
Ajouter un répertoire à exporter
mkdir /DIR
vi /etc/exports
/DIR client.example.com(rw,insecure,no_subtree_check)
exportfs -rv # recharger /etc/exports
Arrêter un partage
exportfs -u nom_du_partage
exportfs -ua # arrêter tous les partages
Commandes utiles
showmount -e host # lister les répertoires exportés vus depuis un client
exportfs # afficher les répertoires exportés localement (/etc/exports)
rpcinfo -p # interroger le portmapper local
rpcinfo -p host # interroger le portmapper d'un hôte distant
ps aux | grep rpc # daemons RPC/NFS en cours
showmount -a # connexions clientes actives depuis le serveur
cat /var/lib/nfs/rmtab
netstat -tuln | grep nfs
Installation et montage (client)
yum install -y nfs-utils
chkconfig nfs on
reboot
Montage manuel :
mkdir /mnt/share
mount -t nfs 192.168.1.10:/DIR /mnt/share
umount -l /mnt/share # démontage "lazy" si la ressource est occupée
Montage automatique persistant :
# /etc/fstab
192.168.1.10:/DIR /mnt/share nfs defaults 0 0
Exemples d'options de montage typées :
# profil "base de données" (verrouillage désactivé, tailles de buffer explicites)
192.168.1.10:/data /mnt/data nfs rw,bg,hard,nointr,tcp,vers=3,timeo=600,rsize=32768,wsize=32768,actimeo=0 0 0
# profil standard
server:/usr/local/pub /pub nfs rsize=8192,wsize=8192,timeo=14,intr 0 0
Diagnostiquer un échec au démarrage
Un échec du service NFS au démarrage (fréquent sur serveur virtualisé où l'ordre de démarrage
des services peut varier) vient généralement de portmap/rpcbind non
démarré, ou démarré après nfs :
chkconfig --add portmap
chkconfig --level 123456 portmap on
NFSv4
yum install nfs-utils nfs4-acl-tools portmap
chkconfig --add rpcbind
Serveur :
# /etc/exports
/home/export *(rw,sync,no_wdelay,insecure_locks,no_root_squash)
Client :
server:/home/export /home/export nfs rw,bg,hard,nointr,tcp,vers=3,timeo=600,rsize=32768,wsize=32768,actimeo=0,nolock 0 0
chkconfig nfs on
chkconfig portmap on
service portmap start # nécessaire pour le support NFSv3
service nfs start
Sur un conteneur OpenVZ/Proxmox, le client NFS doit être explicitement autorisé côté hôte :
vzctl set $CTID --feature nfsd:on --save
Pare-feu
# ouvrir le port NFS pour un sous-réseau donné (exemple iptables, voir Iptables)
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 2049 -j ACCEPT
Chiffrer le transport
NFS ne chiffre pas nativement les données transférées (sauf configuration Kerberos avec
sec=krb5p, voir Debian NFS). À défaut, un tunnel SSH permet de faire passer
le montage dans un canal chiffré :
ssh root@192.168.0.42 -L 2050:localhost:2049 -f sleep 60m
ssh root@192.168.0.42 -L 2051:localhost:32767 -f sleep 60m
localhost:/home /mnt/home nfs rw,hard,intr,port=2050,mountport=2051 0 0
Le point de montage se connecte au port local, redirigé par le tunnel SSH vers le serveur NFS distant — les échanges transitent chiffrés sur le lien SSH.
Forcer un utilisateur/groupe côté client
no_root_squash # le root du client garde les droits root sur l'export (dangereux, cf. section Sécurité)
root_squash # le root du client perd ses privilèges (comportement par défaut)
all_squash # tous les clients sont mappés sur un UID/GID anonyme unique
anonuid / anongid # UID/GID locaux utilisés pour le mapping anonyme
Exemples :
/chemin/dossier_a_partager *(rw,all_squash,anonuid=5000,anongid=5000,sync)
/home/partage 192.168.1.0/24(rw,all_squash,insecure,anonuid=500,anongid=500)
/pub (ro,insecure,all_squash) # répertoire public en lecture seule
Sécurité : exports mal restreints
Un export NFS ouvert sans restriction de client ni root_squash permet à
n'importe quel poste du réseau de monter le partage avec les droits root — y compris pour
déposer une clé SSH dans /root/.ssh/authorized_keys et obtenir un accès shell
complet à la machine :
showmount -e cible
Export list for 192.168.0.18:
/ *
ssh-keygen
mkdir /mnt/nfs
mount -t nfs 192.168.0.18:/ /mnt/nfs
cat ~/.ssh/id_rsa.pub >> /mnt/nfs/root/.ssh/authorized_keys
umount /mnt/nfs
ssh 192.168.0.18
Cette technique fonctionne dès lors que l'export racine (/) est publié sans
restriction de client (*) et sans root_squash — c'est-à-dire
exactement les deux défauts que les paramètres ci-dessus permettent d'éviter. À retenir côté
défense :
- ne jamais exporter
/ou un répertoire contenant des données sensibles sans
restriction de client explicite (IP ou plage, jamais * en production) ;
- laisser
root_squashactif (comportement par défaut) sauf besoin documenté et
isolé sur un réseau de confiance ;
- combiner avec un pare-feu restreignant les ports 111/2049 aux seuls clients légitimes.
Voir aussi
- Debian NFS — installation et export sous Debian/Ubuntu
- Options NFS — référence complète des options d'export et de
/etc/sysconfig/nfs - Selinux NFS — contextes et booléens SELinux à connaître pour NFS
- CMANv3 — NFS fait partie des services pris en charge nativement par le module HA du cluster RHEL