Установка или исправление разрешений файлов

Дата обновления перевода 2023-01-11

Установка или исправление разрешений файлов

Symfony генерирует определенные файлы в каталоге var/ вашего проекта при запуске приложения. В окружении dev, файлы bin/console и public/index.php используют umask(), чтобы гарантировать, что в каталог можно писать. Это означает, что вам не нужно конфигурировать разрешения при разработке приложения на вашей локальной машине.

Однако, использование umask() не считается безопасным в производстве. Поэтому вам часто нужно четко конфигурировать какие-то разрешения на ваших серверах производства, как объясняется в этой статье.

Разрешения, требуемые приложениями Symfony

Вот разрешения, требуемые для запуска приложений Symfony:

  • Каталог var/log/ должен существовать и быть доступным для записи как вашему веб-серверу, так и пользователю терминала;
  • Каталог var/cache/ должен быть доступным для записи пользователю терминала (пользователю, выполняющему команды cache:warmup или cache:clear);
  • Каталог var/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, когда они доступны.