diff --git a/infra/anomaly-detect.md b/infra/anomaly-detect.md index 7924369..8d9a657 100644 --- a/infra/anomaly-detect.md +++ b/infra/anomaly-detect.md @@ -85,7 +85,26 @@ LLM 프롬프트가 무시되어도 실수로 사설망이 ban되지 않음. ### 코드 커밋 해시 -코드 재작성이 병렬로 진행 중 — 이 문서는 코드 완료 전에 커밋됨. 코드 커밋 해시는 별도 커밋으로 추가 예정. +- `a702870` — agentic rewrite (OpenRouter + Grok-4-fast) 초기 구현 +- `af2873d` — `simulate.py` mock 기반 smoke test (5/5 시나리오 PASS) +- `d7789ad` — `DRY_RUN=0` 활성화 (E2E 검증 후) + +### E2E 검증 (2026-04-08) + +`simulate.py` 로컬 mock 테스트 5개 시나리오 전원 PASS 후, 실 VictoriaLogs `/insert/jsonline`에 270 rows 주입해 end-to-end 검증: + +- **시나리오**: sqlmap single IP (`91.92.93.100`, 60건) + distributed brute force (`91.92.94.10~39`, 150건) + 정상 노이즈 (`185.100.200.1~20`, 60건) +- **결과**: Grok-4-fast가 5턴에 **31개 공격 IP 정확 식별**, 정상 IP 0건 ban +- **지연**: ~18초 / **토큰**: 3939 prompt / 223 completion / **비용**: ~$0.001 +- **LAPI**: POST 201 Created, `cscli decisions list -s anomaly-detect/distributed-wp-bruteforce` 에서 31 decisions 확인, scenario 단위 일괄 삭제 cleanup 정상 +- **DRY_RUN=1 안전장치**: 첫 수동 실행은 DRY_RUN=1로 돌려 `"would ban 31 IPs"` 로그만 확인, 실제 LAPI 호출 없음 + +검증 완료 후 systemd unit에 `Environment=DRY_RUN=0` 추가, daemon-reload, 다음 5분 timer 사이클부터 실운영 개시. + +### 운영 중 주의사항 + +- **injected 로그 잔재**: E2E 테스트 중 주입한 270 rows가 vlogs retention 기간 동안 남음. `sim_e2e` 마커 필드로 식별 가능. 다음 cycle에서 다시 탐지될 수 있으나 dedup 24h으로 재ban 차단됨. +- **재테스트 시**: 테스트 후 반드시 `cscli decisions delete -s anomaly-detect/` + `/var/lib/anomaly-detect/dedup.json` 업데이트 (해당 IP 추가하거나 리셋) [[crowdsec-safeline#~~ddos-detect (AI 행위 분석)~~ — 폐기 (2026-04-08)|폐기된 ddos-detect]] 후속. [[victorialogs|VictoriaLogs]]에 적재된 K3s 서울 APISIX access log를 5분마다 분석하여 봇/공격성 IP를 [[crowdsec-safeline|CrowdSec]]에 자동 ban으로 등록한다.