From 53172c06e88f23bb792c2efc1ae571571e4f7b5e Mon Sep 17 00:00:00 2001 From: heimdall Date: Sun, 26 Apr 2026 09:55:55 +0900 Subject: [PATCH] =?UTF-8?q?bouncer=20=EB=8B=A8=EC=9D=BC=ED=99=94:=20netbis?= =?UTF-8?q?-cf-firewall=EB=A7=8C=20=EC=9C=A0=EC=A7=80,=20=EB=82=98?= =?UTF-8?q?=EB=A8=B8=EC=A7=80=203=EC=A2=85(cs-cf-worker/apisix-waf/bunny-c?= =?UTF-8?q?dn)=20=ED=8F=90=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- history/2026-04-26-bouncer-consolidation.md | 103 ++++++++++++++++++++ infra/security/crowdsec-safeline.md | 77 ++++----------- 2 files changed, 123 insertions(+), 57 deletions(-) create mode 100644 history/2026-04-26-bouncer-consolidation.md diff --git a/history/2026-04-26-bouncer-consolidation.md b/history/2026-04-26-bouncer-consolidation.md new file mode 100644 index 0000000..487b9e2 --- /dev/null +++ b/history/2026-04-26-bouncer-consolidation.md @@ -0,0 +1,103 @@ +--- +date: 2026-04-26 +topic: CrowdSec bouncer 단일화 — netbis-cf-firewall만 유지, 나머지 3종 완전 제거 +areas: [infra/security/crowdsec-safeline.md, infra/security/cloudflare.md, services/netbis.md] +tags: [crowdsec, bouncer, cloudflare, bunnycdn, apisix, simplification] +--- + +## 결정 + +CrowdSec LAPI 등록 4종 bouncer 중 `cs-cloudflare-bouncer-1777082222` (netbis-cf-firewall) 만 유지하고 나머지 3종 완전 제거. + +| 보존 | 폐기 | +|---|---| +| `cs-cloudflare-bouncer-1777082222` (netbis-cf-firewall, 2026-04-25 재구축) | `cs-cf-worker-bouncer` (kappa CF Worker + KV + Turnstile×4) | +| | `apisix-waf-bouncer` (APISIX plugin 0.1) | +| | `bunny-cdn-bouncer` (BunnyCDN Edge Script 64811 bloom filter) | + +이유 (kappa 지시): +- 운영 단순화 — 4종 bouncer 동시 관리 부담 +- Worker bouncer 비용 + Turnstile 위젯 168h rotation 부담 +- BunnyCDN Edge bloom filter 갱신 cron 의존성 +- APISIX plugin 0.1 (오래된 패키지) +- netbis-cf-firewall은 origin filter `[crowdsec, cscli]` + Free CF 영역으로 비용 0, 단순 + +## 영향 (실행 전 사용자 확인 불필요로 진행) + +- **enforce 사라진 영역**: + - kappa zone (keepanker.cv, actions.it.com, ironclad.it.com, servidor.it.com) CrowdSec ban → CF에서 관통 + - BunnyCDN 풀존 iron-jp(5555247) / iron-kr(5555227) edge bouncer 차단 → 풀존 도착 트래픽이 origin까지 전달 + - APISIX 인스턴스 chaitin-waf 보완용 IP ban (어느 인스턴스인지 Syn 확인) → SafeLine WAF만 유지 +- **유지되는 enforce**: + - SafeLine WAF (chaitin-waf 플러그인, K3s safeline ns) + - APISIX limit-req + - netbis-cf-firewall (Netbis 6 zone CF Firewall Rule managed_challenge) + - BunnyCDN WAF (OWASP CRS) — bouncer와 별개 + +## 작업 분담 + 진행 + +### Heimdall 직접 + +| 단계 | 결과 | +|---|---| +| `incus stop+delete jp1:cs-cf-worker-bouncer` | ok, 컨테이너 사라짐 확인 | +| `jp1:infra-tool` cron `/etc/cron.d/crowdsec-bunny-bouncer` 삭제 | ok | +| `jp1:infra-tool` `/opt/crowdsec-bouncer/` 디렉토리 + bouncer.py 삭제 | ok | +| `pkill -9 -f bouncer.py` (잔존 프로세스) | ok | +| `cscli bouncers delete cs-cf-worker-bouncer` | deleted successfully | +| `cscli bouncers delete apisix-waf-bouncer` | deleted successfully | +| `cscli bouncers delete bunny-cdn-bouncer` | deleted successfully | +| LAPI 최종 상태 | `cs-cloudflare-bouncer-1777082222` 단일 | + +### Syn 위임 (peer 통신, 동시 진행) + +heimdall→syn tmux 메시지로 3건 위임: + +1. **CF Worker (kappa account)** 정리 — Worker 스크립트 + KV namespace + Turnstile 위젯 4개 (`crowdsec-cloudflare-worker-bouncer-widget`, 적용 zone keepanker/actions/ironclad/servidor) 모두 삭제 +2. **BunnyCDN Edge Script 64811** 정리 — iron-jp(5555247) + iron-kr(5555227) 두 풀존에서 `MiddlewareScriptId: 64811` 해제 + 스크립트 자체 삭제 +3. **APISIX crowdsec-bouncer 플러그인** 비활성화 — apisix-osaka 추정 (헤임달 검증: K3s 서울 미사용, zlambda 미사용). plugin_metadata/crowdsec-bouncer 삭제 + 사용하는 route/global_rule plugins.crowdsec-bouncer 모두 제거 + config.yaml plugins 목록에서 crowdsec-bouncer 제거 (선택) + +> **APISIX는 본래 Syn 영역**(CLAUDE.md 스코프) 이지만 kappa task 에서는 Heimdall 직접으로 명시되어 있었음. 실제로 apisix-osaka admin 권한이 Heimdall ops-agents 키로 없음 → Syn 위임이 자연스러움. 이 경계 deviation 은 작업 효율 우선으로 합리적 판단. + +## Vault 시크릿 처리 + +- `secret/infra/crowdsec-bunny-bouncer` — **보존** (별도 폐기 결정) +- `cs-cf-worker-bouncer` 관련 토큰 — **보존** (별도 폐기 결정) +- LAPI api-key 3종 — `cscli bouncers delete` 시점에 자동 무효화 + +## 검증 + +```bash +# LAPI bouncers list +incus exec jp1:crowdsec -- cscli bouncers list +# → cs-cloudflare-bouncer-1777082222 단일 + +# infra-tool cron 사라짐 확인 +incus exec jp1:infra-tool -- ls /etc/cron.d/ | grep -i crowdsec +# → (empty) + +# cs-cf-worker-bouncer 컨테이너 사라짐 +incus list jp1: --all-projects | grep cs-cf-worker-bouncer +# → (empty) +``` + +Syn 결과 (별도 보고 후 추가): CF Worker / KV / Turnstile / BunnyCDN Edge Script / APISIX plugin 정리 결과는 Syn → Heimdall 회신 시 본 history에 추기. + +## 롤백 + +각 bouncer 재구성 절차 필요 시 이전 history 참조: +- cs-cf-worker-bouncer: 정본 `gitea.inouter.com/kaffa/k8s` `configs/crowdsec/crowdsec-cloudflare-worker-bouncer.yaml` +- bunny-cdn-bouncer: `gitea.inouter.com/kaffa/crowdsec-bunny-bouncer` (소스 보존) +- apisix-waf-bouncer: `crowdsec-bouncer.lua` 파일 + APISIX config.yaml plugins 등록 + plugin_metadata 설정 + +## 후속 과제 + +- [ ] Vault `secret/infra/crowdsec-bunny-bouncer` + cs-cf-worker-bouncer 관련 토큰 폐기 결정 (kappa) +- [ ] CrowdSec scenarios 다시 검토 — 일반 enforce 경로가 사라졌으니 시나리오 그룹화/조용화 가능 +- [ ] kappa zone에 대한 대체 보호 검토 (필요 시 BunnyCDN WAF 강화 / CF Pro 플랜 활용 등) +- [ ] Syn 회신 후 본 history에 CF Worker / KV / Turnstile / BunnyCDN Edge / APISIX plugin 정리 결과 추기 + +## 관련 history + +- [[2026-04-23-netbis-bouncer-removal|2026-04-23 Netbis 바운서 전량 제거]] (1차) +- [[2026-04-25-netbis-cf-firewall-rebuild|2026-04-25 netbis-cf-firewall 재구축]] (origin filter 적용) diff --git a/infra/security/crowdsec-safeline.md b/infra/security/crowdsec-safeline.md index fe256b3..31693ea 100644 --- a/infra/security/crowdsec-safeline.md +++ b/infra/security/crowdsec-safeline.md @@ -231,46 +231,16 @@ CrowdSec 공식 가이드 명시 사항 ([blog](https://www.crowdsec.net/blog/mi ## Bouncer -### cs-cf-worker-bouncer (Cloudflare Worker) +> [!note] Bouncer 단일화 (2026-04-26) +> CrowdSec bouncer를 `netbis-cf-firewall` 단일로 통합. 아래 ~~strikethrough~~ 항목 3종 (cs-cf-worker-bouncer / apisix-waf-bouncer / bunny-cdn-bouncer) 모두 폐기. 사유: 운영 단순화 + 비용 구조 비효율 + Worker bouncer Turnstile 위젯 168h rotation 부담. SafeLine WAF / APISIX limit-req / netbis-cf-firewall 보호는 그대로 유지. +> +> **사라진 enforce 영역**: kappa zone(keepanker.cv, actions.it.com, ironclad.it.com, servidor.it.com) CrowdSec ban / BunnyCDN 풀존(iron-jp, iron-kr) 엣지 차단 / APISIX 인스턴스 chaitin-waf 보완용 IP ban. +> +> 상세: [[../../history/2026-04-26-bouncer-consolidation|history]] -| 항목 | 값 | -|------|-----| -| 위치 | jp1 Incus `cs-cf-worker-bouncer` 컨테이너 | -| 설정 | `/etc/crowdsec/bouncers/crowdsec-cloudflare-worker-bouncer.yaml` | -| 정본 | `gitea.inouter.com/kaffa/k8s` → `configs/crowdsec/crowdsec-cloudflare-worker-bouncer.yaml` | -| 동기화 | 10초 (decision stream polling) | -| 방식 | LAPI → bouncer → Cloudflare Worker KV (bloom filter) → Worker에서 차단/captcha | -| **액션 매핑** | `default_action: captcha` (Turnstile). LAPI decision type이 ban이든 captcha든 모두 Turnstile 페이지로 처리됨 | -| 보호 zone | keepanker.cv, actions.it.com, ironclad.it.com, servidor.it.com | -| 비보호 zone | inouter.com, anvil.it.com — DNS `proxied: false` 라 CF 엣지를 거치지 않아 bouncer 라우트가 enforce 되지 않음. 보호는 BunnyCDN 미들웨어 64811 단독 | -| Turnstile 위젯 | 4개 bouncer-managed (`crowdsec-cloudflare-worker-bouncer-widget` 이름, 168h rotation). BunnyCDN 미들웨어용 `inouter-bunny-middleware` 는 별도 수동 관리 — [[cloudflare#Turnstile 위젯]] | -| yaml writer | `cfb-manager` 단일 (K8s `default/cfb-manager` REST API). 과거 `/etc/cron.d/cf-zone-sync` + `auto-add-cf-zones.sh` 자동 쓰기는 coordination 문제로 제거됨 — 신규 zone 추가는 `cfb-manager POST /domains` 또는 수동 yaml edit + systemctl restart | +### ~~cs-cf-worker-bouncer (Cloudflare Worker)~~ — 폐기 (2026-04-26) -#### Decision 수동 관리 - -bouncer의 `lapi_key`는 **읽기 전용**. decision 추가/삭제는 `crowdsec` 컨테이너에서 `cscli`로: - -```bash -# ban 추가 -ssh incus-jp1 "incus exec crowdsec -- cscli decisions add --ip 1.2.3.4 --duration 2m --reason 'manual ban' --type ban" - -# 확인 -ssh incus-jp1 "incus exec crowdsec -- cscli decisions list --ip 1.2.3.4" - -# 삭제 -ssh incus-jp1 "incus exec crowdsec -- cscli decisions delete --ip 1.2.3.4" -``` - -bouncer 컨테이너에서 `curl POST /v1/decisions`로 직접 넣으면 등록 안 됨 — API 키 권한 제한. - -#### 설정 변경 시 주의 - -**`sed -i` 사용 금지** — Incus 컨테이너 내에서 `sed -i`로 수정 시 이전 내용이 파일 끝에 남아 YAML 깨짐. 반드시 전체 파일 덮어쓰기: - -```bash -cat updated-config.yaml | ssh incus-jp1 "incus file push - cs-cf-worker-bouncer/etc/crowdsec/bouncers/crowdsec-cloudflare-worker-bouncer.yaml" -ssh incus-jp1 "incus exec cs-cf-worker-bouncer -- systemctl restart crowdsec-cloudflare-worker-bouncer" -``` +[[../../history/2026-04-26-bouncer-consolidation|history]] 참조. jp1 incus `cs-cf-worker-bouncer` 컨테이너 + 설정 파일 + LAPI 등록 모두 제거. CF Worker 스크립트 / KV namespace / Turnstile 위젯 4개 (`crowdsec-cloudflare-worker-bouncer-widget`)는 Syn에 위임 정리. > **Netbis CF 바운서 (2026-04-23 폐기 → 2026-04-25 Firewall Rule 단독 재구축)** > @@ -301,31 +271,24 @@ ssh incus-jp1 "incus exec cs-cf-worker-bouncer -- systemctl restart crowdsec-clo cs-cf-worker-bouncer (kappa 계정용)는 별도 컨테이너에서 그대로 운영. netbis는 비용 구조 차이로 firewall bouncer만 사용. -### bunny-cdn-bouncer (BunnyCDN Edge Script) +### ~~bunny-cdn-bouncer (BunnyCDN Edge Script)~~ — 폐기 (2026-04-26) -| 항목 | 값 | -|------|-----| -| 동기화 | jp1 `infra-tool` 컨테이너, `/opt/crowdsec-bouncer/bouncer.py` | -| 크론 | 3분 delta sync, 매시 full sync | -| 방식 | LAPI → Bloom filter → BunnyCDN Edge Script 임베딩 → 퍼블리시 | -| Edge Script | ID 64811 (`crowdsec-bouncer-middleware`), FNV-1a bloom filter | -| 차단 시 | Cloudflare Turnstile CAPTCHA + LibSQL verified IP 캐싱(4h) | -| 적용 풀존 | iron-jp (5555247), iron-kr (5555227) — 두 풀존 모두 `MiddlewareScriptId: 64811` | -| API 키 | Vault `secret/infra/crowdsec-bunny-bouncer` | -| 소스 | `~/crowdsec-bunny-bouncer/` | +[[../../history/2026-04-26-bouncer-consolidation|history]] 참조. jp1 `infra-tool` 컨테이너 cron + `/opt/crowdsec-bouncer/bouncer.py` 제거. LAPI 등록 삭제. BunnyCDN Edge Script 64811 (`crowdsec-bouncer-middleware`) 두 풀존(iron-jp 5555247 / iron-kr 5555227) middleware 해제 + 스크립트 삭제는 Syn 위임. Vault `secret/infra/crowdsec-bunny-bouncer` 시크릿 보존(별도 폐기 결정). -## 보안 구조 +### ~~apisix-waf-bouncer (APISIX plugin)~~ — 폐기 (2026-04-26) + +`apisix-plugin-crowdsec-bouncer 0.1` — APISIX 인스턴스(가능성: apisix-osaka)의 chaitin-waf 보완용 IP ban 플러그인. LAPI 등록 삭제 완료. APISIX plugin 비활성화 + plugin_metadata/route 정리는 Syn 위임. K3s 서울 / zlambda APISIX 는 미사용 확인 완료. 상세: [[../../history/2026-04-26-bouncer-consolidation|history]] + +## 보안 구조 (2026-04-26 bouncer 단일화 이후) ``` -클라이언트 → BunnyCDN Edge Script (CrowdSec bouncer, 0차) - → BunnyCDN WAF (OWASP CRS, 1차) +클라이언트 → BunnyCDN WAF (OWASP CRS, 1차) — 일반 도메인 경로 → Traefik / APISIX + SafeLine WAF (2차) - → CrowdSec 로그 분석 (3차) → bouncer 피드백 루프 -``` + → CrowdSec 로그 분석 (3차) → netbis-cf-firewall (Netbis 6 zone CF Firewall Rule 피드백 루프) -### 0차: BunnyCDN Edge Script (CrowdSec bouncer) -- Bloom filter로 악성 IP 즉시 차단 -- false positive 시 Turnstile CAPTCHA로 구제 +netbis 전용 enforce: CF Account IP List + 6 zone Firewall Rule managed_challenge (netbis-cf-firewall) +일반 zone enforce 사라짐 — kappa zone CrowdSec ban 미적용. BunnyCDN Edge bouncer / Worker bouncer / APISIX bouncer 모두 폐기 (2026-04-26) +``` ### 1차: BunnyCDN WAF (OWASP CRS) - CDN 에지에서 오리진 도달 전 차단