NFSv4用户映射


12

这个问题似乎已经被问过很多次了,但是其他答案都不适用于我。

基本上,我只是设置了一个新的NFSv4服务器,并且遇到了服务器和客户端之间UID和GID不匹配的经典问题。但是,在我的场景中,同步/ etc / passwd和/ etc / group是不可行的。请注意,我在两台计算机上确实具有相同的用户(而不是这个问题)。

因此,我正在研究idmap:根据一些消息来源,似乎NFSv4发送了用户名(与NFSv3发送UID / GID的行为相反),而idmap的作用是将这些用户名转换为服务器UID / GID。

但是,对于我来说,这似乎不起作用(下面的设置详细信息),我认为这非常标准(仅从回购中安装了NFS)。

我想念什么吗?有没有一种方法可以在不设置LDAP或Kerberos的情况下使它起作用?


服务器设置

服务器已Ubuntu 16.04安装并且有两个用户。

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是从回购中安装的,并配置为导出测试文件夹。

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)

由于服务器和客户端具有不同的主机名,因此我在idmapd的配置文件中更改了“域”值。否则,该文件与程序包管理器安装的文件相同。请注意,该文件的内容在服务器和客户端上都是相同的。

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

客户端设置

客户端也有Ubuntu 16.04和两个用户,但是它们具有相同的用户名,但UID / GID不同

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,并安装了测试共享。

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

测试中

首先,我在客户端上创建一个文件,这看起来不错:

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

但是,当我从服务器查看文件时,我注意到所有者是错误的所有者,而该组不存在。

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

实验

根据这个答案对一个类似问题,ID映射应该被激活如下,服务器(注意错误)上:

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

在客户端上时(请注意没有错误):

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

但是结果很奇怪:

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

另一个答案建议如下修改idmapd配置(两台计算机上的内容相同):

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

但这似乎没有任何区别。

Answers:


6

当您不使用Kerberos和安全性样式时,NFSv4不会像您认为的那样转换UID和GID。但是它确实按照您的描述进行操作。原因是NFSv4将使用AUTH_SYS安全性。在这里可以找到更详细的描述。


2
感谢您的回答和链接,内容非常丰富。但是仍然无法使其适应上下文...那么idmapping的目的是什么?如果它不能与rpc一起使用,为什么将其称为“ rpcidmapd”?这些命令的作用是什么?
matpen

FWIW,即使使用AUTH_SYS以下问题,似乎也可以启用NFSv4 id映射:unix.stackexchange.com/q/438939/111905
sxc731

@ sxc731:根据我的经验,今天我做了一个测试,使用idmapwith AUTH_SYS可以正确转换UID和GID。但是有效权利不会被翻译,即使ls显示了您自己的目录或文件,您也无法进行更改,因为数字ID不匹配,并且AUTH_SYS数字ID用于访问权限。
汤玛斯

1
@托马斯正确的。当ID映射通过开启时sec=sys,文件按照ID mappig出现,但是写入就像完全没有ID映射一样进行。另一个参考文献“尽管在上面的字符串中(可选)在NFSv4协议中不再使用uid / gid数字,但使用AUTH_SYS(sec = sys)时,它们仍将位于RPC身份验证字段中,这是默认设置。因此,在这种情况下,客户端和服务器之间用户/组名称和数字空间必须一致。
Irfan Latif,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.