NFSv4 在 Debian Stretch 上映射 UID 和 GID

NFSv4 在 Debian Stretch 上映射 UID 和 GID

我使用以下设置:

NFS 服务器(Ubuntu 16.04 LTS)

  • nfs-公共 1:1.2.8-6ubuntu1.2
  • nfs 内核服务器 1:1.2.8-6ubuntu1.2
  • 用户:测试(uid=1300)

NFS 客户端

  • nfs-公共 1:1.3.4-2.1
  • 用户:testmf(uid=1350)

在客户端,用户test与服务器端具有相同的 UID。但我需要使用用户testmf而不是test那个。

我已阅读了大量文档和来自 StackOverflow/StackExchange 的答案,但由于某些原因,它们对我来说都不起作用。

众多答案之一是更改文件/etc/idmapd.conf

两边的情况如下:

服务器

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

[Mapping]    
Nobody-User = nobody
Nobody-Group = nogroup

在客户端:

[General]
Verbosity = 9
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if it differs from FQDN minus hostname
# Domain = localdomain
Domain = example.com

[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup

[Translation]
Method = static

[Static]
[email protected] = testmf
[email protected] = testmf
test@nfsserver = testmf

我使用这样的命令在客户端上挂载目录:

mount 192.168.0.1:/home/test/my_exp_dir /home/testmf/my_imp_dir

当我这样做时,ls -l /home/testmf/my_imp_dir我得到了类似这样的结果:

-rw-r--r-- 1 test test  326025780 May  9  2017 allCountries.zip

并不是

-rw-r--r-- 1 testmf testmf  326025780 May  9  2017 allCountries.zip

如果我做到这一点,touch testfile我会得到:

-rw-r--r-- 1 test test  326025780 May  9  2017 allCountries.zip
-rw-r--r-- 1 testmf testmf      0 Jun  9  18:57 testfile

或者ls -ln

-rw-r--r-- 1 1300 1300  326025780 May  9  2017 allCountries.zip
-rw-r--r-- 1 1350 1350          0 Jun  9  18:57 testfile

我尝试增加详细程度,但在我的日志中,我看不到用户从一个 UID 到另一个 UID 的映射,就像我在一些答案中看到的那样。我能看到的两个东西是内核设置/sys/module/nfs/parameters/nfs4_disable_idmapping被设置为Y,即使更改为N,似乎也不起作用。

我发现的第二件事是这两个条目在我的客户端服务器上不存在:

  • /proc/net/rpc/nfs4.nametoid
  • /proc/net/rpc/nfs4.idtoname

而且我不知道如何添加它,特别是在 nfsidmap 不可用的情况下。

我读到过,idmapd更改后我也需要重新启动服务。但在 Debian 9 中这是不可能的……或者至少我还没有找到如何做到这一点……

我还更改了文件/etc/default/nfs-common来设置变量NEED_IDMAPD=yes,但它什么也没做,即使重新启动后也是如此......

所以我的问题可能很愚蠢,但是如何在 Debian Stretch 上激活 nfsidmapd?我真的别无选择,搜索关键字和 Debian 的官方文档在这里真的没什么用,除非我完全瞎了眼!

预先感谢您的帮助。

答案1

nfs id 映射存在很大混淆。当字符串形式主体时使用的映射,如[电子邮件保护],必须转换为数字 ID,反之亦然。但是,当您使用 sec=sys 进行挂载时(您显然会这样做),所有请求都会使用客户端的本地 UID 和 GID 进行身份验证。换句话说,触碰客户端进程的 UID 将成为服务器上的文件所有者。

第二个困惑是静止的可用于定义静态映射。根据手册页:

“静态”转换方法使用 GSS 认证名称到本地用户名的静态列表。

哪个字面上地期望经过 GSS 认证的主体:

 if (strcmp(secname, "krb5") != 0 && strcmp(secname, "spkm3") != 0)
     return -EINVAL;

http://git.linux-nfs.org/?p=trondmy/libnfsidmap.git;a=blob;f=static.c;h=fffd4580847d2577d3fb9638a246069bdb8f12b5;hb=HEAD#l118

由于太多人需要静态映射,这个问题可能需要修复,但是您无法修复进程 UID 的使用问题。

要以 NFS 友好的方式解决此问题,最佳选择是使用 kerberos 并使用 sec=krb5 进行挂载。在这种情况下,您的进程可以使用 kerberos 票证为一个用户运行,但本地仍具有不同的 UID。在这种情况下,可以使用静态映射来避免使用 LDAP。

答案2

嗯,这是我的答案,也许不完全是我想要的,但至少它解决了我的问题,我可以继续。

基本上,我已确保所有涉及的服务器上的每个用户都属于同一组,且具有相同的 GID。然后,我使用以下命令设置共享目录中所有目录的组 ID:

find /share-dir -type d -exec chmod g+s {} \;

我还检查了 umask 设置为 007 而不是 022,027。

相关内容