我正在设置一个 Web 服务器,它将以 Apache VirtualHosts 的形式托管多个不同的网站,每个网站都可以运行脚本(主要是 PHP,也可能是其他脚本)。
我的问题是如何将这些 VirtualHost 彼此隔离并与系统的其余部分隔离?我不希望网站 X 读取网站 Y 的配置或任何服务器的“私有”文件。
目前,我已经按照这里所述使用 FastCGI、PHP 和 SUExec 设置了 VirtualHosts(http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec-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
答案1
这可以通过在 Apache 中启用 mod_users 模块来实现。
您需要在 Apache 配置中设置 UserDir。我建议您在单独的配置文件中执行此操作并将其包含在内。将包含内容包装在
<IfModule mod_users.c>
Include conf/extra/userdir.conf
</IfModule>
我可以为您提供整个教程,但这应该可以帮助您开始配置 Apache: http://www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/
提示:如果您正在运行 SELinux(您应该这样做),则必须授予 Apache 对用户主目录的读取权限。您可以通过设置来执行此操作:
sudo setsebool -P httpd_enable_homedirs=On
它还需要对用户目录 public_html 目录的文件权限以及对直至 root 的父目录的 rx 权限。
显然,您需要为用户设置 chroot,例如在 vsftpd 中。安装:
apt-get vsftpd
要配置 chrooting,请使用 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
这将 chroot 任何用户在 web_users 组中。您还需要通过将其设置为 /sbin/nologin 来拒绝对 shell 的访问:
useradd -G "web_users" -s /sbin/nologin new_user
如果这是一台公共生产服务器,我还强烈建议您对操作系统、OpenSSH、Apache、PHP、vsftpd 进行一些强化,并应用一些严格的 iptables 和 TCP 包装器。我建议您也保留 SELinux。
答案2
我建议看看suphp
或PHP-FPM。
它基本上使 PHP 解释器能够“su”到为该 VirtualHost 配置的某个特定用户。这将允许您利用一般文件系统权限来隔离每个 VirtualHost。
出于性能方面的考虑,我建议使用 FPM。从主页上看,这是您最感兴趣的内容:
同样令人感兴趣的是每个池的用户和组选项,它们允许您在给定的 uid 和 gid 下运行特定的 fpm 池;再见 suphp!