Безопасность
Информационная безопасность
StormBPMN Enterprise обеспечивает высокий уровень информационной безопасности через многоуровневую систему защиты, включающую регулярное обновление зависимостей, сканирование уязвимостей и гибкие настройки доступа.
Принципы безопасности
- Минимальные привилегии - только необходимые права
- Глубокая защита - многоуровневая система безопасности
- Аудит всех действий - полное логирование операций
- Шифрование данных - защита паролей и конфиденциальной информации
Переменные окружения безопасности
Базовые настройки безопасности задаются через ENV переменные:
| Переменная | Описание | Пример значения | По умолчанию |
|---|---|---|---|
| STORM_ALLOWED_ORIGINS | Разрешенные источники запросов (CORS) | https://stormbpmn.company.com | * |
| STORM_DISABLE_SIMPLE_AUTH | Отключить встроенную авторизацию | true | false |
| STORM_DISABLE_ENV_IN_UI | Скрыть ENV переменные в админке | true | false |
| STORM_DISABLE_ANON_SHARING | Запретить анонимный доступ к диаграммам | true | false |
| JWTSECRET | Соль для шифрования паролей | Минимум 15 случайных символов | - |
| SESSION_EXPIRATION | Срок жизни сессии | 86400000 | 86400000 |
Рекомендации по безопасности
- STORM_ALLOWED_ORIGINS: Обязательно укажите конкретные домены вместо
*в production - JWTSECRET: Используйте криптографически стойкую случайную строку
- STORM_DISABLE_ENV_IN_UI: Включите в production для скрытия конфиденциальных данных
Настройки в административной панели
Управление пользователями
| Параметр | Описание | Рекомендация для production |
|---|---|---|
| showRegistration | Показать форму регистрации | ❌ Отключить |
| showBasicLogin | Показать поля логин/пароль | ❌ При использовании OAuth2 |
| showCustomLoginButtonName | Кастомный текст кнопки входа | По требованию |
| customLoginButtonName | Текст на кнопке входа | "Войти через корпоративный аккаунт" |
Публичный доступ
| Параметр | Описание | Рекомендация для production |
|---|---|---|
| enableAnonSearchPage | Поиск для неавторизованных | ❌ Отключить |
| allDiagramsAnonAccess | Анонимный доступ ко всем диаграммам | ❌ Отключить |
Корпоративные настройки
| Параметр | Описание | Рекомендация |
|---|---|---|
| enableCommonAssets | Общие элементы архитектуры для всех команд | ✅ Включить для больших компаний |
| enableCommonRoles | Общие роли для всех команд | ✅ Включить для унификации |
| enableCommonUsers | Общая оргструктура для всех команд | ✅ Включить для централизации |
SIEM-логирование
StormBPMN поддерживает полное аудит-логирование всех действий пользователей с отправкой в системы SIEM.
Возможности
- ✅ Полное логирование всех авторизованных операций
- ✅ Маскирование паролей и авторизационных заголовков
- ✅ Фильтрация больших данных (содержимое диаграмм не логируется)
- ✅ Поддержка Syslog по протоколу TCP (RFC 3164 / RFC 5424)
- ✅ Уникальные ID сессий для трассировки действий
Настройка Syslog
| Переменная | Описание | Пример значения | Обязательно |
|---|---|---|---|
| AUDIT_ENABLED | Включение аудита запросов | true | ✅ |
| AUDIT_CHANNEL | Канал аудит-логов | syslog | ✅ |
| SYSLOG_SERVERS | Список syslog серверов | localhost:514,192.168.78.53:601 | ✅ |
| SYSLOG_SOURCE | Название приложения в логах | stormbpmn | 🔧 |
| SYSLOG_MESSAGE_FORMAT | Формат логов | RFC_5424 / RFC_3164 | 🔧 |
Оригинальный IP-адрес пользователя
Для отображения оригинального IP-адреса нужно передать в контейнер заголовок X-Forwarded-For от вышестоящего прокси.
Структура лог-записи
{
"timestamp": "2007-12-03T10:15:30:55.000000",
"sessionId": "ergjieor-ergjniuo-qjwer",
"source": "stormbpmn",
"subject": "kotov@bpmn2.ru",
"subjectIP": "192.168.0.1",
"object": "uaerhgae-aerj3234-egerg",
"resource": "diagram",
"action": "CHANGE",
"payload": {
"method": "POST",
"url": "/api/v1/diagram",
"request": { "..." },
"response": { "..." }
},
"result": "SUCCESSFUL"
}
Типы событий
| Действие | Описание |
|---|---|
| GET | Просмотр объекта |
| CREATE | Создание объекта |
| CHANGE | Изменение объекта |
| DELETE | Удаление объекта |
| Результат | Описание |
|---|---|
| SUCCESSFUL | Успешная операция |
| CLIENT_ERROR | Ошибка клиента |
| SERVER_ERROR | Ошибка сервера |
Включение / исключение методов из аудита
Дополнительная настройка фильтрации URL для аудит-логирования:
| Переменная | Описание | Пример значения |
|---|---|---|
| AUDIT_INCLUDE_UNAUTH_PATH | RegExp через запятую - URL методов для включения в аудит | .*/auth/signin$ |
| AUDIT_EXCLUDE_AUTH_PATH | RegExp через запятую - URL методов для исключения из аудита | .*/heartbeat$,.*/diagram/.*/autosave$ |
Примеры использования
- Включить неавторизованные запросы:
AUDIT_INCLUDE_UNAUTH_PATH=.*/auth/signin$ - Исключить служебные запросы:
AUDIT_EXCLUDE_AUTH_PATH=.*/heartbeat$,.*/health$,.*/diagram/.*/autosave$
Система авторизации
OAuth2 (рекомендуется)
Корпоративная авторизация через внешние провайдеры (Keycloak, Azure AD, и др.)
| Параметр | Описание | Пример значения |
|---|---|---|
| OAuthIsEnabled | Включение OAuth2 | true |
| OAuthClientId | ID клиента в провайдере | stormbpmn-client |
| OAuthClientSecret | Секрет клиента | your-client-secret |
| OAuthAuthorizeUri | URL авторизации | https://keycloak.company.com/auth/realms/master/protocol/openid-connect/auth |
| OAuthUserInfoUri | URL получения информации о пользователе | https://keycloak.company.com/auth/realms/master/protocol/openid-connect/userinfo |
| OAuthTokenUri | URL получения токена | https://keycloak.company.com/auth/realms/master/protocol/openid-connect/token |
| OAuthButtonLabel | Текст на кнопке входа | "Войти через корпоративный аккаунт" |
| OAuthRedirectUri | URL возврата после авторизации | https://stormbpmn.company.com/app/signin |
Настройка Keycloak
Пошаговая инструкция для Keycloak 26.0.7:
- Создать клиента в нужном realm
- Client ID:
stormbpmn-client - Valid redirect URIs:
https://stormbpmn.company.com/app/signin - Web origins:
https://stormbpmn.company.com - Client authentication: ON
- Standard flow: ON, Implicit flow: ON
- Client Scopes: email и profile должны быть default
- Получить Client Secret на вкладке Credentials
Microsoft ADFS
Особенности Microsoft ADFS
Компания Microsoft имеет специфический (альтернативно-одарённый) подход к стандартам OAuth2/OpenID Connect. В частности, ADFS не возвращает информацию о пользователе через стандартную ручку /userinfo, что усложняет интеграцию. Также интерфейсы ADFS (особенно в русской локализации) могут показаться запутанными.
Настройка авторизации через ADFS требует больше времени и внимания по сравнению с другими провайдерами.
Шаг 1: Настройка ADFS
Создание группы приложений
В оснастке ADFS Management создайте группу приложений:

В группе создайте 2 приложения:

Настройка серверного приложения
Первое приложение - Server application (серверное приложение):

В настройках укажите:
- Правильный Redirect URI перенаправления
- Запомните Client ID и Client Secret

Настройка веб-API
Второе приложение - Web API (веб-интерфейс API):
Создайте Relying party identifier (идентификатор проверяющей стороны) и запомните его

Настройка политик доступа
- Выберите подходящую Access Control Policy (политику контроля доступа):

Настройка маппинга атрибутов
В разделе Issuance Transform Rules (Правила преобразования выдачи) настройте маппинг атрибутов:


Важно: маппинг claims
StormBPMN ожидает следующие claims в токене:
| Поле StormBPMN | Ожидаемый claim | Тип |
|---|---|---|
email | email | Стандартный |
firstName | given_name | Стандартный |
lastName | family_name | Стандартный |
fullName | full_name | Кастомный |
position | position | Кастомный |
Кастомные claims (Полное Имя, Должность) должны быть созданы и опубликованы в описании утверждений (Claims Description).
Настройка разрешений
- Установите разрешения клиента:

Если все шаги выполнены внимательно, настройка ADFS на стороне сервера завершена.
Шаг 2: Настройка StormBPMN
Параметры для настройки
Вам потребуются сохраненные значения:
- Client ID (из серверного приложения)
- Client Secret (из серверного приложения)
- Resource identifier (идентификатор ресурса из Web API)
Настройка в административной панели
Перейдите в административную панель:
/app/admin→ вкладка БезопасностьУкажите следующие параметры:
| Параметр | Значение | Примечание |
|---|---|---|
| OAuthClientId | Ваш Client ID | Из серверного приложения ADFS |
| OAuthClientSecret | Ваш Client Secret | Из серверного приложения ADFS |
| OAuthAuthorizeUri | /adfs/oauth2/authorize | Стандартный путь ADFS |
| OAuthUserInfoUri | /adfs/userinfo | Для обратной совместимости (ADFS не использует эту ручку) |
| OAuthTokenUri | /adfs/oauth2/token | Стандартный путь ADFS |
| OAuthButtonLabel | "Войти через ADFS" | Текст на кнопке входа |
| OAuthIsEnabled | true | Включение OAuth2 |
| OAuthRedirectUri | https://your-storm-url/app/signin | URL вашего StormBPMN |
| OAuthResponseType | code | Тип ответа |
| OAuthScope | openid profile email | Области доступа |
| OAuthCodeChallengeMethod | S256 | Метод challenge |
| OAuthFlowMode | PKCE | Режим потока |
| OAuthResource | Ваш Resource identifier | Из Web API приложения |


Дополнительные требования
Сертификаты
На самоподписанных сертификатах интеграция работать не будет. Требуется добавить доверенные сертификаты по инструкции в этом разделе.
Тестирование
Настройка протестирована и гарантированно работает с:
- Windows Server 2022
- ADFS 4.0
Если интеграция не работает, проверьте:
- Корректность всех параметров
- Правильность маппинга claims
- Наличие всех необходимых разрешений в ADFS
- Доверенные сертификаты (если используются)
Проверка Claims
Дополнительная проверка прав в токене OAuth2:
| Параметр | Описание | Пример значения |
|---|---|---|
| OAuthCheckClaim | Включить проверку | true |
| OAuthClaimName | Название claim | groups |
| OAuthClaimValue | Требуемое значение | stormbpmn-users |
Встроенная авторизация
Только для тестирования
Встроенная авторизация подходит только для тестовых сред. В production используйте OAuth2.
Аварийный вход: Добавьте ?showBasicLogin=true к URL входа для доступа к базовой форме, даже если OAuth2 включен.
Добавление собственных SSL-сертификатов
Проблема
Если вы используете свой MinIO, S3 или другой HTTPS-сервис с самоподписанным сертификатом, Java внутри контейнера может не доверять ему. Это приведёт к ошибке:
javax.net.ssl.SSLHandshakeException: PKIX path building failed
Решение
Необходимо смонтировать свой truststore.jks, заменив стандартный truststore Java.
Шаг 1. Создание truststore.jks
Если у вас есть файл сертификата (например, minio-ca.crt), выполните:
keytool -importcert \
-file minio-ca.crt \
-alias my-root-ca \
-keystore truststore.jks \
-storepass changeit \
-noprompt
Пароль truststore
Пароль changeit — стандартный для Java truststore. Можно использовать другой, но он должен совпадать в команде и при запуске.
Шаг 2. Путь к truststore в контейнере
Контейнер StormBPMN использует образ eclipse-temurin:11-jre-alpine. Путь к стандартному truststore:
/opt/java/openjdk/lib/security/cacerts
Проверка пути
Если монтирование не работает, проверьте актуальный путь командой:
docker run --rm eclipse-temurin:11-jre-alpine find /opt -name "cacerts" 2>/dev/null
Шаг 3. Запуск с заменой truststore
В docker-compose.yml:
services:
stormbpmn:
image: _ваш_образ_
volumes:
- ./truststore.jks:/opt/java/openjdk/lib/security/cacerts:ro
Или в командной строке:
docker run \
-v $(pwd)/truststore.jks:/opt/java/openjdk/lib/security/cacerts:ro \
_ваш_образ_
Результат
Java в контейнере будет использовать ваш truststore и доверять указанным сертификатам. Никаких изменений в переменных окружения не требуется.
Чек-лист безопасности
Обязательные настройки
Дополнительные меры
Связанная документация
- Конфигурация - полный справочник настроек
- Production-Ready - настройка для продакшена
- Мониторинг - метрики и алерты
Нужна помощь?
По вопросам безопасности обращайтесь к help@stormbpmn.com или вашему менеджеру.