NFS
Installation d'un serveur NFS
Introduction
NFS signifie Network File System. C'est, comme son nom l'indique, un système de fichiers en réseau qui permet de partager ses données principalement entre systèmes UNIX. À la différence de SAMBA, NFS gère les permissions sur les fichiers et on peut donc l'utiliser de manière totalement transparente dans son arborescence Linux.
ATTENTION !
Comme toute application réseau, NFS ouvre des trous dans la sécurité du système. Je vous invite donc à consulter les liens à la fin de cet article pour des précisions sur la sécurité (celui-ci, en anglais, indique quelques règles à suivre, en parallèle des démarches indiquées dans ce guide nfs pour Debian ou ci-dessous).
Les softs
Les modules du noyau
Dans la configuration du noyau, on va dans la section "File systems ---> Network File Systems"
- Pour le client:
NFS file system support et Provide NFSv3 client support
CONFIG_NFS_FS=y ou m CONFIG_NFS_V3=y
- Pour le serveur:
NFS server support et Provide NFSv3 server support
CONFIG_NFSD=y ou m CONFIG_NFSD_V3=y
À partir du noyau 2.2.18, les modules supportent entièrement la version 3 du protocole ainsi que différentes corrections de bug.
Il serait temps d'upgrader si tu ne l'as pas déjà fait! (profites-en pour passer au 2.4, ce sera réglé :)
Les packages
Les packages (sur ma Debian) sont :
- nfs-common
- nfs-user-server pour le serveur.
Tu peux toujours récupérer les sources qui se trouvent sur http://nfs.sourceforge.net/.
On va aussi installer le wrapper TCP pour un minimum de sécurité. Toujours sur ma Debian, le paquet s'appelle tcpd. Les sources se trouvent ici.
Le serveur
Les 3 fichiers de configuration principaux sont /etc/exports, /etc/hosts.deny et /etc/hosts.allow.
/etc/exports
Le fichier /etc/exports est très simple :
par exemple :
signifie que l'on autorisera la machine 192.168.0.10 à accéder à notre répertoire /home en lecture et écriture (rw) ainsi que la machine 192.168.0.25 mais uniquement en lecture (ro).
- répertoire :
le répertoire du serveur à partager. - machine :
Une liste de machines séparée par des virgules et autorisées à monter ce répertoire (utilisez des adresses IP plutôt que des noms à cause des problèmes de "dns spoofing"). - options :
- ro :
C'est la valeur par défaut, lecture seule. - rw :
La machine à un accès en lecture/écriture au répertoire. - no_root_squash :
Les accès par l'utilisateur root sur le serveur se font sous l'identité root, au contraire de nobody (par défaut)
À UTILISER AVEC PRÉCAUTION - sync : uniquement NFS v2
Ne diffère pas les écritures physiques au volume, augmente la fiabilité en cas de mauvais démontage. La version 3 dispose d'un mécanisme de commit-rollback donc cette option n'est pas utile.
- ro :
Un point important, pour un bon fonctionnement : tu dois avoir les mêmes numéros de groupes et d'utilisateurs sur les deux machines.
Des systèmes permettent de gérer çà, NIS (assez ancien) ou LDAP (plus récent). Avec peu d'utilisateurs, tu peux tout simplement éditer /etc/group et /etc/passwd pour synchroniser ces numéros.
Il n'est pas recommandé d'exporter un système DOS ou VFAT à cause de leurs absences de gestion multi-utilisateurs ; ils ne sont pas fait pour être partagés avec NFS.
/etc/hosts.deny
On va interdire toutes les machines qui ne sont pas autorisées explicitement dans le /etc/hosts.deny.
Un bon vieux "ALL: ALL" interdira l'accès à tous les services à partir de toutes les machines. On peut cependant être plus précis en écrivant :
portmap:ALL lockd:ALL mountd:ALL rquotad:ALL statd:ALL
/etc/hosts.allow
Dans le même esprit que pour le /etc/hosts.allow, ce fichier a l'architecture suivante :
[service]: [IP de la machine client]
Donc pour autoriser 192.168.1.34 à se connecter à un partage NFS, on écrira :
portmap:192.168.1.34 lockd:192.168.1.34 mountd:192.168.1.34 rquotad:192.168.1.34 statd:192.168.1.34
On va pouvoir lancer les services ; sur ma Debian, je lance :
Pour Slackware, ce serait
La commande rpcinfo -p permet de vérifier que les services fonctionnent. Elle devrait produire un résultat dans cet esprit :
program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 737 status 100024 1 tcp 739 status 100011 1 udp 851 rquotad 100011 2 udp 851 rquotad 100003 2 udp 2049 nfs 100003 2 tcp 2049 nfs 100005 1 udp 872 mountd 100005 2 udp 872 mountd 100005 1 tcp 875 mountd 100005 2 tcp 875 mountd cacahuete:~#
Pour recharger les services NFS (par exemple après une modification du fichier de config) :
le serveur est prêt !
Le client
Pour utiliser NFS v3, il faut au minimum la version 2.10m du programme mount. Pour voir sa version, taper :
mount: mount-2.11h cacahuete:~#
On va maintenant pouvoir monter notre partage!
cacahuete:~#
Avec la version 4 de NFS, il faut utiliser la commande spécifique mount.nfs ainsi:
cacahuete:~#
En principe tout devrait bien se dérouler.
Pour monter ce partage définitivement à chaque démarrage de la machine, éditons notre /etc/fstab:
... master.foo.com:/home /mnt nfs rw 0 0...
'mount' possède quelques options spécifiques au nfs, et qui peuvent s'avérer utiles :
- tcp : permet de préciser qu'on ne travaille qu'en TCP
- rsize=XXX et wsize=XXX : permet de modifier la taille par défaut (1024) du buffer. Une taille de 8192 par exemple permet d'accélerer le transfert.
- soft et timeo=XXX: sur un problème de transmission, le client peut perdre la connection. Le noyau continuera d'essayer ad vitam eternam. Les processus risquent de se retrouver dans un état D (ininterruptible sleep) que seul un reboot permet de résoudre. L'option soft dit au noyau d'abandonner au bout d'un certain temps, et l'option timeo permet de définir le timeout.
Sécuriser le NFS
Les données transitent en clair sur le réseau, néanmoins il est possible de crypter les échange grâce au port forwarding de ssh. La mise en place de la cryptographie se fait en deux parties : une partie sur le serveur, une partie sur le client.
Configuration du serveur
Nous avons besoin de connaître et/ou de définir le port tcp utilisé par mountd. Un petit
permettra de savoir quel port est utilisé par mountd. On peut définir celui-ci via l'option -d lors du lancement du service. Dans notre exemple, il s'agit du port 875.
Il faut également rajouter l'option insecure pour les machines/réseaux concernés dans /etc/exports. Cette option permet seulement de pouvoir atteindre le serveur via un port > 1024 (ce que nous allons faire).
Configuration du client
Nous avons besoin de deux ports libres, par exemple 38000 et 38001 pour créer un tunnel sécurisé entre le client et le serveur :
L'utilisation de l'utilisateur root est nécessaire car on va travailler avec un port < 1024. La mise en place d'une authentification par clé peut être dans ce cas très intéressante. Avec cette commande nous venons de créer un tunnel chiffré entre le port 38000 (resp. 38001) de notre client et le 2049 (resp. 875) du serveur. La commande 'sleep 60' fait tomber le tunnel sécurisé au bout de 60 secondes si celui-ci n'est pas utilisé. Il ne reste plus qu'à monter le partage! Le fait d'utiliser un tunnel ssh implique que nous allons utiliser exclusivement une connection tcp. Pour monter le partage :
Cette commande permet de monter serveur:/repertoire dans /mnt/nfs. Il faut bien utiliser localhost:/repertoire pour monter le partage. C'est justement cela qui va permettre d'utiliser la connexion sécurisée.
On peut également rajouter cette ligne dans le /etc/fstab :
... localhost:/home /mnt nfs tcp,rw,port=38000,mountport=38001,soft,timeo=60 0 0...
Liens
- Cet article est principalement basé sur le NFS howto
- Les sources des logiciels NFS sur http://nfs.sourceforge.net/
- LDAP howto
- NIS howto
- Va te faire peur sur security focus
Autres ressources
- Cet article est principalement basé sur le NFS howto
- Les sources des logiciels NFS sur http://nfs.sourceforge.net/
- LDAP howto
- NIS howto
- Va te faire peur sur security focus
Copyright
Copyright © 22/10/2001, Guillaume Pierronnet - 2006 Oudoubah
Ce document est publié sous licence Creative Commons Attribution, Partage à l'identique, Contexte non commercial 2.0 : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ |