de29270a25
Co-authored-by: Cursor <cursoragent@cursor.com>
110 lines
5.5 KiB
Markdown
110 lines
5.5 KiB
Markdown
# E2E и нагрузочное тестирование SAC + агенты
|
||
|
||
Чеклист после freeze MVP (`work-plan.md`). Отмечайте дату и хост.
|
||
|
||
## Дни 1–2: функциональный E2E
|
||
|
||
### Linux (ssh-monitor, `UseSAC=dual` или `exclusive`)
|
||
|
||
- [ ] `ssh-monitor --check-sac` → HTTP 201/202, событие `agent.test` в UI
|
||
- [ ] Успешный SSH login → `ssh.login.success` в SAC + Telegram (dual)
|
||
- [ ] Неудачный SSH → `ssh.login.failed`
|
||
- [ ] `SERVER_DISPLAY_NAME` задан → в SAC **Хосты** отображается display name
|
||
- [ ] Heartbeat → `agent.heartbeat`, хост не `stale` в пределах `SAC_HEARTBEAT_STALE_MINUTES`
|
||
- [ ] Daily report → `report.daily.ssh` (агент или SAC: `python -m app.jobs.daily_report --force`, `details.generated_by`)
|
||
|
||
### Windows (RDP-login-monitor, `UseSAC=dual`)
|
||
|
||
- [ ] `-CheckSac` → ingest OK
|
||
- [ ] Старт монитора → `agent.lifecycle` в SAC (HTTP 201), Telegram «ЗАПУЩЕН»
|
||
- [ ] Версия в UI **Хосты** = `$ScriptVersion` после деплоя
|
||
- [ ] `$ServerDisplayName` → display name в SAC
|
||
- [ ] 4624/4625 (тестовый вход) → `rdp.login.*` при наличии событий
|
||
- [ ] Dashboard: новое событие появляется в «Последние события» без F5 (~5 с)
|
||
|
||
### SAC UI
|
||
|
||
- [ ] Problems: open → ack → resolve
|
||
- [ ] Дубликат `event_id` → HTTP 409, одна строка в БД
|
||
- [ ] Правило brute-force (порог событий) → Problem
|
||
|
||
### SAC Telegram — severity и exclusive (`notif-02`)
|
||
|
||
**Предусловие:** на prod после `79a78dc+` выполнен деплой (`sudo /opt/sac-deploy.sh` → миграция **`004_notification_channels`**).
|
||
|
||
| # | Шаг | Ожидание |
|
||
|---|-----|----------|
|
||
| 1 | UI → **Настройки** → «Проверить Telegram» | Сообщение «✅ SAC: тестовое сообщение…» в чате |
|
||
| 2 | Включить Telegram, `min severity` = **warning**, сохранить (token/chat из env или форма) | GET: `source=db`, `configured=true` |
|
||
| 3 | Ingest **`rdp.login.failed`** (severity `warning`) — см. curl ниже | Telegram: «🚨 SAC событие», severity warning |
|
||
| 4 | Ingest **`rdp.login.success`** (severity `info`) — новый `event_id` | Событие в UI, **нет** сообщения в Telegram |
|
||
| 5 | Сменить `min severity` на **high**, сохранить | Повтор `failed` (warning) → **нет** TG; `high` problem → TG |
|
||
| 6 | Агент **`UseSAC=exclusive`**: неудачный вход | TG только из SAC, **не** из бота агента |
|
||
|
||
**Синтетический ingest (без RDP-хоста):** подставьте `SAC_API_KEY` и уникальный `event_id`.
|
||
|
||
```bash
|
||
API_KEY="sac_…"
|
||
BASE="https://sac.kalinamall.ru"
|
||
|
||
# warning → должен уйти в TG при min=warning
|
||
curl -sS -X POST "$BASE/api/v1/events" \
|
||
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
|
||
-d '{
|
||
"schema_version": "1.0",
|
||
"event_id": "00000000-0000-4000-8000-000000000101",
|
||
"occurred_at": "2026-05-29T12:00:00+03:00",
|
||
"source": {"product": "rdp-login-monitor", "product_version": "1.2.20-SAC"},
|
||
"host": {"hostname": "E2E-RDP", "os_family": "windows", "display_name": "E2E RDP test"},
|
||
"category": "auth",
|
||
"type": "rdp.login.failed",
|
||
"severity": "warning",
|
||
"title": "RDP login failed (E2E)",
|
||
"summary": "notif-02 synthetic failed login"
|
||
}'
|
||
|
||
# info → не должен уйти в TG при min=warning
|
||
curl -sS -X POST "$BASE/api/v1/events" \
|
||
-H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
|
||
-d '{
|
||
"schema_version": "1.0",
|
||
"event_id": "00000000-0000-4000-8000-000000000102",
|
||
"occurred_at": "2026-05-29T12:01:00+03:00",
|
||
"source": {"product": "rdp-login-monitor", "product_version": "1.2.20-SAC"},
|
||
"host": {"hostname": "E2E-RDP", "os_family": "windows"},
|
||
"category": "auth",
|
||
"type": "rdp.login.success",
|
||
"severity": "info",
|
||
"title": "RDP login success (E2E)",
|
||
"summary": "notif-02 synthetic success — no TG expected"
|
||
}'
|
||
```
|
||
|
||
Отметка: дата ______, оператор ______, результат TG шагов 3–4: ☐ OK / ☐ fail
|
||
|
||
## Дни 3–4: нагрузка и устойчивость
|
||
|
||
- [ ] Пакет 50+ `ssh.login.failed` с одного IP → агрегация/Problem, без зависания UI
|
||
- [ ] Повтор ingest с тем же `event_id` → 409
|
||
- [ ] Остановка SAC API → spool на агенте, восстановление после `/health`
|
||
- [ ] Flapping heartbeat: stale → warning в health / хостах
|
||
|
||
## День 5: регресс
|
||
|
||
- [ ] Обновление RDP через Deploy: одна версия в `deployed_version.txt`, ingest после 1.2.14+ JSON
|
||
- [ ] `sac-retention.timer` active; ручной `systemctl start sac-retention.service` — exit 0
|
||
- [ ] Известные issues занесены в issue tracker / `known-issues.md`
|
||
|
||
## Дни 6–7: soak
|
||
|
||
- [ ] 48–72 ч dual mode: нет роста spool без причины, диск БД в норме
|
||
- [ ] Только bugfix по результатам выше
|
||
|
||
## Версии на момент чеклиста
|
||
|
||
| Компонент | Версия |
|
||
|-----------|--------|
|
||
| ssh-monitor | 1.2.6-SAC |
|
||
| RDP-login-monitor | 1.2.20-SAC |
|
||
| security-alert-center | 0.7.0 (`backend/app/version.py`) |
|