NFS : problème de mapping UID / GID

Bonjour. :slight_smile:

J’ai posé la question suivante sur le chan #debian-fr pendant le week-end, malheureusement les réponses ne m’ont été d’aucun secours.

Je dispose actuellement d’une machine hôte et d’une machine virtuelle tournant toutes les deux sous Debian 9.5. L’idée est de partager le dossier /srv/home (permissions 1000:1000) de l’hôte vers la machine virtuelle /var/www/home (permissions 33:33).
Les deux machines sont sous le même bridge (configuré avec systemd-networkd sur la machine hôte).

IP de l’hôte (= IP du bridge) : 192.168.1.2
IP du serveur : 192.168.1.3

/etc/exports : sur l’hôte :

/srv/home 192.168.1.3(rw,sync,insecure,no_subtree_check,all_squash,anonuid=33,anongid=33)

/etc/idmapd.conf : commun à l’hote et à l’invité :

[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
Domain = mondomaine.fr

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

~$ hostname -d : commun à l’hote et à l’invité :

mondomaine.fr

Actuellement, je suis capable de monter le repertoire sur la machine cliente. Cependant les permissions ne sont pas les bonnes. Tous les fichiers / dossiers du dossier monté ont les permissions 1000:1000.
Pourtant all_squash dans mon /etc/exports devrait bien translater les permissions vers 33:33.

J’ai également essayé sur la machine et l’invité :

echo N > /sys/module/nfs/parameters/nfs4_disable_idmapping 
nfsidmap -c
systemctl restart nfs-idmapd.service

Sans plus de succès.
Peut-être que debian-fr.org pourra m’aider ? :slight_smile:

Bon, déjà, tu confonds permissions (droits propriétaire/groupe/autres sur le fichier) et propriété (qui est propriétaire, quel groupe).

Tu confonds aussi la définition d’un gid/uid par défaut (anonuid=33,anongid=33 dans export) avec le mode anonyme d’un service ftp.

Là, tel que tu as configuré ton export, tous les users de ton client qui n’ont pas de compte correspondant sur ton serveur sont mappés en www-data::www-data.
Ca donne à tous ces anonymes la possibilité de modifier les données des sites web sur ton share nfs (puisqu’ils deviennent www-data::www-data lors des accés au serveur).
Avec un user bien identifié qui a le même >nom< sur le client et le serveur (comme ton compte “1000” par exemple, auquel j’imagine tu as donné le même nom sur ton client et ton serveur) idmapd le fait accèder sur le disque du serveur avec l’uid/gid correspondant à son nom qu’il a trouvé en cherchant le nom dans /etc/passwd (du serveur).
Et du coup, paradoxalement, tes utilisateurs qui accèdent au share avec un compte bien reconnu ne peuvent pas accéder aux données de www-data:www-data si tu ne leur a pas donné des droits de groupe.

En fait, donc, pour faire ce que tu veux faire il faudrait:

  • laisser le montage dans l’export sans préciser l’anonid ni l’anonguid, ou en leur donnant la valeur nobody/nogroup (65534/65534), afin que les utilisateurs non identifiés ne puissent accèder à rien.
  • s’il n’existe pas déjà, créer un user/group www-data::www-data sur ton client (si possible en 33::33)
  • travailler sur ta machine cliente avec tes données sur l’export comme si tu étais en local sur ton serveur, c’est à dire passer en user www-data pour manipuler tes fichiers de site web, ou bien ajouter ton user 1000 au groupe www-data pour qu’il ai le droit de manipuler les données du groupe www-data (là, j’ai un doute pour savoir s’il faut l’ajouter au groupe sur le client ou sur le serveur).

Salut, je m’excuse du délai de réponse, mais j’ai eu un problème de routeur peu de temps après mon premier message m’empêchant de bricoler le NFS comme je le souhaitais.

Effectivement mon message initial n’est pas clair j’ai mélangé permissions et propriétés. Je parle ici bien sûr des propriétés du montage.

L’idée ici est d’avoir un dossier NFS dont les propriétaires sont 1000:1000 sur l’hôte et www-data:www-data sur l’invité.

Ce n’est pas le cas, en fait sur le montage distant les fichiers appartiennent tous à 1000:1000. De plus les UID:GID 1000:1000 et 33:33 (www-data:www-data) existent sur les 2 machines.

Comme je l’ai dit au début du post, j’ai eu un problème de routeur m’interdisant l’accès à mon NFS. Finalement ce problème m’a amené à considérer une autre solution : VirtFS.

Ma solution avec VirtFS :

Hôte

Dans virt-manager : ajouter un système de fichier VirtFS avec le pilote par défaut et le mode “Mapped”
Dans l’invité.
Un nom de point de montage est demandé, on en aura besoin sur l’invité.

Invité

Commande de montage :

mount -t 9p -o trans=virtio <Nom du montage> <Point de montage>

ou dans /etc/fstab pour automatiser tout ça :

<Nom du montage> <Point de montage> 9p trans=virtio 0 0

Enfin pour translater les propriétaires :

chown <Nouvel utilisateur>:<Nouveau groupe> -R <Point de montage>

Je ne pense pas pouvoir considérer le sujet comme résolu, mais plutôt comme contourné. Je tenterai de renouveler l’expérience et j’ajouterai à la suite de ce sujet l’éventuelle solution. :slight_smile: