# План работ — Security Alert Center **Актуальный порядок:** сначала подготовка агентов (параллельно с минимальным SAC ingest), затем полный SAC MVP, затем prod rollout `UseSAC=exclusive`. --- ## Фаза 0. Документация ✅ | # | Задача | Статус | |---|--------|--------| | 0.1–0.3 | ТЗ, архитектура, схема, deployment | ✅ | | 0.5 | Репозиторий GitHub + prod deployment | ✅ | | 0.6 | Multi-root workspace | ✅ | --- ## Фаза 1A. Агенты — контракт SAC (параллельно с 1B) **Репозитории:** `ssh-monitor`, `RDP-login-monitor` **Прод:** везде `UseSAC=off` по умолчанию. | # | Задача | Статус | |---|--------|--------| | 1A.1 | Параметры `UseSAC`, `SAC_URL`, `SAC_API_KEY`, spool | ✅ ssh-monitor | | 1A.2 | `build_sac_event()` + `send_sac_event()` по schema v1 | ✅ `sac-client.sh` | | 1A.3 | `notify_or_sac()`: off / dual / exclusive / fallback | ✅ + маппинг событий | | 1A.4 | `--check-sac` / `Test-SacConnection` | ✅ ssh-monitor `--check-sac` | | 1A.5 | README агентов, first deploy | ✅ `first_deploy.sh`, `--deploy` | **Выход:** на тестовом хосте `dual` шлёт JSON в SAC + Telegram. --- ## Фаза 1B. SAC — минимальный ingest ✅ (prod) | # | Задача | Статус | |---|--------|--------| | 1B.1 | Scaffold backend FastAPI | ✅ | | 1B.2 | PostgreSQL + Alembic (hosts, events, api_keys) | ✅ | | 1B.3 | `POST /api/v1/events`, `GET /health` | ✅ prod `sac.example.com` | | 1B.4 | systemd + nginx + TLS | ✅ | | 1B.5 | Валидация JSON Schema v1 | ✅ | **Выход:** ingest с curl и UI на prod — достигнут. --- ## Фаза 1C. SAC — MVP UI и оповещения | # | Задача | Статус | |---|--------|--------| | 1C.1 | Frontend Vue: Events, Hosts | ✅ prod | | 1C.2 | Auth JWT, admin bootstrap | ✅ prod | | 1C.3 | Problems (базовые правила) | ✅ API + UI (деплой ⏳) | | 1C.4 | Telegram из SAC | ✅ backend (деплой + TELEGRAM_* в env) | | 1C.5 | Dashboard (3 виджета), SSE | ✅ v0.2.0 | **Выход:** тег `v0.2.0-mvp`. --- ## Фаза 2. Пилот и exclusive | # | Задача | |---|--------| | 2.1 | E2E: 1 Linux + 1 Windows, `UseSAC=exclusive` | ✅ Linux [pilot-2.1-exclusive.md](pilot-2.1-exclusive.md) | | 2.2 | Daily report / heartbeat через SAC | ✅ [pilot-2.2-heartbeat-reports.md](pilot-2.2-heartbeat-reports.md) | | 2.3 | fallback на агентах | ✅ счётчик `SAC_FALLBACK_FAILURES` в sac-client | **Выход:** `v0.2.0`. --- ## Фаза 3. Эксплуатация См. [roadmap.md](roadmap.md). --- ## Ближайшие 2 дня (чеклист исполнения) ### День 1 - [x] `d1-1` Ingest: `event_id` UUID обязателен, UNIQUE индекс, коды duplicate, логи, docs/schema - [x] `d1-2` MVP Problems: модель, корреляция `host+type+окно`, API `GET/ack/resolve` - [x] `d1-3` Правила v1: `brute-force burst`, `privilege spike`, `host silence` ### День 2 - [x] `d2-1` UI Problems: список, фильтры, `Ack/Resolve`, карточка с таймлайном - [x] `d2-2` Dashboard: top hosts/types, `open vs resolved 24h`, drill-down - [x] `d2-3` Ops: retention, health checks, runbook backup/restore/deploy - [x] `dod` DoD: нет дублей `event_id`, Problems e2e, 3 правила, UI MVP, docs, push в prod ### Отображение хостов (`display_name`, как `SERVER_DISPLAY_NAME` у ssh) Сейчас: **ssh** — `SERVER_DISPLAY_NAME` только в Telegram; в SAC уходит `socket.gethostname()`. **RDP** — параметра нет, в SAC только `$env:COMPUTERNAME`. В SAC UI «Хосты» уже показывает `display_name || hostname`, если поле пришло в ingest. - [x] `agent-display-rdp` **RDP-login-monitor:** `$ServerDisplayName` в `login_monitor.settings.ps1` / example; подпись в Telegram; в `Sac-Client.ps1` — `host.display_name` (и при необходимости согласовать `hostname`) - [x] `agent-display-ssh` **ssh-monitor:** в `sac-client.sh` передавать `SERVER_DISPLAY_NAME` как `host.display_name` в JSON ingest - [x] `sac-display-hosts` **SAC:** проверить ingest/обновление `Host.display_name`; колонка «Хосты» = человекочитаемое имя; поиск по `display_name`; `docs/agent-integration.md` + schema `host.display_name` **Приёмка:** хост с `SERVER_DISPLAY_NAME="UNMS Kalina"` (или RDP `$ServerDisplayName`) в SAC → **Хосты** отображается как **UNMS Kalina**, а не только короткое имя ОС. ### Почасовой чеклист #### День 1 - [x] `09:00–10:00` миграция `event_id` + UNIQUE, валидация ingest - [x] `10:00–11:00` поведение duplicate (`201/409`) и логирование reject - [x] `11:00–12:00` обновить `event-schema-v1.json` и `agent-integration.md` (в т.ч. `host.display_name` для агентов) - [x] `13:00–14:30` модель Problems + миграция - [x] `14:30–16:00` корреляция при ingest (`fingerprint`, `count`, `last_seen`) - [x] `16:00–17:30` API `GET /problems`, `ack`, `resolve` + smoke - [x] `18:00–19:00` правила `brute/privilege/silence` + unit tests #### День 2 - [x] `09:00–11:00` UI Problems: таблица + фильтры (`status/severity/host`) - [x] `11:00–12:00` карточка проблемы + таймлайн событий - [x] `13:00–14:30` Dashboard: виджеты top hosts/types - [x] `14:30–16:00` Dashboard: `open/resolved 24h` + drill-down - [x] `16:00–17:00` retention job (`events 30–90d`, `problems 180d+`) - [x] `17:00–18:00` health checks (DB/worker/heartbeat stale) - [x] `18:00–19:00` runbook + финальный push в prod + freeze dev ### Неделя после freeze (только тестирование) Чеклист: [testing-e2e-checklist.md](testing-e2e-checklist.md) - [ ] `дни 1–2` функциональные E2E (`RDP + SSH + mixed load`) - [ ] `дни 3–4` нагрузка, дубликаты, флаппинг heartbeat - [ ] `день 5` регресс + known issues - [ ] `дни 6–7` soak-test, только bugfix --- ## Gantt (упрощённо) ```mermaid gantt title SAC — актуальный план dateFormat YYYY-MM-DD section Документы Фаза 0 :done, 2026-05-26, 1d section SAC 1B ingest+deploy :done, 2026-05-26, 1d 1C UI базовый :done, 2026-05-26, 1d 1C notify+dash :active, 2026-05-27, 14d section Агенты 1A UseSAC dual :2026-05-26, 10d section Prod Пилот exclusive :2026-06-16, 7d ``` --- ## Следующий рабочий день (29.05.2026) Оповещения SAC (**notif-01…32**) — ✅ см. [todo-2026-05-29.md](todo-2026-05-29.md). На prod: деплой, `notif-02` E2E, timer `sac-daily-report`. Отложенная аналитика: **[analytics-backlog.md](analytics-backlog.md)**. --- ## См. также - [install-ubuntu-24.04.md](install-ubuntu-24.04.md) — подготовка сервера - [operations-prod-status.md](operations-prod-status.md) — статус prod и деплой - [roadmap.md](roadmap.md) - [TZ.md](TZ.md)