Редагування groovy скриптів бізнес-процесів в admin-portal

Загальний опис проблеми та рішення

Розробка бізнес-процесів регламенту реєстру включає в себе розробку Groovy скриптів, що відображають логіку роботи кроків бізнес-процесу. Адмін-портал дозволяє проводити розробку бізнес-процесів регламенту реєстру. Набагато ефективніше вести розробку Groovy скриптів в спеціалізованих засобах розробки, таких як IDE (Desktop або Web версії).

Розширення адмін-порталу використанням rich веб редакторів редагування Groovy скриптів покращить user experience до рівня використання Desktop IDE інструментів, а також зменшить час на постійне переміщення скриптів в Desktop IDE для редагування та назад в BPMN.IO візуальний конструктор бізнес-процесів

Результати POC для ознайомлення з LSP протоколом та веб-редактором коду MonacoEditor

Глосарій

  • LSP - Language Server Protocol

  • LS - Language Server

  • WS - WebSocket

  • WSS - WebSocket Secure

Актори

  • Розробник регламенту реєстру

Функціональні можливості редактору

Наступні функціональні можливості в рівній мірі використовуються для двох функціональних сценаріїв: створення нового кроку бізнес-процесу та редагування або перегляд існуючого.
  • Автодоповнення у вигляді випадаючого списку варіантів виклику

  • Відображення результату аналізу коду на наявність помилок за допомогою language server

  • Показ Hoover тултипу з javadoc інформацією

  • Використання різних кольорів при перегляді коду

  • Автодоповнення для DDM JUEL функцій:

    • initiator

    • completer

    • system_user

    • submission

    • sign_submission

    • get_variable

    • set_variable

    • set_transient_variable

    • process_caller

    • message_payload

Основні принципи

  • Monaco editor в якості Web інструменту розробки groovy скриптів

  • Використання сторонніх Language Server’s (LS’s) для отримання підказок, переліку для автодоповнення та результату помилок семантичного аналізу Groovy скриптів

  • Використання Language Server Protocol для комунікації між Language Server та Monaco editor

  • Використання lsp4j для менеджменту (orchestration) LS’s

  • Транспортний протокол комунікації між Monaco editor та LS - WebSocket over HTTP (HTTPS)

  • Логічний протокол комунікації (структура payload в повідомленнях транспортного протоколу) між Monaco editor та LS - Json-RPC

Високорівневий дизайн

bp groovy script editor

Опис та призначення компонентів

Назва Мова програмування Опис

Monaco editor

JavaScript

Візуальний веб-редактор коду

Remote LS’s

Java, LSP4J

Екземпляри LS сервісів, що реалізує LSP протокол та виконують перевірку клієнтського коду з поверненням результатів перевірки в форматі Json-RPC(LSP).

LS Manager, Websocket Manager

Java, Spring

Spring boot web controller. Створює необхідні екземпляри LS. Створює WebSocket та використовує відповідний LS екземпляр для аналізу та перевірки коду з візуального редактору клієнту.

LSP комунікація

  • В якості транспортного протоколу використовується WSS протокол

  • В якості RPC взаємодії використовується LSP протокол версії 3.17

WebSocket комунікація

web sockets diagram
  • В якості транспортного протоколу використовується WSS

  • Для налаштування Web-socket зв’язку зі сторони UI layer використовується monaco-languageclient.

  • Для організації websocket backend частини використовується spring-websocket.

Кількість екземплярів LS

web sockets concurrency diagram
  • Кожне вікно з monaco editor використовує свій окремий web-socket instance для з’єднання з LS

  • Кожний web-socket використовує окремий екземпляр LS.

  • Всі LS екземпляри знаходяться в одному JVM екземплярі. Технічно кожний екземпляр LS це новий екземпляр з інтерфейсом org.eclipse.lsp4j.services.LanguageServer.

bp-script-editing ls-communication-sequence

Розгортання компоненту

ls deployment

Масштабування

В поточній версії розгортання сервісу пропонується використовувати лише вертикальне масштабування (RAM, CPU). Оскільки використовується підхід розміщення всіх LS в рамках однієї JVM, тому не очікується значного збільшення використання обчислювальних ресурсів під час збільшення кількості одночасно працюючих кліентів LS.

Горизонтальне маштабування можливе шляхом додавання Load Balancer для LSP (WebSocket JSON-RPC) трафіку. Out of scope.

Моделювання загроз

Area Назва Опис Значення ліміту

Kong

WSS трафік через Kong

Налаштування пропускання трафіку через admin kong шляхом використання Upgrade headers. WebSocket kong manual

Авторизація під час handshake процесу

Поточна авторизація на admin kong. GET /groovy повинен бути доступним тільки авторизованим користувачам через admin realm

Максимальний розмір запиту

Ліміт для payload всередині LSP (JSON-RPC). Використати Request Size Limiting

65kb (30kb after SC)

Socket timeout

Idle time для сокету, через який він автоматично закривається. Необхідна конфігурація як на BE так і на FE side. Kong config property proxy_read_timeout

60s (should be by default)

Socket open Rate limit

Ліміт на кількість запитів на створення web-socket /groovy. Використати існуючий плагін в Kong Rate limit plugin

10 per minute per user

Java application

Конфігурація CORS

Налаштувати CORS для /groovy методу відкриття web-socket

Chart configuration

RAM limit

Встановити RAM ліміт шляхом налаштування resources.requests.memory в Chart deployment

1GB

Технологічний стек

Назва Версія Ліцензія Опис

Monaco editor

0.34.1

MIT

Візуальний веб-редактор коду

monaco-languageclient

4.0.3

MIT

Language server клієнт, що підключається до Monaco editor та використовується для з’єднання з віддаленими language серверами використовуючи LSP протокол)

vscode-languageclient

8.0.2

MIT

Транзитивна залежність з monaco-languageclient

LSP4J

0.19

Eclipse Public License - v 2.0

Бібліотека для менеджменту екземплярів LS. Використовується для запуску LS коду.

Groovy language server

-

APACHE LICENSE, v2.0

Реалізує LSP протокол та виконую перевірку Groovy коду з поверненням результатів перевірки в форматі Json-RPC

Spring Boot

2.6.1

APACHE LICENSE, v2.0

Розширення до Spring Framework для спрощення побудови аплікацій на базі Spring завдяки автоматичній конфігурації та наявності spring boot стартерів

spring-boot-starter-websocket

2.6.1

APACHE LICENSE, v2.0

Розширення для Spring для менеджменту веб-сокетів в серверних додатках (використовує spring-websocket:5.3.13)

Інтерфейс управління

BPMN.io буде розширено додатковою кнопкою визову модального вікна редагування groovy скриптів.

bp groovy script open window
Figure 1. Вікно визову редактору скриптів бізнес-процесів
bp groovy script edit window
Figure 2. Вікно редагування скрипта в Monaco Editor

Високорівневий план розробки

Необхідні експертизи

  • Java

  • Javascript

  • DevOps

  • QA, AQA

Backend Java activities

  • Створити Spring Boot based backend service ddm-language-server

  • Розробити WebSocket proxy component

  • Підвищити версію LSP4J до 0.19 для GroovyLanguageServer

Javascript activities

  • Інтеграція Monaco editor в BPMN.IO редактор бізнес-процесів

  • Інтеграція Monaco-editor з ddm-language-server використовуючи monaco-languageclient

DevOps activities

  • Onboard https://github.com/GroovyLanguageServer/groovy-language-server: add codebase into gerrit and create pipeline around

  • Створити deploy-templates та Dockerfile для service ddm-language-server (openjdk based image)

  • Конфігурація AdminKong для пропускання трафіку в ddm-language-server. Додати websocket proxy headers в конфігурацію Kong

  • Конфігурація плагінів Kong для перевірки security лімітів

  • Додати в environment-js змінну languageServerUrl з відносною адресою ddm-laguage-server

Безпека

Бізнес Дані

Категорія Даних

Опис

Конфіденційність

Цілісність

Доступність

Проміжні дані бізнес-процесів, що містять відкриту інформацію

Дані бізнес форм та процесів що не містять інформацію з обмеженим доступом

Низька

Висока

Середня

Операційні журнали

Списки зафіксованих/залогованих звернень до сервісу та журнали його роботи

Середня

Висока

Висока

Спрощена модель загроз

groovy TM

Механізми протидії ризикам безпеки та відповідність вимогам безпеки

Ризик

Засоби контролю безпеки

Реалізація

Пріорітет

Порушення цілісності та конфіденційності даних при передачі

Використання HTTPS та WSS

Враховано в початковому дизайні

Високий

Небезпечне завершення сеансу на стороні сервера

Під час виходу з системи ініційованого користувачем або при автоматичному закінченні терміну дії сесії будь-яка комунікація з веб сокетом повинна бути зупинена

Не враховано в початковому дизайні

Високий

Відмова в обслуговуванні через вичерпання обчислювальних ресурсів (DOS) спричинине відсутністю обмежень для веб сокетів

  • Впровадження ліміту на максимальний розмір запиту на рівні 30 kb

  • Час очікування сокету: 60s

  • Обмеження кількості відкритих сокетів на рівні 10 сокетів для одного користувача протягом хвилини

Враховано в початковому дизайні

Високий

Відмова в обслуговуванні через вичерпання обчислювальних ресурсів (DOS) спричинине відсутністю обмежень для сервісу на рівні опеншифту

  • Обмеження споживання оперативної памяті. Сам ліміт повинен бути прорахований після проведення тестування.

  • Обмеження споживання часу процесора. Сам ліміт повинен бути прорахований після проведення тестування.

  • Налаштувати механізм перезапуска сервісу в разі надмірного використання ресурсів.

Враховано в початковому дизайні

Високий

Відмова в обслуговуванні через вичерпання обчислювальних ресурсів (DOS) спричинине відсутністю обмежень для HTTP запитів на рівні інгрес контролеру Kong

  • Обмеження сокету та кількості запитів має бути налаштований окремо на /groovy ендпоінт. Тобто плагін рейт лімітів для Kong має бути налаштований на /groovy

Не враховано в початковому дизайні

Високий

Ризик бекдору у компоненті language-server

  • Вбудувати усі необхідні ресурси та мовні словники для розбору AST в імедж ddm-language-server для запобігання будь-яких звернень цього сервісу до зовнішніх джерел

  • Заборонити на рівні мережевих політик openshift будь яке спілкування сервісу ddm-language-server з зовнішніми ресурсами і дозволити комунікацію з сервісом логування та сервісами задіяними згідно бізнес логіки.

Частково враховано в початковому дизайні. Неодхідно повністю ізолювати сервіс ddm-language-server від зовнішньої мережі

Високий

Ризик виконання вразливості інтерактивних інформаційних систем (XSS)

  • Налатування CORS

Враховано в початковому дизайні

Високий

Ризик розкриття технічної інформації про систему

  • Сервіс має віддавати загальну помилку при появі проблем.

  • Сервіс повинен мати механізм "last resort" який опрацює будь-які помилки які не були опрацьовані до цього.

  • Переконатись що режим DEBUG вимкнений на усіх рівнях у пре-продакшн та продакшн середовищах.

  • language-server не віддає свою версію та будь-яку технічну та/або системну інформацію у HTTP відповіді.

Не враховано в початковому дизайні

Середній

Десеріалізація ненадійних даних

  • Переконатись, що десеріалізація ненадійних даних уникається або захищена як у розробленому коді, так і в бібліотеках сторонніх розробників.

  • Переконатись, що присутня перевірка схеми JSON та вона перевірена, перш ніж приймати введені дані.

Не враховано в початковому дизайні

Середній

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

  • Переконатись, що запити, які містять неочікувані або відсутні Content Types, відхиляються відповідними заголовками (статус відповіді HTTP 406 Неприйнятний або 415 Непідтримуваний тип медіа).

  • Веб сервер приймає тільки затверджені HTTP методи.

  • Переконатись що HTTP відповідь має загловок Content-Type а також безпечний набір символів (наприклад, UTF-8, ISO-8859-1).

  • Веб сторінка з Монако редактором має містити налаштовані заголовки Content Security Policy (CSP).

  • Веб сторінка з Монако редактором має містити заголовок X-Content-Type-Options: nosniff

Не враховано в початковому дизайні

Середній

Ризик закріплення в системі при експлуатації вразливості до системного рівня та подальший бічний рух. Відповідність вимогам.

  • Системний сервіс не повинен отримувати ключ сервіс аккаунту від openshift (якщо це не являється вимогою) та повинен бути запущенний від не привілейованого системного користувача.

Не враховано в початковому дизайні

Середній

Недостатнє журналювання та відповідність вимогам безпеки

  • Цільовий сервіс має логувати усі запити та надсилати їх до централізованої системи логування та моніторингу.

  • Переконатись що усі неуспішні запити та помилки при виконанні операцій будуть залоговані.

  • Система логування має використовувати уніфікований час та часову зону.

  • Логи мають бути у уніфікованому форматі та містити усю необхідну інформацію для розслідування інцидентів безпеки.

  • Логи не мають містити чутливої інформації або вона повинна бути заплутана (obfuscated) відповідним чином

Не враховано в початковому дизайні

Низький

Місконфігурація сервісу та/або фреймфорку

  • Переконатись, що конфігурація сервера захищена відповідно до рекомендацій сервера додатків і фреймворків, які використовуються.(web server/app server/framework hardening)

Не враховано в початковому дизайні

Низький

Система тестування комплексу засобів захисту (КСЗ)

  1. Репозиторій з вихідним кодом повинен бути заонборджений до системи керування вразливостями та проходити регулярне тестування

  2. Базовий імедж сервісу повинен бути просканований та не містити не вирішенних критичних вразливостей

  3. Базовий імедж повинен бути розміщений в довіреному сховищі підконтрольному організації

  4. Технологія language-server повинна бути додана до переліку 3rd party продуктів які використовуються (inventory)