我有一个 Redhat 6.0 系统(启用了 SELinux),其中 NFS 卷安装在 /myvolume。
该命令ls -la /myvolume
表明它的所有者是“nobody”,组是“nobody”。
在这个系统上我以“apache”用户和“apache”组的身份运行 Apache。
Apache 通过 mod_wsgi 运行一个 python 脚本。此脚本创建一个临时目录(使用 tempfile.mkdtemp),在其中创建一些文件,然后将整个目录移动到 /myvolume 内。
脚本完成其操作后,它创建的文件的所有者为“nodody”,组为“nobody”,并且所有文件的权限掩码均为“rwx------”。
我已经验证,除非我使用“sudo”,否则我自己的用户无法访问这些文件,而 apache 用户可以访问它们。
为什么会发生这种情况?是否与 SELinux、Unix 权限、NFS 卷或 nodoby 用户有关?为什么尝试“chown”/myvolume 中的任何文件会出现“无效参数”错误?
答案1
它与 nfs 相关。
http://tldp.org/HOWTO/NFS-HOWTO/server.html声明如下:
“no_root_squash:默认情况下,客户端计算机上的 root 用户发出的任何文件请求都被视为服务器上的 nobody 用户发出的请求。(具体将请求映射到哪个 UID 取决于服务器上用户“nobody”的 UID,而不是客户端。)如果选择了 no_root_squash,则客户端计算机上的 root 将具有与服务器上的 root 相同的系统文件访问权限。这可能会带来严重的安全隐患,但如果您想在客户端计算机上执行涉及导出目录的任何管理工作,这可能是必要的。您不应该在没有充分理由的情况下指定此选项。”
不建议在 nfs 服务器上激活 no_root_squash。我引用此选项仅用于文档目的。
一种解决方案是在 nfs 客户端和 nfs 服务器上创建一个具有相同 uid 和 gid 的用户和一个组。然后配置 apache 以使用该用户执行您的脚本。