为啥 PHP 在启用 SELinux 的情况下不遵循符号链接?

Posted

技术标签:

【中文标题】为啥 PHP 在启用 SELinux 的情况下不遵循符号链接?【英文标题】:Why won't PHP follow symlinks with SELinux enabled?为什么 PHP 在启用 SELinux 的情况下不遵循符号链接? 【发布时间】:2014-04-29 10:34:08 【问题描述】:

我有一个使用 propel 的网站。我想把各种配置文件放在web根目录之外,但是propel需要它们(例如schema.xmlbuild.properties等)在同一个目录中。因此,我决定将 Web 根目录中的符号链接添加到这些目录:

somesite.com/
  |
  |- public/
  |  |- index.php
  |  |- build -> ../private/build
  |  |- vendor -> ../private/vendor
  |
  |- private/
  |  |- build.properties
  |  |- schema.xml
  |  |- build/
  |  |- vendor/

我的包含路径是这样设置的:

set_include_path('vendor/propel/propel1/runtime/lib' . PATH_SEPARATOR . 'build/classes' . PATH_SEPARATOR . get_include_path());

但是,当我尝试require_once 'Propel.php'; 时,我收到以下错误:

Warning: require_once(Propel.php): failed to open stream: No such file or directory in /home/staging/apache/somewebsite.co.uk/public/functions.php on line 5

chdir('vendor/propel/propel1/runtime/lib');检查我得到以下错误:

Warning: chdir(): Permission denied (errno 13) in /home/staging/apache/somewebsite.co.uk/public/functions.php on line 5

因此,PHP/Apache 似乎不会遵循符号链接。我尝试了以下方法:

检查了目录是o+x,所以apache可以读取它 在 apache 配置中的目录指令中添加了 Options FollowSymLinks(尽管在文档中它说这是默认设置) 我还尝试chcon -R -h -t httpd_sys_content_t public/vendor/ 更改 SELinux 类型,但由于某种原因它没有改变

更新

我以 apache 用户 (su -s /bin/bash apache) 身份登录并从 public 目录中运行 cat vendor/propel/propel1/runtime/lib/Propel.php,它运行良好。但是,我暂时禁用了 SELinux,错误消失了。所以当然是 SELinux。

正如我之前提到的,我尝试过:

chcon -R -h -t httpd_sys_content_t public/vendor/

但在这样做之后,运行 ls -alZ 会为供应商提供以下信息:

lrwxrwxrwx. staging developers unconfined_u:object_r:user_home_t:s0 vendor -> /home/staging/apache/somewebsite.co.uk/private/vendor/

有什么想法吗?

【问题讨论】:

当您冒充为 Web 服务器用户时,您可以从控制台访问这些文件吗? 是的,su -s /bin/bash apachecat vendor/propel/propel1/runtime/lib/Propel.phppublic 目录中可以很好地列出该文件的内容。 如果你以 apache 用户的身份执行一个小的 php-cli 脚本会发生什么? public 目录运行php -r "chdir('vendor');var_dump(getcwd());" 输出string(61) "/home/staging/apache/somewebsite.co.uk/private/vendor" ok,也就是说只有使用apache sapi才会出现问题? 【参考方案1】:

问题最终出在我尝试设置 SELinux 类型的方式上。

我在跑步:

chcon -R -h -t httpd_sys_content_t public/vendor/

但是,我不得不跑:

chcon -R -h -t httpd_sys_content_t public/vendor

没有尾随斜杠。一旦我这样做了,一切都会立即恢复活力。

注意:因为我的 apache Directory 配置中没有 Options 指令,所以我不必指定它,它仍然有效。

【讨论】:

以上是关于为啥 PHP 在启用 SELinux 的情况下不遵循符号链接?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 require_once 在以下情况下不起作用?

启用 SELinux 后 proxy_pass 不起作用,为啥?

启用 SELinux 后 proxy_pass 不起作用,为啥?

为啥使用?在这种情况下不工作? (迅速)

为啥 selectAnnotation 在这种情况下不起作用?

Vue SPA url 在启用历史模式的情况下不起作用