Mappage utilisateur NFSv4

12

Cette question semble avoir déjà été posée à plusieurs reprises, mais les autres réponses ne s'appliquent pas en quelque sorte à moi.

Fondamentalement, je viens de configurer un nouveau serveur NFSv4 et je suis confronté au problème classique où les UID et GID ne correspondent pas entre le serveur et le client. Cependant, la synchronisation de / etc / passwd et / etc / group n'est pas possible dans mon scénario. Notez que j'ai les mêmes utilisateurs sur les deux machines (par opposition à cette question ).

Par conséquent, je cherchais dans idmap: selon certaines sources, il semble que NFSv4 envoie des noms d'utilisateur (par opposition au comportement de NFSv3 pour envoyer UID / GID) et le rôle d'idmap serait de traduire ces noms d'utilisateur en UID / GID du serveur.

Cependant, cela ne semble pas fonctionner dans mon cas (détails de configuration ci-dessous), que je considère très standard (à peu près uniquement NFS installé à partir du repo).

Suis-je en train de manquer quelque chose? Existe-t-il un moyen de faire fonctionner cela sans configurer LDAP ou Kerberos?


Configuration du serveur

Le serveur est Ubuntu 16.04installé et deux utilisateurs.

user1@server:~$ id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1),27(sudo)
user1@server:~$ id user2
uid=1001(user2) gid=1001(user2) groups=1001(user2)

NFS a été installé à partir du référentiel et configuré pour exporter un dossier de test.

user1@server:~$ sudo apt-get install nfs-kernel-server

user1@server:~$ sudo cat /proc/fs/nfsd/versions 
+2 +3 +4 +4.1 +4.2

user1@server:~$ ls -ld /srv/nfs/test/
drwxrwxrwx 2 nobody nogroup 4096 nov  2 17:34 /srv/nfs/test/

user1@server:~$ cat /etc/exports 
"/srv/nfs/test" 192.168.x.x(rw,sync,no_subtree_check)

Comme le serveur et le client ont des noms d'hôtes différents, j'ai changé la valeur "Domaine" dans le fichier de configuration d'idmapd. Sinon, le fichier est identique à celui installé par le gestionnaire de packages. Veuillez noter que le contenu de ce fichier est identique sur le serveur et le client.

user1@server:~$ cat /etc/idmapd.conf
[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
Domain = mydomain

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

Configuration du client

Le client a également Ubuntu 16.04et deux utilisateurs, qui ont cependant les mêmes noms d'utilisateur mais des UID / GID différents .

user1@client:~$ id user1
uid=1001(user1) gid=1002(user1) groups=1002(user1),27(sudo)
user1@client:~$ id user2
uid=1000(user2) gid=1000(user2) groups=1000(user2),27(sudo)

NFS a été installé à partir du référentiel et le partage de test a été monté.

user1@client:~$ sudo apt-get install nfs-common

user1@client:~$ mkdir ./test
user1@client:~$ sudo mount -t nfs4 192.168.x.x:/srv/nfs/test ./test

Essai

Je crée d'abord un fichier sur le client, et cela semble correct:

user1@client:~$ touch test/testfile
user1@client:~$ ls -l ./test
total 0
-rw-rw-r-- 1 user1 user1 0 nov  2 17:24 testfile

Mais quand je regarde le fichier depuis le serveur, je remarque que le propriétaire est le mauvais, alors que le groupe n'existe pas.

user1@server:~$ ls -l /srv/nfs/test
total 0
-rw-rw-r-- 1 user2 1002 0 nov  2 17:24 testfile

Expériences

Selon cette réponse à une question similaire, l'id-mapping doit être activé comme suit, sur le serveur (notez les erreurs):

user1@server:~$ sudo tee /sys/module/nfsd/parameters/nfs4_disable_idmapping <<< "N"
user1@server:~$ sudo nfsidmap -c
nfsidmap: 'id_resolver' keyring was not found.
user1@server:~$ sudo service rpcidmapd restart
Failed to restart rpcidmapd.service: Unit rpcidmapd.service not found.
user1@server:~$ sudo service nfs-kernel-server restart

Sur le client (notez l'absence d'erreurs):

user1@client:~$ sudo tee /sys/module/nfs/parameters/nfs4_disable_idmapping <<< "N"
user1@client:~$ sudo nfsidmap -c

Mais les résultats sont étranges:

user1@client:~$ touch test/testfile
user1@client:~$ ls -l test
total 0
-rw-rw-r-- 1 user2 4294967294 0 nov  2 19:16 testfile
user1@server:~$ ls -l /srv/nfs/project/
total 0
-rw-rw-r-- 1 user2 1002 0 nov  2 19:16 prova

Une autre réponse suggère de modifier la configuration idmapd comme suit (le contenu est le même sur les deux machines):

user1@server:~$ cat /etc/idmapd.conf 
[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
Domain = mydomain

[Translation]
   Method=static
[Static]
   user1@mydomain = user1

[Mapping]

Nobody-User = nobody
Nobody-Group = nogroup

Mais cela ne semble faire aucune différence.

matpen
la source

Réponses:

6

NFSv4 ne traduira pas les UID et GID comme vous pourriez le penser lorsque vous n'utilisez pas Kerberos et la saveur de sécurité. Mais cela fonctionne exactement comme vous l'avez décrit. La raison en est que NFSv4 utilisera la AUTH_SYSsécurité. Une description plus détaillée peut être trouvée ici .

Thomas
la source
2
Merci pour votre réponse et le lien, très instructif. Mais ne peut toujours pas l'adapter au contexte ... alors quel est le but de l'idmapping? Pourquoi est-il appelé "rpcidmapd" s'il ne fonctionne pas avec rpc? Et quel est l'effet de ces commandes?
matpen
FWIW, il semble possible d'activer le mappage d'ID NFSv4 même lors de l'utilisation AUTH_SYSpar cette question: unix.stackexchange.com/q/438939/111905
sxc731
@ sxc731: d'après mon expérience, et j'ai fait un test aujourd'hui, en utilisant idmapavec AUTH_SYSne traduire correctement les UID et GID. Mais les droits effectifs ne sont pas traduits et même si lsvous affichez vos propres répertoires ou fichiers, vous ne pourrez pas apporter de modifications car les ID numériques ne correspondent pas et avec AUTH_SYSles ID numériques sont utilisés pour les droits d'accès.
Thomas
1
@Thomas correct. Lorsque le mappage d'ID est activé (ON) sec=sys, les fichiers apparaissent selon le mappage d'ID, mais l'écriture fonctionne comme s'il n'y avait aucun mappage d'ID. Autre référence : "Bien que les numéros uid / gid ne soient plus utilisés dans le protocole NFSv4, sauf éventuellement dans les chaînes ci-dessus, ils seront toujours dans les champs d'authentification RPC lors de l'utilisation de AUTH_SYS (sec = sys), qui est la valeur par défaut. En tant que tel, dans ce cas, le nom d' utilisateur / groupe et les espaces numériques doivent être cohérents entre le client et le serveur. "
Irfan Latif