diff --git a/infra/apisix.md b/infra/apisix.md index 996eee5..0642d91 100644 --- a/infra/apisix.md +++ b/infra/apisix.md @@ -36,7 +36,7 @@ updated: 2026-04-04 ### 오사카 (apisix-osaka) ``` -BunnyCDN(inouter, ID 5316471) → apisix-osaka(172.233.93.180) → 백엔드 +BunnyCDN(iron-jp, ID 5555247) → apisix-osaka(172.233.93.180) → 백엔드 ``` - 용도: Ironclad 인프라 서비스 (ironclad.it.com, n8n, twilio 등) - Docker: APISIX 3.15.0 (waf-apisix) + etcd v3.5.11 (waf-etcd) @@ -205,16 +205,22 @@ etcd: - 이전 후 ingress controller는 자동으로 모든 K8s CRD 객체를 새 etcd에 재push (rollout restart로 즉시 동기화 가능) - 외부 통합 etcd의 stale `/apisix/seoul/*` 키는 수동 삭제 (postgresql-ha.md의 etcd cleanup 명령 참고) -### BunnyCDN Pull Zone 매핑 +### BunnyCDN Pull Zone 매핑 (2026-04-09 API 실측) -| Zone | ID | Origin | 방향 | 주요 Hostnames | +| Zone | ID | Origin | 방향 | Hostnames (전수) | |---|---|---|---|---| -| iron-jp | 5555247 | 172.233.93.180 | → 오사카 | inouter.com, n8n.inouter.com, tg.inouter.com, linode.actions.it.com | -| iron-kr | 5555227 | 220.120.65.245 | → 서울 (Traefik) | actions.it.com, gitea.inouter.com, n8n.inouter.com, jarvis.inouter.com, telegram-webhook.inouter.com, vault.inouter.com | -| iron-kr-waf | 5555224 | 220.120.65.245:9443 | → 서울 (APISIX WAF) | juiceshop.keepanker.cv | +| iron-kr | 5555227 | 220.120.65.245 | → 서울 (OpenWrt → Traefik) | `iron-kr.b-cdn.net`, actions.it.com, n8n.inouter.com, jarvis.inouter.com, telegram-webhook.inouter.com, vault.inouter.com, outline.inouter.com (사용자 6 + 시스템 1 = 7) | +| iron-jp | 5555247 | 172.233.93.180 | → 오사카 (osaka-gw APISIX) | `iron-jp.b-cdn.net`, anvil.it.com, n8n.anvil.it.com, tg.anvil.it.com, linode.actions.it.com (사용자 4 + 시스템 1 = 5) | +| iron-kr-waf | 5555224 | 220.120.65.245:9443 | → 서울 (HAProxy :9443 → K3s APISIX SafeLine WAF) | `iron-kr-waf.b-cdn.net`, juiceshop.keepanker.cv | +| iron-git | 5584382 | 220.120.65.245 | → 서울 (gitea, **미들웨어 미장착**) | `iron-git.b-cdn.net`, gitea.inouter.com | +| i-gate | 5557897 | 172.233.93.180 | (미사용 슬롯) | `i-gate.b-cdn.net` | -참고: iron-kr zone은 `DisableCookies: false` (쿠키 허용). Gitea 웹 로그인 세션에 필요. -Edge Script: iron-jp, iron-kr에 CrowdSec bouncer middleware (ID 64811) 연결. +참고: +- iron-kr `IgnoreQueryStrings: true` / iron-jp `IgnoreQueryStrings: false` — 동일 미들웨어 풀존이지만 캐시 키 정책이 다름 +- iron-kr / iron-jp `BlockNoneReferrer: true`, iron-git 는 `false` (git smart HTTP 호환) +- 모든 zone `EdgeRules: []` (Edge Rules 미사용, 모든 분기는 미들웨어 64811 안) +- Edge Script 64811 `crowdsec-bouncer-middleware` 는 **iron-jp + iron-kr 두 풀존**에만 attach. iron-git 은 의도적 우회 (git pack 바이너리 보호 불가). +- gitea.inouter.com 은 더 이상 iron-kr 가 아니라 iron-git 풀존 소속 (분리됨) ### DNS 참고 diff --git a/infra/crowdsec-safeline.md b/infra/crowdsec-safeline.md index b58ac09..aba85db 100644 --- a/infra/crowdsec-safeline.md +++ b/infra/crowdsec-safeline.md @@ -242,7 +242,7 @@ Kappa 계정용 `cs-cf-worker-bouncer`와 별도 컨테이너로 분리 운영. | 방식 | 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-jp (5555247), iron-kr (5555227) — 두 풀존 모두 `MiddlewareScriptId: 64811` (2026-04-09 실측) | | API 키 | Vault `secret/infra/crowdsec-bunny-bouncer` | | 소스 | `~/crowdsec-bunny-bouncer/` | @@ -277,18 +277,20 @@ Kappa 계정용 `cs-cf-worker-bouncer`와 별도 컨테이너로 분리 운영. - APISIX 로그: http-logger → `:8085` → `custom/apisix-json-logs` - HTTP 시나리오 매칭 → decision → bouncer 피드백 -## waf-kr BunnyCDN Pull Zone +## iron-kr-waf BunnyCDN Pull Zone (구 waf-kr) APISIX SafeLine WAF 전용. | 항목 | 값 | |------|-----| -| Zone ID | 5554681 | -| Name | waf-kr | +| Zone ID | 5555224 | +| Name | iron-kr-waf | | Origin | https://220.120.65.245:9443 | -| 경로 | 인터넷 → BunnyCDN(waf-kr) → HAProxy(:9443) → APISIX(31137) → SafeLine → K3s | +| 경로 | 인터넷 → BunnyCDN(iron-kr-waf) → OpenWrt HAProxy(:9443) → MetalLB 192.168.9.50:443 → APISIX(K3s 서울) → chaitin-waf → SafeLine detector → K3s svc | -등록 호스트: `juiceshop.keepanker.cv` (WAF 테스트용) +등록 호스트: `iron-kr-waf.b-cdn.net`, `juiceshop.keepanker.cv` (WAF 테스트용). ApisixRoute `juiceshop` (chaitin-waf block) → juiceshop:3000. + +> 옛 메모의 `waf-kr (5554681)` 는 더 이상 존재하지 않음 — `iron-kr-waf (5555224)` 로 통합·재명명됨. ## 참고 diff --git a/services/bunnycdn-security.md b/services/bunnycdn-security.md index cb4906b..32ca725 100644 --- a/services/bunnycdn-security.md +++ b/services/bunnycdn-security.md @@ -1,15 +1,18 @@ --- title: BunnyCDN 엣지 보안 (CrowdSec + 국가 차단) -updated: 2026-03-23 +updated: 2026-04-09 tags: [cdn, bunnycdn, security, crowdsec, edge-script] --- ## 구성 -- 엣지 스크립트: `crowdsec-bouncer-middleware` (ID: 64811) -- 연결된 Pull Zone: inouter (5316471), actions (5330178) -- 관리: cfb-manager (K3s tools ns) -- 소스: [[crowdsec-safeline|CrowdSec]] bloom filter + Cloudflare Turnstile 캡차 +- 엣지 스크립트: `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|CrowdSec]] bloom filter (FNV-1a 임베디드 BLOOM_B64) + Cloudflare Turnstile 캡차 + +> 옛 메모의 풀존 ID `5316471 (inouter)`, `5330178 (actions)`, `5554681 (waf-kr)` 는 현 계정에 더 이상 존재하지 않음. iron-kr / iron-jp / iron-kr-waf 로 통합·이전됨. ## 동작 순서 @@ -38,16 +41,20 @@ US, CA, GB, DE, FR, IT, ES, NL, BE, AT, CH, SE, NO, DK, FI, PL, CZ, PT, IE, RO, - 엣지 스크립트의 국가 차단은 `Cdn-RequestCountryCode` 헤더 기반 → CDN 내부 요청(Let's Encrypt, Origin Shield)에는 이 헤더가 없으므로 영향 없음 - Free SSL 자동 발급/갱신 정상 동작 -## Pull Zone 설정 +## Pull Zone 설정 (2026-04-09) -| Pull Zone | Origin | 비고 | -|-----------|--------|------| -| inouter (5316471) | https://172.233.93.180 (오사카) | | -| actions (5330178) | https://220.120.65.245 (서울) | | +| Pull Zone | ID | Origin | 호스트 수 | 비고 | +|-----------|----|--------|----------|------| +| iron-kr | 5555227 | https://220.120.65.245 (서울) | 사용자 6 + 시스템 1 | actions.it.com / outline / vault / n8n / jarvis / telegram-webhook + iron-kr.b-cdn.net. `IgnoreQueryStrings: true` | +| iron-jp | 5555247 | https://172.233.93.180 (오사카) | 사용자 4 + 시스템 1 | anvil.it.com / n8n.anvil / tg.anvil / linode.actions + iron-jp.b-cdn.net. `IgnoreQueryStrings: false` | -- VerifyOriginSSL: false -- BlockedCountries: 비어있음 (엣지 스크립트에서 처리) -- Origin Shield: 비활성화 +공통: +- `VerifyOriginSSL: false` +- `BlockedCountries: []` (엣지 스크립트에서 헤더 기반 처리) +- `EnableOriginShield: false` +- `BlockNoneReferrer: true` +- `MiddlewareScriptId: 64811` +- `EdgeRules: []` (Edge Rules 미사용 — 모든 분기는 미들웨어 코드 안) ## CrowdSec Bouncer 구조