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

в

SELINUX=disabled

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

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

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

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

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

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

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

4

Другие решения

В дополнение к 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/

0

По вопросам рекламы [email protected]