netbis-sigmatch v2.3: CF Access Rules LIVE 연동 (Phase 11)

This commit is contained in:
kaffa
2026-04-24 14:58:28 +09:00
parent beecbb3be4
commit d32121bfda

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.2, 2026-04-24 Matrix Profile 추가) ## 핵심 설계 (v2.3, 2026-04-24 CF Access Rules LIVE 모드 추가)
### 탐지 트리거 (OR 조건, 하나라도 충족 시 attack mode ON) ### 탐지 트리거 (OR 조건, 하나라도 충족 시 attack mode ON)
@@ -86,8 +86,39 @@ Raw extreme: reqs ≥ 1500 / 5min
## 조치 레벨 ## 조치 레벨
- **challenge** (Cloudflare managed_challenge, CAPTCHA, TTL 30분): 정상 유저는 한 번 풀고 통과 - **challenge** (Cloudflare `managed_challenge`, CAPTCHA, 내부 TTL 30분): 정상 유저는 한 번 풀고 통과
- **block** (TTL 24시간): challenge 통과 후에도 같은 IP가 5+ 사이클 연속 공격 시 - **block** (CF `block`, 내부 TTL 24시간): challenge 통과 후에도 같은 IP가 5+ 사이클 연속 공격 시
- 내부 TTL이 지나면 loop이 CF rule을 DELETE (CF Access Rules 자체 TTL 없음, sigmatch가 관리)
## CF 연동 (Phase 11, v2.3)
### 엔드포인트
- Account-level: `POST /accounts/{id}/firewall/access_rules/rules` (6개 zone 동시 적용)
- 인증: `X-Auth-Email` + `X-Auth-Key` (global_api_key). API token은 Rulesets/Firewall 403
- Vault: `secret/cloud/cloudflare-netbis` (`account_id`, `email`, `global_api_key`)
### 중복 호출 최소화
상태 변화 있을 때만 CF API 호출:
- `없음 → challenge/block`: `create_rule``rule_id` 저장
- `challenge → block`: `update_rule (PATCH mode)` (같은 rule_id 유지)
- `같은 action 지속`: **skip-same** (CF 호출 없음, sqlite state만 갱신하여 TTL 연장)
- `expire_actions`: 내부 TTL 만료 시 `delete_rule` + state clear
### Rate Limit 대응
- `min_interval_sec=0.3` (sleep), 429 시 exponential backoff
- CF API 계정 제한 1200 req/5min — 지속 공격 IP 10개 × 사이클당 skip-same 로직이라 여유
### Rule 태깅
notes에 `netbis-sigmatch` prefix. startup 시 `list_sigmatch_rules()`로 우리가 만든 rule만 필터 캐시.
### CLI 유틸 (`cf_client.py`)
```bash
# env: CF_ACCOUNT_ID, CF_EMAIL, CF_GLOBAL_API_KEY
uv run python cf_client.py list # 현재 sigmatch rules 확인
uv run python cf_client.py create --ip X --mode managed_challenge --note "..."
uv run python cf_client.py delete --rule-id XXX
uv run python cf_client.py purge [--yes] # sigmatch prefix 전체 삭제
```
## 개발 단계 ## 개발 단계
@@ -97,9 +128,10 @@ Raw extreme: reqs ≥ 1500 / 5min
- [x] Phase 6 (v2): 집계 기반 공격 모드 + 개별 극단 시그니처 - [x] Phase 6 (v2): 집계 기반 공격 모드 + 개별 극단 시그니처
- [x] Phase 7: 롤링 baseline 자동 갱신 - [x] Phase 7: 롤링 baseline 자동 갱신
- [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) 추가
- [ ] Phase 10: 장시간 관찰 (dry-run) — 진행 중 (백그라운드 `loop.py`). entropy baseline 20+ 샘플 쌓이려면 약 20시간 - [x] Phase 10: bootstrap_baseline.py — 과거 24h seed로 모든 hour samples_ok 즉시 충족
- [ ] Phase 11: CF IP Access Rules 호출 (managed_challengeblock) - [x] **Phase 11 (v2.3): CF Access Rules 호출 (managed_challenge/block)** ← 현재 DRY로 검증
- [ ] Phase 11 LIVE 전환: `--live` 플래그로 실 운영 (환경변수 CF credentials 주입)
- [ ] Phase 12: jp1 Incus 배포 (systemd timer) - [ ] Phase 12: jp1 Incus 배포 (systemd timer)
## 파라미터 (사람 조정 가능) ## 파라미터 (사람 조정 가능)
@@ -159,9 +191,11 @@ Raw extreme: reqs ≥ 1500 / 5min
├── collect_baseline.py — retrospective seed baseline 수집 ├── collect_baseline.py — retrospective seed baseline 수집
├── baseline_aggregate.py — 시간대별 seed 통계 수집 (1회성) ├── baseline_aggregate.py — 시간대별 seed 통계 수집 (1회성)
├── inspect_baseline.py — baseline DB 탐색 ├── inspect_baseline.py — baseline DB 탐색
├── state.py — state DB (ip_state, baseline_samples, cusum_state 등) ├── state.py — state DB (ip_state + cf_rule_id, baseline_samples, cusum_state 등)
├── matrix_profile.py — stumpy MP discord 판정 (v2.2) ├── matrix_profile.py — stumpy MP discord 판정 (v2.2)
├── loop.py — 메인 실시간 루프 ├── cf_client.py — CF Access Rules API 래퍼 + CLI 유틸 (v2.3)
├── bootstrap_baseline.py — 과거 N시간 seed 주입 (cold start 해소)
├── loop.py — 메인 실시간 루프 (--live로 CF 호출)
├── simulate.py — 과거 데이터로 로직 검증 ├── simulate.py — 과거 데이터로 로직 검증
├── baseline.db — seed snapshot 24h ├── baseline.db — seed snapshot 24h
├── state.db — 운영 상태 + 롤링 baseline ├── state.db — 운영 상태 + 롤링 baseline