anomaly-detect: Gitea 저장소 연결 + 초기 리뷰 수정 기록

This commit is contained in:
2026-04-08 22:47:32 +09:00
parent 4eba970ea8
commit efa4eae782

View File

@@ -1,9 +1,11 @@
---
title: anomaly-detect (VictoriaLogs + ollama 기반 이상 트래픽 감지)
updated: 2026-04-08 신규
updated: 2026-04-08
tags: [security, crowdsec, victorialogs, ollama, gemma, anomaly]
---
> 코드: `gitea.inouter.com/kaffa/anomaly-detect` (private)
# anomaly-detect
[[crowdsec-safeline#~~ddos-detect (AI 행위 분석)~~ — 폐기 (2026-04-08)|폐기된 ddos-detect]] 후속. [[victorialogs|VictoriaLogs]]에 적재된 K3s 서울 APISIX access log를 5분마다 분석하여 봇/공격성 IP를 [[crowdsec-safeline|CrowdSec]]에 자동 ban으로 등록한다.
@@ -119,13 +121,29 @@ incus exec anomaly-detect -- sh -c 'echo "{}" > /var/lib/anomaly-detect/dedup.js
- `curl http://10.253.100.240:8080/v1/decisions` → 403 (인증 필요, 네트워크 OK)
- 더미 IP `198.51.100.99`로 alert POST → 201 + decision 등록 → cleanup 확인 (smoke test)
## 초기 리뷰 수정 (2026-04-08)
코드 리뷰 결과 다음 버그/개선을 반영:
1. **LAPI POST 실패 시 dedup 선기록 버그**: `dedup[ip] = now_ts`가 LAPI alert POST 이전에 설정되어, LAPI가 일시적으로 죽으면 해당 공격 IP가 24h 동안 재ban되지 않던 문제 수정. 성공/`no` 판정일 때만 dedup에 기록하고, LAPI 예외는 다음 사이클 재시도.
2. **XFF CSV 파싱**: `xff="1.2.3.4, 5.6.7.8"` 같은 CSV를 그대로 IP로 쓰던 버그 수정. `extract_client_ip()` 헬퍼로 첫 번째 IP만 사용.
3. **사설망/Tailscale 필터 개선**: `ip.startswith(("10.", "172.16.", ...))` 문자열 매칭 → `ipaddress.ip_address().is_private` + Tailscale CGNAT `100.64.0.0/10` 제외.
4. **dedup.json 원자적 쓰기**: `tempfile` + `os.replace`로 크래시 시 파일 절단 방지.
수정본은 `gitea.inouter.com/kaffa/anomaly-detect` main 브랜치에 커밋됨 (`d5310f0`).
## 향후 작업
- [ ] 처음 1주는 dry_run 없이 자동 ban이지만 임계값 조정 필요 시 보수적으로 시작 → 모니터링 후 점진 강화
- [ ] Discord webhook 알림 추가 (`secret/apps/discord` Vault에서 가져오기)
- [ ] **[Medium]** Discord webhook 알림 추가 (`secret/apps/discord` Vault에서 가져오기) + systemd `OnFailure=` drop-in
- [ ] **[Medium]** ollama 장시간 장애 시 하드 게이트 fallback (예: 5분 1000+ reqs + 4xx>80% 자동 ban)
- [ ] **[Medium]** `LLM no 판정` IP의 dedup 짧게 (1h) 따로 관리해 false negative 회수
- [ ] **[Low]** CrowdSec alert `origin``"crowdsec"``"anomaly-detect"`로 태깅
- [ ] **[Low]** sample 10건을 "처음 만난 10건" → "최근 10건"으로 변경 (LogsQL `_time` desc 정렬)
- [ ] **[Low]** `scenario_hash` 고정 해시 지정
- [ ] gemma4:e4b 한국어 reason 품질 평가 → 모델 변경 검토 (`gemma3:12b`, `qwen2.5:7b`, `llama3.1:8b` 등)
- [ ] 게이트 통과 후 후보 0건이 며칠 지속되면 임계값 완화
- [ ] 코드를 Gitea repo로 분리 (`gitea.inouter.com/kaffa/anomaly-detect`)
- [x] 코드를 Gitea repo로 분리 (`gitea.inouter.com/kaffa/anomaly-detect`) — 2026-04-08 완료
## 폐기된 전임자