我对 NFS 还很陌生。我想确保自己清楚。
假设 NFS 服务器共享一个目录 rw,, 并且该目录中的所有文件的权限都是 700,并且这些文件的用户/组是 root/root,,,
在客户端上,您必须以 root 身份登录才能看到它。这样正确吗?
我知道客户端上的非 root 用户可以直接的连接来覆盖它。(因为不使用挂载,而只是使用 NFS 客户端 hack。)
看起来,任何有权访问客户端计算机的人都应该有权访问这些文件,而客户端计算机应该忽略权限。只有服务器才应该处理权限。
我的理解正确吗?这种布局正常吗?有没有办法忽略客户端的权限?
答案1
我想说,总体而言,您对 NFS 的理解是正确的。以下是有关您提到的要点的一些详细信息:
NFSv3 服务器仅提供文件所有权和访问权限。客户端负责为特定用户强制执行这些权限(即,当具有特定 UID 的进程请求并执行 fs 操作时)。
即使你设置具有加密、Kerberos 授权和 LDAP 的 NFSv4(并且 Krb 和 LDAP 服务器在不同的主机上运行)那么客户端的 root 仍然可能拥有至少与所有允许的用户和组一样多的 fs 权限。但您可以再次获得非 root 用户活动甚至私有网络上的其他主机的保护。
通常情况下,客户端会非常成功地强制执行用户权限。我不知道有任何简单的方法可以让 NFS 挂载的文件权限被忽略。如果这就是你想要的,那么只需将u=rwx,g=rwx,o=rwx
所有文件夹和u=rw,g=rw,o=rw
所有文件的权限设置为。
无关:
但要小心不要翻转 setuid 位 - 这实际上可能会最终将 root shell 授予客户端上的普通用户(例如 www-data)。可以使用 NFS 和非 NFS 挂载的“-o nosuid”选项完全禁用 Setuid。
有一种方法可以为 Solaris 服务器禁用/启用 rootsquash(在 Solaris 术语中,它被称为 rootsquash 以外的其他名称 - 我忘了它是什么)。
您可以让 Solaris 服务器将整个共享标记为只读,例如:
zfs set sharenfs="[email protected]/16" tank/home/tabriz
那么无论客户端做什么,fs 都将不可写。
即使程序可以使用 NFS 协议,客户端上的非 root 用户也可能无法打开与 NFS 服务器的直接连接。这是因为NFS 客户端通常被迫通过特权端口进行连接在健康的客户端上只有 root 可以执行此操作。
答案2
NFS 安全性在客户端上强制执行。
NFS 诞生于任何连接到 NFS 共享的人都在受信任网络内的时代。真的应该不是如果有任何不受信任的实体可能能够向 NFS 服务发送数据包,则使用 NFS。
除此之外,NFS 通常会默认使用 rootsquash,这意味着客户端上的 root(uid 0)被解释为服务器上的 nobody(uid 65535)。
磁盘上的文件实际上并不与用户(这是一般规则,不特定于 NFS)。它们与用户ID。如果用户 alice 在 NFS 服务器上的 uid 为 100,而用户 bob 在 NFS 客户端上的 uid 为 100,那么 bob 将能够访问 alice 的文件。事实上,在客户端上,所有文件都将显示为 bob 所拥有。也就是说,NFS 服务器仅向客户端提供原始元数据。客户端可以自行解释它认为合适的内容。
NFS 的设计初衷并不安全。切勿在存在不受信任方的网络上使用 NFS。
答案3
共享目录 rw 表示服务器应该允许任何具有适当凭证的人对该目录及其内容进行读写访问。
通过将目录及其内容的权限更改为 700 并将所有权更改为 root/root,您可以有效地拒绝所有人的访问。这是因为默认情况下,Solaris NFS 将客户端计算机中的 root 用户映射到任何人。
您可以找到 Solars share_nfs 的手册页这里