在我的 NFS 服务器上,我定义了以下导出:
#NFS exports Database
/shared -alldirs -network=192.168.1 -mask=255.255.255.0
在我的 NFS 客户端上:
192.168.1.7:/shared /shared nfs rw 0 0
显然,作为服务器上的 root,我可以做任何我想做的事情。然而,在客户端上,我的常规用户“gabe”可以更改 nfs 挂载(假设我有权限),但 root 不能。
作为我的普通用户:
gabe@client$ cd /shared
gabe@client$ ls -l
total 8
drwxrwxrwx 4 gabe wheel 512 Mar 20 19:20 tmp
gabe@client$ cd tmp
gabe@client$ touch test.txt
gabe@client$ rm test.txt
作为根用户:
# cd /shared/tmp
# touch test.txt
touch: test.txt: Permission denied
再说一次,这一切都在 NFS 上客户事情的一面,我怀疑它可能与 -maproot 选项有关。这是我第一次设置 NFS,我刚刚注意到这个特性。我现在要做一些阅读,看看我是否能解决这个问题,但如果有人有任何见解,我将不胜感激。
答案1
NFS 的设计思想是用户和组 ID 在网络上的所有计算机上都是相同的。对于普通用户来说,这样就可以了。但 root 的 UID 始终为 0,并且仅仅因为您在一台机器上拥有 root 权限,并不意味着您应该对网络上的每台计算机都具有 root 访问权限。
因此,NFS对root有特殊的对待。默认情况下,root 映射到nobody
用户,该用户通常没有写访问权限。该-maproot
选项允许您更改 root 的处理方式。 BSD 的选项-maproot=root
对应于 Linux 的no_root_squash
选项。
答案2
这是传统 NFS 实现的常见行为。 NFS 用户映射的执行与上下文无关,因此客户端 root 的所有访问都必须映射到特定用户(通常nobody
默认情况下)。因此,出现了这种奇怪的行为,客户端根无法直接访问您的文件,但可以su gabe
访问它们。
(NFS 的“最新”版本,即 NFSv4,也许还有 NFSv3,如果双方都支持,则允许更明智的行为,但我不知道详细信息。)