Служебные http-сервисы, которые работают даже в заблокированной базе
В этой публикации описывается опыт доступа к служебным http-сервисам в обход установленной блокировки информационной базы.
- Описание
- Подробнее
Описание
Я привык автоматизировать свою работу, поэтому в моих рабочих базах живет http-сервис для централизованного управления расширениями, внешними обработками, получения всякой нужной и ненужной информации, вроде настройки платформенной истории данных или записей журнала регистрации. В рамках этой статьи не важно, что именно. Важно, что этот сервис выполняет какое-то полезное дело, но нужен только для администрирования.

На скрине ниже показан одна из команд этого сервиса, Help, выводящая список доступных команд (попытка самодокументирования).

Уточню, на скрине выше и далее, если скрин касается выполнения запроса к http-сервису, изображена программа Insomnia (insomnia.rest).
Если в данный момент база заблокирована (установлена блокировка сеансов с кодом разрешения), http-сервис ожидаемо не работает:

Как быть в такой ситуации? Я — администратор системы и я точно знаю, что мне можно в данный момент пользоваться http-сервисом. Я сам включил блокировку сеансов, собираюсь устанавливать релиз или осуществлять прочие административные действия, но неплохо было бы, если бы мой служебный сервис не прекращал в это время работу.
Обычно это решается тонкой настройкой публикации на веб-сервере, где в vrd файле описывается авторизация и/или код разрешения для входа в обход установленной блокировки. Однако рабочие базы уже опубликованы, причем все сервисы в одной публикации. Администрированием веб-сервера я не занимаюсь, а объяснить, что нужно сделать админам, чтобы опубликовать нужный сервис отдельно — целый квест.
Но ведь публикация базы на веб-сервере — это по сути создание промежуточной точки доступа для клиента. Клиент обращается к веб-серверу, веб-сервер поднимает исполняемый файл, который общается уже с сервером 1С. Раз клиент-серверная архитектура подразумевает множество клиентов, почему бы не организовать отдельное подключение для нашего случая?
Для организации своей отдельной публикации воспользуемся докером и замечательной статьей Запуск Apache 2.4 с модулем 1С внутри Docker контейнера.
Далее я тезисно опишу, что нужно сделать, подробности ищите в вышеупомянутой статье.
1. Создадим каталог, в котором будут все нужные конфигурационные файлы. Я назвал ее NEW_PUBLICATOR.

2. Скачаем файлы платформы для установки 1С. Для это воспользуемся замечательным библиотекой Yet another release downloader (YARD) на oscript. (У всех же установлен oscript, да?)
Установим последнюю версию библиотеки:
opm install yardИ в созданном ранее каталоге вызовем команду:
yard releases --user "userITS" --pwd "passITS" get --app-filter "Технологическая платформа 8.3" --version-filter 8.3.18.1208 --path ".\distr\" --distr-filter "Cервер 1С:предприятия \(64-bit\) для DEB-based"Здесь userITS и passITS нужно заменить на свои, ну и конечно указать нужную вам версию платформы.
В результате в каталоге появится папка distr, содержащая установочные файлы 1С.

3. Опишем в vrd файле подключение к нашей базе, код блокировки указываем примерно так же, как мы указываем в ключах командной строки при запуске заблокированной базы, параметром UC, но с учетом синтаксиса файла:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/new"
ib="Srvr="N26701V";Ref="new";UC="kod_razresheniya"">
<debug enable="true"
protocol="tcp"
url=""/>
<httpServices publishByDefault="false">
<service name="ПомощникАдминистрирования"
rootUrl="AdminHelper"
enable="true"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
</httpServices>
</point>4. Создадим файл для настройки веб-сервера Apache httpd.conf, полный листинг файла прячу за спойлером. Файл стандартный, в конец добавляем вызов модуля 1С и описание публикации:
LoadModule _1cws_module /opt/1cv8/x86_64/8.3.18.1208/wsap24.so
# 1c new
Alias "/new" "/usr/local/apache2/htdocs/new/"
<Directory "/usr/local/apache2/htdocs/new/">
AllowOverride All
Options None
Require all granted
SetHandler 1c-application
ManagedApplicationDescriptor "/usr/local/apache2/htdocs/new/default.vrd"
</Directory>Полное содержимое файла:
