如何在 NFS 共享上映射用户 ID?

如何在 NFS 共享上映射用户 ID?

我已成功将远程计算机的 NFS 共享挂载到本地。但是,我想在远程计算机上编辑的文件均归 拥有root

我如何安装我的 NFS 驱动器以便我的本地用户可以编辑这些文件?

我尝试了该idmap.conf文件,但我不太清楚是否应该在本地或远程计算机上编辑它,以及应该重新启动哪些服务(再次,本地或远程)才能产生影响。

从过去起,我记得uid=X,gid=X做这样的事情的选项,但现在我得到了这个错误:

mount.nfs: an incorrect mount option was specified

我使用 Fedora 34 作为本地,并使用 CentOS 7.6 作为远程。

答案1

对于所有基于文件的网络文件系统,文件权限都是强制执行的由服务器。您可用文件执行的操作ls -l不一定与您实际可用该文件执行的操作相匹配。

例如,如果您使用 SMB 或 SSHFS 并以“bart”的身份向服务器进行身份验证,那么您在服务器上只拥有用户“bart”的权限 -ls -l报告什么并不重要,无论您是否是本地系统上的 root 身份也不重要;本地uid=选项不会对您的 SSHFS 帐户在服务器端执行的操作产生任何影响。

但与 SSHFS(使用一个连接和一组凭据)不同,NFS 最初被设计为“系统范围”功能,其中同一个挂载可以由不同的用户使用,每个用户都有自己的权限 - 并且它被设计为与 NIS/YP 一起在同质环境中工作,NIS/YP 是一个确保相同帐户在每台机器上具有相同 UID 的系统。大多数 NFS 客户端功能(或缺乏功能)仍然反映了这种设计。

因此考虑到这一点,UID 在 NFS 中有两种完全不同且独立的用途:服务器报告的所有权数据和客户端报告的身份验证凭据。

  • 所有权信息服务器报告(例如 中的数据ls -l)作为 NFS 本身的一部分进行处理。

    (这就是类似选项uid=相关的地方,但是 Linux NFS 客户端没有它们,尽管其他一些文件系统有。)

    在 NFSv4 中,所有权信息可以使用“idmap”进行转换:服务器将 UID 转换为用户名@域,客户端将该用户名转换回其本地 UID。确保双方使用相同的 idmap 域(如 报告的nfsidmap -d)——如果不同,请通过 /etc/idmap.conf 手动设置。然而,这实际上并不能让你该文件中的任何内容 – 大部分都是视觉内容。

    在 NFSv3 中,只能报告数字 UID,并且没有映射它的工具 - 客户端始终看到存储在服务器上的 UID。

  • 然而,实际有效的特权依​​赖于信息客户报告因为它们是在服务器端强制执行的,而不仅仅是客户端。这是在 SunRPC 级别处理的,因此与 NFS 版本没有关系。

    由于 NFS 客户端设计为多用户,其默认身份验证机制只是向服务器报告访问用户的 UID。因此,如果您使用sec=sys(默认) 导出和挂载 NFS 共享,则客户端始终向服务器报告您的真实 UID,并且服务器无需任何验证即可信任它。

    不幸的是,虽然理论上 UID可以在将它们报告给服务器之前先在这里映射,Linux NFS 客户端中根本没有这样的功能,它总是报告您的真实 UID。

    要解决此问题,您需要在所有系统上同步您的帐户的 UID,或通过 使用 Kerberos 身份验证sec=krb5。这需要设置 Kerberos KDC 服务器。

简而言之,

  1. 确保您使用的是 NFSv4。运行mountfindmnt -u查看所选的版本。

  2. 运行nfsidmap -d并验证两个系统是否使用相同的 idmap 域。默认情况下,这是从系统的 FQDN(hostname -f)猜测的,但也可以在中设置/etc/idmapd.conf。此值不需要是真正的 DNS 域,只需是任意字符串即可。这应该可以修复显示的所有者ls

  3. 强烈建议您设置 Kerberos,在您的服务器上运行 KDC(可以是同一台服务器,也可以是不同的服务器),并将 NFS 切换到sec=krb5。 (特别是如果您在 Internet 上使用 NFS!)

    您不需要任何复杂的附加组件,如 LDAP 或 Active Directory 或 IPA – 只需要相当小的“krb5kdc”守护进程。

    (相同的 Kerberos 还可以通过“GSSAPIAuthentication”用于 SSH 身份验证,而不仅仅是用于 NFS。)

  4. 如果这不可行,那么您需要在一个系统上更改您的帐户的 UID 以匹配另一个系统。通常只需以 root 身份登录并执行操作usermod -u(这也会更改整个主目录)。

答案2

解决这个问题的最佳方法是使用前面提到的 kerberos。

作为 kerberos 的替代方案,关于如何在使用 NFS4 时实现相同的目标,考虑到您想对家中的几台机器执行此操作。

请记住,您正在共享目录/mnt/public

  1. 导出如下:
/mnt/public 192.168.1.0/24(rw)

问题提到了一种映射用户的方法,我的理解是目标是找到一种方法来通过简单的 NFS 共享交叉连接用户访问。所以我映射的是组而不是独立用户。通过使用 SUID 而不是 SGID,可以为用户使用相同的逻辑

  1. 我们需要在所有设备中有一个特定的 GID
groupadd homeshare -g 27000

客户端也需要相同的 GID,这意味着在所有客户端中手动创建一个 ID 为 27000 的组。

  1. 创建具有 GSID 权限的公共目录:
mkdir -p /mnt/public
chmod g+s /mnt/public
chown :homeshare /mnt/public

公共共享必须使用组 suid 并由您刚刚创建的组拥有

另外,在客户端中为组定义一个密码。使用newgrp密码登录。这样,您不需要将所有用户添加到组中,只有您共享组密码的用户才有访问权限。

例子:

gpasswd homeshare # define the password to the group
newgrp homeshare #login in the group using the password

答案3

您在本地机器上是哪个用户?如果您也是 root,您应该能够编辑这些文件。如果您是 root 但无法编辑,请查看您的服务器/etc/exports文件,因为您的 root 用户可能被压制了。

root_squash 将请求从 uid/gid 0 映射到匿名 uid/gid。请注意,这不适用于可能同样敏感的任何其他 uid 或 gid,例如用户 bin 或组 staff。

   no_root_squash
          Turn off root squashing. This option is mainly useful for
          diskless clients.

   all_squash
          Map all uids and gids to the anonymous user. Useful for
          NFS-exported public FTP directories, news spool
          directories, etc. The opposite option is no_all_squash,
          which is the default setting.

   anonuid and anongid
          These options explicitly set the uid and gid of the
          anonymous account.  This option is primarily useful for
          PC/NFS clients, where you might want all requests appear
          to be from one user. As an example, consider the export
          entry for /home/joe in the example section below, which
          maps all requests to uid 150 (which is supposedly that of
          user joe).

除此之外,远程和本地机器上的用户 ID 应该相同。但是,目前还没有适合家庭使用的易于维护的解决方案。

如果你不是root 应该没有办法实现您的目标,因为任何人都不应该被允许在远程机器上编辑 root 的文件!

相关内容