我已将所有网站设置在不同的/var/www
子目录中。假设我有 5 个基于 WordPress 等 CMS 的网站,分别位于/var/www/a.com
、、和。/var/www/b.com
/var/www/c.com
/var/www/d.com
/var/www/e.com
但我发现,如果我向 中的某人授予管理员权限a.com
,使用某些插件,他们就可以访问/var/www
,并访问不同的目录,比如说/var/www/c.com
,因此他们可以通过读取例如wp-config.php
WordPress 的配置文件()来获得访问权限,因为最终目录列表插件是通过 Web 服务器来完成的,而 Web 服务器可能具有组访问权限。
我发现的唯一解决方案是仅在此文件中限制对访客和组的完全访问权限,因此从技术上讲,它只能通过具有 root 访问权限的 SSH 进行访问,但这可能会导致错误,因为除非 Web 服务器用户是所有者,否则 Web 服务器将无法访问。
这让我得出这样的结论:如果你在同一台主机上托管多个网站,并且它们运行相同的 Web 服务器守护程序,那么存在固有风险。但应该有一个解决方案,因为全世界有数百家 Web 托管公司都在这样做。
针对这种情况,有人可以给我推荐一个解决方案吗?
答案1
最简单的方法是使用PHP和你想阻止任何 php 脚本浏览其他目录而不是您当前网站的那个,您可以使用open_basedir
更多信息 :https://www.php.net/manual/en/ini.core.php#ini.open-basedir
编辑: 为了像 Gerald Schneider 所说的那样更加安全,请在您的 web 服务器配置或 php 池中添加 open_basedir。
在您的网站文件夹中添加一个 .user.ini 文件,然后更改所有者权限以免您的网络服务器或 php 编辑/删除此文件。
例子 :/var/www/a.com/.user.ini
添加如下内容:
open_basedir = "/var/www/a.com:/tmp"
所以这意味着,对于 PHP 来说,它将无法解析这些路径之外的内容(上传所需的 /var/www/a.com 和 /tmp)。
检查你的 php.ini 以启用此配置文件,执行phpinfo()
并检查user_ini.filename
更多信息 :https://www.php.net/configuration.file.per-user
此提示仅保护您免受使用 PHP 函数的 PHP 脚本的侵害并且您不需要更改任何目录权限,但如果有人想用 PHP 执行批处理脚本,它可以解析其他文件夹,如果您使用 sftp、ftp 或其他方式浏览文件,则此规则将不起作用。
答案2
解决方案是使用 PHP FPM 池,这样每个目录将由不同的用户运行。
我之前忘了写过这个,但这就是我解决问题的方法,现在文件权限是有意义的,因为我可以对所有者、组和来宾权限进行巨大的控制,正如 UNIX 经典文件系统权限控制中所预期的那样。