如何配置 NFSv4 挂载,以便 NFS 客户端上由 root 用户创建的文件的所有者在客户端上显示为“root:root”,而不是“nobody:nogroup”?

如何配置 NFSv4 挂载,以便 NFS 客户端上由 root 用户创建的文件的所有者在客户端上显示为“root:root”,而不是“nobody:nogroup”?

我有一台安装了 Nextcloud snap 的 Ubuntu 16.04 服务器 ( nextcloud.lan),以及一台配置为通过 NFSv4 提供文件的 Ubuntu 16.04 NAS ( nas.lan)。我想/var/snap/nextcloud通过从 NAS 导出的 NFS 目录在 nextcloud.lan 上挂载目录,以便 Nextcloud 使用的所有文件都存储在 NAS 上。

NAS 上的 NFS 身份验证配置为默认 AUTH_SYS/AUTH_UNIX。请参阅 nas.lan 的以下配置文件:

/etc/idmap.conf

[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
Domain = localdomain

/etc/exports

/vol0/export 192.168.2.0/24(rw,fsid=0,insecure,no_subtree_check,async) /vol0/export/nextcloud 192.168.2.0/24(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

对于nextcloud.lan

/etc/fstab

nas:/nextcloud /mnt nfs auto 0 0

/etc/idmap.conf

[General]

Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
Domain = localdomain

目前,当 uid 同时存在于 nas.lan 和 nextcloud.lan 上的用户在 nextcloud.lan 上的挂载目录中创建文件(例如用户名 jacob、uid 1000)时,该文件会在两个系统上以适当的所有者创建(例如 jacob:jacob)。

但是,当 root 用户在 nextcloud.lan 上的导出目录中创建文件时,这两个系统中的文件似乎都归“nobody:nogroup”所有。Nextcloud snap 只能以 root 用户身份运行,所以我的问题是,如何让 root 用户在 NFS 客户端 nextcloud.lan 上创建的文件显示为“root:root”,而不是“nobody:nogroup”

我读到过 NFS 对 root 用户权限进行了一些特殊处理,并且出于安全原因不会在系统之间映射 root 用户 ID。我想知道是否有办法覆盖这一点?

我看到有一个名为的选项no_root_squash,但这对我来说不起作用。

我也尝试在 nextcloud.local 上设置以下内容/etc/idmapd.conf,但这对我来说也不起作用:

[Mapping]
Nobody-User=root
Nobody-Group=root

到目前为止,我已经尝试了所有能想到的方法来将 nobody:nogroup 映射到 nextcloud.lan 系统上的 root:root,但都没有成功。

如果有人能分享关于如何做到这一点的见解,我将不胜感激。谢谢你的帮助。

答案1

导出文件中有两个重叠的条目:

/vol0/export           192.168.2.0/24(rw,fsid=0,insecure,no_subtree_check,async)
/vol0/export/nextcloud 192.168.2.0/24(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

子网 192.168.2.0/24 内的任何客户端都可能(并且很可能确实)使用第一个条目,最终将 root 映射到用户 nobody。尝试缩小 IP 范围:

/vol0/export  192.168.2.0/24(rw,fsid=0,insecure,no_subtree_check,async) 192.168.2.1(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

其中 192.168.2.1 应该是 nextcloud.lan 的 IP 地址。

答案2

我可以通过对 /etc/exports 进行以下修改来实现这一点:

/vol0/export           192.168.2.0/24(rw,fsid=0,insecure,no_subtree_check,async,no_root_squash)
/vol0/export/nextcloud 192.168.2.0/24(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

然后我能够通过 NFS 将 /var/snap/nextcloud 挂载到 nas 上的导出目录,一切似乎运行良好。

但是,我同意@AndrewHenle 的观点——这种方法似乎很危险,也不安全,最好找到一种方法,将 nextcloud.lan 系统上的 root 用户映射到 nas.lan 系统上的非 root 用户。不幸的是,nextcloud snap 此时需要以 root 身份运行。我可能会将其作为一个单独的问题提出来。

相关内容