netbis-sigmatch v2.4: A4 Matrix Profile 트리거 제거

18h DRY 가동 결과 99 distinct IP 차단 누적. attack_contributor 2,668건 중
97.5%가 MP only 시그널 발동. MP threshold p99 (1% 오탐) × 매 5분 사이클 평가
= 누적 폭주. attack_contributor의 단순 volume top이 webhook + heavy normal
user 항상 잡음.

LIVE였으면 베팅 콜백 4~5개 차단 + KR 활발 유저 + IPv6 모바일 240/4 가짜 IP
99개 차단 = 서비스 사고.

matrix_profile.py 모듈은 보존 (관찰/연구용). loop.py에서 호출만 제거.

폐기 사유: MP의 self-similar 시계열 가정이 daily seasonality 있는 트래픽과
안 맞음 + 단일 시그널이 contributor 단계로 무차별 차단 증폭
This commit is contained in:
kaffa
2026-04-25 10:17:24 +09:00
parent e0787b38f3
commit ae6237de21

View File

@@ -13,7 +13,7 @@ Netbis NPM 로그(VictoriaLogs)를 실시간 분석해 **사람 개입 없이
- **배포 예정**: jp1 Incus `ai-sigmatch` 컨테이너 (systemd timer 1분) - **배포 예정**: jp1 Incus `ai-sigmatch` 컨테이너 (systemd timer 1분)
- **책임자**: kappa 직접 개발 (Heimdall 위임 X, 개발 단계) - **책임자**: kappa 직접 개발 (Heimdall 위임 X, 개발 단계)
## 핵심 설계 (v2.3, 2026-04-24 CF Access Rules LIVE 모드 추가) ## 핵심 설계 (v2.4, 2026-04-25 A4 Matrix Profile 트리거 제거)
### 탐지 트리거 (OR 조건, 하나라도 충족 시 attack mode ON) ### 탐지 트리거 (OR 조건, 하나라도 충족 시 attack mode ON)
@@ -38,16 +38,7 @@ g_t > μ × 2.0 → trigger → reset g=0
- entropy 계산은 `min_entropy_baseline_samples=20` 확보 후부터 - entropy 계산은 `min_entropy_baseline_samples=20` 확보 후부터
- `uniq_ips < entropy_min_uniq_ips=30` 이면 판정 스킵 (트래픽 자체가 너무 적을 때) - `uniq_ips < entropy_min_uniq_ips=30` 이면 판정 스킵 (트래픽 자체가 너무 적을 때)
**A4. Matrix Profile discord** (패턴 이상) **A4. Matrix Profile discord** ~~(v2.2~v2.3)~~ — **v2.4에서 제거** (사유 아래 참조)
```
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 → attack mode ON: top N contributor IP 일괄 challenge
@@ -136,8 +127,9 @@ uv run python cf_client.py purge [--yes] # sigmatch prefix 전
- [x] Phase 8 (v2.1): CUSUM Page-Hinkley + global src IP entropy drop - [x] Phase 8 (v2.1): CUSUM Page-Hinkley + global src IP entropy drop
- [x] Phase 9 (v2.2): Matrix Profile discord (stumpy.stump) 추가 - [x] Phase 9 (v2.2): Matrix Profile discord (stumpy.stump) 추가
- [x] Phase 10: bootstrap_baseline.py — 과거 24h seed로 모든 hour samples_ok 즉시 충족 - [x] Phase 10: bootstrap_baseline.py — 과거 24h seed로 모든 hour samples_ok 즉시 충족
- [x] **Phase 11 (v2.3): CF Access Rules 호출 (managed_challenge/block)** ← 현재 DRY 검증 - [x] Phase 11 (v2.3): CF Access Rules 호출 (managed_challenge/block) DRY 검증 단계
- [ ] Phase 11 LIVE 전환: `--live` 플래그로 실 운영 (환경변수 CF credentials 주입) - [x] **Phase 11.6 (v2.4): A4 Matrix Profile 트리거 제거** ← 현재 (false positive 누적 사고 회피)
- [ ] Phase 11 LIVE 전환: `--live` 플래그로 실 운영
- [ ] Phase 12: jp1 Incus 배포 (systemd timer) - [ ] Phase 12: jp1 Incus 배포 (systemd timer)
## 파라미터 (사람 조정 가능) ## 파라미터 (사람 조정 가능)
@@ -177,6 +169,14 @@ uv run python cf_client.py purge [--yes] # sigmatch prefix 전
- ~~IsolationForest + DBSCAN per-IP anomaly~~ → 정상 폴링 유저를 outlier로 잡아 오탐 위험 - ~~IsolationForest + DBSCAN per-IP anomaly~~ → 정상 폴링 유저를 outlier로 잡아 오탐 위험
- ~~Persistence 단독 트리거~~ → 페이지 오래 열어둔 유저 6 사이클 지속 시 오탐 - ~~Persistence 단독 트리거~~ → 페이지 오래 열어둔 유저 6 사이클 지속 시 오탐
- ~~사전 정의 hard rule (R1~R6)~~ → 공격 패턴 종속, 자동 시그니처 생성 취지 어긋남 - ~~사전 정의 hard rule (R1~R6)~~ → 공격 패턴 종속, 자동 시그니처 생성 취지 어긋남
- ~~Matrix Profile discord (attack 트리거 용도, v2.2~v2.3)~~ → **v2.4 제거**. 사유:
- threshold p99 = 정의상 1% false positive. 매 5분 사이클 평가 → 하루 ~14회 발동
- MP의 self-similar 시계열 가정이 우리 트래픽과 안 맞음. m=12 (1시간) 윈도우는
daily seasonality(낮/저녁/새벽 패턴 변동)보다 짧아 자연스러운 시간대 변동을 discord로 잡음
- 단일 시그널이 attack_mode 트리거가 되어 attack_contributor에서 reqs 순 top 20을
무차별 차단 → 18시간 동안 99 distinct IP 차단 누적 (webhook 4~5개 + KR 활발 유저
+ IPv6 모바일 240/4 가짜 IP). LIVE였으면 베팅 콜백 중단 사고
- matrix_profile.py 모듈은 보존 (관찰/연구용 수동 호출 가능). attack 트리거에서만 제거
## 폐기 후보 (검토 후 불채택) ## 폐기 후보 (검토 후 불채택)