image

Возможно, вы слышали много историй про то, как для какой-то крупной компании разрабатывается система, которая потом становится просто неприменимой примерно нигде, включая изначальную компанию.

Мы Гринатом — условно говоря, ИТ-интегратор Росатома, но не только. Наш основной заказчик ставит задачу на отраслевые решения. То есть по факту мы делаем решения для Росатома, но при этом учитываем, что другим российским компаниям они тоже нужны. И в этом месте случается самое интересное: эти решения должны быть конкурентными, применимыми за пределами контура заказчика и вообще работать.

В 2022 году у всех стала «болеть» шина. На самом деле наша история началась в 2017-м, но к 2020 году у нас уже был проект, который можно было доделать до отраслевого решения. А когда доделали — решили вывести его на коммерческий рынок, чтобы шину как продукт могла купить любая российская компания, которой это нужно.

Но у нас в задаче она должна иметь 4-й уровень доверия ФСТЭК и входить в реестр российского ПО.

В общем, мы взяли опенсорсное ядро Apache NiFi под лицензией Apache 2.0, выделили ядро и коннекторы, провели многоступенчатый аудит кода, модифицировали его под локальные требования и засертифицировали во ФСТЭК свой форк, а потом к этой стабилизированной версии дописали всё остальное, что нужно. К слову, лицензия Apache 2.0 позволяет сильно перерабатывать исходный код и распространять результат коммерчески как самостоятельное произведение. Ничего сверхоригинального, но это много довольно тяжёлой работы. Про неё и расскажу подробнее под катом.

Суть задачи


Дано: куча объектов инфраструктуры, связанных напрямую по принципу точка-точка. Это создавало кучу проблем архитектурного уровня, например, если надо было внести какое-то изменение, то нужно было идти в код каждой интеграции и менять все связанные объекты. В 2022 году ещё очень остро встал вопрос ИБ, поэтому пришлось пересмотреть подходы. При интеграциях точка-точка доступы хранятся во всех элементах инфраструктуры, и достаточно выбрать одну самую слабую часть, чтобы получить доступы к ближайшим интегрированным объектам.

Нужна шина, и это понятно.

Требования стандартные:
  • Не брокер, а именно шина.
  • Lowcode + встроенные преобразования форматов.
  • Коннекторы (адаптеры) для стандартных протоколов «из коробки».
  • Гарантированная доставка сообщений.
  • Отказоустойчивость при выходе нод из строя (+ геораспределённость).
  • Масштабируемость.

Чуть более официальные требования:
Технические характеристики
Пользовательское ПО является тонким клиентом и поддерживает работы в следующих средах:
  • Операционные системы семейства Microsoft Windows, Linux (Unix), MacOS и др., поддерживающие работу веб-браузеров.
  • Веб-браузер Mozilla Firefox версии не ниже 70.0, Google Chrome версии не ниже 50.0 или Safari.

Серверная часть может исполняться в следующих ОС:
  • ОС СН Astra Linux Special Edition версии 1.6 «Смоленск».
  • CentOS версии 8.3.
  • РЕД ОС версии 7.2 «Муром».


Функциональные возможности
  • Устойчивость к потерям сообщений.
  • Гибкое управление приоритизацией обработки сообщений.
  • Трансформация передаваемых данных.
  • Интуитивно понятный интерфейс, позволяющий просто создавать новые интеграционные потоки.
  • Внесение изменений в потоки во время выполнения.


Получилась платформа для объединения информационных систем в единое пространство, где есть:
  • Масштабируемость и отказоустойчивость с использованием модели кластеризации.
  • Поддержка расширений — возможность создания собственных процессоров на языке Java.
  • Использование SSL, SSH, HTTPS.
  • Поддержка большинства стандартных протоколов взаимодействия: JMS, HTTP, HTTPS, REST, FTP, FTPS, SFTP, SMTP, POP3, IMAP, JDBC.
  • Синхронный и асинхронный обмен сообщениями.
  • Гибкая ролевая система.

Продукт позволяет интегрировать системы между собой без их доработок. Атом.Мост является связующим звеном для передачи сообщения от одной информационной системы к другой.

В рамках платформы поддерживается взаимодействие по всем стандартным коммуникационным протоколам и ряду специализированных — СМЭВ, SAP RFC, SAP XI.

Задача как таковая встала ещё в 2017 году. Архитекторы заявили, что пора импортозамещаться с SAP PI. На рынке не было готового решения, поэтому предложили допилить напильником несколько кубиков из опенсорса. Точнее, поскольку тогда не было особых стимулов переезжать с немецких решений, до 2019 года задача находилась на исследовании, и активных работ не было. Просто присматривались. В 2019-м это стало проектом.

NiFi


На тот момент со стороны технических требований лучше всего для наших задач подходил движок Apache NiFi. К тому же проект открытый, и можно свободно его использовать в рамках лицензий. Юристы проработали все детали, и в конце 2019-го мы взяли исходные коды NiFi и начали собирать ядро будущего Атом.Моста.

NiFi — опенсорс, он похож на Hadoop, если сильно прищуриться, при этом NiFi — на одной стороне Волги, Hadoop — на другой, а между ними — туман. Но там полноценные коннекторы к Cassandra, Mongo, ElasticSearch, Kafka, RabbitMQ и ещё десяткам систем. Есть богатое API для создания модулей, есть преобразование данных, есть GUI для настройки потоков данных (достаточно быть аналитиком, и даже не надо разрабатывать или знать встроенный язык либо регулярные выражения) и так далее.

image

То есть в идеальном мире мы взяли бы NiFi, снабдили кучей своих плагинов и выкатили на прод. И это в полной мере решило бы задачу.

Но мир неидеален


Когда вы делаете что-то для корпорации вроде Росатома, то нельзя просто взять опенсорсный продукт и выкатить его на прод. С 2022 года нельзя вдвойне, потому что требуются очень внимательная проверка и переработка кода через РБПО (разработка безопасного ПО).

Во-первых, код опенсорса постоянно обновляется, и вы не всегда можете отследить зависимости третьего и дальше порядков. Решение — стабилизировать версию и втягивать обновления крупными релизами через аудит кода.

Во-вторых, даже если вы так сделаете, то это хорошо работает для некоторых компаний, но далеко не для всех. Для нескольких нужен аудитор, которому все доверяют. В России для компаний с госучастием это ФСТЭК. Они обещают, что в коде не будет закладок и уязвимостей (точнее, по факту они обещают, что проверят это насколько могут), и после сертификации ФСТЭК решения можно использовать железобетонно. В смысле на проверках вас не накрячат за то, что вы приняли в эксплуатацию какой-то левый софт.

В этих условиях мы сделали следующее:
  1. Отделили ядро NiFi (сам движок) от всех интерфейсов (процессоров и адаптеров).
  2. Доказали, что все требования безопасности относятся именно к ядру, то есть адаптеры не требуют отдельной сертификации.
  3. Прогнали очень большое количество тестов ядра в собственной лаборатории.
  4. Засертифицировали ядро во ФСТЭК.
  5. Доработали собственные адаптеры (в основном к SAP-стеку). Были разработаны коннекторы для протоколов SAP — XI и RFC, позволяющие переносить существующие интеграции с SAP без доработки бизнес-систем.

Как проходили сертификацию


Опенсорсное ядро достаточно хорошо, но, как показывает практика, случается всякое. Нужны доказательства. Вот, например, история про внедрение бэкдора в одну из популярных nix-библиотек и включение этой библиотеки в Debian.

Собственно, нужно убедиться самим, а потом отдать проверенное во ФСТЭК.

Во-первых, наши эксперты читали код.

Во-вторых, мы прошлись по этому коду статическими анализаторами.

В-третьих, наши безопасники написали обширную программу тестов для испытательной лаборатории на своих стендах.

Это вызывало очень необычное распределение ролей: если разработку (отделение ядра и написание коннекторов) делали пять человек, то ещё около 20 занимались безопасностью.

От испытательной лаборатории, где были проведены ревью, статический и динамический анализы кода, получили около трёх тысяч замечаний.

Вот примеры:

image

Из этого было что-то важное:

image

И что-то не очень:

image

Больше всего проблем было с тем, как пофиксить то, что находил статический анализ, и при этом не поломать всю остальную систему. Ещё нюанс с «количествами»: если минорная ошибка, например, в количестве 300 штук, то это, стало быть, надо было пофиксить 300 штук мест, при этом часто однотипно, а как следствие можно запутаться в правках. Там, где копипаст несильно работает, нужно по коду править очень внимательно. Вот это вот «много плюс внимательно» — это довольно сложно.

Ещё одна особенность — статический анализ, конечно, классная штука, но сложнее всего находить те баги, которые он не видит.

По юнит-тестам: сложно было увеличить процент покрытия. Начинали там вообще с 10–20 %, а без юнит-тестов фаззинг-тесты делать несильно понятно как. То есть «одна сложность тянет за собой вторую», и это нарастает, как снежный ком.

Ещё было сложно фиксить баги сборки, то есть когда в результате в дистрибутив попадали не те артефакты, которых ожидали. Особенно речь идёт про nifi-assembly — блок в ванильном дистрибутиве исходников, который выпил нам много крови.

Было то, что статанализ видел как ошибку, но ошибкой оно не являлось:

image

А в конце этих работ нужно было составить список документов для сертификации. «Покрыть документацией» — это далеко не так просто, как вы думаете. Конкретно нужны были:
  • Функциональная спецификация.
  • Базовый модульный проект.
  • Руководство администратора.
  • Описание инструментальных средств разработки.
  • Руководство пользователя (оператора) по эксплуатации.
  • ПМИ функционального тестирования.
  • Спецификация.
  • Руководство по безопасной разработке продукта (GADF).
  • Документ «Описание архитектуры безопасности».
  • Анализ влияния обновлений на безопасность.
  • Ведомость эксплуатационных документов (ВЭД).
  • Технические условия.
  • Описание применения (продукта).
  • Описание программы.
  • ПМИ на проникновение.
  • Протоколы функционального тестирования.
  • Протоколы тестирования на проникновение.
  • Формуляр.
  • Документ «Модель безопасности».
  • Документ «Анализ скрытых каналов».
  • Документ «Процедуры устранения недостатков».
  • Регламент безопасной разработки.

Очень важно, что документы и анализ кода — это связанные вещи, потому что какие-то типы уязвимостей можно устранять регламентом работы (например, тем, что с системой работает оператор в кабинете, закрывающемся на ключ в охраняемом здании: я утрирую, но это реально где-то ослабляет требования к коду). Где-то нужно указывать ошибку и составлять отчёт: баг видим, незначительный, на функции безопасности не влияет, исправления не требует… и вообще это фича.

Затем всё это в собранном протестированном виде уехало во ФСТЭК. После всех мучений длиной почти в год получили документ, что соответствуем.

Всё это случилось в 2021 году.

Внедрение


Есть SAP-шина, рядом стоит наш Атом.Мост. Мы взяли в команду около 35 стажёров, они брали потоки SAP и аккуратно переводили уже на российский Атом.Мост. Что-то автоматизацией покрывалось хорошо, что-то — не очень. Стремимся всё автоматизировать, конечно, чтобы дальше на коммерческом рынке были инструменты для миграции с SAP’а на Мост.

Затем после описания потока меняли эндпоинт. С точки зрения владельцев систем, ничего не менялось. Система переключалась и работала дальше. Как исходная сборка думала, что стучит в SAP-шину, так и продолжает думать — никаких изменений.

Дальше стали копиться запросы новых фич и особенности, которые хорошо бы включить в следующий релиз. А, напомню, релиз ядра — это проблема, потому что нужно заново проходить сертификацию. Конечно, это уже не с такими болями, как в первый раз, но всё равно долго, сложно и дорого.

Поэтому всё, что можно сделать без изменения ядра, делается без изменения ядра, чтобы не затрагивать функции безопасности. Из важных апдейтов — прикрутили Graylog (продукт по управлению логами, предупреждениями и уведомлениями) и с помощью него сделали мониторинги.

Следующая версия, которую уже делаем, — там внушительная часть доработок от ядра 2021 года. Наша задача — органично связать бизнес-мониторинг с ядром. Сейчас сообщения с ошибкой отправляются в Graylog, но нет возможности сделать прямую линку на ошибку, чтобы перейти в конкретный объект. Приходится искать по идентификатору. Это усложняет работу поддержки. Есть сложности с навигацией: Атом.Мост — самодокументируемый, и нет необходимости писать документацию к потокам. Но потоки собираются из кубиков, и там сложная система вложений. Может быть до 10 иерархических уровней, и это затрудняет чтение. Хотим приделать модуль, чтобы навигация была удобнее, каталогизировать потоки. Добавляем автоматизацию управления конфигурациями, чтобы Мост запускался, как сервис с управлением, из одной точки (совместимость с оркестратором). Есть особенности маппинга SAP, нельзя править из Моста (можно только читать), а хотелось бы менять. Сейчас будем делать маппинг, что позволит из двух табличек связывать поля перетаскиванием стрелочек, а на самих стрелочках можно будет рисовать функции, что делать с полем. Добавляем совместимость со СМЭВ — это требования заказчиков.

Итог


Готово!

Как я уже говорил, по стратегии Росатома к внутренним решениям есть требование, чтобы они были применимы и конкурентоспособны и на коммерческом рынке. Это определяет уровень качества ПО. Мы начинали с решения для атомной отрасли, а выросли в продукт, который, как показало общение с сообществом, интересен и другим компаниям, кроме Росатома. Поэтому мы продаем шины всем, кому это актуально. Посмотреть можно тут, если что.

Комментарии (26)


  1. Manguss
    06.06.2024 08:12

    Очень подробно и качественно рассказали что же сделано, почему продукт на OpenSouce основанный стоит денег и в чем ценность проделанной работы. Было дело изучал представленные на рынке решения шины данных, у многих компаний в основе NiFi, те же UseTech и ArenaData, но они не смогли вот так классно показать что же они сделать и какую ценность это несет для нас как покупателя.


  1. Ares_ekb
    06.06.2024 08:12

    Подскажите, если не секрет, какую JDK вы используете? OpenJDK или другую? Какую версию (11, 17, 21)? Должна ли JDK тоже иметь сертификат ФСТЭК?

    И как реализовывали аутентификацию? Использовали ли что-нибудь типа Keycloak?


    1. IlVlaSmirnov Автор
      06.06.2024 08:12
      +1

      Liberica 11 или 11 из репозитория сертифицированной ОС. Должна иметь сертификат ФСТЭК. Мы используем внешнюю систему аутентификации Атом.ИД.


  1. vazir
    06.06.2024 08:12

    Радостно за вас конечно, что проект с открытым кодом вам помог сделать востребованный коммерческий продукт с закрытым кодом. Но все же интересно, а хотя бы чтото вы отдали назад в комьюнити, части кода улучшающие оригинальный проект?


    1. rsashka
      06.06.2024 08:12

      проект с открытым кодом вам помог сделать востребованный коммерческий продукт с закрытым кодом

      Закрытым продуктом это назвать нельзя до тех пор, пока законному пользователю не откажут в получении исходников, нарушив тем самым свободную лицензию. Может будь они передали исходники заказчику? Или исходники заказчику они и нафиг не нужны, лишь бы решение работало?

      А вы сразу ярлык навешиваете.


      1. vazir
        06.06.2024 08:12

        Что вы там себе навоображали страшно представить, но для общего образования сначала хотя бы поинтересуйтесь чем открытые лицензии друг от друга отличаются, и что требуют, а в особенности указанная лицензия Apache 2.0, а потом на каких принципах развития зиждется опенсорс, и сможет ли он развиваться если все будут только потреблять. Так же мой вопрос, был ли "хоть какой то payback в открытый исходный проект". Так что, я не о том спрашивал топикстартера. Вообще не о том.


        1. rsashka
          06.06.2024 08:12
          +1

          А вы ни о чем не спрашивали, а сразу кинули топикастеру непонятную предьяву как раз из-за собственного непонимания ограничений у разных типов свободный лицензий.

          Потрудитесь хотя бы для собственного образования выяснить, в каких случаях у создателя производного продукта под свободной лицензией возникают обязанности в публикации исходников.


          1. vazir
            06.06.2024 08:12

            Я где-то упоминал обязанности? Или публикацию исходников... Вроде на русском языке все написал... Удачи вам, и хорошего настроения.


            1. rsashka
              06.06.2024 08:12

              Или публикацию исходников... Вроде на русском языке все написал...

              Вы уже успели забыть, что сами же и написали комментарием выше? "Но все же интересно, а хотя бы чтото вы отдали назад в комьюнити, части кода улучшающие оригинальный проект?"

              Да, да и вам удачи


              1. PereslavlFoto
                06.06.2024 08:12
                +4

                Вопрос, по сути, такой. Авторы статьи нашли в программе множество ошибок, поэтому внесли в неё множество исправлений. Сколько этих исправлений были включены в исходный вариант программы?


              1. vazir
                06.06.2024 08:12
                +2

                Не смотря на то что вы подменяете понятия, и просто закусились, в желании быть правым любой ценой, видимо возрастное... Просто разверну вопрос. Для топикстартера, не для вас... Ребята использовали открытый проект, отлично, на то он и открытый, и это хорошо. Никаких обязательств по публикации кода нет, это лицензия апач, для того она и создана, используем практически как хотим. Вообще ничего плохого нет. Похоже что провели огромную работу по анализу кода, возможно что-то доделали в основном коде, исправили, улучшили. Учитывая это, не выкладывая весь сорс, особенно вероятно там есть некие требования от росатома по данной теме. Но очень вероятно есть части, особенно относящиеся к основному, открытому проекту, которые можно улучшить их патчами, улучшить для всего мира, и вопрос был, сделали ли они что-то такое или нет. Был ли хоть какой то вклад, обратно в проект или его небыло.


                1. Ares_ekb
                  06.06.2024 08:12
                  +2

                  Был ли хоть какой то вклад, обратно в проект или его небыло

                  Понятно, что мой комментарий немного не в тему и ваш вопрос о другом.

                  Но по моему опыту не всегда легко сделать этот обратный вклад в проект. Pull реквесты могут очень долго рассматриваться и не приниматься. И дело не в том, что они недостаточно качественные или нужные, а просто у мейнтейнеров нет времени и мотивации их рассматривать.

                  На мой взгляд, более предпочтительно как-раз отправить pull реквест, а не делать свой форк, потому что запаришься потом обновлять форк из исходного репозитория.

                  Словом не всегда такая ситуация, что люди берут открытый код, улучшают его и не хотят ни с кем делиться. Бывает наоборот, что очень хочется поделиться, чтобы упростить себе работу, но для этого много препятствий


    1. IlVlaSmirnov Автор
      06.06.2024 08:12
      +5

      Да, есть у нас «технический долг» перед сообществом.

      Планируем его начать постепенно закрывать с осени. Сейчас проект уже достаточно зрелый, чтобы мы могли начать это делать.


  1. nerudo
    06.06.2024 08:12
    +1

    Какую классную работу вы проделываете и как недорого!


    1. Tufed
      06.06.2024 08:12

      Это человеко-часы инженегров стоят недорого. А сам продукт и тем более внедрение стоят минимум 7-значных чисел. За меньшее никто не возьмётся делать.


  1. dbalabolin
    06.06.2024 08:12

    Читаю и вспоминаю фразу Квинто из фильма «Ва банк».

    и никаких собственных идей

    Надерганцы. А сами то что?


    1. Foxchasing
      06.06.2024 08:12

      Исходя из вашего бесполезного комментария можно сделать вывод, что вы вообще не понимаете как работает вся индустрия.


      1. dbalabolin
        06.06.2024 08:12

        Это шлакоделы без собственных идей. Пустое место в индустрии. Я то как раз без всяких гос денег выпускаю и контроллеры и протоколы и все это еще и экспортирую.
        А гос навозные жуки тырят код.


        1. Foxchasing
          06.06.2024 08:12
          +1

          Вы обычный пустозвон без понимания как работает IT индустрия в целом, не вам рассуждать, кто пустое место в индустрии, а кто нет. Интересенько, как это можно украсть код Apache или BSD? Ну покажите пример, что, как и где выпускаете, куда экспортируете, а не пустозвоньте.

          Судя по профилю, вы не в состоянии делать хоть что-то, кроме как генерировать словесный мусор.


      1. dbalabolin
        06.06.2024 08:12

        А тырят именно потому что вместо разработки нового которое на 50 лет вперед будет работать просто ковыряют старое говно древнее и радуются. Радоваться надо когда ваш код будут переделывать что бы украсть.


        1. Foxchasing
          06.06.2024 08:12

          Опять поток сознания, который ровным счётом ничего не значит.


  1. Mane0
    06.06.2024 08:12

    Добрый день. Подскажите, а все эти проверки анализаторами нужно выполнять и для всех зависимостей продукта?


    1. IlVlaSmirnov Автор
      06.06.2024 08:12

      Да, для всех зависимостей. При сборке используется внутренний корпоративный артефакторий и внешние артефакты, которые тащатся с Maven Централа, проверяются, сканируются, и в случае нахождения уязвимостей, мы уже принимали решение о замене артефактов версий и т. д., и т. п.


  1. atshaman
    06.06.2024 08:12

    А какой NiFi взят за основу, и как собираетесь бежать за апстримом, если не секрет?


    1. IlVlaSmirnov Автор
      06.06.2024 08:12

      За основу был взят 1.12.1. За мейнстримом бежать приходится шагами крупными. Это связано с ФСТЭКом. Ядро раз в месяц сертифицировать невозможно. То есть следующая версия будет строиться на основе NiFi 2.0.+


  1. AndreySavinykh
    06.06.2024 08:12
    +1

    Немного странно выбирать за базу NiFi , который изначально предназначается вообще-то для ETL процессов ... Понятно, что все сделать. Но чем не устроил camel тот же, например, в сочетании с Kafka/activemq ?

    И, если не секрет, замеряли пиковую производительность обмена (сообщений в сек)?