Files
security-alert-center/docs/pilot-2.2-heartbeat-reports.md
T
PTah 415d863b3b feat: SAC daily reports from DB aggregation (notif-32)
- Aggregate report.daily.ssh/rdp from 24h ingest; job and systemd timer

- notify_daily_report bypasses NOTIFY_MIN_SEVERITY; ingest routes agent reports

- HTML templates, env SAC_DAILY_REPORT_*, docs and tests (56 cases)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-29 16:30:07 +10:00

3.7 KiB
Raw Blame History

Фаза 2.2 — Heartbeat и daily report через SAC

Агент уже шлёт в SAC (в т.ч. в exclusive):

Тип Интервал (ssh-monitor)
agent.heartbeat каждые 12 ч
report.daily.ssh раз в сутки после DAILY_REPORT_HOUR

SAC отображает их в События и на Dashboard / Хосты.


UI SAC

  • Dashboard: счётчики heartbeat/отчётов за 24 ч, хосты с устаревшим heartbeat.
  • Хосты: колонки Агент (online / stale / unknown), время последнего heartbeat и отчёта (ссылка на Отчёты по hostname).
  • Отчёты (/reports): список report.daily.* по узлам; клик по строке — карточка с метриками и полным текстом (HTML/report_body в details).
  • Старые события без details.report_body показывают подсказку обновить агент.

Настройка порога «живости» (сервер SAC)

В config/sac-api.env:

# По умолчанию 780 мин (13 ч) — чуть больше интервала heartbeat агента (12 ч)
SAC_HEARTBEAT_STALE_MINUTES=780

После изменения: sudo systemctl restart sac-api.


Проверка на пилотном хосте (exclusive)

  1. Дождаться heartbeat или ускорить тест: на агенте временно уменьшить интервал нельзя без правки кода — проще подождать или вручную:

    sudo /usr/local/bin/ssh-monitor --dry-run
    

    (не шлёт реально; для реального теста — дождаться цикла 12 ч или смотреть уже пришедшие события).

  2. В SAC UI → События, фильтр type=agent.heartbeat.

  3. Хосты → статус online после свежего heartbeat.

  4. Ежедневный отчёт: после DAILY_REPORT_HOUR — событие report.daily.ssh (от агента) или от SAC при SAC_DAILY_REPORT_ENABLED=true и отсутствии отчёта агента за сутки.


SAC: отчёт без агента (exclusive / пропуск агента)

В config/sac-api.env:

SAC_DAILY_REPORT_ENABLED=true
SAC_DAILY_REPORT_HOUR=9
SAC_DAILY_REPORT_TIMEZONE=Europe/Moscow
SAC_DAILY_REPORT_SKIP_IF_AGENT_SENT=true
SAC_DAILY_REPORT_REQUIRE_ACTIVITY=true
  • Job: cd backend && .venv/bin/python -m app.jobs.daily_report (ручной прогон: --force).
  • Timer: deploy/systemd/sac-daily-report.service + .timer (по умолчанию 09:15 UTC в unit; час проверяется по SAC_DAILY_REPORT_TIMEZONE).
  • Оповещение: notify_daily_reportне режется NOTIFY_MIN_SEVERITY=warning (severity отчёта info).
  • UI Отчёты и Telegram используют details.report_html / report_body как у агента.

Установка timer (один раз на сервере):

sudo cp /opt/security-alert-center/deploy/systemd/sac-daily-report.service /etc/systemd/system/
sudo cp /opt/security-alert-center/deploy/systemd/sac-daily-report.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now sac-daily-report.timer

Деплой

sudo /opt/sac-deploy.sh

См. также