Доступ запрещен при использовании модуля Apache userdir и Laravel или WordPress.

Вопрос или проблема

У меня есть проблема, для которой я долго ищу решение, но до сих пор не нашел.

Я использую 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.

Применение

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

  1. Настройка владельца и группы файлов

    • Каждое приложение можно настроить так, чтобы владельцем его файлов был пользователь, которому принадлежит домашняя директория. Для этого используйте команду chown, чтобы назначить владельца и группу:
      chown -R ваш_пользователь:www-data /путь/к/вашему_приложению
    • Убедитесь, что ваши критические директории, например wp-content, storage и vendor, имеют группу www-data и установленный бит SGID (Set Group ID). Это позволит новым файлам унаследовать группу:
      chmod -R 2775 /путь/к/вашей_директории
  2. ACL (Access Control Lists)

    • Использование ACL позволяет задавать более гранулированные права доступа. Сначала убедитесь, что система поддерживает ACL, и примените нужные настройки:
      setfacl -m u:www-data:rwx /путь/к/вашей_директории
    • Данным подходом вы сможете предоставить права на запись именно тем папкам, которые в этом нуждаются, без изменения общих прав владельца.
  3. Использование suEXEC или PHP-FPM

    • Добавьте изоляцию на уровне выполнения скриптов, используя suEXEC для CGI-скриптов и PHP-FPM для PHP. Таким образом, каждый пользователь будет запускать свои скрипты от своего имени, сохраняя возможности записи без необходимости дополнительных прав для Apache.
  4. Настройка umask

    • Убедитесь, что ваш umask для создаваемых файлов установлен на 002 или 022, чтобы файлы и каталоги наследовали правильные права при создании.
  5. Контейнеризация

    • Как более современное решение, вы можете рассмотреть возможность использования контейнеров (например, Docker), что позволит более четко разграничивать доступы и права на уровне системных ресурсов.

Каждое из этих решений требует тщательного подхода и проверки на тестовом окружении, прежде чем применять его в реальной эксплуатации. Помните, что безопасность вашего сервера должна оставаться в приоритете, и каждое изменение должно быть хорошо обдумано и проверено.

Оцените материал
Добавить комментарий

Капча загружается...