netbis-sigmatch v2.2: Matrix Profile discord (stumpy) trigger 추가

This commit is contained in:
kaffa
2026-04-24 13:17:03 +09:00
parent baa81a1955
commit beecbb3be4

View File

@@ -13,7 +13,7 @@ Netbis NPM 로그(VictoriaLogs)를 실시간 분석해 **사람 개입 없이
- **배포 예정**: jp1 Incus `ai-sigmatch` 컨테이너 (systemd timer 1분)
- **책임자**: kappa 직접 개발 (Heimdall 위임 X, 개발 단계)
## 핵심 설계 (v2.1, 2026-04-24 CUSUM + global entropy 추가)
## 핵심 설계 (v2.2, 2026-04-24 Matrix Profile 추가)
### 탐지 트리거 (OR 조건, 하나라도 충족 시 attack mode ON)
@@ -38,6 +38,17 @@ g_t > μ × 2.0 → trigger → reset g=0
- entropy 계산은 `min_entropy_baseline_samples=20` 확보 후부터
- `uniq_ips < entropy_min_uniq_ips=30` 이면 판정 스킵 (트래픽 자체가 너무 적을 때)
**A4. Matrix Profile discord** (패턴 이상)
```
stumpy.stump(최근 7일 total_reqs 시계열, m=12)
현재 서브시퀀스의 MP > 과거 MP 분포의 p99 → discord
```
- m=12 (1시간 subsequence length)
- 완전 비파라메트릭. 학습 불필요, 자기 과거와 직접 비교
- z-normalized euclidean distance라 스케일 차이 무시, **형태 차이**만 봄
- CUSUM은 "크기 이상"만, MP는 "패턴/형태 이상" 담당 → 상보적
- 첫 사이클은 numba JIT로 ~7s, 이후 ms 단위
→ attack mode ON: top N contributor IP 일괄 challenge
**B. 개별 극단 (항상 동작)**
@@ -65,6 +76,7 @@ Raw extreme: reqs ≥ 1500 / 5min
| DDoS·대규모 공격 (급격) | static threshold (p95×2.0 / max×1.5) 발동 |
| Low-rate / 점진 ramp-up DDoS | CUSUM Page-Hinkley 누적으로 발동 |
| 소수 IP 집중 공격 (같은 볼륨) | global src IP entropy drop으로 발동 |
| 지속되는 비정형 shape (평소 한 번도 안 본 패턴) | Matrix Profile discord로 발동 |
| 가짜 공격 (baseline 경계선) | samples ≥ 10 확보 후에만 판정 (초기 1~2일은 판정 유예) |
**사람이 쓴 공격 지식 없음**:
@@ -84,10 +96,11 @@ Raw extreme: reqs ≥ 1500 / 5min
- [x] Phase 3-5: (폐기) IsolationForest+DBSCAN+persistence 기반
- [x] Phase 6 (v2): 집계 기반 공격 모드 + 개별 극단 시그니처
- [x] Phase 7: 롤링 baseline 자동 갱신
- [x] **Phase 8 (v2.1): CUSUM Page-Hinkley + global src IP entropy drop** ← 현재
- [ ] Phase 9: 장시간 관찰 (dry-run) — 진행 중 (백그라운드 `loop.py`). entropy baseline 20+ 샘플 쌓이려면 약 20시간
- [ ] Phase 10: CF IP Access Rules 호출 (managed_challenge → block)
- [ ] Phase 11: jp1 Incus 배포 (systemd timer)
- [x] Phase 8 (v2.1): CUSUM Page-Hinkley + global src IP entropy drop
- [x] **Phase 9 (v2.2): Matrix Profile discord (stumpy.stump) 추가** ← 현재
- [ ] Phase 10: 장시간 관찰 (dry-run) — 진행 중 (백그라운드 `loop.py`). entropy baseline 20+ 샘플 쌓이려면 약 20시간
- [ ] Phase 11: CF IP Access Rules 호출 (managed_challenge → block)
- [ ] Phase 12: jp1 Incus 배포 (systemd timer)
## 파라미터 (사람 조정 가능)
@@ -101,6 +114,8 @@ Raw extreme: reqs ≥ 1500 / 5min
| `cusum_threshold_mult` | 2.0 | CUSUM 트리거 h = μ × mult |
| `min_entropy_baseline_samples` | 20 | entropy baseline 샘플 부족 시 판정 스킵 |
| `entropy_min_uniq_ips` | 30 | uniq IP 부족 시 entropy 판정 스킵 |
| `mp_subseq_len` | 12 | Matrix Profile subsequence length (5분×12=1h) |
| `mp_threshold_pct` | 0.99 | 과거 MP 분포의 이 percentile 초과 시 trigger |
| `scanner_uniq_ratio` | 0.8 | uniq_paths/reqs 임계 |
| `scanner_min_entropy` | 7.0 | path entropy 임계 (per-IP) |
| `scanner_min_reqs` | 300 | 스캐너 최소 요청 수 |
@@ -116,6 +131,8 @@ Raw extreme: reqs ≥ 1500 / 5min
- 평상시 24h 데이터: static threshold 0회 발동, **CUSUM hour별 μ 적용 시 0회 오탐**
- 마지막 5개 윈도우에 1.5x→3.5x 점진 ramp 주입: CUSUM 3회 발동 (idx 198/199/200 연속)
- CUSUM 유닛 테스트: 평상시 g=0 유지, ramp-up 시 g 누적 → h 초과 시 trigger + reset 확인
- **Matrix Profile**: 평상시 201 윈도우에서 p99 초과 ~1%. 단기 3-point spike는 MP 안 튀고 (CUSUM 담당), **1시간 sustained max×3 형상은 MP=3.46 > p99=3.19로 trigger** 확인. 역할 상보적
- 배포 후 cycle 101에서 `mp=1.87/thr=2.88` 안정 관찰 (현재 패턴이 과거와 유사 → trigger X)
## 폐기된 이전 설계
@@ -131,7 +148,8 @@ Raw extreme: reqs ≥ 1500 / 5min
향후 데이터 2주+ 쌓이면 검토 예정:
- **Holt-Winters** — level+trend+seasonality. 현재 static p95×mult 대체 가능
- **Aggregate-window Isolation Forest** — per-IP 아닌 "윈도우 다변량 feature" anomaly
- **River HalfSpaceTrees** — streaming Isolation Forest, 다변량 윈도우 feature 학습-예측 동시
- **ADWIN (concept drift)** — baseline 자동 window 조정 (서비스 성장 대응)
## 파일 구조
@@ -141,7 +159,8 @@ Raw extreme: reqs ≥ 1500 / 5min
├── collect_baseline.py — retrospective seed baseline 수집
├── baseline_aggregate.py — 시간대별 seed 통계 수집 (1회성)
├── inspect_baseline.py — baseline DB 탐색
├── state.py — state DB (ip_state, baseline_samples 등)
├── state.py — state DB (ip_state, baseline_samples, cusum_state 등)
├── matrix_profile.py — stumpy MP discord 판정 (v2.2)
├── loop.py — 메인 실시간 루프
├── simulate.py — 과거 데이터로 로직 검증
├── baseline.db — seed snapshot 24h