NFSv4 在 Debian Stretch 上映射 UID 和 GID

Ale*_*chi 3 nfs mapping debian-stretch

我使用以下设置:

NFS 服务器(Ubuntu 16.04 LTS)

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

NFS客户端

  • nfs-common 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
Run Code Online (Sandbox Code Playgroud)

在客户端:

[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]
test@nfsserver.example.com = testmf
test@192.168.0.1 = testmf
test@nfsserver = testmf
Run Code Online (Sandbox Code Playgroud)

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

mount 192.168.0.1:/home/test/my_exp_dir /home/testmf/my_imp_dir
Run Code Online (Sandbox Code Playgroud)

当我做 als -l /home/testmf/my_imp_dir我得到这样的东西:

-rw-r--r-- 1 test test  326025780 May  9  2017 allCountries.zip
Run Code Online (Sandbox Code Playgroud)

并不是

-rw-r--r-- 1 testmf testmf  326025780 May  9  2017 allCountries.zip
Run Code Online (Sandbox Code Playgroud)

如果我做到这一点,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
Run Code Online (Sandbox Code Playgroud)

或者 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
Run Code Online (Sandbox Code Playgroud)

我试图提高详细程度,但在我的日志中没有任何地方可以看到用户从一个 UID 到另一个 UID 的映射,就像我在某些答案中看到的那样。我可以看到的两件事是内核设置/sys/module/nfs/parameters/nfs4_disable_idmapping被设置为Y,即使更改为N,似乎也没有任何效果。

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

  • /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 的官方文档在这里并没有真正的帮助,除非我完全失明!

预先感谢您的帮助。

kof*_*ann 5

nfs id 映射存在很大的混淆。当字符串形式主体(如 test@example.com)必须转换为数字 id 时使用的映射,反之亦然。但是,当您使用 sec=sys 挂载时,您显然会这样做,然后所有请求都使用客户端的本地 UID 和 GID 进行身份验证。IOW,客户端进程的触摸UID 将是服务器上的文件所有者。

第二个混淆是Static可用于定义静态映射。根据手册页:

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

从字面上预计GSS-认证主体:

 if (strcmp(secname, "krb5") != 0 && strcmp(secname, "spkm3") != 0)
     return -EINVAL;
Run Code Online (Sandbox Code Playgroud)

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。