3.3 KiB
3.3 KiB
title, updated
| title | updated |
|---|---|
| CrowdSec 및 SafeLine WAF | 2026-03-15 |
DB 테이블
DB 테이블은 blocklist (ip PK, reason, origin, expires_at), verified_ips, metadata
시나리오
시나리오: safeline/xml-injection, safeline/command-injection, custom/safeline-waf-blocked (trigger), custom/safeline-waf-repeated (leaky bucket 3+/5min)
Bouncer
Bouncer 목록: apisix-waf-bouncer, bunny-cdn-bouncer, cs-cloudflare-worker-bouncer
bunny-cdn-bouncer 상세
- 동기화: jp1
infra-tool컨테이너,/opt/crowdsec-bouncer/bouncer.py - 크론: 3분 간격 delta sync, 매시 정각 full sync (
/etc/cron.d/crowdsec-bunny-bouncer) - 방식: CrowdSec LAPI → Bloom filter 생성 → BunnyCDN Edge Script 코드에 임베딩 → 퍼블리시
- Edge Script: BunnyCDN Compute Script ID 64811 (
crowdsec-bouncer-middleware)- Bloom filter (FNV-1a) 기반 IP 차단
- 차단 시 Cloudflare Turnstile CAPTCHA 챌린지 (false positive 대응)
- LibSQL DB로 verified IP 4시간 캐싱 + HMAC 서명 쿠키
- Clean IP 네거티브 캐시 (최대 50K)
- 적용 풀존: inouter (5316471) — actions (5330178)은 미적용
- API 키: Vault
secret/infra/crowdsec-bunny-bouncer(bouncer_key) - 소스 코드:
~/crowdsec-bunny-bouncer/
3중 보안 구조 (KR존, 2026-03-15)
클라이언트 → BunnyCDN Edge Script (CrowdSec bouncer, 0차)
→ BunnyCDN WAF (1차)
→ APISIX + SafeLine WAF (2차)
→ CrowdSec (분석/3차) → bunny-cdn-bouncer로 피드백 루프
1차: BunnyCDN WAF (OWASP CRS)
- 위치: CDN 에지 (오리진 도달 전 차단)
- 차단: SQLi, XSS, CMDi, SSRF, Shellshock, Log4j
- 비활성화한 룰: DATA LEAKAGES SQL (id=911) — NocoDB API 응답 오탐 방지
- 통과: Request Smuggling, NoSQLi, 일반 경로 스캔
2차: SafeLine WAF (chaitin-waf 플러그인)
- 위치: APISIX 내부 플러그인
- BunnyCDN을 통과한 공격 차단
- 글로벌 적용 (global_rules로 chaitin-waf 설정)
3차: CrowdSec (로그 분석)
- 위치: jp1 CrowdSec (10.253.100.240:8080)
- APISIX http-logger → CrowdSec HTTP acquisition (global_rules)
- 파서: custom/apisix-json-logs (APISIX http-logger JSON 파싱)
- 반복 공격자 패턴 탐지 (시나리오 매칭)
- 인증:
Authorization: apisix-crowdsec-log-2024
공격 테스트 결과 (sandbox-tokyo → nocodb.inouter.com)
| 공격 | 결과 | 차단 위치 |
|---|---|---|
SQLi (OR 1=1) |
403 | BunnyCDN WAF |
| SQLi (대소문자 혼합) | 403 | BunnyCDN WAF |
| SQLi (더블 인코딩) | 403 | BunnyCDN WAF |
| SQLi (POST body) | 403 | BunnyCDN WAF |
XSS (<script>) |
403 | BunnyCDN WAF |
| XSS (img onerror) | 403 | BunnyCDN WAF |
| CMDi | 403 | BunnyCDN WAF |
| SSRF | 403 | BunnyCDN WAF |
| Shellshock | 403 | BunnyCDN WAF |
| Log4j (JNDI) | 403 | BunnyCDN WAF |
| Path Traversal | 404 | 경로 정규화 (무해) |
| Request Smuggling | 302 | 통과 (CDN 정규화로 실제 smuggling 불가) |
| NoSQLi (JSON) | 401 | 통과 (PostgreSQL이라 무효, 인증에서 차단) |
| WP scan | 404 | 통과 (존재하지 않는 경로) |
참고
- BunnyCDN WAF 차단 시 오리진에 로그 안 옴 → CrowdSec에 미수신
- 리얼 IP: 외부 트래픽은
X-Forwarded-For로 정상 전달, LAN은127.0.0.1 - OpenWrt에 CrowdSec firewall bouncer 설치 가능하나 DNAT 구조라 리얼 IP 매칭 불가