Установка або налаштування дозволів файлів
Дата оновлення перекладу 2023-06-15
Установка або налаштування дозволів файлів
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 є рекомендованими, якщо
вони доступні.