Sur une debian, et donc sur la Freeduc-Sup, vous pouvez installer les outils nécessaires sur un serveur grâce à apt-get.
Sur le serveur, il faut installer portmap, nfs-common, et nfs-kernel-server.
apt-get install portmap nfs-common nfs-kernel-server
Sur le client, il est faut installer nfs-common et portmat.
apt-get install portmap nfs-common
En ce qui concerne les sécurités, sachez que NFS
utilise le wrapper tcp (tcpd). Il est possible de configurer la sécurité via
les fichiers /etc/hosts.allow
et
/etc/hosts.deny
. Les protocoles à ouvrir sur le serveur
sont statd, nfsd, lockd, rquotad et mountd. Sur le client, il faut permettre
à statd d'accèder à localhost.
Vous pouvez activer NFS par la commande /etc/init.d/nfs-kernel-server
. Il vous faudra au préalable avoir défini les ressources à partager (exporter). start
Les programmes sur lequel s'appuie le service NFS utilisent les RPC (Remote Procedure Call). Ils s'inscrivent donc auprès du service portmap qui met à jour sa table de service rpc. Voici un extrait de ce que donne la commande rpcinfo
-p
program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100021 1 udp 33065 nlockmgr 100021 3 udp 33065 nlockmgr 100021 4 udp 33065 nlockmgr 100021 1 tcp 38399 nlockmgr 100021 3 tcp 38399 nlockmgr 100021 4 tcp 38399 nlockmgr 100005 1 udp 967 mountd 100005 1 tcp 970 mountd 100005 2 udp 967 mountd 100005 2 tcp 970 mountd 100005 3 udp 967 mountd 100005 3 tcp 970 mountd
Voici maintenant les processus qui doivent être actifs sur le serveur NFS.
portmap gére le catalogue des programmes RPC,
mountd est chargé des opérations de montage/démontage d'arborescence,
nfsd exécute les primitives d'accès aux fichiers - requêtes émanant des clients.
/etc/exports
décrit ce que le serveur exporte, vers quelles machines le serveur exporte, avec quelles autorisations. Il s'agit d'un
fichier texte, qui est éditable avec n'importe quel éditeur. Il centralise
la liste de l'ensemble des ressources offertes par cette machine. Notez cependant
que le nom de partage est automatiquement celui de la ressource (on ne peut pas
partager sous un autre nom), et qu'enfin, on peut ponctuellement partager une
ressource sans passer par ce fichier (à la volée : voir exportfs).
Exemple de fichier /etc/exports
:
# Ressource Options Liste_de_Clients # Exporte /tmp vers la machine "cli" avec possibilité Read Write (rw) # rw est l'option par défaut /tmp cli(rw) #Exporte "/tmp" en lecture seule vers toutes les machines du réseau /tmp *(ro)
Il n'y a pas de fichier particulier. Il suffit que les programmes soient installés (portmap et nfs-common). Pensez à lancer le portmap, sinon le montage restera en attente.
/etc/init.d/portmap start
Les répertoires exportés par un serveur peuvent être “ montés ” manuellement ou à la demande. Nous verrons comment configurer un fichier sur le poste client, afin qu'un dossier soit “ monté ” automatiquement au démarrage du client. Il s'agit dans ce cas de l'utilisation permanente de la ressource.
Prenons la configuration précédente ( fichier /etc/exports
ci-dessus)
Le client cli1
monte (importe) /tmp
de ns1
sur le répertoire local /tempo
en utilisant la commande suivante
. $
mount -t nfs
ns1:/tmp /tempo
-t
indique le type de SGF - arborescence NFS -
Une fois montée, l'accès à la ressource est transparent.
En fin d'utilisation, le client démonte l'arborescence /tmp
en utilisant la commande $
umount /tempo
A chaque opération de montage ou démontage, le fichier local /etc/mtab
est mis à jour. Il contient la liste des systèmes de fichiers montés (arborescence NFS ou non).
Attention : NFS utilise un cache. Si vous ne voulez pas perdre de données, utiliser une procédure de “ démontage ” des disques ou alors un “ shutdown ” du poste client. Dans les autres cas, vous risquez de perdre les informations logées en cache.
Vérifiez que le noyau supporte le système de fichiers nfs:
Utilisez la commande more
, voici ce que vous pouvez obtenir./proc/filesystems
nodev pipefs ext2 nodev ramfs msdos vfat iso9660 nodev usbfs nodev nfs
Le système de fichiers nfs doit apparaître. S'il n'apparaît pas, c'est que le système n'est pas compilé avec le support de NFS, ou alors il est compilé pour le charger comme un module. Si c'est le cas, vous pouvez charger le module avec la commande :
insmod nfs
ou encore
modprobe nfs
Le module doit apparaître avec la commande lsmod, et le fichier /proc/filesystems
est normalemnt modifié (insmod force l'insertion d'un module dans le noyau, un module pouvant étre un pilote de périphérique par exemple, ou des fonctionnalités de la machine. Modprobe insert le module avec autodétection, afin de vous rendre compte de son bon fonctionnement, ou en donnant les bons paramètres. Lsmod liste les modules présents dans votre noyau, et rmmod permet la suppression d'un module présent dans le noyau).
Ce fichier est utilisé par les daemons pour déterminer les volumes qui seront exportés (accessibles), et quels seront les permissions à accorder sur ces volumes. Il existe autant de lignes que de points de montage. La structure d'une ligne est de la forme :
PointDeMontage client1(option) clientn(option)
- PointDeMontage est le volume local à exporter,
- Client1 ... Clientn définissent les ordinateurs qui ont le droit d'accéder au volume exporté,
- Option: définit le type d'accès et les permissions.
Exemple de fichier avec la commande more /etc/exports
/tmp *.archinet.edu(rw) /usr/local/man *.archinet.edu(ro)
Le dossier /tmp
est exporté en lecture et écriture pour tous les ordinateurs du domaine archinet.edu. Le dossier /usr/local/man
en lecture uniquement.
Voici quelques options de montage, utiliser man exports
pour avoir la liste exhaustive :
Secure : requiert une authentification
Insecure : ne requiert pas d'authentification
ro | rw : lecture uniquement ou lecture écriture
Noaccess : permet d'exclure une partie de l'arborescence pour des clients donnés
Voici un extrait de la page de manuel :
Exemple
# fichier /etc/exports d'exemple / maître(rw) confiance(rw,no_root_squash) /projects proj*.local.domain(rw) /usr *.local.domain(ro) @trusted(rw) /home/joe pc001(rw,all_squash,anonuid=150,anongid=100) /pub (ro,insecure,all_squash)
Commentaire :
La première ligne exporte l'ensemble du système de fichiers vers les machines maître et confiance. En plus des droits d'écriture, toute conversion d'UID est abandonnée pour l'hôte confiance.
La deuxième et la troisième ligne montrent des exemples de noms d'hôtes génériques, et de sous-réseaux (`@trusted').
La quatrième ligne montre une entrée pour le client PC/NFS présenté plus haut.
La dernière ligne exporte un répertoire public de FTP, à tous les hôtes dans le monde, en effectuant les requêtes sous le compte anonyme. L'option insecure
permet l'accès aux clients dont l'implémentation NFS n'utilise pas un port réservé.
Un des problèmes de NFS va être la gestion des utilisateurs et de leurs droits. Le serveur NFS va tenter d'identifier les users de la machine cliente par rapport au système habituel d'authentification de la machine. Tant que le client et le serveur ne se mettent pas d'accord sur une base commune d'identification, les confusions, voire les attaques, sont possibles. En effet, comment gérer les droits de l'utilisateur Pierre qui vient de la machine client Pluton si notre serveur ne connait aucun utilisateur Pierre ? Et d'abord, comment sait on quel utilisateur est connecté ?
La réponse est simple : par son id. Or, si on a deux systèmes d'authentification différents et autonomes (par exemple, par /etc/passswd
, sur chacune des machines), qui dit que l'id de Pierre sur la machine cliente ne sera pas celle de Paul sur la machine serveur ?
En fait, c'est encore pire : Si on ne met pas un système commun d'identification (et pour être sur, d'authentification), on est certain de confondre les utilisateurs. DE MANIERE GENERAL, IL VAUT MIEUX UTILISER NFS DANS UN ENVIRONNEMENT DE CONFIANCE
NFS offre de commandes qui permettent de manipuler les identifiants des utilisateurs afin de plier ceux-ci à notre système de sécurité (contrôle et modification des identifiants donnés par les clients).
Comme vu plus haut, n'oubiez pas d'avoir portmap actif sur votre client. Les programmes clients à utiliser sont : mount et showmount
Ce fichier contient une table des volumes montés sur le système. Il est utilisé par les daemons mount, umount, fsck. Les volumes déclarés sont montés au démarrage du système. Voici un extrait de fichier :
Exemple
/dev/hda1 / ext2 defaults 1 1 /dev/hda2 swap swap defaults 0 0 /dev/fd0 /mnt/floppy ext2 noauto 0 0 /dev/cdrom /mnt/cdrom iso9660 user,noauto,ro 0 0 ns1:/usr/local/man /doc nfs rsize=8192,wsize=8192,timeo=14,intr
La dernière ligne indique que le volume /usr/local/man
, situé sur le serveur ns1
, et qui contient les pages du manuel est un volume nfs, monté sous le nom de local de /doc
.
Ce fichier évite d'avoir à “ monter ” manuellement des systèmes de fichiers ou d'avoir à indiquer les points de montage, bien que cela puisse s'avérer parfois nécessaire (utilisation ponctuelle d'une ressource...). L'option auto
permet de préciser si le montage doit etre fait automatiquement au démarrage de la machine. L'option noauto
permet d'indiquer le montage tel qu'il doit être fait, lors d'une demande manuelle de montage (pratique pour les disquettes, CD et autres lecteurs amovibles).
La commande souvent utilisée est de la forme mount -t TypeDeSGF
NomDeMontage VolumeMonté
.
Vous pourrez avoir toutes les options avec la commande man mount
ou une aide plus brève avec mount --help
.
Exemple de montage : mount
.-t nfs
ns1:/usr/local/man /doc
La forme standard de la commande mount est mount -t type
périphérique répertoire
avec :
Type : type de sgf (fat, vfat, nfs, ext2, minix....) pour nous c'est nfs
Périphérique : nom du fichier exporté sous la forme NomServeur:NomDossierExporté
Répertoire : nom du répertoire local de montage/
Le type de fichier que vous montez est de type nfs, vous utiliserez l'exemple de la commande ci-dessous :
mount -t nfs
serveurNFS:/usr/share/doc /mnt/doc
Commentaire : la ligne de commande monte le répertoire exporté /usr/share/doc
du serveur serveurNFS, sur le répertoire local du client /mnt/doc
.
Le mtab
est modifié chaque fois que l'utilisateur “ monte ” ou “ démonte ” un système de fichiers. Le système tient à jour une table des volumes montés.
Attention, l'accès à la commande mount n'est, par défaut, autorisée que pour root.
Il faut rajouter l'option user
dans le fichier /etc/fstab
, afin qu'un autre utilisateur puisse accéder à cette commande.
Exemple : /dev/cdrom /mnt/cdrom iso9660 noauto,ro
devient /dev/cdrom /mnt/cdrom iso9660 user,noauto,ro
La prise en compte des modifications est dynamique.
La commande mount sans paramètres donne la liste des volumes montés. La commande consulte la table maintenue à jour dans le fichier mtab
.
Cette commande permet d'interroger un hôte distant sur les services NFS qu'il offre, et notamment les volumes qu'il exporte.
showmount -e AdresseIP_ou_NomIP
lancée à partir d'un client nous affichera la liste des ressources offertes par sAdresseIP_ou_NomIP (=serveur).
Sur le serveur, showmount -a
nous affichera la liste des clients connectés sur chacune de nos ressources.
De même, sur le serveur, la command showmount -e
affiche le liste des partages en cours.
rpcinfo : (par exemple rpcinfo -p
consulte le catalogue des applications RPC (nfsd, mountd sont des applicatifs RPC parmi d'autres).
nfsstat : fournit des statistiques d'utilisation de NFS.
La commande exportfs permet elle aussi d'obtenir la liste des partages en cours, de relancer le service (pour la prise en compte d'éventuelles modifications du fichier /etc/exports
, voir même d'effectuer un partage à la volée (sans passer par /etc/exports
).
exportfs -v
affiche les partages en cours.
exportfs -r
active les changements fait dans le fichier de configuration de partage NFS (il fait relire le fichier /etc/exports
par le programme serveur).
exportfs machine:/repertoire
offre à la volée à machine (qui peut être aussi bien un nom de machine qu'étoile, ou un réseau) le partage /repertoire
. On peut passer des options avec -o.
Exemple
#exportfs -v /tmp pluton(rw,root_squash) #exportfs -o rw,no_root_squash 192.168.*:/opt/sav #exportfs -v /tmp pluton(rw,root_squash) /opt/sav 192.168.*(rw,no_root_squash)