我仅具有已挂载的 NFS 共享的读取权限。
如果在 NAS 上设置了“无压缩映射”,Ubuntu 普通用户Permission denied
在尝试cd
进入共享时将获得访问权限,并且只能通过使用 获得读取访问权限sudo
。
使用压缩“将所有用户映射到管理员”设置,客户端普通用户可以cd
进入共享并且只能对共享具有读取访问权限。使用sudo
不允许写入。
Synology NAS:
DS214> id username
uid=1026(username) gid=100(users) groups=100(users),101(administration)
无挤压(无映射)
DS214> cat /etc/exports
/volume1/Files 10.1.1.2(rw,async,no_wdelay,no_root_squash,insecure_locks,sec=sys,anonuid=1025,anongid=100) `
全部压缩(将所有用户映射到管理员)
DS214> cat /etc/exports
/volume1/Files 10.1.1.2(rw,async,no_wdelay,all_squash,insecure_locks,sec=sys,anonuid=1024,anongid=100)`
Ubuntu 客户端:
$ cat /etc/fstab
10.1.1.214:/volume1/Files /mnt/nfs/Files nfs rw,user,auto 0 0
$ id username
uid=1000 gid=1000(username) groups=1000(username), <etc>
$ ls -n /mnt/nfs
drwxrwxrwx 9 0 0 4096 Sep 25 01:28 Files
$ ls -n /mnt/nfs/Files
drwxr-xr-x 11 1026 100 4096 Sep 24 22:05 Data
(我最初在错误中发布了使用sudo
启用的写访问)我可以使用 打开已安装的 NFS 共享中的文件,sudo vi /mnt/nfs/Files/Data/test.file
但即使使用也无法将更改写入文件sudo
。 vi 命令的错误消息:w!
是:
"test.file" E212: Can't open file for writing`
答案1
NFSv2/3 仅根据 UID 和 GID 处理权限。服务器上的文件权限与客户端上的用户和组 ID 进行匹配。这就是为什么 NFSv<4 在用户对客户端计算机具有 root 访问权限的环境中设计不安全的原因;在这种情况下,UID 欺骗是微不足道的。
请注意,NFSv4 通过 Kerberos5 提供客户端和用户身份验证。如果需要使用用户名和密码进行身份验证,即使在纯 Linux 环境中,使用 Samba (SMB/CIFS) 也比设置 Kerberos 更容易。
为了至少防止 root 权限升级,默认情况下使用选项 导出 NFS 共享root_squash
,这会将所有来自 的客户端请求映射到和root (uid=0, gid=0)
。可以使用 覆盖此行为,授予 root 对导出的访问权限。anonuid
anongid
no_root_squash
这里,我们看到了另一个缺点。要正常运行,NFS 基本上要求您在所有机器上具有相同的 UID/GID。您要访问的文件属于1026
并具有权限 755。您在客户端上的用户具有uid=1000
。GID 也不匹配,因此您只获得世界权限。因此没有写访问权限。
为了解决这个问题,你可以做以下几件事之一:
在 NAS 上,将文件的所有者更改为
1000
。您可能需要创建该特定帐户。我无法判断这会如何影响其他服务。将本地用户的 UID 更改为
1026
。由于您是服务器上唯一可以访问文件的人,因此您可以让服务器假装所有请求都来自正确的 UID。为此,NFS 提供了选项
all_squash
。它告诉服务器将所有请求映射到由 指定的匿名用户anonuid,anongid
。将选项添加
all_squash,anonuid=1026,anongid=100
到中的导出/etc/exports
。
要小心不过,因为这将使任何人有效地挂载导出这些文件的所有者!
如果您与他人及其客户共享网络,而您并不完全信任他们不会对您的文件进行破坏,那么您确实应该研究一种提供身份验证的文件共享方法。在我看来,Samba 是实现此目的的最简单方法。
答案2
执行showmount -e 10.1.1.214
以查看导出选项。Permission denied
错误来自 NFS 服务器本身。尝试将选项从 更改rw,user,auto
为defaults
。