我从一个服务器托pipe多个网站,每个网站都有自己的用户和www目录在他们的主目录。 目前我们的Web服务器以nobody用户运行(99)。 我们注意到要运行几个stream行的脚本和引擎,他们需要写入自己的文件。
由于主目录由用户拥有,而不是任何人(99),主机configuration中的最佳策略或更改是什么:
感谢您的build议!
您应该考虑扩展ACL。 在FreeBSD和linux上支持,setfacl命令允许你定义多个有权访问每个文件/目录的用户/组。 然后,您可以给nobody用户/组授予/ home / home / user的“执行”权限。 然后只读取和写在他们需要的网站的文档根。
如果不这样做,你可以把每个用户的主目录组更改为nobody,然后在/ home / username上使用710的权限,然后在文档根目录下inputuser:nobody和chmod 770。
请记住,“nobody”用户将需要在/和文档根目录之间的每个目录(或者查看特定权限或“其他”字段)的“执行”权限,然后读取(也可以写入)文档根目录。 您可以禁止所有其他用户对用户目录或文档根目录进行读取或执行。 除了root以外,没有其他人拥有读权限,并且所有用户只有执行权限的情况并不罕见。 那么他们可以到/ home / username,但是他们不能得到服务器上存在其他用户的列表
chown -R :nobody root_of_all_sites chmod g+rw -R root_of_all_sites
基本上你可以使网站组可写,你可以分配任何组来读取和写入。 你可能需要定期设置(如果用户上传新文件或有不同的机制 – umask等)
这些多个网站的用户是否相互信任? 如果是这样,用户很容易处理这个问题。 所有用户应该做的就是使适当的目录世界可访问/可写
chmod o+wx dir chmod o+w dir/files_webserver_should_edit*
如果用户想要确保能够访问在该目录下创build的文件,用户也可以运行
chmod g+s dir
所以由web服务器创build的文件是由nobody拥有的,但是在用户的组中(尽pipePHP脚本需要确保创build具有组访问权限的文件)。 o+s
将使用户拥有的文件,但如果文件的权限不正确,则可能会拒绝Web服务器访问它创build的文件。 如果某些文件不应该被networking服务器写入,那么你可以更进一步
chmod o+t dir chmod gw dir/files_not_to_be_altered*
如果用户对目录有写访问权限,但是不能访问该目录中的文件,他们可以从该目录中删除该文件,并创build一个新的文件夹,这些文件具有写访问权限。 粘性位(o + t)防止用户从目录中删除他们不拥有的文件。 通过这些脚本的组合,PHP脚本可以创build新文件并更新和删除他们创build的文件(因为他们将被“nobody”所有),但不能编辑“files_not_to_be_altered”并且不能删除它们,因为它们归属于“用户”)。
这使用户可以控制哪些目录实际上可由Web服务器写入,并且不需要root访问权限,因为它不会改变所有权。
如果用户不相互信任 ,那么您需要一点根干预。 每个网站的目录结构将需要调整一次来转换其所有权:
注意:这些说明假设没有人的组也是没有人,但有些系统使用nogroup
chown -R user:nobody /some/website chmod -R g+rX,o-rwx /some/website
(大写X增加了对目录的访问)
这将使目录树可以访问用户和任何人,并删除其他人的访问。 用户可以从那里自行进行,在他们所需的地方授予g+w
访问权限,但是他们将不得不使用u+s
而不是g+s
来确保他们可以访问由Web服务器创build的文件。 o+t
将按预期工作。
顺便说一下,你可能有其他的服务器使用nobody / nogroup …来最大限度地减less备用的攻击方法(一些其他服务中的漏洞利用,因为没有人给攻击者写这些网站的能力),大多数系统都有一个专用的web服务器用户/只有networking服务器运行的组。
也许最简单的方法是使用mpm-itk – 它需要你切换mpms,并且会导致性能下降。 但是,这将允许您为每个VirtualHost使用Apacheconfiguration一个不同的用户,并且不需要其他configuration更改。 我已经尝试过了,使用起来非常简单,而且性能并不可怕 。 YMMV当然…
为了获得最佳性能,您应该将PHP脚本作为单独的用户运行,并对这些文件进行chown,以便Apache用户只能对其进行读取访问。
最简单的就是使用SuPHP: http : //www.suphp.org/
另一个select是在CGI模式下运行PHP,并确保Apache被configuration为exec()每个CGI在它自己的userid下。 说明: