Почему PHP не будет следовать символическим ссылкам с включенным SELinux?

У меня есть веб-сайт, использующий Propel. Я хочу поместить различные файлы конфигурации из корневого каталога, но Propel нуждается в них (например, schema.xml, build.properties и т. д.) в том же каталоге. Итак, я решил добавить символические ссылки из корневого каталога в эти каталоги:

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 может их прочитать
  • Добавлено Options FollowSymLinks в директиву каталога в конфигурации apache (хотя в документах говорится, что это настройка по умолчанию в любом случае)
  • Я также пробовал chcon -R -h -t httpd_sys_content_t public/vendor/ изменить тип SELinux, но он почему-то не меняется

Обновить

Я вошел в систему как пользователь apache (su -s /bin/bash apache) и запустил cat vendor/propel/propel1/runtime/lib/Propel.php из каталога public, и все заработало нормально. Однако я временно отключил 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/

Есть идеи?


person LeonardChallis    schedule 29.04.2014    source источник
comment
Можете ли вы получить доступ к этому файлу из консоли, выдавая себя за пользователя веб-сервера?   -  person hek2mgl    schedule 29.04.2014
comment
Да, su -s /bin/bash apache и cat vendor/propel/propel1/runtime/lib/Propel.php внутри каталога public прекрасно перечисляют содержимое этого файла.   -  person LeonardChallis    schedule 29.04.2014
comment
Что произойдет, если вы выполните небольшой скрипт php-cli от имени пользователя apache?   -  person hek2mgl    schedule 29.04.2014
comment
Запуск php -r "chdir('vendor');var_dump(getcwd());" из public выходов каталога string(61) "/home/staging/apache/somewebsite.co.uk/private/vendor"   -  person LeonardChallis    schedule 29.04.2014
comment
хорошо, это означает, что проблема существует только тогда, когда вы используете apache sapi?   -  person hek2mgl    schedule 29.04.2014


Ответы (1)


Проблема оказалась в том, как я пытался установить тип SELinux.

Я бегал:

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

Однако мне пришлось бежать:

chcon -R -h -t httpd_sys_content_t public/vendor

без завершающей косой черты. Как только я это сделал, все сразу ожило.

Примечание. Поскольку у меня не было директивы Options в моей конфигурации apache Directory, мне не нужно было указывать ее, и она все еще работала.

person LeonardChallis    schedule 29.04.2014