Files
obsidian/services/bunnycdn-security.md
kappa d16090a33d edge: iron-kr IgnoreQueryStrings true→false (iron-jp 와 통일)
- 실측 cache hit rate 0.23% 로 변경 영향 무시 수준
- privilege 교차 / 배포 cache-bust 버그 방지
2026-04-10 11:24:06 +09:00

8.6 KiB

title, updated, tags
title updated tags
BunnyCDN 엣지 보안 (CrowdSec + 국가 차단) 2026-04-10
cdn
bunnycdn
security
crowdsec
edge-script

2026-04-10 전수 감사 (Outline agent-qna doc 51b963c3-b251-48b5-a57a-a2305959c470) 결과 반영. 5개 풀존, 17개 호스트네임, 미들웨어 64811 attach 매트릭스를 모두 정본화.

구성

  • 엣지 스크립트: crowdsec-bouncer-middleware (ID: 64811, ScriptType=2 Middleware)
  • 연결된 Pull Zone (2026-04-09 실측): iron-kr (5555227), iron-jp (5555247)MiddlewareScriptId: 64811. 두 풀존 모두 동일 미들웨어 공유.
  • 미장착 풀존: iron-git (5584382, gitea.inouter.com), iron-kr-waf (5555224, SafeLine 자체 보호), i-gate (5557897, 미사용)
  • 관리·동기화: jp1 infra-tool 컨테이너 /opt/crowdsec-bouncer/bouncer.py (3분 delta + 매시 full sync). cfb-manager 는 Cloudflare Worker bouncer 관리이며 BunnyCDN 미들웨어와 무관.
  • 소스: crowdsec-safeline bloom filter (FNV-1a 임베디드 BLOOM_B64) + Cloudflare Turnstile 캡차

옛 메모의 풀존 ID 5316471 (inouter), 5330178 (actions), 5554681 (waf-kr) 는 현 계정에 더 이상 존재하지 않음. iron-kr / iron-jp / iron-kr-waf 로 통합·이전됨.

동작 순서

요청 → BunnyCDN 엣지
  1. 국가 차단 (Cdn-RequestCountryCode 헤더)
     - 차단 시 403 반환
  2. CrowdSec bloom filter (악성 IP 판별)
     - bloom filter hit → 캡차 또는 403
     - cfb-manager가 주기적으로 bloom filter 업데이트
  3. 캡차 (Cloudflare Turnstile)
     - bloom hit된 IP에게 캡차 제시
     - 통과 시 4시간 허용 (DB + 쿠키)
  4. 정상 → Origin으로 전달

차단 국가

US, CA, GB, DE, FR, IT, ES, NL, BE, AT, CH, SE, NO, DK, FI, PL, CZ, PT, IE, RO, HU, BG, HR, SK, SI, LT, LV, EE, LU, MT, CY, GR, IS, UA, RU, BY

(북미 + 유럽 + 구소련)

주의사항

  • BunnyCDN Traffic Manager 국가 차단은 사용하지 않음 — Let's Encrypt 검증 및 Origin Shield fetch를 막아서 Free SSL 발급 실패 + 500 에러 유발
  • 엣지 스크립트의 국가 차단은 Cdn-RequestCountryCode 헤더 기반 → CDN 내부 요청(Let's Encrypt, Origin Shield)에는 이 헤더가 없으므로 영향 없음
  • Free SSL 자동 발급/갱신 정상 동작

Pull Zone 전수 (2026-04-10)

ID 이름 OriginUrl Middleware Smart Cache IgnoreQS BlockNoRef 비고
5555227 iron-kr https://220.120.65.245 64811 false true 메인 inouter.com 계열. 2026-04-10 IgnoreQueryStrings true→false (iron-jp 와 통일, privilege 교차 / 배포 cache-bust 버그 방지)
5555247 iron-jp https://172.233.93.180 64811 false true anvil.it.com 계열
5555224 iron-kr-waf https://220.120.65.245:9443 null true true SafeLine WAF 다운스트림 보호
5584382 iron-git https://220.120.65.245 null true false git smart HTTP 보호 우회 (의도)
5557897 i-gate https://172.233.93.180 null true true idle 슬롯, 0 byte

공통: EnableLogging: true, EnableWebSockets: true (max 500), EnableGeoZone*: true (전 지역), BlockedCountries: [], BlockedIps: [], EdgeRules: [] (Edge Rules 미사용 — 모든 분기는 미들웨어 코드 안), OriginType: 0 (URL), VerifyOriginSSL: false, EnableOriginShield: false. OptimizerEnabled: iron-kr / iron-jp 만 true.

호스트네임 인벤토리 (17개)

Pull Zone Hostname 시스템? TLS ForceSSL
iron-kr iron-kr.b-cdn.net false
iron-kr actions.it.com false
iron-kr n8n.inouter.com false
iron-kr jarvis.inouter.com false
iron-kr telegram-webhook.inouter.com false
iron-kr vault.inouter.com false
iron-kr outline.inouter.com false
iron-jp iron-jp.b-cdn.net false
iron-jp anvil.it.com false
iron-jp n8n.anvil.it.com false
iron-jp tg.anvil.it.com false
iron-jp linode.actions.it.com false
iron-kr-waf iron-kr-waf.b-cdn.net false
iron-kr-waf juiceshop.keepanker.cv false
iron-git iron-git.b-cdn.net false
iron-git gitea.inouter.com false
i-gate i-gate.b-cdn.net false

합계: 사용자 호스트 12 + 시스템 호스트 5 = 17. 모두 HasCertificate: true (Let's Encrypt 자동 발급/갱신). Bunny API 의 list/get 응답에는 인증서 만료일이 노출되지 않음 → 만료 임박 모니터링은 능동 외부 cert 체크 또는 Bunny 대시보드 알림에 의존.

Edge Script / Middleware attach 매트릭스

Script ID 이름 Type Attached pullzones 비고
64811 crowdsec-bouncer-middleware 2 (Middleware) iron-kr (5555227), iron-jp (5555247) 두 풀존 동일 미들웨어 공유
(none) iron-kr-waf, iron-git, i-gate iron-git 의도적 우회 (git pack 바이너리 보호 불가), iron-kr-waf 는 다운스트림 SafeLine, i-gate idle

CrowdSec Bouncer 동기화 구조

CrowdSec LAPI (jp1 Incus, 10.253.100.240:8080) → 악성 IP decision
    ↓
infra-tool 컨테이너 (jp1) /opt/crowdsec-bouncer/bouncer.py
    ├ 3분 delta sync
    └ 매시 full sync
    ↓
bloom filter (FNV-1a) base64 → BunnyCDN compute API
    → Edge Script 64811 코드의 BLOOM_B64/BLOOM_VERSION 상수 정규식 교체
    → publish
    ↓
엣지 스크립트가 요청마다 client IP 를 bloom filter 로 체크
  → hit → Turnstile 캡차 (verified 4h 쿠키)
  → miss → origin 통과

주의: cfb-manager (K8s default/cfb-manager) 는 Cloudflare Worker bouncer 관리 API 이며 BunnyCDN 미들웨어 64811 와는 무관. 옛 메모 혼동 정정.

미들웨어 64811 Turnstile sitekey 이력

시점 sitekey 이름 비고
~2026-04-09 0x4AAAAAAC2cntUlRC3KKMKG crowdsec-cloudflare-worker-bouncer-widget (inouter.com) cs-cf-worker-bouncer 가 자동 발급/rotate. 미들웨어 64811 이 baked-in 사용
2026-04-10 삭제됨 cf-audit-cleanup-2 의 cfb-manager DELETE inouter.com 트리거 → bouncer restart 가 destructive cleanup. 미들웨어 stale, 잠재 버그 발생
2026-04-10 0x4AAAAAAC3otPWhldI96Aks inouter-bunny-middleware 복구. kappa 가 jp1 bouncer 호스트의 cs-cf-worker-bouncer 토큰을 일시 빌려 직접 API 로 생성. 이름이 bouncer 패턴과 다르므로 freeze. Vault secret/cloud/cloudflare/turnstile-inouter-bunny (sitekey/secret/name). Syn 이 미들웨어 64811 env 갱신 + publish (deployment 3816dbc5-…)

미들웨어 64811 의 TURNSTILE_SITE_KEY / TURNSTILE_SECRET_KEY env 변수를 갱신할 때는 반드시 두 변수 모두 동시에 갱신 + publish. 코드 자체에는 sitekey 가 hardcoded 되지 않음 (env 만 참조).

특이사항 (2026-04-10 감사)

  • i-gate (5557897): 시스템 호스트네임 1개만, 0 byte 트래픽. 빈 슬롯 — 제거 또는 명확한 용도 부여 필요.
  • iron-kr / iron-jp IgnoreQueryStrings 불일치: 2026-04-10 둘 다 false 로 통일 완료. iron-kr 의 실측 cache hit rate 가 0.23% 로 사실상 0 이라 변경 영향 무시할 수준. 안전한 기본값 (query string 무시 안 함) 으로 맞춤.
  • Turnstile sitekey gap: 미들웨어 64811 의 TURNSTILE_SITE_KEYinouter-bunny-middleware (inouter.com zone) 단일 키 → actions.it.com, anvil.it.com, *.b-cdn.net 호스트에서 ban 발동 시 캡챠 위젯 로드 실패 가능. zone별 dispatcher 또는 multi-domain 위젯 통합 TODO.
  • 옛 메모의 풀존 ID 5316471 (inouter), 5330178 (actions), 5554681 (waf-kr) 는 현 계정에 더 이상 존재하지 않음. *.actions.it.com Cloudflare DNS 가 아직 actions.b-cdn.net 을 가리키는 dead reference 가 남아 있음 — cloudflare 정리 필요. (nas.inouter.com 은 2026-04-10 cf-audit-cleanup-1 에서 정리 완료)

참조

  • 전수 감사 정본 (대화 로그): Outline agent-qna doc 51b963c3-b251-48b5-a57a-a2305959c470 (2026-04-10)
  • 워크스페이스 런북: ~/syn/bunnycdn/README.md
  • API 레퍼런스: bunnycdn

관련 문서