6. Gérer les droits sur le système de fichiers NFS

C'est le démon idmapd qui est utilisé avec NFSv4.2 pour traduire les identifiants d'utilisateurs et de groupes entre serveurs et clients. À la différence des versions précédentes, NFSv4 utilise des noms symboliques (du type user@domaine) plutôt que des UID/GID numériques. Ce démon assure donc la cohérence des permissions en associant correctement ces identités aux comptes locaux. Sans lui, les droits d'accès pourraient être incohérents, ce qui entraînerait des problèmes de sécurité et d'utilisation.

De plus, un compte utilisateur etu-nfs avec les mêmes identifiants UID/GID existe sur le serveur et le client.

6.1. Ajouter une résolution de noms d'hôtes basique

Comme le démon idmapd utilise un nom de domaine, nous devons compléter la configuration du serveur et du client NFS pour avancer dans les tests.

Le nom de domaine choisi pour ces manipulations est : lab.local.

Q86.

Comment compléter la configuration du client et du serveur NFS pour obtenir une résolution local de nom d'hôtes ?

Consultez les pages de manuels de la table de recherche statique des noms d'hôtes : man hosts.

Codez un script qui ajoute les enregistrements du client et du serveur dans le fichier /etc/hosts.

En consultant les pages de manuels vous obtenez le format des deux enregistrements à insérer dans le fichier /etc/hosts.

[IP address] [name] [name].[domain]

Créez un script qui ajoute les deux enregistrements du client et du serveur NFS en utilisant vos propres adresses.

cat << 'EOF' > update-hosts.sh
#!/bin/bash

DOMAIN="lab.local"
HOSTS_FILE="/etc/hosts"
CLIENT_IP="2001:678:3fc:65:baad:caff:fefe:6"
CLIENT_NAME="nfs-client"
SERVER_IP="2001:678:3fc:65:baad:caff:fefe:5"
SERVER_NAME="nfs-server"

# Remove client previous record
if grep -q "${CLIENT_IP}" "${HOSTS_FILE}"; then
    sed -i "/${CLIENT_IP}.*/d" "${HOSTS_FILE}"
fi

echo "${CLIENT_IP} ${CLIENT_NAME} ${CLIENT_NAME}.${DOMAIN}" >> "${HOSTS_FILE}"

# Remove server previous record
if grep -q "${SERVER_IP}" "${HOSTS_FILE}"; then
    sed -i "/${SERVER_IP}.*/d" "${HOSTS_FILE}"
fi

echo "${SERVER_IP} ${SERVER_NAME} ${SERVER_NAME}.${DOMAIN}" >> "${HOSTS_FILE}"

exit 0
EOF

sudo bash update-hosts.sh

Exécutez ce code sur les deux hôtes client et serveur NFS.

Vérifiez que la résolution des noms d'hôtes est fonctionnelle.

for h in nfs-client nfs-server; do
    ping -qc3 $h
done
PING nfs-client (2001:678:3fc:65:baad:caff:fefe:6) 56 data bytes

--- nfs-client ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2027ms
rtt min/avg/max/mdev = 0.478/5.423/15.125/6.860 ms
PING nfs-server (2001:678:3fc:65:baad:caff:fefe:5) 56 data bytes

--- nfs-server ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2043ms
rtt min/avg/max/mdev = 0.031/0.048/0.058/0.012 ms

Q87.

Comment compléter la configuration du démon idmapd pour utiliser le nom de domaine défini ?

Consultez les pages de manuels du démon (man idmapd) et identifiez le fichier de configuration à éditer.

Ajoutez le nom de domaine lab.local dans le fichier de configuration et redémarrez le service sur le serveur NFS.

Le fichier de configuration à éditer est : /etc/idmapd.conf.

Éditez le fichier en ajoutant le nom de domaine. Voici un exemple :

[General]

Verbosity = 1
# set your own domain here, if it differs from FQDN minus hostname
# Domain = localdomain
Domain = lab.local

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

Redémarrez le service sur le serveur NFS.

sudo systemctl restart nfs-idmapd.service
systemctl status nfs-idmapd.service
● nfs-idmapd.service - NFSv4 ID-name mapping service
     Loaded: loaded (/usr/lib/systemd/system/nfs-idmapd.service; static)
     Active: active (running) since Thu 2025-09-18 09:04:52 CEST; 8s ago
 Invocation: b4c5fa9d86c94d58a5599d5bffa839ce
       Docs: man:idmapd(8)
    Process: 3574 ExecStart=/usr/sbin/rpc.idmapd (code=exited, status=0/SUCCESS)
   Main PID: 3576 (rpc.idmapd)
      Tasks: 1 (limit: 973)
     Memory: 512K (peak: 2M)
        CPU: 16ms
     CGroup: /system.slice/nfs-idmapd.service
             └─3576 /usr/sbin/rpc.idmapd

sept. 18 09:04:52 srvr systemd[1]: Starting nfs-idmapd.service - NFSv4 ID-name mapping service...
sept. 18 09:04:52 srvr rpc.idmapd[3576]: Setting log level to 1
sept. 18 09:04:52 srvr rpc.idmapd[3576]: libnfsidmap: using domain: lab.local
sept. 18 09:04:52 srvr rpc.idmapd[3576]: libnfsidmap: Realms list: 'LAB.LOCAL'
sept. 18 09:04:52 srvr rpc.idmapd[3576]: libnfsidmap: loaded plugin /usr/lib/x86_64-linux-gnu/libnfsidmap/nsswitch.so for method nsswitch
sept. 18 09:04:52 srvr systemd[1]: Started nfs-idmapd.service - NFSv4 ID-name mapping service.

6.2. Tester les identifiants et les échanges entre le serveur et le client NFS

Q88.

Comment créer des objets avec des valeurs UID/GID différentes de celles du compte etu-nfs dans son répertoire utilisateur ?

Créez des fichiers dans le répertoire utilisateur du compte etu-nfs sur le serveur et testez l'accès à ces mêmes fichiers sur le client.

Utilisez la commande chown pour attribuer les valeurs UID/GID.

Placez vous côté serveur pour créer deux fichiers textes distincts. Le premier doit appartenir au compte etu-nfs et le second doit avoir des identifiants qui ne correspondent à aucun compte existant.

  1. Créez le fichier dont etu-nfs est propriétaire.

    echo "This file belongs to etu-nfs" | sudo tee /ahome/etu-nfs/ThisOneIsMine
    sudo chown etu-nfs:etu-nfs /ahome/etu-nfs/ThisOneIsMine
  2. Créez le fichier avec des identifiants « inconnus ».

    echo "This file belongs to no-one" | sudo tee /ahome/etu-nfs/ThisOneIs-NOT-Mine
    sudo chown 2000:2000 /ahome/etu-nfs/ThisOneIs-NOT-Mine

Affichez la liste des objets contenus dans le répertoire utilisateur du compte etu-nfs.

sudo ls -lh /ahome/etu-nfs/
total 12K
-rw-rw-r-- 1 etu-nfs etu-nfs 18 15 sept. 15:00 myTextFile
-rw-r--r-- 1 etu-nfs etu-nfs 29 18 sept. 14:19 ThisOneIsMine
-rw-r--r-- 1    2000    2000 28 18 sept. 14:25 ThisOneIs-NOT-Mine

Le fait que les valeurs UID/GID 2000 apparaissent sous forme numérique prouve qu'aucune identité connue du système n'est associée.

Côté client, les objets créés sont biens visibles et la vue réseau du système de fichiers NFS passe par une correspondance des propriétaires.

Placez vous maintenant côté client NFS et prenez l'identité etu-nfs.

Vérifiez que le répertoire courant est celui de l'utilisateur etu-nfs et que les identifiants courants correspondent bien à cette identité.

pwd
/ahome/etu-nfs
id
uid=1002(etu-nfs) gid=1002(etu-nfs) groupes=1002(etu-nfs),100(users)

Affichez la liste des objets présents dans ce répertoire et vérifiez qu'elle est identique à celle obtenue sur le serveur.

ls -lh
total 12K
-rw-rw-r-- 1 etu-nfs etu-nfs 18 15 sept. 15:00 myTextFile
-rw-r--r-- 1 etu-nfs etu-nfs 29 18 sept. 14:19 ThisOneIsMine
-rw-r--r-- 1    2000    2000 28 18 sept. 14:25 ThisOneIs-NOT-Mine

Testez l'affichage et la modification du contenu des deux fichiers créés précédemment.

  1. Affichez et modifiez le premier fichier.

    cat ThisOneIsMine
    This file belongs to etu-nfs

    Ce fichier appartient bien à etu-nfs et cette identité a tous les droits sur cet objet.

    echo "ID etu-nfs owns it" >> ThisOneIsMine
    cat ThisOneIsMine
    This file belongs to etu-nfs
    ID etu-nfs owns it

    L'écriture dans le fichier s'est faite avec succès.

  2. Essayez d(afficher et de modifier le second fichier.

    cat ThisOneIs-NOT-Mine
    This file belongs to no-one

    L'affichage fonctionne puisque la lecture (bit 'r' le plus à droite du masque des permissions) est autorisée pour tout le monde.

    echo "ID etu-nfs is trying to edit this file" >>ThisOneIs-NOT-Mine
    -bash: ThisOneIs-NOT-Mine: Permission non accordée

    L'écriture échoue puisque seul l'utilisateur avec l'identifiant 2000 a le droit d'écriture.

Q89.

Comment Réaliser une capture de trafic réseau côté serveur pendant que l'utilisateur génère un fichier texte assez volumineux dans son répertoire utilisateur ?

  1. Lancez la capture de trafic côté serveur avec tshark en suivant la même méthode que lors des questions précédentes.

  2. Lancez une commande de création d'un fichier texte dans le répertoire utilisateur /ahome/etu-nfs/ côté client.

  3. Recherchez la syntaxe de la commande tshark qui permet d'extraire la charge utile de la capture de trafic NFS.

  4. Affichez le résultat de l'extraction de cette charge utile côté serveur.

Commencez par lancer la capture de trafic côté serveur.

tshark -i enp0s1 -f "host 2001:678:3fc:65:baad:caff:fefe:6" -w nfs-payload.pcap

Passez côté client et lancer une commande de création de fichier texte.

man man > man.txt

Revenez côté serveur et arrêtez la capture de trafic avec Crtl+C.

Listez les trames capturées dans le fichier nfs-payload.pcap.

tshark -r nfs-cat.pcap -Y nfs
tshark -r nfs-cat.pcap -Y nfs
    1 0.000000000 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 242 V4 Call ACCESS FH: 0xb51c8f4e, [Check: RD MD XT XE]
    2 0.000290656 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 194 V4 Reply (Call In 1) ACCESS, [Access Denied: XE], [Allowed: RD MD XT]
    4 0.001205086 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 250 V4 Call GETATTR FH: 0xb51c8f4e
    5 0.001456394 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 286 V4 Reply (Call In 4) GETATTR
    7 7.527683269 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 378 V4 Call OPEN DH: 0x8854dd26/man.txt
    8 7.529921152 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 450 V4 Reply (Call In 7) OPEN StateID: 0x0bf9
   10 7.578515596 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 250 V4 Call GETATTR FH: 0x8854dd26
   11 7.578658561 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 330 V4 Reply (Call In 10) GETATTR
   13 7.591854994 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 338 V4 Call OPEN DH: 0x8854dd26/fr.tmac
   14 7.591993162 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 186 V4 Reply (Call In 13) OPEN Status: NFS4ERR_NOENT
   15 7.593573743 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 342 V4 Call OPEN DH: 0x8854dd26/trans.tmac
   16 7.593714256 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 186 V4 Reply (Call In 15) OPEN Status: NFS4ERR_NOENT
   17 7.594754074 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 342 V4 Call OPEN DH: 0x8854dd26/latin9.tmac
   18 7.594834919 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 186 V4 Reply (Call In 17) OPEN Status: NFS4ERR_NOENT
   19 7.596065068 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 342 V4 Call OPEN DH: 0x8854dd26/hyphen.fr
   20 7.596201636 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 186 V4 Reply (Call In 19) OPEN Status: NFS4ERR_NOENT
   25 7.624835600 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 10842 V4 Call WRITE StateID: 0x0e54 Offset: 0 Len: 39113
   27 7.628251090 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 274 V4 Reply (Call In 25) WRITE
   28 7.630402438 2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 NFS 274 V4 Call CLOSE StateID: 0x0bf9
   29 7.630513322 2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 NFS 266 V4 Reply (Call In 28) CLOSE

Dans l'exemple ci-dessus, on repère l'écriture d'un nombre d'octets assez important sur la trame numéro 25.

Procédez à l'extraction de la charge utile contenue dans le fichier de capture.

tshark -r nfs-cat.pcap -Y nfs -T fields -e nfs.data |\
    tr -d '\n:' |\
    xxd -r -ps > out.bin

Affichez les premières ligne du fichier d'extraction out.bin.

head -n 10 out.bin
MAN(1)                 Utilitaires de l'afficheur des pages de manuel      MAN(1)

NOM
       man - Interface de consultation des manuels de référence du système

SYNOPSIS
       man [options de man] [[section] page ...] ...
       man -k [options d'apropos] expression_rationnelle ...
       man -K [options de man] [section] term ...
       man -f [options de whatis] page ...

C'est la catastrophe ! Le trafic NFS entre le serveur et le client circule en clair sur le réseau et il vraiment très facile de l'intercepter.

Il est temps de passer à la sécurisation des échanges entre le serveur NFS et ses clients.