Product SiteDocumentation Site

11.4. Serveur de fichiers NFS

NFS (Network File System) is a protocol allowing remote access to a filesystem through the network. All Unix systems can work with this protocol.
NFS est un outil très utile. S'il avait de nombreuses limitations auparavant, elles ont pour la plupart disparu avec la version 4 du protocole. L'inconvénient est que la dernière version de NFS est désormais plus difficile à configurer dès que l'on veut utiliser des fonctions de sécurité de base telles que l'authentification et le chiffrement, puisqu'il repose sur Kerberos pour ces fonctionnalités. Et sans ces deux dernières, l'utilisation du protocole NFS doit se limiter à un réseau local de confiance car les données qui circulent sur le réseau ne sont pas chiffrées (un sniffer peut les intercepter) et les droits d'accès sont accordés en fonction de l'adresse IP du client (qui peut être usurpée).

11.4.1. Sécuriser NFS (au mieux)

Si les fonctionnalités de sécurité de Kerberos ne sont pas utilisées, il faut s'assurer que seules les machines autorisées à l'employer peuvent se connecter aux différents serveurs RPC qui lui permettent de fonctionner, car le protocole de base considère les données reçues du réseau comme des données sûres. Le pare-feu doit donc interdire l'usurpation d'adresse IP (IP spoofing) pour qu'une machine extérieure ne puisse pas se faire passer pour une machine intérieure, et les différents ports employés doivent être restreints aux machines devant accéder aux partages NFS.
Les anciennes versions du protocole nécessitaient d'autres services RPC qui utilisaient des ports assignés dynamiquement. Heureusement, avec la version 4 de NFS, seul le port 2049 (pour NFS) et 111 (pour l'annuaire, le portmapper) sont nécessaires et ils sont donc faciles à filtrer avec le pare-feu.

11.4.2. Serveur NFS

Le serveur NFS est intégré au noyau Linux ; Debian le compile dans ses noyaux sous forme de module. Pour l'activer automatiquement à chaque démarrage, il faut installer le paquet nfs-kernel-server, qui contient les scripts d'initialisation adéquats.
Le fichier de configuration du serveur NFS, /etc/exports, donne les répertoires exportés à l'extérieur. À chaque partage NFS sont associées des machines qui ont le droit d'y accéder. Un certain nombre d'options permettent de dicter quelques règles d'accès. Le format de ce fichier est très simple :
/repertoire/a/partager machine1(option1,option2,...) machine2(...) ...
Il est important de remarquer qu'avec NFSv4, tous les répertoires exportés doivent faire partie d'une seule et même arborescence, et que le répertoire racine de cette arborescence doit être exporté et identifié avec l'option fsid=0 ou fsid=root.
Chaque machine est identifiée par son nom DNS ou son adresse IP. Il est aussi possible de spécifier un ensemble de machines en employant la syntaxe *.falcot.com ou en décrivant une plage complète d'adresses IP (exemples : 192.168.0.0/255.255.255.0, 192.168.0.0/24).
Par défaut, un partage n'est accessible qu'en lecture seule (option ro comme read only). L'option rw (comme read-write) donne un accès en lecture/écriture. Les clients NFS doivent se connecter depuis un port réservé à root (c'est-à-dire inférieur à 1 024) à moins que l'option insecure (« pas sûr ») n'ait été employée (l'option secure — « sûr » — est implicite en l'absence de insecure, mais on peut quand même la mentionner).
Le serveur ne répond à une requête NFS que lorsque l'opération sur disque a été complétée (option sync). L'option async (asynchrone) désactive cette fonctionnalité et améliore quelque peu les performances, au détriment de la fiabilité puisqu'il subsiste alors un risque de perte de données en cas de crash du serveur (des données acquittées par le serveur NFS n'auront pas été sauvegardées sur le disque avant le crash). La valeur par défaut de cette option ayant changé récemment (par rapport à l'historique de NFS), il est recommandé de toujours mentionner explicitement l'option souhaitée.
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. If all users should be mapped to the user nobody, use all_squash. 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).
Avec NFSv4, il est possible d'ajouter une option sec pour préciser le niveau de sécurité souhaité : sec=sys est la valeur par défaut sans aucune sécurité particulière, sec=krb5 active uniquement l'authentification, sec=krb5i y ajoute une protection d'intégrité, et sec=krb5p est le plus haut niveau qui inclut la protection de la confidentialité (avec le chiffrement des données). Pour que cela puisse marcher, une installation fonctionnelle de Kerberos est nécessaire (ce service n'est pas traité par ce livre).
D'autres options existent encore, que vous découvrirez dans la page de manuel exports(5).

11.4.3. Client NFS

As with other filesystems, integrating an NFS share into the system hierarchy requires mounting (and the nfs-common package). Since this filesystem has its peculiarities, a few adjustments were required in the syntaxes of the mount command and the /etc/fstab file.

Exemple 11.19. Montage manuel avec la commande mount

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

Exemple 11.20. Entrée NFS dans le fichier /etc/fstab

arrakis.interne.falcot.com:/partage /srv/partage nfs4 rw,nosuid 0 0
The entry described above mounts, at system startup, the NFS directory /shared/ from the arrakis server into the local /srv/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. Note that on the server, the shared directory is below the NFSv4 root export (for example /export/shared), it is not a top-level directory.
La page de manuel nfs(5) détaille toutes les options possibles.