Дозволи, необхідні додаткам Symfony

Дата оновлення перекладу 2022-12-23

Symfony генерує певні файли у каталозі var/ вашого проекту при запуску додатку. У середовищі dev, файли bin/console та public/index.php використовують umask(), щоб гарантувати, що у каталог можна записувати. Це означає, що вам не потрібно конфігурувати дозволи при розробці додатку на вашій локальній машині.

Однак, використання umask() вважається небезпечним у виробництві. Тому вам часто потрібно чітко конфігурувати деякі дозволи на ваших серверах виробництва, як пояснюється у цій статті.

Дозволи, необхідні додаткам Symfony

Ось дозволи, необхідно для запуку додатків Symfony:

  • Каталог var/log/ повинен існувати і бути доступним для запису як для користувача вашого сервера, так і для користувача терміналу;
  • Каталог var/cache/ повинен бути доступним для запиу для користувача терміналу (користувач, який виконує команди cache:warmup або cache:clear);
  • Каталог var/cache/ повинен бути доступним для запису для користувача веб-сервера, якщо ви викорисстовуєте filesystem-based cache.

Конфігурація дозволів для додатків Symfony

На системах Linux та macOS, якщо ваш користувач веб-сервера відрізняється від коритувача командного рядку, вам потрібно правильно сконфігурувати дозволи, щоб уникнути проблем. Існує декілька способів досягнення цього:

1. Використання ACL на системі, що підтримує setfacl (Linux/BSD)

Використання дозволів Списків контролю доступу (ACL) - найбезпечніший та рекомендований метод, щоб зробити каталог var/ доступним для запису. Вам може знадобитися встановити setfacl та включити підтримку ACL на вашому підрозділі диску перед використанням цього методу. Потім, використайте наступний скрипт, щоб визначити вашого користувача
веб-сервера та гарантувати необхідні дозволи:

1
2
3
4
5
6
7
8
$ HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1)

# якщо наступні команди не працюють, спробуйте додати опцію `-n` до `setfacl`

# встановити дозволи для майбутніх файлів та папок
$ sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var
# встановити дозволи для існуючих фалів та папок
$ sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var

Обидві ці команди призначають доступи для користувача системи (того, хто виконує ці команди) та користувача веб-браузера.

Note

setfacl недоступний у точках монтування NFS. Однак, зберігання кешу та логів над NFS дуже не рекомендовано з міркувань продуктивності.

2. Використовуйте одного користувача для CLI та веб-сервера

Відредагуйте вашу конфігурацію веб-сервера (зазвичай httpd.conf або apache2.conf для Apache) та всатновіть його користувача такого ж, як вашого користувача CLI (наприклад, для Apache, оновіть директиви User та Group).

Caution

Якщо це рішення використовується на сервері виробництва, переконайтеся, що цей користувач має лімітовані привілеї (не має доступу до приватних даних або серверів, виконання небезпечних бінарностей та ін.), так як скомпроментований сервер надасть хакеру такі привілеї.

3. Без використання ACL

Якщо жоден з попередніх методів вам не підходить, змініть umask так, щоб каталоги кешу та логів були доступні для запису групами або світом (в залежності від того, чи є користувачі веб-сервера та командного рядку онаковими для групи чи ні). Щоб досягти цього, помістіть наступний рядок на початку bin/console та файлів public/index.php:

1
2
3
4
5
umask(0002); // Це дозволить дозволам бути 0775

// or

umask(0000); // Це дозволить дозволам бути 0777

Caution

Зміна umask не потокобезпечна, тому методи ACL є рекомендованими, якщо вони доступні.