Перейти к содержанию
Обсудить задачу →
Статьи и инструкции

Права файлов и папок в BitrixVM: диагностика владельца, chmod, ACL и ошибок записи

Исправляем ошибки записи в BitrixVM: пользователь PHP, владелец, chmod, ACL, диск и SELinux. Ограниченное изменение каталога, проверка приложения и возврат.
Концептуальная иллюстрация: Права файлов и папок в BitrixVM: диагностика владельца, chmod, ACL и ошибок записи

«Не удалось записать файл» в 1С-Битрикс не означает, что всему сайту нужен chmod 777. Причиной могут быть неверный владелец, запрет прохода по родительской папке, ACL, заполненный диск, read-only mount или SELinux. Массовый chown на /home/bitrix/ext_www затронет соседние сайты и может разрушить разделение доступа.

Ниже — порядок для Linux-администратора BitrixVM/BitrixEnv. Пути типовые, но пользователь PHP, DocumentRoot, версия окружения и дополнительные сайты устанавливаются по фактической конфигурации. Команды диагностики не заменяют проверку проекта; пример исправления ограничен одним каталогом данных.

1. Как определить точный сайт и процесс PHP

Запишите домен, действие и полный путь из ошибки. Сопоставьте его с конфигурацией virtual host и корнем нужного сайта. /home/bitrix/www — типовой основной корень, дополнительные площадки могут располагаться отдельно. Символические ссылки и bind mounts требуют отдельного учёта.

Посмотрите рабочие процессы:

ps -eo user,group,pid,comm,args | grep -E 'php-fpm|httpd|apache2|nginx'
ls -ld /home/bitrix/www
readlink -f /home/bitrix/www

Не выбирайте root по master-процессу. Для PHP-FPM важны user/group рабочего pool; для Apache с PHP-модулем — рабочие процессы Apache. Nginx может читать статические файлы от другого пользователя. Имя bitrix не предполагается для произвольного хостинга.

Производитель прямо связывает режимы с устройством конкретного сервера: необходимый уровень прав. Права файловой системы и роли пользователей CMS — отдельные уровни.

2. Как читать владельца и режимы

stat -c '%A %a %U:%G %n' /home/bitrix/www/upload
namei -l /home/bitrix/www/upload/import
id bitrix

Путь import приведён как пример проблемной папки. namei показывает компоненты пути: доступ к конечному файлу не поможет, если на одном из родителей отсутствует право прохода x.

Для каталога r позволяет получать имена, x — обращаться к объектам, w вместе с x — создавать и удалять записи. Для файла w разрешает изменение содержимого. Поэтому запрет записи в файл не всегда запрещает его удаление пользователю с правами на родительский каталог.

755/644 и 775/664 не являются магическими наборами. Второй вариант даёт группе запись. Нужно понимать состав группы и принадлежность процессов. 777/666 расширяют запись до любого локального пользователя и не исправляют SELinux, read-only или недостаток места.

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

3. Как отличить права от проблем файловой системы

df -h /home/bitrix/www
df -i /home/bitrix/www
findmnt -T /home/bitrix/www/upload
lsattr -d /home/bitrix/www/upload

Смотрите не только байты, но и inode. Для mount проверьте отсутствие неожиданного ro и правильность подключённого тома. Immutable-атрибут и ограничения сетевой файловой системы также могут препятствовать записи. Не снимайте атрибуты и не перемонтируйте том, пока не установлена причина.

Привяжите ошибку к журналу PHP/веб-сервера и времени запроса. Permission denied, No space left on device и Read-only file system требуют разных действий. HTTP 403 тоже может происходить из конфигурации web server, а не из Unix-режима.

4. Как проверить ACL и фактическое право процесса

getfacl -p /home/bitrix/www/upload/import
sudo -u bitrix test -x /home/bitrix/www/upload/import
printf 'traverse exit=%s\n' "$?"
sudo -u bitrix test -w /home/bitrix/www/upload/import
printf 'write permission exit=%s\n' "$?"

Код 0 означает успешную проверку test. Она не создаёт файл и не доказывает, что реальный HTTP-запрос завершится: процессы могут иметь другой контекст или ограничения. Используйте только установленное в шаге 1 имя пользователя.

В getfacl смотрите named user/group, mask и effective. Видимое rwx может ограничиваться маской. Default ACL влияет на новые дочерние объекты. chmod может изменить ACL mask; при активной ACL сначала согласуйте её модель, а не накладывайте обычные режимы поверх.

5. Как сохранить метаданные до исправления

Для небольшого конкретного каталога используйте Linux Bash под оператором с sudo. Сначала проверьте, что цель — нужный каталог, а не symlink:

site_root=$(realpath -e /home/bitrix/www) || exit 1
[ ! -L /home/bitrix/www/upload/import ] || exit 1
target_dir=$(realpath -e /home/bitrix/www/upload/import) || exit 1
case "$target_dir" in
  "$site_root"/upload/import) ;;
  *) printf 'Неожиданная область изменения\n' >&2; exit 1 ;;
esac
umask 077
metadata_file="$HOME/bitrix-import-before-$(date +%Y%m%d-%H%M%S).acl"
sudo getfacl -R -P --absolute-names --numeric "$target_dir" > "$metadata_file"
[ "$?" -eq 0 ] && [ -s "$metadata_file" ] || exit 1

Запускайте блок в отдельной административной Bash-сессии: exit завершит её при несоответствии. Каталог должен существовать. Проверьте содержимое снимка и его область; храните его вне публичного сайта. Рекурсивное чтение тоже создаёт нагрузку на большом дереве.

Метаданные не содержат резервную копию содержимого. Отдельно сохраните пригодную копию данных и параметры mount/SELinux. Не меняйте одновременно дерево из другой сессии: иначе снимок и исходное состояние разойдутся.

6. Как исправить конкретный каталог, не затрагивая весь сайт

Следующий вариант применим только если подтверждены все условия: это каталог импортируемых данных без исполняемых файлов, symlink и вложенных mount; правильный владелец bitrix:bitrix; отдельная ACL-модель отсутствует; для группы действительно согласована запись. Найдите исключения до выполнения:

find -P "$target_dir" -xdev -type l -print
find -P "$target_dir" -xdev -printf '%m %u:%g %p\n'

Если найдены неизвестные объекты или другие владельцы, разберите их отдельно. При установленных условиях измените только каталоги и обычные файлы:

sudo find -P "$target_dir" -xdev -type d -exec chown bitrix:bitrix -- {} +
sudo find -P "$target_dir" -xdev -type f -exec chown bitrix:bitrix -- {} +
sudo find -P "$target_dir" -xdev -type d -exec chmod 0775 -- {} +
sudo find -P "$target_dir" -xdev -type f -exec chmod 0664 -- {} +

Это пример ограниченной коррекции, не регламент всех BitrixVM. Он не применяется к ключам, конфигурациям с секретами, скриптам и каталогам соседних сайтов. -P не следует по найденным symlink, -xdev ограничивает переход на другую файловую систему, но bind mount на той же файловой системе требует проверки отдельно.

7. Что делать, если Unix-права правильные, а запись не работает

На системе с SELinux проверьте состояние и контекст конкретного пути:

getenforce
ls -Zd "$target_dir"
matchpathcon -V "$target_dir"
sudo ausearch -m AVC,USER_AVC -ts recent

Доступность команд зависит от установленных пакетов и включённого SELinux. AVC сверьте по времени, процессу и объекту. На системе, где SELinux выключен, он не причина данного отказа. Не отключайте защиту в качестве первого решения.

Если ожидаемая политика для этого пути уже настроена, а текущая метка ей не соответствует, согласованное restorecon -v для точного объекта может вернуть контекст. Для нового нестандартного пути сначала требуется постоянная политика fcontext и проверка назначения. Не назначайте всему сайту тип, позволяющий запись, только ради одной upload-папки.

8. Почему ошибка возвращается после загрузки файлов

Установите, кто создаёт новые объекты: PHP, SFTP, deployment, cron, интеграция 1С или root-скрипт. Сопоставьте владельца нового файла с процессом. Две разные учётные записи с несогласованными группой и umask снова создадут конфликт после разового chown.

Для Битрикс существуют настройки режимов новых файлов/папок; они описаны в документации производителя. Они не исправляют владельца, права родителей и ACL, не следует добавлять константы во все конфигурации без проверки версии и действующих определений.

Согласуйте процесс публикации и обслуживания. Запуск cron от root может создавать root-файлы, но перевод существующей задачи на bitrix требует проверки её обязанностей. Не меняйте сервисную учётную запись всех заданий в рамках одной ошибки записи.

9. Как проверить исправление и закрыть лишнюю запись

Повторите stat, getfacl и проверки от фактического пользователя PHP. Затем воспроизведите исходное действие в приложении: загрузку, создание кеша или импорт. Проверьте журнал и владельца нового объекта. Успех sudo touch от root не подтверждает работу PHP.

Проверьте также чтение статического файла веб-сервером и отсутствие записи у лишних пользователей. Убедитесь, что секретные конфигурации не попали в общедоступные права. Для upload отдельно проверьте запрет исполнения загруженных скриптов в конфигурации сайта: chmod не является таким запретом.

CMS-ошибка доступа пользователя решается её ролью и группами. Права Bitrix Framework не следует заменять выдачей Unix-записи всем.

10. Как вернуть метаданные и оформить результат

Если изменение не дало нужного результата, а дерево и исходные объекты сохранились, сначала просмотрите восстановление без применения:

sudo setfacl --test --restore="$metadata_file"

После проверки области и отсутствия новых конкурентных изменений:

sudo setfacl --restore="$metadata_file"

Восстановление по setfacl может вернуть сохранённые ACL, режимы и владельцев с достаточными полномочиями. Оно не восстанавливает содержимое, удалённые объекты и SELinux-контекст; новые файлы требуют отдельного решения.

Зафиксируйте причину, каталог, пользователя процесса, режим до/после, тест приложения и способ предотвращения повторения. Для диагностики BitrixVM и настройки эксплуатации сайта обратитесь в АВАНГАРД ИТ.