将 Apache 虚拟主机与系统的其余部分隔离

Jes*_*erB 11 security ubuntu php shared-hosting apache-2.2

我正在设置一个 Web 服务器,它将托管许多不同的网站作为 Apache VirtualHosts,每个网站都可以运行脚本(主要是 PHP,可能还有其他)。

我的问题是如何将这些 VirtualHosts 与彼此以及系统的其余部分隔离开来?我不希望网站 X 读取网站 Y 的配置或任何服务器的“私有”文件。

目前,我已经按照此处所述(http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec)设置了带有 FastCGI、PHP 和 SUExec 的 VirtualHosts -easy-way.html ),但 SUExec 仅阻止用户编辑/执行除他们自己之外的文件 - 用户仍然可以读取敏感信息,例如配置文件。

我曾考虑删除服务器上所有文件的 UNIX 全局读取权限,因为这将解决上述问题,但我不确定是否可以安全地执行此操作而不会中断服务器功能。

我也研究过使用 chroot,但似乎这只能在每个服务器的基础上完成,而不能在每个虚拟主机的基础上完成。

我正在寻找任何将我的 VirtualHosts 与系统其余部分隔离的建议。

PS 我正在运行 Ubuntu 12.04 服务器

我的回答:我几乎按照我当前的配置结束,但是为所有虚拟主机做一个 chroot jail,例如在 chroot jail/var/www,然后将所有用户的数据放在子文件夹中,每个子文件夹都具有 group/others r/w/x 权限禁用。此选项是可取的,特别是因为无需对源代码进行任何修改即可实现。

我选择了@Chris 的答案,因为它写得很透彻,而且还考虑了 FTP 和 SELinux

ger*_*ijk 6

我建议看看suphpPHP-FPM

它基本上将使 PHP 解释器能够“su”到为该 VirtualHost 配置的某些特定用户。这将允许您利用通用文件系统权限来隔离每个 VirtualHost。

出于性能考虑,我会推荐 FPM。从主页这是您最感兴趣的内容:

同样有趣的是每个池的用户和组选项,它允许您在给定的 uid 和 gid 下运行特定的 fpm 池;再见 suphp!


小智 5

这可以通过启用 Apache 中的 mod_users 模块来完成。

您需要在 apache 配置中设置 UserDir。我建议您在单独的配置文件中执行此操作并将其包含在内。将包含包含在

<IfModule mod_users.c>
   Include conf/extra/userdir.conf
</IfModule>
Run Code Online (Sandbox Code Playgroud)

我可以为您提供整个教程,但这应该可以帮助您开始配置 Apache: http: //www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/

提示如果您正在运行 SELinux(并且您应该),则必须授予 Apache 对用户主目录的读取权限。您可以通过设置来做到这一点:

sudo setsebool -P httpd_enable_homedirs=On
Run Code Online (Sandbox Code Playgroud)

它还需要用户目录 public_html 目录的文件权限和父目录(直至 root)的 rx 权限。

显然,您需要为用户设置 chroot,例如在 vsftpd 中。安装:

apt-get vsftpd
Run Code Online (Sandbox Code Playgroud)

要配置 chroot,请使用 vi 或 nano 打开 /etc/vsftpd/vsftpd.conf。查找并取消注释或添加:chroot_local_user=yes

您可以通过 FTP 获得我推荐的 sftp 相同的行为,打开 /etc/ssh/sshd_config 并添加 Match 块和这一行:

Subsystem   sftp    internal-sftp

Match Group web_users
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
Match
Run Code Online (Sandbox Code Playgroud)

这将 chroot web_users 组中的任何用户。此外,您还需要通过将其设置为 /sbin/nologin 来拒绝对 shell 的访问:

useradd -G "web_users" -s /sbin/nologin new_user
Run Code Online (Sandbox Code Playgroud)

如果这是一个公共生产服务器,我还强烈建议您对操作系统、OpenSSH、Apache、PHP、vsftpd 进行一些强化,并应用一些严格的 iptables 和 TCP 包装器。我建议您也保留 SELinux。

  • 我不明白“mod_userdir”如何提供单独域的虚拟托管。此外,我确实担心隔离方面的安全性,因为我无法在 Apache 内的用户目录之间找到任何相关信息。它似乎不提供该功能。 (3认同)