NFS4 ubuntu:ls -al显示nobody:nobody

在Ubuntu(xenial aka 16.04)上,所有客户端在所有NFS4挂载的目录中显示目录和文件所有者为nobody:nobody

用户和组数据库来自ldap的sssd ,客户端和服务器都使用相同的ldap sources / trees和getent passwd $user ,显示正确的条目( $user是非本地的,即ldap用户条目,所以ldap似乎工作)。

用户可以写入他们所拥有的目录(即使操作系统显示nobody:nobody ),新文件最终也会在服务器上拥有正确的所有权,例如在ldap树中定义的正确的UID:GID 。 但是,Ubuntu用户看不到,谁拥有哪个文件,这是非常奇怪的。 此外,ssh似乎也做了一些检查,因此无法使用其授权密钥方法(即无密码)login,也不会使用〜/ .ssh / *中的任何设置,除非在CLI上明确指定。 这是一场噩梦。 Solaris客户端完全没有问题,所以问题必须是与Ubuntu / Linux相关的。

  • /etc/idmapd.conf具有适当的域集。
  • /etc/nsswitch.confpasswdgroupshadowservicesnetgroupautomounthosts集有files [SUCCESS=return] sss
  • / etc / default / nfs-commonNEED_GSSDNEED_STATD设置为noSTATDOPTS为“”。

还有什么我失踪?

这是由于NFSv4 idmap missconfiguration造成的。 根据nfs规范,客户端和服务器使用基于string的主体作为所有者和组的标识符。 本地idmapdconfiguration负责将这些主体转换为本地uid和gid。 通常这涉及LDAP或NIS。

您可以通过以下方式强制客户端和服务器使用数字ID:

 $ echo Y > /sys/module/nfs/parameters/nfs4_disable_idmapping $ nfsidmap -c 

在客户端,和

 # echo Y > /sys/module/nfsd/parameters/nfs4_disable_idmapping 

在服务器上。 和/或为了使更改永久化,请使用相应的模块configuration:

 $ echo "options nfs nfs4_disable_idmapping=1" > /etc/modprobe.d/nfs.conf 

 $ echo "options nfsd nfs4_disable_idmapping=1" > /etc/modprobe.d/nfsd.conf 

深入挖掘之后,看起来Linux NFS4客户端不是zone / cgroup / LXC。 即它盲目地使用来自全局区域(/etc/request-key.d/id_resolver.conf)的请求密钥configuration,从而导致调用/ usr / sbin / nfsidmap。 由于全球区域(GZ)是一个最小区域,它不知道在非全球区域(NGZ)别名容器中使用的身份。 顺便说一下,无论如何,将GZ自己的身份映射到1:1的NGZ可能被视为一个安全问题/ bug。

如果request-key会提供一个信息,以便能够从哪个区域或cgroup中发起请求,那么可以为GZ的/ usr / sbin / nfsidmap编写一个简单的包装器,它调用相应的/ usr / sbin / nfsidmap在相关的区域。 不幸的是,似乎没有办法,“恢复”这一缺失的信息。

所以现在的答案是:由于devise缺陷,不能正常工作。