feat: problem rules v1 brute-force, privilege spike, host silence (d1-3)

- Threshold rules on ingest; heartbeat auto-resolves host silence

- Config thresholds in sac-api.env; unit tests

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
PTah
2026-05-28 09:51:05 +10:00
parent 83f48dce97
commit 64b5ef297a
7 changed files with 450 additions and 35 deletions
+10
View File
@@ -57,6 +57,16 @@ $SacSpoolDir = "D:\Soft\Logs\sac-spool"
Только правки `Sac-Client.ps1` / `sac-client.sh`: для RDP достаточно поднять patch в `version.txt` (и при необходимости `$ScriptVersion`); для Linux `sac-client.sh` обновится по checksum даже без смены `SSH_MONITOR_VERSION`, но **рекомендуется** поднимать обе метки для логов.
### 1.5. Правила Problems v1 (SAC backend)
| `rule_id` | Условие | Пороги (env) |
|-----------|---------|--------------|
| `rule:brute_force_burst` | `ssh.login.failed` / `rdp.login.failed`, один `source_ip` | `SAC_BRUTE_FORCE_WINDOW_MINUTES=15`, `SAC_BRUTE_FORCE_THRESHOLD=30` |
| `rule:privilege_spike` | `privilege.sudo.command` на хосте | `SAC_PRIVILEGE_SPIKE_WINDOW_MINUTES=10`, `SAC_PRIVILEGE_SPIKE_THRESHOLD=10` |
| `rule:host_silence` | был heartbeat, но устарел (`agent.heartbeat`) | `SAC_HEARTBEAT_STALE_MINUTES` (как для UI «Хосты») |
Свежий `agent.heartbeat` **автоматически resolve** open/ack проблему `rule:host_silence`. Одиночные `high`/`critical` (ban, mass bruteforce) — как раньше.
---
## 2. Протокол ingest
+2 -2
View File
@@ -83,7 +83,7 @@
- [x] `d1-1` Ingest: `event_id` UUID обязателен, UNIQUE индекс, коды duplicate, логи, docs/schema
- [x] `d1-2` MVP Problems: модель, корреляция `host+type+окно`, API `GET/ack/resolve`
- [ ] `d1-3` Правила v1: `brute-force burst`, `privilege spike`, `host silence`
- [x] `d1-3` Правила v1: `brute-force burst`, `privilege spike`, `host silence`
### День 2
@@ -112,7 +112,7 @@
- [x] `13:0014:30` модель Problems + миграция
- [x] `14:3016:00` корреляция при ingest (`fingerprint`, `count`, `last_seen`)
- [x] `16:0017:30` API `GET /problems`, `ack`, `resolve` + smoke
- [ ] `18:0019:00` правила `brute/privilege/silence` + unit tests
- [x] `18:0019:00` правила `brute/privilege/silence` + unit tests
#### День 2