При работе сервера 1С:Предприятие на операционной системе CentOS 7 (и других дистрибутивах Linux) администраторы часто сталкиваются с проблемой разграничения прав доступа. Типичная ситуация: сервер 1С записывает файл во временный каталог или общую папку, но веб-сервер (например, Apache) не может его прочитать. Это происходит из-за того, что файлы по умолчанию создаются с правами, ограничивающими доступ для всех, кроме владельца и его основной группы. Рассмотрим, как решить эту задачу правильно, не прибегая к небезопасным командам chmod 777 или постоянному вызову внешних скриптов.
Разберем, как именно происходит процесс записи. В коде 1С мы обычно используем стандартные методы работы с двоичными данными. Посмотрим на типичный пример кода, который инициирует создание файла на стороне сервера:
// Пример записи файла из временного хранилища на диск сервера
ДанныеФайла = ПолучитьИзВременногоХранилища(Адрес);
ДанныеФайла.Записать(ПутьКфайлуПользователя);
Когда выполняется метод Записать(), процесс сервера 1С (обычно работающий под пользователем usr1cv8 и группой grp1cv8) выполняет системный вызов к ядру Linux. В этот момент права нового файла определяются так называемой «маской создания файлов» или umask процесса. Если umask установлен в значение 0027, то новые файлы получают права 0640 (чтение/запись для владельца, чтение для группы, ничего для остальных). Это блокирует доступ для пользователя apache, которому для чтения требуются права как минимум 0644.
Проанализируем самый надежный способ — изменение маски umask непосредственно для службы 1С. В CentOS 7 управление службами осуществляется через systemd. Нам необходимо указать системе, с какими правами по умолчанию процесс 1С должен создавать объекты в файловой системе.
/usr/lib/systemd/system/srv1cv83.service.[Service].UMask. Чтобы файлы создавались с правами 0644, нам нужно установить маску 0022:
[Service]
# Другие параметры службы...
User=usr1cv8
Group=grp1cv8
UMask=0022
systemctl daemon-reload
systemctl restart srv1cv83
Теперь любой файл, записанный через ДанныеФайла.Записать(), будет иметь права на чтение для всех пользователей системы, включая Apache.
Иногда изменение общего umask для всей службы нежелательно из соображений безопасности. В таком случае мы можем применить механизм SETGID к конкретному каталогу. Это заставит все создаваемые в нем файлы «наследовать» группу этого каталога, а не основную группу пользователя usr1cv8.
Выясним, как это реализовать по шагам:
webdata, и добавим в нее обоих пользователей:
groupadd webdata
usermod -aG webdata usr1cv8
usermod -aG webdata apache
chown :webdata /temp_files/bisonline/
chmod g+s /temp_files/bisonline/
Теперь, когда 1С создает файл в этой папке, он автоматически получит группу webdata. Если при этом umask позволяет группе читать файлы (например, права 0660 или 0640), пользователь apache сможет работать с этими файлами, так как он тоже входит в группу webdata.
Проанализируем наиболее современный и гибкий метод — использование ACL. Этот механизм позволяет задать «права по умолчанию» для конкретной папки, которые будут автоматически применяться к любым новым объектам внутри неё, игнорируя системный umask.
Для настройки прав пользователя apache на каталог, куда пишет 1С, выполним следующие действия:
yum install acl.apache в нужной директории:
setfacl -d -m u:apache:rx /temp_files/bisonline/
getfacl /temp_files/bisonline/.Флаг -d указывает, что это правило «по умолчанию». Теперь каждый раз, когда 1С вызывает Записать(), файловая система Linux будет автоматически добавлять права для apache, даже если 1С об этом «не знает».
Выясним причину, по которой использование ЗапуститьПриложение("chgrp...") или chmod после записи файла является плохой практикой. Во-первых, это создает дополнительную нагрузку на сервер (порождение нового процесса ОС). Во-вторых, возникает «состояние гонки» (race condition): между моментом завершения записи файла методом 1С и моментом выполнения команды смены прав существует короткий промежуток времени, когда файл уже существует, но еще недоступен для Apache. Использование системных механизмов umask, SETGID или ACL исключает эти проблемы, так как права назначаются атомарно в момент создания файла.
Таким образом, мы рассмотрели три эффективных способа настройки прав доступа в Linux для сервера 1С. Выбор конкретного метода зависит от ваших требований к безопасности и сложности структуры каталогов на сервере.