Вчера я потратил 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, касались только проблем с разрешениями на папки, чего не было в моем случае.
(практическое) Как я могу предоставить разрешения на запись-удаление-обновление службы Apache httpd для каталога без полного отключения SELinux?
(теоретический) Что такое SELinux? Для чего он предназначен? Почему (по какой причине) он был создан? Почему я должен использовать это? Есть ли причина оставить SElinux включенным на локальной машине разработчика?
исключительно для модераторов ресурса: я знаю, что эта проблема охватывает больше администрирования, чем фактического программирования, но я уверен, что это затрагивает разработчиков гораздо более серьезно, чем, скажем, начинающих администраторов, поэтому, выбирая между SuperUser и StackOverflow, я выбрал последнее. Однако вам решать, перенести вопрос в SuperUser или оставить на этом месте.
Я не эксперт, но у меня было несколько проблем с 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
Надеюсь, некоторые из этих фрагментов и информации будут вам полезны, и это не просто бред сумасшедшего.
В дополнение к HumbleRat очень полезный ответ, вот что решило мою проблему с Apache не разрешено писать журналы в выделенной директории:
# Allow write only to specific dirs
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/logs -R