我正在build立一个Web服务器,它将把许多不同的网站作为Apache VirtualHosts来托pipe,其中每一个都有可能运行脚本(主要是PHP,其他的)。
我的问题是,我如何将这些虚拟主机中的每一个与其他系统隔离开来? 我不希望网站X读取网站Y或任何服务器的“私人”文件的configuration。
目前我已经使用FastCGI,PHP和SUExec设置了VirtualHosts,如下所述(http://10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec -easy-way.html ),但是SUExec只能防止用户编辑/执行非自己的文件 – 用户仍然可以读取configuration文件等敏感信息。
我曾经想过要删除服务器上所有文件的UNIX全局读取权限,因为这样可以解决上述问题,但我不确定是否可以安全地执行此操作而不中断服务器function。
我也研究过使用chroot,但是这似乎只能在每个服务器的基础上完成,而不是在每个虚拟主机的基础上完成。
我正在寻找任何build议,将我的VirtualHosts从系统的其余部分。
PS我正在运行的Ubuntu 12.04服务器
我的答案:我几乎按照我目前的configuration结束了,但是为所有的虚拟主机做了一个chroot jail,例如在/var/www有chroot jail,然后把所有的用户数据放在每个group / others r /禁用了w / x权限。 特别是这个选项是可取的,因为这是所有可能的,没有任何修改源代码。
我select了@Chris的答案,因为它被彻底写入,也被认为是FTP和SELinux
这可以通过在Apache中启用mod_users模块来完成。
您需要在您的apacheconfiguration中设置UserDir。 我build议你在一个单独的configuration文件中做这个并包含它。 包括在内
<IfModule mod_users.c> Include conf/extra/userdir.conf </IfModule>
我可以给你整个教程,但这应该让你开始configurationApache: http : //www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/
如果你正在运行SELinux(你应该),你必须让Apache读访问用户家庭。 你可以通过设置:
sudo setsebool -P httpd_enable_homedirs=On
它还需要用户dirs public_html目录的文件许可权以及直到根目录的父目录的rx权限。
显然你需要为用户设置chroot,例如在vsftpd中。 安装:
apt-get vsftpd
要configurationchroot,请使用vi或nano打开/etc/vsftpd/vsftpd.conf。 查找并取消注释或添加:chroot_local_user = yes
你可以得到相同的行为,我推荐通过FTP,打开/ etc / ssh / sshd_config sftp并添加一个匹配块和这一行:
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
如果这是一个公共生产服务器,我强烈build议你在OS,OpenSSH,Apache,PHP,vsftpd上应用一些强化,并应用一些严格的iptables和TCP包装。 我build议你离开SELinux。
我build议看看suphp或PHP-FPM 。
它将基本上使PHP解释器“su”到为该VirtualHostconfiguration的某个特定用户。 这将允许您使用通用文件系统权限来隔离每个VirtualHost。
我会推荐FPM出于性能方面的考虑。 从主页上看,这是你最感兴趣的东西:
另外感兴趣的是每个池用户和组选项,它们允许你在给定的uid和gid下运行特定的fpm池; 再见suphp!
看看chroot 。
一些起点:
Apache的chroot变得简单
Apache的Chroot环境(Debian)
Apache Chroot监狱:虚拟主机