Вопрос или проблема
У меня есть проблема, для которой я долго ищу решение, но до сих пор не нашел.
Я использую Apache с модулем userdir и как-то изолирую каждый сайт/приложение в его соответствующем $HOME.
Однако у меня есть два типа платформ, которые выходят за пределы этой “изоляции”, это сайты, сделанные на WordPress и Laravel.
Для WordPress мне нужно дать Apache (www-data) разрешение на запись в папку “wp-content”, а для Laravel — разрешение на запись в папки “vendor” и “storage”.
Вот пример:
[php:error] [pid 99340] [client 175.xxx.xxx.xxx:15954] PHP Fatal error: Uncaught ErrorException: file_put_contents(/var/www/user/public_html/storage/framework/views/3e2d446afa85e2bbfa14dffb12f4a2a7a3423ced.php): Failed to open stream: Permission denied in /var/www/user/public_html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:190
Не предоставляя разрешения на запись для пользователя Apache (www-data), я получаю ошибку “500” при доступе к сайту.
Мое намерение состоит в том, чтобы не позволять пользователю Apache иметь доступ на запись в эти папки, но позволить пользователю, назначенному этому $HOME, иметь доступ на запись.
Есть ли какой-то способ это реализовать?
Спасибо.
Ответ или решение
Конечно, я могу помочь вам с этой задачей. Проблема, с которой вы столкнулись, связана с управлением правами доступа на сервере Apache, особенно в контексте использования модулей userdir в связке с платформами, такими как WordPress и Laravel. Давайте подробно разберемся, как можно решить эту ситуацию, сохраняя при этом требования безопасности.
Теория
Когда вы используете Apache с модулем userdir, вы предоставляете каждому пользователю своего рода изолированное рабочее пространство в их домашнем каталоге. Это практическое решение для хостинга нескольких веб-приложений на одном сервере, где каждый пользователь имеет своё окружение. Однако, такие популярные платформы, как WordPress и Laravel, требуют записи в определенные директории для корректной работы (например, wp-content
в WordPress и storage
, vendor
в Laravel).
Столкновение с ошибками типа "Permission denied" обычно связано с недостаточными правами доступа для пользователя Apache (обычно www-data
). Это происходит потому что Apache, обычно, выполняется под пользователем с ограниченными правами всякий раз, когда обрабатывает запросы к серверу.
Пример
В приведенном примере ошибка связана с файловой системой. Apache не смог записать данные в директорию storage/framework/views
в Laravel, что вызвало фатальную ошибку. Эти директории требуют периодаческой записи данных. Например, кешированные страницы и данные сеансов должны сохраняться в директорию storage
.
Применение
Для решения вашей проблемы необходимо найти баланс между предоставлением необходимых прав для выполнения вашей работы и поддержанием необходимых мер безопасности. Вот несколько вариантов, которые могут помочь:
-
Настройка владельца и группы файлов
- Каждое приложение можно настроить так, чтобы владельцем его файлов был пользователь, которому принадлежит домашняя директория. Для этого используйте команду
chown
, чтобы назначить владельца и группу:chown -R ваш_пользователь:www-data /путь/к/вашему_приложению
- Убедитесь, что ваши критические директории, например
wp-content
,storage
иvendor
, имеют группуwww-data
и установленный бит SGID (Set Group ID). Это позволит новым файлам унаследовать группу:chmod -R 2775 /путь/к/вашей_директории
- Каждое приложение можно настроить так, чтобы владельцем его файлов был пользователь, которому принадлежит домашняя директория. Для этого используйте команду
-
ACL (Access Control Lists)
- Использование ACL позволяет задавать более гранулированные права доступа. Сначала убедитесь, что система поддерживает ACL, и примените нужные настройки:
setfacl -m u:www-data:rwx /путь/к/вашей_директории
- Данным подходом вы сможете предоставить права на запись именно тем папкам, которые в этом нуждаются, без изменения общих прав владельца.
- Использование ACL позволяет задавать более гранулированные права доступа. Сначала убедитесь, что система поддерживает ACL, и примените нужные настройки:
-
Использование suEXEC или PHP-FPM
- Добавьте изоляцию на уровне выполнения скриптов, используя suEXEC для CGI-скриптов и PHP-FPM для PHP. Таким образом, каждый пользователь будет запускать свои скрипты от своего имени, сохраняя возможности записи без необходимости дополнительных прав для Apache.
-
Настройка umask
- Убедитесь, что ваш umask для создаваемых файлов установлен на 002 или 022, чтобы файлы и каталоги наследовали правильные права при создании.
-
Контейнеризация
- Как более современное решение, вы можете рассмотреть возможность использования контейнеров (например, Docker), что позволит более четко разграничивать доступы и права на уровне системных ресурсов.
Каждое из этих решений требует тщательного подхода и проверки на тестовом окружении, прежде чем применять его в реальной эксплуатации. Помните, что безопасность вашего сервера должна оставаться в приоритете, и каждое изменение должно быть хорошо обдумано и проверено.