因此,我正在设置一个包含 Apache、PHP 和 MySQL 的共享主机,而最大的疑问是如何使用 PHP,因为有无数种方法可以安全地配置它。
计划如下:
- MySQL 的 Chroot(内置对 chroot 的支持)
- Apache 的 Chroot(mod_security)
- 每个用户都以自己的用户身份执行 PHP 脚本(见下文)
- 设置 open_basedir
- 禁用所有“邪恶”的 php 函数(allow_url_fopen、system、exec 等等)
我已经看过执行和苏php但它们看起来很慢;
http://blog.stuartherbert.com/php/2007/12/18/using-suexec-to-secure-a-shared-server/ http://blog.stuartherbert.com/php/2008/01/18/using-suphp-to-secure-a-shared-server/
因此我进行了更多研究并找到了其他一些解决方案:
- apache2-mpm-itk + mod_php (?)
- mod_fcgid + php-fpm
- mod_fastcgi + php-fpm
我尝试使用 mod_fastcgi + php-fpm 进行简单设置,它似乎可以工作,以正确的用户身份运行等等,但对目录旅行的保护仍然是 open_basedir(?)
一个解决方案可能是使用 php-fpm 的 chroot 选项,但这会导致很多其他问题,例如
- 域名解析器不工作
- 发送邮件不起作用
尖端?
答案1
fpm 项目做得很好,可以非常轻松地部署共享托管解决方案,甚至可以切换用户(但是,apache 存在一些问题,可以通过符号链接解决;互联网上有很多关于它的教程)。
涉及 php5-fpm 的解决方案需要 mod_fastcgi,并允许托管商进行每个用户的配置(memory_limit、max_execution_time... 仅作为示例),据我所知,它非常稳定 ;)
关于解析和使用电子邮件的问题,只需将库添加到切换环境和所需的可执行文件(例如 sendmail)即可轻松解决。
我发现并正在解决的问题是关于 php-fpm 传递给 php 脚本的错误变量(chrooting 之后,php-fpm 应该删除外部目录,只将 chroot 内的目录传递给脚本...但它没有这样做,必须有其他东西来处理这个问题,比如 mod_fastcgi 和 php-fpm 之间的代理)。
我已设法使用 php-fpm 和 apache 之间的 fcgi 代理来自动更正变量,因为在我撰写本文时 php-fpm 无法修复它们。
答案2
自从提出并回答了这个问题以来,CloudLinux 确实成为了共享主机领域的主流 Linux 发行版。它基于 RHEL/CentOS 作为其上游,但进行了一些修改。以下是一些详细信息:
- 它提供了一种称为 CageFS 的东西来处理 chrooting。
- 对于运行 PHP,它提供了一种称为 mod_lsapi 的方法,这是一种以良好的性能运行 PHP 的方法,与您习惯使用 mod_php 的方式非常相似(即能够在 .htaccess 文件中使用 php_flag 和 php_value,并且它以良好的方式进行操作码缓存)。它能够在用户之间实现良好的权限隔离。
- 它还提供了内核级修改以防止符号链接攻击。