PHP-FPM的chroot和chdir目录


10

我在启用chrooting的情况下设置php-fpm。现在,我看到有两种选择,我想知道确切的区别是什么。

该设置具有:

chroot = /var/www/domains/domain.tld/
; Chdir to this directory at the start. This value must be an absolute path.
; Default Value: current directory or / when chroot
chdir = /docroot/

为什么这里有两个不同的位置,以及允许php访问哪个路径。php网站可以访问/var/www/domains/domain.tld/,还是只能访问docroot目录中的文件。

===

也许有一些具体的建议给我。我想要一个这样的设置:

webroot位置: /var/www/

domain.com/
 |---conf/
 |    |--nginx.conf
 |    |--php-fpm.conf
 |
 |---ssl/
 |---logs/
 |---session/
 |---domains/
       |---www/
       |---app/
       |---dev/

现在,这里的php-fpm设置将是:

chroot = /var/www/domain.com/
chdir  = /domains/www

现在,这里的主要问题是,位于www子域中的应用程序是否能够访问dev或中的文件app。甚至是位于会话中的文件(会话保存路径),或其他文件夹(如ssl和日志)。

Answers:


12
  • Chroot设置“根”目录-您无法在根目录上方导航。
  • Chdir只是更改了起始目录-仍然可以导航到其他目录(包括该目录上方的目录)。
    • 如果您未指定chroot路径,则使用“真实”根目录-并且您指定绝对chdir。
    • 如果您确实指定了chroot路径,那么您将指定相对于chroot的路径的路径(它将重新定义根目录)。

您建议的设置似乎还不错。

  • 起始路径为chroot路径+ chdir路径
  • 该应用程序将能够访问chroot路径下的所有文件(除非存在其他限制,例如php_openbasedir,权限等)。

附带说明-您的php应用程序还将根据您显示的文档结构访问您的nginx.conf和php-fpm.conf-这似乎是您可能想要更改的内容(至少使文件读为-仅针对该用户)。


我将确保这些文件是安全的。顺便说一句,这种chrooting方法和只设置php_openbasedir有什么区别?
赛义夫·拜肯

1
是的-chroot适用于操作系统级别,很难绕过。open_basedir特定于PHP,并且需要在每个函数中进行检查,因此漏洞利用更为普遍(例如,通过使用shell_exec运行外部脚本)。有关此问题,PHP网站上有一个有趣的安全说明。这并不是说如果使用chroot,open_basedir是没有用的-在任何情况下,如果脚本之外发生了某些事情,定义不同于chroot路径的open_basedir可能会很方便。Chroot也可能会提供更好的性能。
cyberx86
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.