如何让 NFSv4 idmap 与 sec=sys 一起工作?

Rob*_*ski 12 linux users nfsv4

我有一个服务器(Debian),它通过 NFS 为某些文件夹提供服务,还有一个客户端(Debian),它连接到 NFS 服务器(使用 NFSv4)并安装导出的文件夹。到目前为止一切都很好,我可以连接和修改文件夹的内容。但用户完全搞砸了。据我了解,这是由于 NFS 使用 UID 来设置权限,并且由于来自客户端服务器的用户的 UID不同,因此会发生这种情况,这仍然是意料之中的。但据我所知,通过启用 NFSv4,IDMAPD 应该启动并使用用户名而不是 UID。用户确实存在于服务器客户端上方面,他们只是有不同的 UID。但无论出于何种原因 IDMAPD 不起作用或似乎没有做任何事情。

所以这是我到目前为止所做的:

在服务器端:

  • 已安装 nfs-kernel-server
  • 使用正确的导出设置填充 /etc/exports --> /rfolder ip/24(rw,sync,no_subtree_check,no_root_squash)
  • 并将 /etc/default/nfs-common 更改为NEED_IDMAPD=yes

在客户端

  • 已安装 nfs-common
  • 并将 /etc/default/nfs-common 更改为NEED_IDMAPD=yes
  • 并使用“ mount -t nfs4 ip:/rfolder /media/lfolder ”挂载文件夹

重新启动并重新启动了几次,但仍然没有。当我从服务器创建一个带有用户A的文件夹时,在客户端上我看到文件夹所有者是某个用户X。当我使用用户A客户端创建文件时,在服务器端它说它来自某个用户Y

我用 HTOP 检查了 rpc.idmap 进程正在服务器上运行,确实如此。尽管在客户端上它似乎没有运行。通过尝试在客户端上手动启动服务,我刚刚收到一条错误消息,指出 IDMAP 需要运行 nfs-kernel-server 依赖项。所以我把它安装在Client端,现在我有 rpc.idmap 进程在ClientServer上运行。两个都重启了,问题依旧。

知道这里有什么问题吗?或者如何正确配置它?

seb*_*sth 17

在使用默认 AUTH_SYS 身份验证(sec=sys挂载选项)而不是 Kerberos 的挂载上使用 NFSv4 id 映射时,有几件事需要注意。

注意:使用AUTH_SYSidmapping 仅转换用户/组名称。仍会根据本地 UID/GID 值检查权限。使用用户名获得权限的唯一方法是使用 Kerberos。

在最近的内核中,只有服务器使用 rpc.idmapd(记录在 中man rpc.idmapd)。使用 idmap 时,用户名以user@domain格式传输。除非在 中配置了域名/etc/idmapd.conf,否则 idmapd 使用系统的 DNS 域名。为了使idmap正确映射用户,客户端和服务器上的域名需要相同。

其次,内核默认禁用 NFSv4sec=sys挂载id 映射。将nfs4_disable_idmapping参数设置为 false 会启用sec=sys挂载的id 映射。

在服务器上:

echo "N" > /sys/module/nfsd/parameters/nfs4_disable_idmapping
Run Code Online (Sandbox Code Playgroud)

和客户端:

echo "N" > /sys/module/nfs/parameters/nfs4_disable_idmapping
Run Code Online (Sandbox Code Playgroud)

您需要nfsidmap -c在客户端上清除 idmap 缓存,以使更改在挂载的 NFSv4 文件系统上可见。

要使这些更改永久化,请在中创建配置文件/etc/modprobe.d/

服务器( modprobe.d/nfsd.conf) 上:

options nfsd nfs4_disable_idmapping=N
Run Code Online (Sandbox Code Playgroud)

客户端( modprobe.d/nfs.conf) 上:

options nfs nfs4_disable_idmapping=N
Run Code Online (Sandbox Code Playgroud)

  • 补充一点,在使用 sec=sys 进行上述所有设置之后,ID 映射仅在读取文件时有效。写入/修改由简单的 UNIX DAC 控制,因为 RPC 机制对映射一无所知。ID 映射仅适用于 Kerberos。https://serverfault.com/a/812829/452872 (3认同)
  • @Nate我认为我的陈述仍然具有误导性。事实上,ID 映射根本不适用于 `sec=sys`。明显的所有权仅由客户端内核显示,如果调用用户的 UID/GID 实际上与文件的 UID/GID 不匹配,并且该文件不被世界读取,则服务器内核甚至不会让您读取文件( `o+r`)。我在尝试[让 NFS 在 Android 上工作](https://android.stackexchange.com/a/201191/218526) 时发现了这一点。 (2认同)
  • @IrfanLatif 感谢您的澄清,我在答案中添加了这一点。事实证明,当我尝试此操作时,所有系统都已经有了匹配的 UID/GID,所以一切都靠运气:\ (2认同)