我已成功将远程计算机的 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 服务器。
简而言之,
确保您使用的是 NFSv4。运行
mount
或findmnt -u
查看所选的版本。运行
nfsidmap -d
并验证两个系统是否使用相同的 idmap 域。默认情况下,这是从系统的 FQDN(hostname -f
)猜测的,但也可以在中设置/etc/idmapd.conf
。此值不需要是真正的 DNS 域,只需是任意字符串即可。这应该可以修复显示的所有者ls
。强烈建议您设置 Kerberos,在您的服务器上运行 KDC(可以是同一台服务器,也可以是不同的服务器),并将 NFS 切换到
sec=krb5
。 (特别是如果您在 Internet 上使用 NFS!)您不需要任何复杂的附加组件,如 LDAP 或 Active Directory 或 IPA – 只需要相当小的“krb5kdc”守护进程。
(相同的 Kerberos 还可以通过“GSSAPIAuthentication”用于 SSH 身份验证,而不仅仅是用于 NFS。)
如果这不可行,那么您需要在一个系统上更改您的帐户的 UID 以匹配另一个系统。通常只需以 root 身份登录并执行操作
usermod -u
(这也会更改整个主目录)。
答案2
解决这个问题的最佳方法是使用前面提到的 kerberos。
作为 kerberos 的替代方案,关于如何在使用 NFS4 时实现相同的目标,考虑到您想对家中的几台机器执行此操作。
请记住,您正在共享目录/mnt/public
- 导出如下:
/mnt/public 192.168.1.0/24(rw)
问题提到了一种映射用户的方法,我的理解是目标是找到一种方法来通过简单的 NFS 共享交叉连接用户访问。所以我映射的是组而不是独立用户。通过使用 SUID 而不是 SGID,可以为用户使用相同的逻辑
- 我们需要在所有设备中有一个特定的 GID
groupadd homeshare -g 27000
客户端也需要相同的 GID,这意味着在所有客户端中手动创建一个 ID 为 27000 的组。
- 创建具有 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 的文件!