2b76ae8497
- Validate UUID format; log created/duplicate/rejected - Tests for 201, 409, 422; update agent-integration and work-plan - Docs: neutral IDE wording (no product-specific editor names)
16 KiB
16 KiB
Техническое задание
Security Alert Center (SAC)
| Поле | Значение |
|---|---|
| Версия документа | 1.0 |
| Дата | 2026-05-26 |
| Статус | Черновик на согласование |
| Целевая ОС сервера | Ubuntu 24.04 LTS |
1. Назначение и цели
1.1. Назначение
Security Alert Center (SAC) — центральное веб-приложение, которое:
- Принимает структурированные события безопасности от агентов ssh-monitor (Linux) и RDP-login-monitor (Windows).
- Хранит их в базе данных для поиска, аудита и аналитики.
- Отображает ленту событий, инциденты (Problems) и дашборды в стиле Zabbix (Monitoring → Problems, графики, хосты).
- По правилам доставляет оповещения операторам (Telegram, email, webhook) — когда на агентах включён режим
UseSAC.
1.2. Цели
- Единая точка наблюдения за входами, неудачными попытками, sudo, банами IP, RD Gateway и т.д.
- Снижение «шума» в мессенджерах за счёт дедупликации, группировки и правил в SAC.
- Сохранение привычного поведения агентов при
UseSAC=off(уведомления напрямую в Telegram/email, как сейчас). - Эксплуатация на одном сервере Ubuntu 24.04 без обязательного Kubernetes.
1.3. Не входит в scope MVP (см. roadmap.md)
- Кластеризация SAC (active-active).
- Полноценный SIEM / ML-аномалии.
- Замена существующих агентов — они остаются, меняется только канал доставки при
UseSAC.
2. Контекст: три репозитория
| № | Репозиторий | Роль |
|---|---|---|
| 1 | ssh-monitor |
Агент на Linux-серверах |
| 2 | RDP-login-monitor |
Агент на Windows Server |
| 3 | security-alert-center |
Центральный сервер (этот проект) |
Совместная разработка в multi-root workspace — см. workspace-three-repos.md.
3. Как это работает (архитектура потоков)
Ниже — целевая схема взаимодействия компонентов (рис. 1).
flowchart LR
subgraph agents [Агенты на хостах]
SSH[ssh-monitor Linux]
RDP[RDP-login-monitor Windows]
end
subgraph sac [Security Alert Center Ubuntu 24.04]
API[Ingest API HTTPS]
Q[Очередь / воркер]
DB[(PostgreSQL)]
RT[Realtime SSE/WebSocket]
UI[Web UI]
NOTIFY[Правила оповещений]
end
subgraph channels [Каналы наружу]
TG[Telegram]
MAIL[Email]
WEBHOOK[Webhook / Slack]
end
SSH -->|JSON события + API key| API
RDP -->|JSON события + API key| API
API --> Q --> DB
DB --> UI
DB --> RT --> UI
DB --> NOTIFY --> TG
NOTIFY --> MAIL
NOTIFY --> WEBHOOK
Рис. 1. Поток данных: агенты → SAC → БД/UI; оповещения пользователю при UseSAC=exclusive идут только из SAC.
3.1. Жизненный цикл события
- На хосте возникает событие (успешный SSH, неудачный RDP, sudo, бан IP и т.д.).
- Агент формирует каноническое JSON-событие (схема v1 — event-schema-v1.json).
POST /api/v1/eventsпо HTTPS с API-ключом; при сбое — запись в локальный spool и повтор.- SAC: валидация → дедупликация → запись в PostgreSQL → оценка правил → при необходимости создание Problem.
- Оператор просматривает UI; при
UseSAC=exclusiveTelegram/email отправляет SAC, не агент.
3.2. Режим UseSAC на агентах
| Режим | Значение | Поведение агента | Кто шлёт в Telegram/email |
|---|---|---|---|
off |
0 |
Как сейчас | Агент |
exclusive |
1 |
Только SAC (расширенный JSON) | Только SAC |
dual |
2 |
SAC + локальные каналы | Оба (миграция/отладка) |
fallback |
3 |
SAC; при N сбоях подряд — снова локально | SAC, при аварии SAC — агент |
Требования:
- При
UseSAC=exclusiveфункцииnotify_send/Send-TelegramMessageдля оповещений о событиях не вызываются. - Локальные лог-файлы на агенте (
LOG_FILE,login_monitor.logи т.д.) сохраняются всегда. - При
UseSAC=exclusiveобязательныSAC_URL,SAC_API_KEY; при старте — проверка доступности SAC (--check-sac/ аналог). - Подробности — agent-integration.md.
4. Функциональные требования
4.1. Приём событий (Ingest API)
| ID | Требование |
|---|---|
| F-ING-01 | POST /api/v1/events принимает одно событие JSON, соответствующее event-schema-v1.json. |
| F-ING-02 | Аутентификация: заголовок Authorization: Bearer <api_key> или X-SAC-API-Key. |
| F-ING-03 | Ответ 202 Accepted с event_id, sac_event_url; при создании Problem — problem_id (опционально). |
| F-ING-04 | Идемпотентность: повтор с тем же event_id не создаёт дубликат. |
| F-ING-05 | POST /api/v1/events/batch — до 100 событий (фаза 1.5). |
| F-ING-06 | Rate limiting: настраиваемый лимит на ключ/хост. |
| F-ING-07 | GET /health — проверка БД и версии (для агентов и мониторинга). |
4.2. Учёт хостов (Hosts)
| ID | Требование |
|---|---|
| F-HST-01 | Первый валидный ingest с API key регистрирует/обновляет карточку хоста. |
| F-HST-02 | Поля: hostname, display_name, os_family, os_version, ipv4/ipv6, версия агента, use_sac_mode, last_seen, tags. |
| F-HST-03 | Статус «жив/мёртв» по последнему agent.heartbeat (порог N минут — настраивается). |
| F-HST-04 | UI: список хостов, фильтр, переход к событиям хоста. |
4.3. Хранение событий (Events)
| ID | Требование |
|---|---|
| F-EVT-01 | Хранение всех полей события + received_at, host_id. |
| F-EVT-02 | Поиск/фильтр: период, хост, type, severity, IP, user, текст в summary. |
| F-EVT-03 | Просмотр карточки события с details, raw (с лимитом отображения). |
| F-EVT-04 | Экспорт CSV за выбранный фильтр (фаза 1.5). |
| F-EVT-05 | Retention: настраиваемое хранение сырых событий (по умолчанию 90 дней). |
4.4. Инциденты (Problems)
| ID | Требование |
|---|---|
| F-PRB-01 | Правила создают Problem из одного или нескольких событий (пример: ≥30 ssh.login.failed за 15 мин с одного IP). |
| F-PRB-02 | Статусы: open, acknowledged, resolved. |
| F-PRB-03 | UI: список Problems с severity, хостом, временем, действиями ack/resolve. |
| F-PRB-04 | Связь Problem ↔ Events (просмотр связанных событий). |
4.5. Веб-интерфейс
| ID | Требование |
|---|---|
| F-UI-01 | Страница Problems — активные инциденты, счётчики по severity. |
| F-UI-02 | Страница Events — лента с пагинацией и фильтрами. |
| F-UI-03 | Страница Hosts — инвентарь агентов. |
| F-UI-04 | Страница Dashboards — графики: успешные/неудачные входы по времени, топ IP, sudo, баны (MVP: базовый набор виджетов). |
| F-UI-05 | Live-лента последних событий (SSE или WebSocket). |
| F-UI-06 | Аутентификация в UI: логин/пароль (MVP); LDAP — фаза 3. |
| F-UI-07 | Роли MVP: admin, operator, viewer. |
4.6. Оповещения из SAC
| ID | Требование |
|---|---|
| F-NOT-01 | Каналы: Telegram, SMTP email, generic webhook (JSON). |
| F-NOT-02 | Правила: условие (тип, severity, хост, тег) → каналы + шаблон. |
| F-NOT-03 | Дедупликация и cooldown на уровне SAC (аналог BRUTE_NOTIFY_COOLDOWN_SEC, SSH_ACCEPT_NOTIFY_DEDUP_SEC). |
| F-NOT-04 | Расписание тишины (maintenance window) — фаза 2. |
| F-NOT-05 | Суточные отчёты (report.daily.*) формируются и отправляются из SAC, не с агента при UseSAC=exclusive. |
4.7. Типы событий (минимальный перечень MVP)
ssh-monitor:
ssh.login.success,ssh.login.failed,ssh.session.disconnectedprivilege.sudo.commandssh.ip.banned,ssh.ip.bruteforce.threshold,ssh.bruteforce.masssession.logind.new,session.logind.removed,session.logind.failedreport.daily.ssh,agent.heartbeat,agent.recovered,agent.test
RDP-login-monitor:
rdp.login.success,rdp.login.failed,auth.explicit.credentials(4648)rdg.connection.success,rdg.connection.failedreport.daily.rdp,agent.heartbeat,agent.lifecycle,agent.test
Полный контракт — event-schema-v1.json и agent-integration.md.
4.8. Расширенные поля событий (при UseSAC=exclusive)
Агент передаёт структуру сверх текущего текста Telegram:
- Идентификаторы:
event_id,correlation_id,dedup_key,fingerprint - Контекст хоста: FQDN, timezone, версия продукта,
agent.instance_id - Пороги:
enrichment.attempt_number,enrichment.threshold - SSH/RDP-специфика: port, logon_type, gateway target, sudo command, ban_until
raw: обрезанный фрагмент journal / Event XMLfiltered_out+filter_reason(опционально, отдельный тип)
Обогащение в SAC (не обязательно в MVP): GeoIP, «новый IP для user», корреляция SSH+RDP с одного IP.
5. Нефункциональные требования
| ID | Требование |
|---|---|
| NF-01 | Сервер приложения: Ubuntu 24.04 LTS (единственная поддерживаемая платформа для SAC). |
| NF-02 | БД: PostgreSQL 16+ (production); SQLite допустим только для dev. |
| NF-03 | Ingest: p95 < 2 с при нормальной нагрузке (до 50 событий/с мин суммарно). |
| NF-04 | Доступность UI по HTTPS (TLS). |
| NF-05 | API keys хранятся в БД как hash; секреты конфигурации — в /etc/security-alert-center/ или env, не в git. |
| NF-06 | Резервное копирование БД: документированная процедура pg_dump (см. deployment.md). |
| NF-07 | Логи приложения: structured JSON, ротация logrotate. |
| NF-08 | Язык UI: русский (основной); i18n — фаза 3. |
| NF-09 | Время в БД: UTC; отображение — timezone пользователя или Europe/Moscow по умолчанию. |
6. Технологический стек (целевой)
| Слой | Технология |
|---|---|
| Backend | Python 3.12, FastAPI, SQLAlchemy 2, Alembic |
| БД | PostgreSQL 16 |
| Очередь (фаза 1.5+) | Redis 7, воркер (ARQ или Celery) |
| Frontend | Vue 3 + Vite, UI-kit (Naive UI / PrimeVue), ECharts |
| Realtime | Server-Sent Events (приоритет MVP) |
| Reverse proxy | nginx |
| Развёртывание | Native: PostgreSQL + systemd + nginx (production). Docker Compose — альтернатива для стенда |
Детали — architecture.md.
7. Безопасность
- Только HTTPS для ingest и UI.
- Отдельные API keys на хост (ротация из UI).
- RBAC в UI (MVP: 3 роли).
- Аудит действий: ack/resolve, смена правил.
- PII в
raw— ограничение размера; опция маскирования в логах SAC. - Разделение сетей: агенты → исходящий 443 на SAC; SAC не требует входящих на агенты.
8. Интеграция с существующими агентами
Изменения в репозиториях ssh-monitor и RDP-login-monitor — отдельные задачи, не в этом репозитории.
Обязательно:
- Параметры
UseSAC,SAC_URL,SAC_API_KEY,SAC_MODE(off|exclusive|dual|fallback). - Функция отправки структурированного события + локальный spool.
- Команда проверки
--test-sac/Test-SacConnection. - Сохранение локальных логов при любом режиме.
Спецификация — agent-integration.md.
9. Критерии приёмки MVP
- Развёрнут SAC на Ubuntu 24.04, доступны UI и
POST /api/v1/events. - Тестовый агент (curl /
agent.test) создаёт событие, видимое в UI < 10 с. - Реализованы режимы ingest для типов из п. 4.7 (тестовыми payload).
- Страницы Problems (базовые правила), Events, Hosts, Dashboard (минимум 3 виджета).
- Настроен канал Telegram из SAC; при
UseSAC=exclusiveна тестовом ssh-monitor Telegram с агента не приходит, с SAC — приходит. - Heartbeat: Problem «хост недоступен» при отсутствии heartbeat > N мин.
- Документация развёртывания воспроизводима с нуля по deployment.md.
- Spool: при остановке SAC события буферизуются на агенте и доставляются после восстановления.
10. Риски и митигация
| Риск | Митигация |
|---|---|
| SAC недоступен, алерты потеряны | spool на агенте, режим fallback |
| Дубли SSH + logind | dedup_key на агенте и в SAC |
| Перегруз БД | партиции по месяцу, retention, агрегаты (фаза 2) |
| Двойные Telegram при миграции | явный dual, затем exclusive |
11. Связанные документы
- architecture.md
- event-schema-v1.json
- agent-integration.md
- work-plan.md
- roadmap.md
- deployment.md
- workspace-three-repos.md
12. История изменений
| Версия | Дата | Изменения |
|---|---|---|
| 1.0 | 2026-05-26 | Первоначальная версия ТЗ |