При работе сервера «1С:Предприятие» в операционных системах семейства Linux администраторы часто сталкиваются с неприятной особенностью. Файлы отчетов, выгрузок, логов или обменов, создаваемые сервером 1С (который по умолчанию работает от имени пользователя usr1cv8), записываются с правами, доступными только для чтения самому владельцу. Другие пользователи системы, внешние службы, веб-серверы (например, Apache или Nginx) или общие сетевые папки Samba видят эти файлы, но не могут открыть их для чтения или редактирования.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем механизмы работы операционной системы Linux с правами доступа и рассмотрим несколько способов решения — от простых системных настроек до использования расширенных списков контроля доступа (POSIX ACL).
Первое решение, которое приходит в голову многим начинающим администраторам Linux, — изменить маску создания файлов (umask) для пользователя usr1cv8. Обычно для этого пытаются отредактировать конфигурационные файлы профиля, такие как .bashrc, .profile или глобальный файл /etc/profile.
Однако на практике такой подход не дает результатов. Дело в том, что сервер «1С:Предприятие» запускается как системная служба (демон). При старте демона операционная система не инициализирует полноценный интерактивный сеанс пользователя, а значит, все файлы инициализации окружения вроде .bashrc просто игнорируются. Настройку маски создания файлов необходимо производить непосредственно в конфигурации службы инициализации.
Рассмотрим по шагам, как правильно настроить umask для службы сервера 1С в зависимости от используемой системы инициализации.
В современных дистрибутивах Linux (Ubuntu, Debian, CentOS, RedHat, ALT Linux) управление службами осуществляется через подсистему systemd. Начиная с версии платформы 8.3.21, использование systemd стало стандартом по умолчанию, но и на более ранних версиях платформы администраторы часто настраивают запуск через юниты вручную.
Чтобы переопределить настройки прав для службы 1С, выполним следующие действия:
sudo systemctl edit srv1cv83
(Обратите внимание: имя службы может отличаться в зависимости от версии платформы, например, srv1cv8-8.3.25.1234. Уточните точное имя службы перед запуском).
[Service]
UMask=0002
0002 означает, что вновь создаваемые файлы будут иметь права 664 (чтение и запись для владельца и группы, чтение для остальных), а каталоги — 775 (полные права для владельца и группы, чтение и переход для остальных).
sudo systemctl daemon-reload
sudo systemctl restart srv1cv83
Если вы используете более старые версии платформы (например, обсуждаемую в теме версию 8.3.15) или операционную систему без systemd, запуск службы выполняется через классические скрипты инициализации. Скрипт запуска обычно находится по пути /etc/init.d/srv1cv83.
Редактировать сам скрипт не рекомендуется. Вместо этого настроим конфигурационный файл окружения службы:
/etc/default/srv1cv83, а в CentOS/RedHat — /etc/sysconfig/srv1cv83.
umask 0002
sudo service srv1cv83 restart
Механизм umask в Linux работает как фильтр: он может только запретить выдачу определенных прав при создании файла, но не может принудительно добавить права, которые процесс не запрашивал.
Если при создании файла внутренний код платформы 1С явно вызывает системную функцию создания файла и передает в нее жестко заданные ограничения безопасности (например, права 0600 — только для чтения и записи владельцем), то системный umask не сможет расширить эти права. В некоторых сценариях работы платформы (при формировании определенных отчетов, временных файлов или выгрузок) 1С действительно принудительно ограничивает права доступа из соображений безопасности. В таких случаях изменение umask службы окажется неэффективным. Рассмотрим более гибкие варианты обхода этого ограничения.
Если файлы должны создаваться в определенном каталоге обмена (например, /home/shared/exchange) и быть доступными для других пользователей или веб-служб, идеальным решением будет использование списков контроля доступа (Access Control Lists). Списки ACL позволяют настроить автоматическое наследование прав для любых новых файлов и папок внутри конкретного каталога, полностью игнорируя то, с какими правами их создавала платформа 1С.
Проанализируем этот процесс и настроим его по шагам:
# Для Debian/Ubuntu:
sudo apt update && sudo apt install acl
# Для CentOS/RedHat:
sudo yum install acl
web-users (в которую входит, например, веб-сервер или пользователи Samba), которой необходим доступ к файлам обмена. Зададим дефолтные права (Default ACL) на наш каталог:
# Назначаем права для существующих файлов и папок рекурсивно
sudo setfacl -R -m g:web-users:rwx /home/shared/exchange
# Устанавливаем дефолтные правила для всех НОВЫХ файлов и папок (флаг d:)
sudo setfacl -R -m d:g:web-users:rwx /home/shared/exchange
Благодаря этому правилу, любой файл, созданный сервером 1С в папке /home/shared/exchange, даже с жесткими правами владельца 0600, автоматически получит дополнительные права на чтение, запись и исполнение для группы web-users. Это полностью решает проблему без ослабления безопасности всей операционной системы.
В операционной системе Linux можно настроить наследование группы-владельца для всех создаваемых файлов внутри каталога. Это очень полезно, если вы объединили пользователя 1С (usr1cv8) и других пользователей в общую группу.
Разберем, как применить этот подход:
sudo groupadd exchange-group
sudo usermod -aG exchange-group usr1cv8
sudo usermod -aG exchange-group apache
sudo chown -R usr1cv8:exchange-group /home/shared/exchange
sudo chmod g+s /home/shared/exchange
Теперь любой файл, записанный платформой 1С в этот каталог, автоматически получит группу-владельца exchange-group. В сочетании с настройкой UMask=0002 для службы 1С это обеспечит беспрепятственный доступ к файлам всем членам группы.
Если по какой-то причине на вашей файловой системе не поддерживается ACL или вы не можете вносить изменения в параметры службы сервера 1С, рассмотрим еще два альтернативных варианта решения проблемы.
Вариант А. Виртуальное монтирование через bindfs
Утилита bindfs позволяет примонтировать одну директорию в другую с виртуальной "подменой" прав на лету. Физически файлы будут лежать в папке 1С с правами владельца, но в точке монтирования они будут отображаться так, будто имеют полный доступ для всех:
sudo bindfs --create-with-perms=0777 --perms=0777 /home/shared/exchange /home/shared/exchange_public
В результате сторонние пользователи работают с файлами через папку exchange_public, не испытывая никаких проблем с доступом.
Вариант Б. Отслеживание изменений через inotify
Мы можем написать простой фоновый скрипт на bash, который будет непрерывно мониторить папку обмена и автоматически менять права на файлы сразу после их создания платформой 1С:
#!/bin/sh
MONITORDIR="/home/shared/exchange"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
chmod 664 "$NEWFILE"
done
Этот скрипт можно оформить в виде простой службы systemd, которая будет запускаться при старте операционной системы.
Мы рассмотрели несколько способов решения проблемы с правами доступа к файлам под Linux. Подведем итог, какой метод выбрать:
КомандаСистемы("chmod ...") из кода 1С, так как это снижает производительность системы и создает серьезные уязвимости безопасности.