SELinux влияет на ошибку PHP «не удалось открыть поток: отказано в доступе»

Вчера я потратил 5 часов подряд на обнаружение, казалось бы, необоснованной ошибки "не удалось открыть поток. Отказано в доступе", которая происходила после любых операций записи в файловую систему: fopen (с флагами "w" и "a"), move_uploaded_file, file_put_contents.

Я много раз перепроверял владельцев каталогов (пользователь и группа - chown, chgrp), менял атрибуты папки на незащищенный 777 (rwx с chmod), но это не дало результата. Я даже переустановил Apache и PHP, но все равно столкнулся с той же ошибкой.

Как выяснилось после нескольких часов чтения различной документации, причиной ошибки были ограничения SELinux, автоматически применяемые для службы Apache httpd. Я просто отключил SELinux, отредактировав файл /etc/selinux/config в моей Fedora (выпуск 20), изменив строку:

SELINUX=enforcing

to

SELINUX=disabled

Я перезагрузил компьютер, и эта досадная ошибка наконец исчезла.

Я должен заметить, что все вопросы в Stack Overflow, касающиеся проблемы «отказа в доступе» в среде LAMP, касались только проблем с правами доступа к папке, чего не было в моем случае.

  1. (практически) Как предоставить службе Apache httpd разрешения на запись, удаление и обновление каталога без полного отключения SELinux?

  2. (теоретическая) Что такое SELinux? Для чего он предназначен? Почему (для чего) он был создан? Почему я должен использовать его? Есть ли причина оставлять SElinux включенным на локальной машине разработчика?

исключительно модераторам ресурса: я знаю, что эта проблема затрагивает больше администрирование, чем реальное программирование, но я уверен, что она затрагивает разработчиков гораздо сильнее, чем, скажем, начинающих администраторов, поэтому выбирая между SuperUser и StackOverflow, я выбрал последнее . Однако вам решать, переместить вопрос в SuperUser или оставить на этом месте.


person broadcast-the-skills    schedule 16.12.2014    source источник
comment
Для меня это звучит как вопрос, который больше подходит для serverfault.com   -  person Nameless One    schedule 16.12.2014
comment
Прошло некоторое время с тех пор, как я попробовал систему SELinux — для локального разработчика я обнаружил, что она чрезмерно заблокирована. Я бы отключил его локально, но я ожидаю, что он будет полезен в производстве.   -  person halfer    schedule 16.12.2014
comment
Я думаю, для администратора это очень распространенная и, вероятно, широко известная проблема (например, почему я должен использовать наследование для программистов), но для программистов это может быть очень полезно - если бы я вчера нашел какие-то похожие темы в индексах поисковых систем, я бы сэкономил около 5 часов времени. Однако я оставляю это на усмотрение модераторов, куда поставить этот вопрос.   -  person broadcast-the-skills    schedule 16.12.2014


Ответы (2)


Я не эксперт, но у меня было несколько проблем с SELinux. Я прочитал несколько статей, и из того, что я могу понять, SELinux — это еще один уровень безопасности для вашего сервера, и его действительно следует оставить включенным, а не выключать из-за незнания (это была цитата, которую я прочитал, а не мои слова). Я нашел этот сайт полезным, а также комичным, и он, вероятно, даст вам больше информации, чем я когда-либо мог.

http://stopdisablingselinux.com/

Несколько вещей, с которыми я столкнулся, которыми я поделюсь:

Вы можете проверить текущие разрешения SELinux с помощью следующей команды:

ls -lZ

Вы можете установить разрешения SELinux с помощью следующей команды:

chcon unconfined_u:object_r:httpd_user_content_t:s0

Вы можете использовать подстановочный знак для изменения всех файлов в каталоге следующим образом:

chcon unconfined_u:object_r:httpd_user_content_t:s0 *

Вы можете рекурсивно установить разрешения для всех файлов и каталогов, используя это (это команда, которая, вероятно, решит вашу проблему с разрешениями, вам следует избегать 777, например, чумы):

chcon -R unconfined_u:object_r:httpd_user_content_t:s0 *

Если вы хотите использовать домашние каталоги для обслуживания сайтов или приложений, вам необходимо ввести следующую команду:

setsebool -P httpd_enable_homedirs=1

У меня были проблемы с fsockopen на Centos с Selinux, и мне пришлось использовать следующее (-P делает это изменение постоянным, вам также понадобится эта команда):

setsebool -P httpd_can_network_connect 1

Вы можете увидеть, какие флаги установлены на HTTPD:

sestatus

Я думаю, что последнее, что у меня была проблема с аутентификацией с открытым/закрытым ключом на сервере, и мне нужно было запустить эту команду, чтобы исправить это (я полагаю, что это известная ошибка):

restorecon -R -v /home

Надеюсь, некоторые из этих фрагментов и информации будут вам полезны, и это не просто бред сумасшедшего.

person The Humble Rat    schedule 16.12.2014
comment
В настоящее время я смотрю презентацию, связанную с stopdisablingselinux.com, и команды выглядят очень полезными. Спасибо! - person broadcast-the-skills; 16.12.2014

В дополнение к очень полезному ответу HumbleRat, вот что решило мою проблему с Apache не разрешено писать журналы в выделенном каталоге:

# Allow write only to specific dirs
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/logs -R

Источник: https://blog.lysender.com/2015/07/centos-7-selinux-php-apache-cannot-writeaccess-file-no-matter-what/

person Pr Shadoko    schedule 05.12.2018