Комплексная платформа по управлению киберрисками и каталогом российского ПО. Сервер на Go/Fiber, PostgreSQL, слой расчёта рисков и SPA‑фронтенд на React/TypeScript с полностью русским интерфейсом. Заточена под отраслевые требования РФ: реестр Минцифры, сертификаты ФСТЭК/ФСБ, БДУ ФСТЭК.
| Активы | Карта рисков |
|---|---|
![]() |
![]() |
| Справочник ПО | Симулятор риска |
|---|---|
![]() |
![]() |
git clone https://github.com/velvetway/CyberRisk.git
cd CyberRisk
docker compose up --buildЗатем:
- Фронтенд: http://localhost:3000
- API: http://localhost:8081
Создайте пользователя через форму регистрации или API:
curl -X POST http://localhost:8081/api/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"demo","password":"demo1234","role":"admin"}'- Архитектура
- База данных и миграции
- REST API
- Расчёт рисков и рекомендации
- Фронтенд
- Запуск локальной среды
- PDF‑отчёты
- Тесты и проверка качества
- Дальнейшее развитие
├─ cmd/server/main.go — точка входа Fiber‑сервера
├─ internal/
│ ├─ config — загрузка переменных окружения
│ ├─ domain — доменные модели и enum‑ы
│ ├─ repository — доступ к PostgreSQL (pgx)
│ ├─ service — бизнес‑логика (активы, угрозы, риск, ПО)
│ ├─ report — генерация PDF с gofpdf
│ └─ transport/http — HTTP‑хендлеры Fiber
├─ migrations/ — версия БД и тестовые данные
└─ frontend/ — SPA на React 19 + TypeScript
- Backend: Go 1.25, HTTP‑сервер на Fiber v2, подключение к PostgreSQL через
pgxpool. Основной исполняемый файлcmd/server/main.goсоздаёт контекст с graceful shutdown, загружает конфиг (DB_DSN,HTTP_PORT), инициализирует репозитории/сервисы и регистрирует HTTP‑роуты. - Слой конфигурации:
internal/config/config.goустанавливает значения по умолчанию (postgres://app:app@localhost:5432/cyber_risk?sslmode=disable, порт8081), что облегчает запуск в dev. - Сервисы:
service/asset,service/threat,service/vulnerability,service/asset_vulnerabilityреализуют CRUD‑операции и валидацию вводимых данных.service/softwareуправляет справочником ПО, поиском российских аналогов и фильтром по сертификации ФСТЭК/ФСБ.service/riskсодержит калькулятор, правила генерации рекомендаций и агрегирующие методы (PreviewRisk,Overview,AssetRiskProfile).
- Transport layer:
internal/transport/http/server.goсоздаёт Fiber‑приложение, включает CORS (*), panic‑recover и health‑check/health. Внутри роутера/apiрегистрируются хендлеры активов, угроз, уязвимостей, связей актив↔уязвимость, сервиса риска и каталога ПО. - Отчётность:
internal/reportсодержит шаблоны и встроенные шрифты для генерации PDF отчёта по конкретному сценарию риска.
PostgreSQL — единственный источник данных. Миграции (каталог migrations) поддерживаются утилитой golang-migrate. Основные фичи:
001_init— базовые таблицы активов, угроз, уязвимостей, связей и справочников.002_seed_data— стартовые записи активов, угроз, уязвимостей для демонстрационного профиля.004_software_catalog_and_data_categories+006_seed_software_catalog— схема и сид‑данные каталога ПО с принадлежностью к реестру Минцифры и сертификатам ФСТЭК/ФСБ.- Каждая миграция имеет
.up.sqlи.down.sql; запуск осуществляется через контейнерmigrateвdocker-compose.yml.
export DB_DSN="postgres://app:app@localhost:5432/cyber_risk?sslmode=disable"
export HTTP_PORT=8081
go run cmd/server/main.goПул pgxpool создаётся один раз и переиспользуется всеми репозиториями.
Все эндпоинты префиксированы /api и возвращают/принимают JSON. Ошибки возвращаются в виде { "error": "<текст>" }.
| Метод | Путь | Назначение |
|---|---|---|
GET /api/assets |
Список активов с пагинацией (limit, offset) |
|
POST /api/assets |
Создать актив (обязательны name, CIA‑оценки, критичность) |
|
GET /api/assets/:id |
Получить актив | |
PUT /api/assets/:id |
Обновить актив | |
DELETE /api/assets/:id |
Удалить актив | |
GET /api/assets/:assetID/vulnerabilities |
Связанные уязвимости | |
POST /api/assets/:assetID/vulnerabilities |
Привязать уязвимость к активу | |
DELETE /api/assets/:assetID/vulnerabilities/:vulnID |
Отвязать | |
GET /api/threats |
Каталог угроз (БДУ ФСТЭК, вектор атаки, влияния на CIA) | |
GET /api/vulnerabilities |
Каталог уязвимостей | |
POST /api/risk/preview |
Рассчитать риск для пары asset_id + threat_id, вернуть impact, likelihood, score, level и рекомендации |
|
GET /api/risk/overview |
Матрица всех рисков (каждая точка — актив × угроза) | |
GET /api/risk/asset/:id |
Профиль рисков для выбранного актива | |
POST /api/risk/report/pdf |
PDF отчёт по конкретному сценарию | |
GET /api/software |
Каталог ПО (фильтры: limit, offset, category_id, is_russian, fstec_only, search) |
|
POST /api/software |
Добавить ПО в справочник | |
GET /api/software/:id |
Детальная карточка ПО | |
PUT /api/software/:id |
Обновление карточки | |
DELETE /api/software/:id |
Удаление | |
GET /api/software/categories |
Категории ПО | |
GET /api/software/russian |
Российские аналоги для категории | |
GET /api/software/certified |
Сертифицированное ПО (ФСТЭК/ФСБ) |
Формальная модель риска (ПТСЗИ): см. docs/risk-model.md — граф
S → ST → VL → DAи формулаW_i, которая заменила старую схемуImpact × Likelihood.
Формулы сконцентрированы в internal/service/risk/calculator.go:
Impact = f(BusinessCriticality, Confidentiality, Integrity, Availability)+ поправки за наличие угрозы, влияющей на соответствующие CIA‑метрики, и максимальную серьёзность уязвимости, привязанной к активу.Likelihood = BaseLikelihood(угрозы) + среда эксплуатации + финальные корректировки(изоляция сегмента, наличие доступа в интернет, вектор атаки).Score = Impact × Likelihood, диапазон 1–25, уровни риска:Critical(≥16),High(≥11),Medium(≥6),Low(остальное).RegulatoryFactorусиливает оценку в зависимости от полей актива:- Категории КИИ (187‑ФЗ), уровни защищённости ПДн (ПП‑1119), тип обрабатываемых данных (гостайна, коммерческая тайна и т.д.).
- Объём персональных данных > 1 000 или > 100 000 субъектов увеличивает множитель.
AdjustedScore = Score × RegulatoryFactor, при необходимости применяется функцияAdjustedRiskLevel.
service/risk/recommendations.go содержит rule‑engine, который на основании атрибутов актива/угрозы/уязвимости формирует список рекомендаций:
- Категории: защита периметра, управление уязвимостями, резервное копирование, регуляторные требования 152‑ФЗ/187‑ФЗ и т.д.
- Для регуляторных рекомендаций выводится блок с российскими СЗИ (
RussianTool) с пометкой о сертификатах ФСТЭК/ФСБ и номере в реестре Минцифры.
Метод Overview() кеширует уязвимости по активу в памяти, чтобы не выполнять N×M запросов в таблицу связей. Репозитории используют ограничение по LIMIT/OFFSET по умолчанию (50 строк).
Каталог frontend/ — Create React App (React 19, TypeScript, D3). Структура:
src/api/client.ts— типобезопасный HTTP клиент, повторно используемый на страницах.src/types.ts— общие типы, синхронизированные с backend JSON полями (snake_case).src/pages/— основные сценарии:AssetsPage,AssetFormPage,AssetRiskProfilePage.RiskPreviewPage— интерактивный подбор угрозы/актива и просмотр рекомендаций.RiskMapPage— d3‑матрица 5×5 с heatmap, подсчётом статистики по уровням риска и панелью деталей при наведении.SoftwareCatalogPage— карточный или табличный каталог ПО с поиском, фильтром по категориям/реестру/сертификации и статистикой.
src/components/— переиспользуемые карточки, таблицы, фильтры.src/utils/i18n.ts— словарь и helpergetRiskLevelLabelдля вывода русских названий уровней.
package.json настроен с "proxy": "http://localhost:8081", поэтому npm start автоматически проксирует API на порт Go‑сервера.
- Запустить PostgreSQL и миграции:
Таблицы и демо‑данные загрузятся автоматически.
docker-compose up -d postgres docker-compose run --rm migrate
- Backend:
Health‑check доступен по
cd /path/to/Diplom export DB_DSN="postgres://app:app@localhost:5432/cyber_risk?sslmode=disable" export HTTP_PORT=8081 go run cmd/server/main.go
http://localhost:8081/health. - Frontend:
cd frontend npm install npm start # dev-сервер CRA на http://localhost:3000 npm run build # production-сборка в frontend/build
Для боевого развёртывания можно отдавать содержимое frontend/build статическим веб‑сервером, а Fiber запускать отдельным сервисом (Dockerfile не входит, но конфигурация прозрачна).
POST /api/risk/report/pdf принимает asset_id и threat_id, повторно использует PreviewRisk, рендерит шаблон в internal/report/templates и возвращает файл с заголовками Content-Type: application/pdf, Content-Disposition: attachment; filename=risk_report.pdf. В отчёт включаются таблицы с исходными параметрами актива, угрозы, рассчитанные метрики, список рекомендаций и реестр российских средств защиты.
- Backend: на текущем этапе модульные тесты не добавлены. Рекомендуется покрыть критичную арифметику (
risk.Calculator) и репозитории (pgxpool) через integration‑тесты (go test ./...). - Frontend: доступна стандартная инфраструктура CRA (
npm test) с@testing-library. В проекте присутствует базовыйApp.test.tsx; добавляйте сценарные тесты для страниц расчёта риска и каталога ПО. - Static checks: используйте
golangci-lintиeslint/tsc --noEmitпри CI.
- Добавить аутентификацию и разграничение ролей (enum
domain.UserRoleподготовлен). - Вести историю изменений оценок риска и статус рекомендаций.
- Поддержать загрузку собственных шаблонов отчётов и локализаций.
- Расширить API фильтрацией (например, по категориям угроз) и пагинацией на уровне карт рисков.
Документация должна помочь быстро разобраться в проекте, расширить модули и безопасно развернуть систему. За дополнительными вопросами обращайтесь в issues репозитория.
В процессе работы над CyberRisk были отдельно выделены и опубликованы вспомогательные MCP-серверы. Их можно использовать независимо — например, для обогащения справочника ПО или модели угроз внутри самого CyberRisk:
- velvetway/minreestr-mcp — MCP-сервер для поиска по каталогу российского ПО каталогпо.рф (26 000+ продуктов, ФСТЭК/ФСБ-сертифицированное ПО, производители).
- velvetway/bdu-fstec-mcp — MCP-сервер для БДУ ФСТЭК (86 000+ российских уязвимостей): FTS5-поиск, фильтры по CVSS/опасности/году/вендору, обратный маппинг CVE → БДУ.
- velvetway/bdu-fstec-mirror — зеркало БДУ ФСТЭК без геоблока (XML + готовая SQLite-база с FTS5-индексом).




