我建立了一个可以自动管理专用服务器的网站。它可以执行各种操作,例如创建用户和 apache 设置以指向其主目录。
主目录托管游戏二进制文件,主文件夹可以从 Web 访问,但只能访问非必要资源文件(.wav .mdl .spr 等),这就是 apache 的配置方式。因此,要使其正常工作,我需要对所有文件具有执行和读取权限。
问题是,在一个用户的主文件夹中运行的二进制文件可以访问其他用户的主文件夹,并读取和写入其中的文件。
如何让用户的主目录仅供自己和 apache 以外的任何人访问?文件夹树如下所示:
https://i.stack.imgur.com/mXflN.png(无代表直接显示图像)
答案1
在每个用户的主目录上设置一个 ACL,Apache 需要访问该目录。这可以让你避免对群组使用愚蠢的技巧,这些技巧实际上会导致比解决的问题更多的问题。
例如:
setfacl -R -m u:httpd:rx,d:u:httpd:rx /home/username
将允许httpd
用户读取该目录中的所有内容,包括子目录和任何新创建的文件。
答案2
我建议让每个用户的主目录由用户和用户组拥有,并且只有用户和组可以进入该目录(770),然后让 Apache 成为每个用户组的成员。
此外,请务必实施某种形式的符号链接攻击保护(请参阅https://documentation.cpanel.net/display/EA/Symlink+Race+Condition+Protection对于某些选项 - 此链接不仅适用于 cPanel)。
如果您不介意速度影响,可以使用 MPM ITK,这样既简单又不需要符号链接攻击保护(另请参阅其主页上的“怪癖和警告”)。在这种情况下,Apache 以每个单独的网站用户身份运行。
您还可以查看多站点托管——是否遗漏了重要的漏洞来确保站点之间的安全?讨论多站点托管安全性和其他一些方法。
免责声明:我不能保证上述任何建议都是 100% 安全的,因此请您自行承担风险 =)。
答案3
尝试了很多解决方案(包括这里列出的解决方案)后,我发现最好的方法是:
添加
www-data
到用户组,以便用户能够最终控制 apache 是否能够托管他们的文件告诉 apache 这些文件夹在哪里
<Directory /var/www/user/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
- 这让我想到了最后一点,从 PHP-FPM 7.4 开始,
/home
文件夹默认受到保护,没有必要为了在其中放置一个文件夹而试图绕过它/home
,这就是我/var/www/user
在步骤 2 中指定的原因。因此,只需将chown
整个文件夹提供给用户
所有其他方法都存在各种问题,从令人恼火到完全无法使用,特别是用户无法读取/写入 Apache 创建的某些文件,或者权限太松懈,导致安全问题,或者简单地说管理太复杂。