【问题标题】:How do I chroot php-fpm (7.3) for use with Apache 2.4.10?我如何 chroot php-fpm (7.3) 以与 Apache 2.4.10 一起使用?
【发布时间】:2020-02-08 16:14:06
【问题描述】:

出于安全原因,我想将我的 php-fpm 服务 chroot 到 /var/www/html。我在 Apache 2.4.10 中有一个虚拟主机,看起来像这样:

<VirtualHost *:8080>
        DocumentRoot /var/www/html
        DirectoryIndex index.php index.html /index.php /index.html

        <FilesMatch \.php$>
                SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://localhost/"
        </FilesMatch>

</VirtualHost>

我的问题是当我在 php-fpm 的 pool .conf 中设置 chroot = /var/www/html 时,从 Apache 发送的文件路径不正确(由于 DocumentRoot 它会将 SCRIPT_FILENAME 设置为 /var/www/html/index.php,当 php-fpm现在会期待/index.php)。我可以通过 AliasMatch \.php$ / 将我的 php 文件从 DocumentRoot 文件夹中取出来解决这个问题,但这会阻止 DirectoryIndex 工作,因为现在 Apache 将 /index.php 查找为索引文件,这不会不存在。我假设这可能也是非常糟糕的形式......

有没有办法解决这个问题?我知道 nginx 可以通过重写 SCRIPT_FILENAME 来解决这个问题,但这不是我的选择。我也知道我可以设置doc_root php.ini 选项,但我听说这可能是个问题,因为它会影响与php 中的脚本路径相关的$_SERVER 变量。

在相关说明中,不在 chroot 中运行 php-fpm 有多不安全? (我已将 open_basedir 设置为 /var/www/html)

【问题讨论】:

  • This answer 建议使用ProxyPassMatch 而不是FileMatch 处理类似情况。请尝试一下。
  • 感谢您的提示。实际上,我最初一直在使用ProxyPassMatch 运行,但无法让它工作,但看起来我当时可能遇到了一个单独的设置问题,因为它现在似乎对我有用。

标签: php apache fpm


【解决方案1】:

我曾经在 chroot 中运行 PHP,但是,由于没有巨大的安全优势,这确实很痛苦。我遇到的最大问题是试图将所有相关的共享对象放入 chroot 并在每次系统更新后让它们保持最新。我最终放弃并最终为每个虚拟主机运行了一个具有不同用户:组的反向代理,而不是尝试 chroot。如果您有 2 个池作为 www:site1 和 www:site2 运行,您可以 chown root:site1 /var/www/site1 然后 chmod 750 /var/www/site1。这将防止被黑的虚拟主机(站点 2)渗入其他虚拟主机(站点 1)。服务器上的大多数其他文件应该是安全的,但您仍然希望有出站 iptable 规则,并且如果您使用文件存储引擎,则应确保您的会话存储使用模式 600。您可能还想探索 disable_functions ini 设置以提高安全性。

【讨论】:

  • 这就像我最终使用的一样,只是对权限非常小心。我发现我还必须将太多系统内容符号链接到 chroot 中才能使其正常工作。如果可以的话,我也会接受 Koala Yeung 在上面留下的评论,因为他们帮助我真正获得了我认为我想要的设置。
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
相关资源
最近更新 更多