При переводе серверов 1С:Предприятие на операционную систему Linux технические специалисты часто сталкиваются со следующей задачей: необходимо обеспечить доступ сервера приложений к сетевой папке, расположенной в инфраструктуре Windows (например, для выполнения обменов РИБ, выгрузки отчетов или хранения файлов). В операционной системе Windows мы привыкли использовать стандартные сетевые пути формата \\server\share. Однако Linux-сервер напрямую работать с такими путями в коде 1С не сможет.
В этой статье мы подробно разберем, как правильно решить эту задачу, избежав при этом типичных проблем с правами доступа, нестабильностью сетевого соединения и безопасностью учетных данных.
Для того чтобы сервер 1С под управлением Linux мог работать с сетевой папкой Windows, как с обычным локальным каталогом, эту папку необходимо примонтировать в файловую систему Linux. Выясним причину, почему это лучшее решение: в таком случае для самой платформы 1С путь к файлам будет выглядеть как стандартный локальный путь Linux, например: /mnt/win/RIB. Это полностью исключает необходимость переписывать программный код конфигураций под особенности сетевых протоколов.
Рассмотрим по шагам, как выполнить базовое монтирование сетевого ресурса Windows (SMB/CIFS) на сервере Linux.
Для начала создадим локальный каталог, в который будет монтироваться сетевая папка. Выполним в консоли Linux команду от имени суперпользователя:
mkdir -p /mnt/win
Теперь проанализируем базовую команду монтирования, которая предлагалась в обсуждении на форуме:
mount -t cifs //server/ts/RIB /mnt/win/ -o dom=DOMAIN,user=USER,pass=PASS
Обратите внимание на важный совет из обсуждения: крайне рекомендуется переименовать сетевую папку на стороне Windows так, чтобы в ее имени использовалась только латиница (например, заменить "риб" на "RIB"). Использование кириллицы в сетевых путях при работе с Linux часто приводит к труднодиагностируемым ошибкам кодировки.
Хотя базовая команда позволяет быстро проверить доступ к ресурсу, для реальной промышленной эксплуатации сервера 1С ее использовать нельзя. Проанализируем типичные проблемы базового монтирования и разберем способы их устранения.
Если выполнить монтирование от имени суперпользователя root без указания дополнительных параметров, владельцем всех файлов в примонтированной папке станет root. Сервер 1С:Предприятие на Linux запускается под системным пользователем (обычно это usr1cv8, входящий в группу grp1cv8). В результате служба 1С не сможет записать ни одного файла в сетевую директорию и вернет ошибку прав доступа.
Выясним, как решить эту проблему. Перед монтированием нам необходимо узнать идентификаторы (UID и GID) пользователя, под которым работает сервер 1С. Выполним в терминале команду:
id usr1cv8
В ответ система вернет числовые значения, например: uid=995(usr1cv8) gid=1002(grp1cv8). Теперь мы можем использовать эти данные при монтировании, явно указав их в параметрах. Дополнительно заставим Linux принудительно назначать владельцем создаваемых файлов именно нашего пользователя с помощью опций forceuid и forcegid:
mount -t cifs //server/ts/RIB /mnt/win/ -o user=USER,pass=PASS,uid=995,gid=1002,file_mode=0777,dir_mode=0777,forceuid,forcegid
Участники обсуждения справедливо отмечают, что если Windows-сервер перезагрузится или на сетевом оборудовании произойдет кратковременный сбой, смонтированная вручную папка "отвалится". Сервер 1С потеряет доступ к файлам, что приведет к аварийному завершению фоновых заданий или обменов данными.
Для решения этой проблемы мы откажемся от жесткого статического монтирования при загрузке и настроим современный механизм автоматического монтирования по требованию с помощью systemd.automount. Этот способ монтирует сетевую папку только в тот момент, когда к ней обращается сервер 1С, и автоматически восстанавливает подключение в случае сетевого сбоя.
Для настройки отредактируем конфигурационный файл /etc/fstab. Добавим в него параметры автоматического монтирования:
noauto,x-systemd.automount,x-systemd.device-timeout=10,_netdev,nofail
Разберем, за что отвечает каждый параметр:
/mnt/win.Указывать имя пользователя и пароль от Windows-ресурса открытым текстом в конфигурационном файле /etc/fstab крайне небезопасно, так как этот файл доступен для чтения всем пользователям системы. Для защиты учетных данных создадим отдельный файл конфигурации, например /etc/1c-cifs.cred:
username=WINDOWS_USER
password=WINDOWS_PASSWORD
domain=DOMAIN_NAME
Установим жесткие права доступа на этот файл, разрешив его чтение только суперпользователю root:
chmod 600 /etc/1c-cifs.cred
После этого в параметрах монтирования вместо user=... и pass=... мы будем использовать безопасную опцию credentials=/etc/1c-cifs.cred.
Современные версии Windows Server по умолчанию отключают устаревший протокол SMBv1 (CIFS) из соображений безопасности. Чтобы избежать ошибок подключения, обязательно укажем современную версию протокола в параметрах монтирования с помощью ключа vers=3.0.
Кроме того, для стабильной работы СУБД и файловых операций сервера 1С рекомендуется применить специфичные настройки оптимизации блокировок:
uid/gid и не конфликтовать со специфичной файловой системой NTFS на Windows.Посмотрим на пример правильной итоговой конфигурации. С учетом всех разобранных факторов и оптимизаций, строка подключения в файле /etc/fstab должна выглядеть следующим образом:
//server/ts/RIB /mnt/win cifs noauto,x-systemd.automount,x-systemd.device-timeout=10,_netdev,nofail,credentials=/etc/1c-cifs.cred,uid=995,gid=1002,file_mode=0777,dir_mode=0777,forceuid,forcegid,vers=3.0,nobrl,nounix,soft 0 0
После внесения изменений в файл /etc/fstab выполним команду перезапуска конфигурации systemd, чтобы применить настройки автомонтирования:
systemctl daemon-reload
systemctl restart remote-fs.target
Теперь при первой же попытке обращения сервера 1С (или любого пользователя) к локальному пути /mnt/win операционная система Linux автоматически инициирует безопасное и стабильное подключение к Windows-шаре \\server\ts\RIB с корректными правами доступа для пользователя usr1cv8.