Редагування groovy скриптів бізнес-процесів в адмін-порталі
🌐 Цей документ доступний українською та англійською мовами. Використовуйте перемикач у правому верхньому куті, щоб змінити версію. |
1. Загальний опис проблеми та рішення
Розробка бізнес-процесів регламенту реєстру передбачає розробку Groovy-скриптів, що відображають логіку роботи кроків бізнес-процесу. Адмін-портал дозволяє проводити розробку бізнес-процесів регламенту реєстру. Набагато ефективніше вести розробку Groovy-скриптів у спеціалізованих засобах розробки, таких як IDE (Desktop або Web версії).
Розширення адмін-порталу використанням rich вебредакторів редагування Groovy-скриптів покращить користувацький досвід до рівня використання настільних IDE-інструментів, а також зменшить час на постійне переміщення скриптів до Desktop IDE для редагування та назад — до BPMN.IO-візуального конструктора бізнес-процесів.
Результати POC для ознайомлення з LSP протоколом та вебредактором коду MonacoEditor. |
2. Глосарій
-
LSP - Language Server Protocol
-
LS - Language Server
-
WS - WebSocket
-
WSS - WebSocket Secure
3. Актори
-
Розробник регламенту реєстру
4. Функціональні можливості редактору
Наступні функціональні можливості в рівній мірі використовуються для двох функціональних сценаріїв: створення нового кроку бізнес-процесу та редагування або перегляд наявного. |
-
Автодоповнення у вигляді випадного списку варіантів виклику
-
Відображення результату аналізу коду на наявність помилок за допомогою language server
-
Показ Hoover-підказки (hoover tooltip) з javadoc-інформацією
-
Використання різних кольорів при перегляді коду
-
Автодоповнення для DDM JUEL-функцій:
-
initiator
-
completer
-
system_user
-
submission
-
sign_submission
-
get_variable
-
set_variable
-
set_transient_variable
-
process_caller
-
message_payload
-
5. Основні принципи
-
Monaco editor як вебінструмент розробки 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
.
6. Високорівневий дизайн
6.1. Опис та призначення компонентів
Назва | Мова програмування | Опис |
---|---|---|
JavaScript |
Візуальний вебредактор коду |
|
Remote LS’s |
Java, LSP4J |
Екземпляри LS сервісів, що реалізує LSP протокол та виконують перевірку клієнтського коду з поверненням результатів перевірки в форматі Json-RPC(LSP). |
LS Manager, Websocket Manager |
Java, Spring |
Spring boot web controller. Створює необхідні екземпляри LS. Створює WebSocket та використовує відповідний LS-екземпляр для аналізу та перевірки коду з візуального редактора клієнту. |
6.2. LSP комунікація
-
Як транспортний протокол використовується
WSS
-протокол -
Як RPC-взаємодія використовується LSP-протокол версії
3.17
.
6.2.1. WebSocket-комунікація
-
Як транспортний протокол використовується
WSS
-
Для налаштування Web-socket зв’язку зі сторони візуального рівня (UI layer) використовується monaco-languageclient.
-
Для організації частини websocket backend використовується spring-websocket.
6.2.2. Кількість екземплярів LS
-
Кожне вікно з monaco editor використовує свій окремий web-socket instance для з’єднання з LS.
-
Кожний web-socket використовує окремий екземпляр LS.
-
Усі LS-екземпляри знаходяться в одному JVM-екземплярі. Технічно кожний екземпляр LS — це новий екземпляр з інтерфейсом
org.eclipse.lsp4j.services.LanguageServer
.
8. Масштабування
В поточній версії розгортання сервісу пропонується використовувати лише вертикальне масштабування (RAM, CPU). Оскільки використовується підхід розміщення всіх LS в рамках однієї JVM, тому не очікується значного збільшення використання обчислювальних ресурсів під час збільшення кількості одночасно запущених клієнтів LS.
Горизонтальне масштабування можливе шляхом додавання Load Balancer для LSP (WebSocket JSON-RPC) трафіку. Out of scope. |
9. Моделювання загроз
Area | Назва | Опис | Значення ліміту |
---|---|---|---|
Kong |
WSS трафік через Kong |
Налаштування пропускання трафіку через admin kong шляхом використання Upgrade headers. WebSocket kong manual |
|
Авторизація під час handshake процесу |
Поточна авторизація на admin kong. |
||
Максимальний розмір запита |
Ліміт для payload всередині LSP (JSON-RPC). Використати Request Size Limiting |
65kb (30kb after SC) |
|
Socket timeout |
Idle time для сокету, через який він автоматично закривається. Необхідна конфігурація як на BE так і на FE side. Kong config property |
60s (should be by default) |
|
Socket open Rate limit |
Ліміт на кількість запитів на створення web-socket |
10 per minute per user |
|
Java application |
Конфігурація CORS |
Налаштувати CORS для |
|
Chart configuration |
RAM limit |
Встановити RAM ліміт шляхом налаштування resources.requests.memory в Chart deployment |
1GB |
10. Технологічний стек
Назва | Версія | Ліцензія | Опис |
---|---|---|---|
0.34.1 |
Візуальний вебредактор коду |
||
4.0.3 |
Language server клієнт, що підключається до Monaco editor та використовується для з’єднання з віддаленими language серверами використовуючи LSP протокол) |
||
8.0.2 |
Транзитивна залежність з monaco-languageclient |
||
0.19 |
Бібліотека для менеджменту екземплярів LS. Використовується для запуску LS коду. |
||
- |
Реалізує LSP протокол та виконую перевірку Groovy коду з поверненням результатів перевірки в форматі Json-RPC |
||
2.6.1 |
Розширення до Spring Framework для спрощення побудови аплікацій на базі Spring завдяки автоматичній конфігурації та наявності spring boot стартерів |
||
2.6.1 |
Розширення для Spring для менеджменту вебсокетів в серверних додатках (використовує spring-websocket:5.3.13) |
11. Інтерфейс управління
BPMN.io буде розширено додатковою кнопкою виклику модального вікна редагування groovy скриптів.
12. Високорівневий план розробки
12.1. Необхідні експертизи
-
Java
-
Javascript
-
DevOps
-
QA, AQA
12.1.1. Backend Java activities
-
Створити Spring Boot-based backend service ddm-language-server
-
Розробити WebSocket proxy component
-
Підвищити версію LSP4J до 0.19 для GroovyLanguageServer
12.1.2. Javascript activities
-
Інтеграція Monaco editor в BPMN.IO редактор бізнес-процесів
-
Інтеграція Monaco-editor з ddm-language-server використовуючи monaco-languageclient
12.1.3. DevOps activities
-
Впровадити https://github.com/GroovyLanguageServer/groovy-language-server: підготувати кодову базу (codebase) в gerrit та створити пов’язаний Jenkins-пайплайн.
-
Створити deploy-templates та Dockerfile для service
ddm-language-server
(openjdk based image). -
Конфігурація AdminKong для пропускання трафіку до
ddm-language-server
. Додати websocket проксі заголовки до конфігурації Kong. -
Конфігурація плагінів Kong для перевірки лімітів безпеки (security limits).
-
Додати в
environment-js
зміннуlanguageServerUrl
з відносною адресоюddm-laguage-server
.
13. Безпека
13.1. Бізнес Дані
Категорія Даних |
Опис |
Конфіденційність |
Цілісність |
Доступність |
Проміжні дані бізнес-процесів, що містять відкриту інформацію |
Дані бізнес форм та процесів що не містять інформацію з обмеженим доступом |
Низька |
Висока |
Середня |
Операційні журнали |
Списки зафіксованих (logged) звернень до сервісу та журнали його роботи |
Середня |
Висока |
Висока |
13.3. Механізми протидії ризикам безпеки та відповідність вимогам безпеки
Ризик |
Засоби контролю безпеки |
Реалізація |
Пріорітет |
Порушення цілісності та конфіденційності даних при передачі |
Використання HTTPS та WSS |
Враховано в початковому дизайні |
Високий |
Небезпечне завершення сеансу на стороні сервера |
Під час виходу з системи ініційованого користувачем або при автоматичному закінченні терміну дії сесії будь-яка комунікація з веб сокетом повинна бути зупинена |
Не враховано в початковому дизайні |
Високий |
Відмова в обслуговуванні через вичерпання обчислювальних ресурсів (DOS), спричинена відсутністю обмежень для вебсокетів |
|
Враховано в початковому дизайні |
Високий |
Відмова в обслуговуванні через вичерпання обчислювальних ресурсів (DOS), спричинена відсутністю обмежень для сервісу на рівні OpenShift. |
|
Враховано в початковому дизайні |
Високий |
Відмова в обслуговуванні через вичерпання обчислювальних ресурсів (DOS), спричинена відсутністю обмежень для HTTP запитів на рівні вхідного (ingress) контролера Kong. |
|
Не враховано в початковому дизайні |
Високий |
Ризик бекдору (backdoor) у компоненті |
|
Частково враховано в початковому дизайні. Необхідно повністю ізолювати сервіс ddm-language-server від зовнішньої мережі |
Високий |
Ризик виконання вразливості інтерактивних інформаційних систем (XSS) |
|
Враховано в початковому дизайні |
Високий |
Ризик розкриття технічної інформації про систему |
|
Не враховано в початковому дизайні |
Середній |
Десеріалізація ненадійних даних |
|
Не враховано в початковому дизайні |
Середній |
Ризик появи групи веб вразливостей та відповідність вимогам безпеки |
|
Не враховано в початковому дизайні |
Середній |
Ризик закріплення в системі при експлуатації вразливості до системного рівня та подальший бічний рух. Відповідність вимогам. |
|
Не враховано в початковому дизайні |
Середній |
Недостатнє журналювання та відповідність вимогам безпеки |
|
Не враховано в початковому дизайні |
Низький |
Неправильна конфігурація сервісу та/або фреймфорку |
|
Не враховано в початковому дизайні |
Низький |
13.4. Система тестування комплексу засобів захисту (КЗЗ)
-
Репозиторій з вихідним кодом повинен бути впроваджений до системи керування вразливостями та проходити регулярне тестування.
-
Базовий образ (image) сервісу повинен бути просканований та не повинен містити не розв’язаних критичних вразливостей.
-
Базовий образ (image) повинен бути розміщений у довіреному сховищі, підконтрольному організації.
-
Технологія
language-server
повинна бути додана до переліку сторонніх продуктів, які використовуються (inventory).