Как настроить права доступа при записи файлов сервером 1С на CentOS 7?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе сервера 1С:Предприятие на операционной системе CentOS 7 (и других дистрибутивах Linux) администраторы часто сталкиваются с проблемой разграничения прав доступа. Типичная ситуация: сервер 1С записывает файл во временный каталог или общую папку, но веб-сервер (например, Apache) не может его прочитать. Это происходит из-за того, что файлы по умолчанию создаются с правами, ограничивающими доступ для всех, кроме владельца и его основной группы. Рассмотрим, как решить эту задачу правильно, не прибегая к небезопасным командам chmod 777 или постоянному вызову внешних скриптов.

Анализ стандартного механизма записи в 1С

Разберем, как именно происходит процесс записи. В коде 1С мы обычно используем стандартные методы работы с двоичными данными. Посмотрим на типичный пример кода, который инициирует создание файла на стороне сервера:


// Пример записи файла из временного хранилища на диск сервера
ДанныеФайла = ПолучитьИзВременногоХранилища(Адрес);
ДанныеФайла.Записать(ПутьКфайлуПользователя); 

Когда выполняется метод Записать(), процесс сервера 1С (обычно работающий под пользователем usr1cv8 и группой grp1cv8) выполняет системный вызов к ядру Linux. В этот момент права нового файла определяются так называемой «маской создания файлов» или umask процесса. Если umask установлен в значение 0027, то новые файлы получают права 0640 (чтение/запись для владельца, чтение для группы, ничего для остальных). Это блокирует доступ для пользователя apache, которому для чтения требуются права как минимум 0644.

Решение 1: Настройка системного umask для службы 1С

Проанализируем самый надежный способ — изменение маски umask непосредственно для службы 1С. В CentOS 7 управление службами осуществляется через systemd. Нам необходимо указать системе, с какими правами по умолчанию процесс 1С должен создавать объекты в файловой системе.

  1. Откроем файл конфигурации службы сервера 1С. Обычно он располагается по пути /usr/lib/systemd/system/srv1cv83.service.
  2. Найдем секцию [Service].
  3. Добавим или изменим параметр UMask. Чтобы файлы создавались с правами 0644, нам нужно установить маску 0022:
    
    [Service]
    # Другие параметры службы...
    User=usr1cv8
    Group=grp1cv8
    UMask=0022
    
  4. После редактирования файла необходимо обновить конфигурацию systemd и перезапустить службу:
    
    systemctl daemon-reload
    systemctl restart srv1cv83
    

Теперь любой файл, записанный через ДанныеФайла.Записать(), будет иметь права на чтение для всех пользователей системы, включая Apache.

Решение 2: Использование бита SETGID для наследования группы

Иногда изменение общего umask для всей службы нежелательно из соображений безопасности. В таком случае мы можем применить механизм SETGID к конкретному каталогу. Это заставит все создаваемые в нем файлы «наследовать» группу этого каталога, а не основную группу пользователя usr1cv8.

Выясним, как это реализовать по шагам:

  1. Создадим общую группу для 1С и Apache, например webdata, и добавим в нее обоих пользователей:
    
    groupadd webdata
    usermod -aG webdata usr1cv8
    usermod -aG webdata apache
    
  2. Назначим эту группу владельцем целевого каталога: chown :webdata /temp_files/bisonline/
  3. Установим бит SETGID: chmod g+s /temp_files/bisonline/

Теперь, когда 1С создает файл в этой папке, он автоматически получит группу webdata. Если при этом umask позволяет группе читать файлы (например, права 0660 или 0640), пользователь apache сможет работать с этими файлами, так как он тоже входит в группу webdata.

Решение 3: Продвинутая настройка через ACL (Access Control Lists)

Проанализируем наиболее современный и гибкий метод — использование ACL. Этот механизм позволяет задать «права по умолчанию» для конкретной папки, которые будут автоматически применяться к любым новым объектам внутри неё, игнорируя системный umask.

Для настройки прав пользователя apache на каталог, куда пишет 1С, выполним следующие действия:

  1. Убедимся, что утилиты для работы с ACL установлены: yum install acl.
  2. Установим права по умолчанию (Default ACL) на чтение и выполнение для пользователя apache в нужной директории: setfacl -d -m u:apache:rx /temp_files/bisonline/
  3. Проверим установленные права командой getfacl /temp_files/bisonline/.

Флаг -d указывает, что это правило «по умолчанию». Теперь каждый раз, когда 1С вызывает Записать(), файловая система Linux будет автоматически добавлять права для apache, даже если 1С об этом «не знает».

Почему не стоит использовать внешние команды?

Выясним причину, по которой использование ЗапуститьПриложение("chgrp...") или chmod после записи файла является плохой практикой. Во-первых, это создает дополнительную нагрузку на сервер (порождение нового процесса ОС). Во-вторых, возникает «состояние гонки» (race condition): между моментом завершения записи файла методом 1С и моментом выполнения команды смены прав существует короткий промежуток времени, когда файл уже существует, но еще недоступен для Apache. Использование системных механизмов umask, SETGID или ACL исключает эти проблемы, так как права назначаются атомарно в момент создания файла.

Таким образом, мы рассмотрели три эффективных способа настройки прав доступа в Linux для сервера 1С. Выбор конкретного метода зависит от ваших требований к безопасности и сложности структуры каталогов на сервере.

← На главную