Сервер УТМ

Общие положения

Основные термины и понятия

  • Универсальный транспортный модуль (УТМ) – программное средство, обеспечивающее транспорт данных из баз данных пользователя к серверу ЕГАИС.
  • “Клиент-пользователь” – программное средство, которому необходимо предоставить удаленный доступ к УТМ. Это может быть СУБД пользователя (1С), браузер или что-то иное.
  • “УТМ-Провайдер” – клиент-серверное программное средство для удаленного доступа и мониторинга набора УТМ.
  • “УТМ — клиент” – приложение — клиентская часть “УТМ — провайдера”, работающее в инфраструктуре (в локальной сети или на локальном компьютере) с конкретным УТМ.
  • “УТМ — сервер” – приложение – серверная часть “УТМ — провайдера”, работающее в произвольной инфраструктуре и обеспечивающее подключение к себе “УТМ — клиента”, “Клиент-пользователя” и позволяющее транслировать запросы одного из них другому.

Сокращения

  • УТМ — Универсальный транспортный модуль
  • РИБ — Распределенная информационная база
  • SaaS — Software as a service — программное обеспечение как услуга

Область применения. Решаемые задачи

На текущий момент существует несколько групп потенциальных клиентов, которым может понадобиться описываемая система:

  • Клиенты, имеющие разветвлённую сеть филиалов, территориально удаленных от головной организации, на которых установлены УТМ.
  • Клиенты, ведущие учет в “облачных” системах (модель SaaS), при которых работа производится в тонком или веб-клиенте, не позволяющим получить доступ к УТМ на стороне клиента.
  • Другие клиенты, которым нужно средство мониторинга функциональности и быстродействия своих УТМ.

Вышеперечисленные клиенты могут решать свои проблемы с УТМ различными средствами (выставление УТМ в Интернет напрямую через “белый” IP, организацию vpn –соединений между 2 локальными сетями, организацию распределенных информационных баз, и.т.д.), что неизбежно приводит к снижению производительности, безопасности и усложняет структуру учета. Для борьбы с вышеперечисленными проблемами и был создан “УТМ-Провайдер”, цели создания которого можно перечислить пунктами:

  • Удаленные доступ к УТМ (одному или нескольким), находящимся в другой локальной сети через: Интернет без использования специфических средств доступа (vpn) и их настройки.
  • Отказ от создания сети РИБ
  • Удаленное управление пулом УТМ
  • Сбор статистики (функционирование, быстродействие) работы УТМ

Характеристики ПО “УТМ-ПРОВАЙДЕР”

Схема общей инфраструктуры взаимодействия компонентов УТМ-Провайдера

Попробуем расписать данную схему подробнее. Изначально УТМ –мы работают в своих локальных сетях, пользователи напрямую обращаются к ним. С введением “УТМ-Провайдера”, с УТМ-мами начинают работать “клиенты УТМ”, которые с одной стороны, подключаются как клиенты к УТМ, с другой стороны, как клиенты, подключаются к серверу УТМ, находящемуся в интернете. Именно подключение к “серверу УТМ”, как клиент, позволяет игнорировать ограничения NAT. Затем, пользователь обращается к серверу УТМ, который транслирует запрос пользователя на Клиента УТМ, который транслирует запрос в УТМ. Аналогично, ответ из УТМ транслируется в “УТМ Клиент”, далее в “УТМ Сервер” и далее – пользователю. Это общая схема работы.

Вопросы безопасности

Разделенный доступ к УТМ

Так как архитектура решения предполагает использование одного “Сервера УТМ” для нескольких “Клиентов УТМ”, было решено сделать http-авторизацию при подключения пользователя к “Серверу УТМ”. При этом логином будет выбран FSRAR_ID клиента-организации, а пароль будет требоваться в обязательном порядке в виде его MD5-хеша. О организации авторизации будет описано подробнее ниже.

SSL шифрование

Так как данные, передаваемые в УТМ будут передаваться через интернет, было решено выполнять их шифрование согласно протоколу SSL (версия TLS1.2) для предотвращения их перехвата и доступа сторонним лицам. Данные шифруются на этапе передачи от “Клиента УТМ” к “Серверу УТМ” и, опционально, от “Сервера УТМ” к пользователю (могут и не шифроваться, если пользователь и “УТМ Сервер” находятся в одной локальной сети.

Обмен сертификатами

Так как данные, передаваемые в УТМ будут передаваться через интернет, было решено выполнять их подпись для предотвращения их подмены “клиентов УТМ” сторонними фальшивыми клиентами, а также “Серверов УТМ” сторонними фальшивыми серверами. Данные подписываются на этапе передачи от “Клиента УТМ” к “Серверу УТМ” и, опционально, от “Сервера УТМ” к пользователю (могут и не подписываться, если пользователь и “УТМ Сервер” находятся в одной локальной сети. Каждому “Клиенту УТМ” выдается подписанный сертификат, работающий только на конкретном клиенте. Аналогично с “Сервером УТМ”. Важно отметить, что данные сертификаты являются самоподписанными и выдают предупреждение при подключении к серверу УТМ из браузера, на которое следует добавить данный сертификат в исключения браузера.

Клиентская часть ПО “УТМ-ПРОВАЙДЕР” (“УТМ-КЛИЕНТ”)

Клиентская часть (“УТМ Клиент”) представлена отдельным исполняемым файлом “UTMProviderClient.exe” и выполняется в инфраструктуре УТМ. “УТМ Клиент” работает с конкретным экземпляром УТМ и может выполняться как на рабочей станции УТМ, так и на прочей рабочей станции в локальной сети. Если “УТМ Клиент” выполняется на рабочей станции с УТМ, он будет собирать статистику и быстродействие УТМ, а также обеспечивать удаленный доступ. Если “УТМ Клиент ” выполняется на отдельной машине и имеет доступ к УТМ посредством локальной сети, то статистику и быстродействие он снимать не будет. Выполняться может как служба Windows, так и отдельно стоящее приложение, запускаемое с ключом “-application” командной строки и имеющее интерфейс с текущим логом и настройками:

Клиент поддерживает повторные подключения к УТМ и “УТМ Серверу” в случае обрыва связи, свертывание в системный трэй при минимизации окна, а также ведения лога в интерфейс, в файлы на локальном диске. А также передача логов на “УТМ сервер” и дальше, пользователю по запросу:

Серверная часть ПО “УТМ-ПРОВАЙДЕР” (“УТМ-КЛИЕНТ”)

Серверная часть (“УТМ Сервер”) представлена отдельным исполняемым файлом “UTMProviderServer.exe”. “УТМ Сервер” работает с множеством экземпляров “УТМ Клиентов” и может выполняться как на рабочей станции в интернете, так и на рабочей станции в локальной сети пользователя. Выполняться может как служба Windows, так и отдельно стоящее приложение, запускаемое с ключом “-application” командной строки и имеющее интерфейс с текущим логом и настройками:

В интерфейсе можно увидеть список подключённых/авторизованных “Клиентов-УТМ”, по нажатию на который можно увидеть его параметры. Это могут быть логические параметры:

системные:

и лог обмена с клиентом:

Также, в случае возникновения каких-либо проблем с УТМ, данный Клиент УТМ выделяется красным цветом в списке клиентов, а в параметрах УТМ возникает подсказка по проблеме:

Также, из системных параметров можно отправить команды УТМ-у, такие, как запуск, перезапуск и остановку УТМ:

Интерфейс удаленного доступа к “УТМ-СЕРВЕРУ”

Помимо типового доступа учетного ПО (пользователя) к серверу УТМ для обмена с РАР УТМ, есть отдельный интерфейс доступа, реализующий функционал, аналогичный приложению Сервера УТМ. Интерфейс реализован в виде обмена запрос-ответ пакетами XML, посылаемыми на адрес “/UTM_Management”. Формат пакетов обмена в виде xsd файла приведен в приложении 1. Пример реализации удаленного доступа приведен в виде обработки 1С и доступен для просмотра:

Приложение 1. Схема XSD удаленного администрирования сервера УТМ

<xs:schema 
    xmlns:tns="http://www.ejoff.ru/UTM_Management" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"            
    targetNamespace="http://www.ejoff.ru/UTM_Management" 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified">
    <xs:simpleType name="ИдентификаторФСРАР">
        <xs:restriction base="xs:string">
            <xs:maxLength value="50" />
            <xs:pattern value="[0-9]+" />
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="Клиент">
        <xs:sequence>
            <xs:element name="UTMLogicStatus" type="tns:ЛогическийСтатусКлиента" />
            <xs:element name="UTMSystemStatus" type="tns:СистемныйСтатусКлиента" />
            <xs:element name="FSRARID" type="tns:ИдентификаторФСРАР" />
            <xs:element name="Description" type="xs:string" />
            <xs:element name="Connected" type="xs:boolean" />
            <xs:element name="Logined" type="xs:boolean" />
            <xs:element name="LastErrorDescription" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Команда">
        <xs:sequence>
            <xs:element name="Address" type="xs:string" />
            <xs:element name="Port" type="xs:string" />
            <xs:element name="FSRARID" type="tns:ИдентификаторФСРАР" nillable="true" />
            <xs:element name="AdminLogin" type="xs:string" />
            <xs:element name="AdminPassword" type="xs:string" />
            <xs:element name="CommandType" type="tns:ТипыКоманд" />
            <xs:element name="Sign" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ЛогическийСтатусКлиента">
        <xs:sequence>
            <xs:element name="UTMVersion" type="tns:ТипВерсияУТМ" />
            <xs:element name="UTMWorking" type="xs:boolean" />
            <xs:element name="PKIDateFiled" type="xs:boolean" />
            <xs:element name="PKIStartDate" type="xs:date" nillable="true" />
            <xs:element name="PKIStopDate" type="xs:date" nillable="true" minOccurs="0" />
            <xs:element name="GOSTDateFiled" type="xs:boolean" />
            <xs:element name="GOSTStartDate" type="xs:date" nillable="true" minOccurs="0" />
            <xs:element name="GOSTStopDate" type="xs:date" nillable="true" minOccurs="0" />
            <xs:element name="InDocCount" type="xs:int" />
            <xs:element name="OutDocCount" type="xs:int" />
            <xs:element name="MinOutQueryTime" type="xs:int" />
            <xs:element name="MaxOutQueryTime" type="xs:int" />
            <xs:element name="AvgOutQueryTime" type="xs:int" />
            <xs:element name="TimeStamp" type="xs:dateTime" nillable="true" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ОтветУТМ">
        <xs:sequence>
            <xs:element name="ClientList" type="tns:СписокКлиентов" minOccurs="0" />
            <xs:element name="ErrorCode" type="xs:int" />
            <xs:element name="Result" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="СистемныйСтатусКлиента">
        <xs:sequence>
            <xs:element name="UTMLocal" type="xs:boolean" />
            <xs:element name="MonitorIsRun" type="xs:boolean" nillable="true" />
            <xs:element name="UpdateIsRun" type="xs:boolean" nillable="true" />
            <xs:element name="TransportIsRun" type="xs:boolean" nillable="true" />
            <xs:element name="TransportReadBytes" type="xs:unsignedLong" />
            <xs:element name="TransportWriteBytes" type="xs:unsignedLong" />
            <xs:element name="TransportCurrentMemory" type="xs:unsignedLong" />
            <xs:element name="TransportMaximumMemory" type="xs:unsignedLong" />
            <xs:element name="DiskFreeSize" type="xs:unsignedLong" />
            <xs:element name="DiskTotalSize" type="xs:unsignedLong" />
            <xs:element name="PageFault" type="xs:unsignedLong" />
            <xs:element name="AvgPageFault" type="xs:unsignedLong" />
            <xs:element name="ErrorCode" type="xs:int" />
            <xs:element name="TimeStamp" type="xs:dateTime" nillable="true" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="СписокКлиентов">
        <xs:sequence>
            <xs:element name="Client" type="tns:Клиент" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="ТипВерсияУТМ">
        <xs:restriction base="xs:string">
            <xs:maxLength value="6" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="ТипыКоманд">
        <xs:restriction base="xs:string">
            <xs:enumeration value="GetClientList" />
            <xs:enumeration value="StartUTM" />
            <xs:enumeration value="StopUTM" />
            <xs:enumeration value="RestartUTM" />
            <xs:enumeration value="GetClientLog" />
            <xs:enumeration value="GetMainLog" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

У вас остались вопросы?

Задайте их любым удобным для вас способом прямо сейчас.

Не нашли то, что искали?

Оставьте свой номер телефона, и мы бесплатно проконсультируем вас по возникшим вопросам.