From d25dc3e52f58cd92ede4fd13136c0f84794af72d Mon Sep 17 00:00:00 2001 From: kaffa Date: Sun, 26 Apr 2026 10:33:48 +0900 Subject: [PATCH] =?UTF-8?q?obsidian=20=EC=A0=95=ED=95=A9=EC=84=B1=20?= =?UTF-8?q?=EC=A0=95=EC=A0=95=20=E2=80=94=20bouncer=20=EB=8B=A8=EC=9D=BC?= =?UTF-8?q?=ED=99=94=20=EC=9E=94=EC=A1=B4=20stale=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - infra/compute/infra-hosts.md: jp1 default 20→19, cs-cf-worker-bouncer 컨테이너 라인에서 제거 - services/bunnycdn-security.md: Edge Script 64811 / bloom filter / 국가차단 / Turnstile inouter-bunny 폐기 반영. 현재 layer (Bunny Shield + Rate Limit + 대역폭 한도) 중심 재작성 - infra/network/apisix.md: Edge Script 64811 attach 라인 폐기 표시 - infra/security/cloudflare.md: Workers 인벤토리 + Worker 라우트 + CF proxy 패턴 + cfb-manager 절 모두 폐기 반영 - infra/security/crowdsec-safeline.md: cs-cf-worker-bouncer 운영 중 문장 폐기 표시 - ops-agents/overview.md: Syn 영역 정의에서 폐기 자산 명시 - history/_index.md: 누락된 2026-04-25-netbis-npm-vector-msg-rewrite, 2026-04-26-bouncer-consolidation 등록 + frontmatter updated --- history/_index.md | 4 +- infra/compute/infra-hosts.md | 8 +- infra/network/apisix.md | 4 +- infra/security/cloudflare.md | 42 +++------ infra/security/crowdsec-safeline.md | 2 +- ops-agents/overview.md | 6 +- services/bunnycdn-security.md | 131 +++++++++------------------- 7 files changed, 70 insertions(+), 127 deletions(-) diff --git a/history/_index.md b/history/_index.md index 6770a76..4a8b53e 100644 --- a/history/_index.md +++ b/history/_index.md @@ -1,6 +1,6 @@ --- title: history 인덱스 -updated: 2026-04-25 +updated: 2026-04-26 tags: [moc, history] --- @@ -32,3 +32,5 @@ tags: [moc, history] | [[2026-04-16-pgpool-full-migration]] | pgpool-II 전면 전환 + pgcat 퇴역 | | [[2026-04-16-pgpool-n8n-poc]] | pgpool-II PoC (n8n 전용 전환) | | [[2026-04-25-anomaly-detect-removal]] | anomaly-detect 폐기 (오탐 다수, 컨테이너 포함 완전 제거) | +| [[2026-04-25-netbis-npm-vector-msg-rewrite]] | NPM Vector `_msg` 재합성 (proxy_v2 → nginx combined) — child-nginx-logs unparsed 84% 해결 | +| [[2026-04-26-bouncer-consolidation]] | CrowdSec bouncer 단일화 (netbis-cf-firewall만 유지, 나머지 3종 + Edge Script 64811 + Turnstile 위젯 6개 폐기) | diff --git a/infra/compute/infra-hosts.md b/infra/compute/infra-hosts.md index 70d6ffe..d5806b4 100644 --- a/infra/compute/infra-hosts.md +++ b/infra/compute/infra-hosts.md @@ -1,6 +1,6 @@ --- title: 인프라 호스트 및 네트워크 -updated: 2026-04-25 anomaly-detect 폐기 반영 (hp2 default 5→4) +updated: 2026-04-26 bouncer 단일화 — jp1 default 20→19 (cs-cf-worker-bouncer 폐기) + hp2 default 5→4 (anomaly-detect 폐기 2026-04-25) tags: [infra, network, kr-zone, openwrt] --- @@ -219,7 +219,7 @@ db (proxysql, pgcat), kroki, mq (RabbitmqCluster CR), openmemory (mcp/ui/qdrant) |--------|---------|------------|------| | jp1 | agents | 15 | 모두 RUNNING | | jp1 | db | 1 | etcd-1 | -| jp1 | default | 20 | RUNNING 18 + STOPPED 2 (baserow, iac-route) | +| jp1 | default | 19 | RUNNING 17 + STOPPED 2 (baserow, iac-route) — cs-cf-worker-bouncer 폐기 2026-04-26 | | jp1 | monitoring | 2 | grafana, prometheus | | kr1 | default | 3 | brokkr, mariadb-2, postgres-2 | | kr1 | ops | 1 | heimdall (tofu 관리) | @@ -238,8 +238,8 @@ db (proxysql, pgcat), kroki, mq (RabbitmqCluster CR), openmemory (mcp/ui/qdrant) **db 프로젝트** (1): etcd-1 (10.253.102.11) -**default 프로젝트** (20): -- RUNNING 컨테이너: crowdsec (10.253.100.240), cs-cf-worker-bouncer (10.253.100.131), dev-web (10.253.102.169), **etcd** (10.253.101.233, 2026-04-06 신규), hey (10.253.103.80), infra-tool (10.253.100.183), **netbis-cf-bouncer** (10.253.103.33, 2026-04-03 신규), pricing-api (10.253.102.142), **socks5-proxy** (10.253.102.12, 2026-03-21 신규), ssh-test (10.253.102.82), sshpiper (10.253.100.34), telegram-web-client (10.253.102.124), tor-server (10.253.101.178), **vault** (10.253.101.58, 2026-03-24 신규 — K3s 이전 후 인프라 정본), voice-api (10.253.101.7) +**default 프로젝트** (19): +- RUNNING 컨테이너: crowdsec (10.253.100.240), dev-web (10.253.102.169), **etcd** (10.253.101.233, 2026-04-06 신규), hey (10.253.103.80), infra-tool (10.253.100.183), **netbis-cf-bouncer** (10.253.103.33, 2026-04-03 신규), pricing-api (10.253.102.142), **socks5-proxy** (10.253.102.12, 2026-03-21 신규), ssh-test (10.253.102.82), sshpiper (10.253.100.34), telegram-web-client (10.253.102.124), tor-server (10.253.101.178), **vault** (10.253.101.58, 2026-03-24 신규 — K3s 이전 후 인프라 정본), voice-api (10.253.101.7) _(cs-cf-worker-bouncer는 2026-04-26 bouncer 단일화로 폐기)_ - RUNNING VM: gitea-runner (10.253.103.203, +docker0), juice-shop (10.253.100.202, +docker0), k8s (10.253.103.124, +flannel/cni0) - STOPPED: baserow (CONTAINER APP, 2026/01/05 마지막 시작), iac-route (CONTAINER, 2026/03/04) diff --git a/infra/network/apisix.md b/infra/network/apisix.md index 96ffb07..09cd29e 100644 --- a/infra/network/apisix.md +++ b/infra/network/apisix.md @@ -203,8 +203,8 @@ etcd 통합/분리 이력: [[2026-04-06-apisix-etcd-consolidation|history]] 참고: - iron-kr / 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 바이너리 보호 불가). +- 모든 zone `EdgeRules: []` (Edge Rules 미사용) +- ~~Edge Script 64811 `crowdsec-bouncer-middleware` attach~~: **2026-04-26 bouncer 단일화로 폐기.** 전 풀존 `MiddlewareScriptId: null` ([[../../history/2026-04-26-bouncer-consolidation|history]]) - gitea.inouter.com 은 더 이상 iron-kr 가 아니라 iron-git 풀존 소속 (분리됨) ### DNS 참고 diff --git a/infra/security/cloudflare.md b/infra/security/cloudflare.md index c597c87..6bc2850 100644 --- a/infra/security/cloudflare.md +++ b/infra/security/cloudflare.md @@ -159,7 +159,7 @@ DNS 레코드 없음. zone 만 등록. 워커 라우트 + Turnstile 위젯 + cer | Worker | 라우트 부착 zones | 비고 | |---|---|---| -| **crowdsec-cloudflare-worker-bouncer** | actions, ironclad, keepanker, servidor | CrowdSec CF bouncer 본체. cs-cf-worker-bouncer (jp1) 가 168h 마다 secret rotate. 정본 [[crowdsec-safeline]] | +| ~~**crowdsec-cloudflare-worker-bouncer**~~ | _(폐기)_ | **2026-04-26 bouncer 단일화로 Worker 스크립트 + KV namespace + 라우트 4개 모두 삭제.** [[../../history/2026-04-26-bouncer-consolidation\|history]] | | **ironclad-site** | ironclad.it.com (apex) | 정적 사이트, has_assets | | **cf-multisite** | `*.actions.it.com/*` | 라우팅 워커 | | chat-worker | (없음) | workers.dev only | @@ -173,16 +173,15 @@ DNS 레코드 없음. zone 만 등록. 워커 라우트 + Turnstile 위젯 + cer | Zone | Pattern | Script | |---|---|---| -| actions.it.com | `*actions.it.com/*` | crowdsec-cloudflare-worker-bouncer | | actions.it.com | `*.actions.it.com/*` | cf-multisite | | actions.it.com | `vultr.actions.it.com/*` | null (orphan, 미정리) | | actions.it.com | `linode.actions.it.com/*` | null (orphan, 미정리) | | ironclad.it.com | `ironclad.it.com/*` | ironclad-site | -| ironclad.it.com | `*ironclad.it.com/*` | crowdsec-cloudflare-worker-bouncer | -| keepanker.cv | `*keepanker.cv/*` | crowdsec-cloudflare-worker-bouncer | -| servidor.it.com | `*servidor.it.com/*` | crowdsec-cloudflare-worker-bouncer | -inouter.com / anvil.it.com 에는 Worker 라우트 없음. DNS proxied=false 라 CF 엣지를 거치지 않으므로 enforce 불가 — 이들 zone 의 엣지 보호는 BunnyCDN 미들웨어 64811 이 단독 책임. +> [!note] cs-cf-worker-bouncer 라우트 4개 폐기 (2026-04-26) +> `*actions.it.com/*`, `*ironclad.it.com/*`, `*keepanker.cv/*`, `*servidor.it.com/*` Worker 라우트는 bouncer 단일화로 모두 제거. Worker 스크립트 + KV namespace + Turnstile 위젯 4개 함께 폐기. [[../../history/2026-04-26-bouncer-consolidation|history]] + +inouter.com / anvil.it.com 에는 Worker 라우트 없음. DNS proxied=false 라 CF 엣지를 거치지 않으므로 enforce 불가. ~~BunnyCDN 미들웨어 64811 단독 책임~~ 도 2026-04-26 폐기 — 현재 이들 zone 엣지 IP 차단 layer 부재 (Bunny Shield WAF + Rate Limit + 풀존 BlockedIps 만 가능). Worker Custom Domains (계정 레벨): 0건. @@ -219,31 +218,18 @@ Vault 시크릿 잔여 (위젯 삭제됐지만 시크릿은 보존 — 재가동 | Zone | Proxy | 보호 | |---|---|---| -| inouter.com / anvil.it.com | off | BunnyCDN 미들웨어 64811 단독 | -| actions.it.com / ironclad.it.com | on | CF Worker (bouncer + cf-multisite / ironclad-site) | -| keepanker.cv | on (Tunnel) | CF Tunnel + juiceshop 만 iron-kr-waf override | +| inouter.com / anvil.it.com | off | _IP-list enforce 부재 (2026-04-26 BunnyCDN 미들웨어 64811 폐기 후). Bunny Shield WAF + Rate Limit + 풀존 BlockedIps 만 가능_ | +| actions.it.com / ironclad.it.com | on | CF Worker (cf-multisite / ironclad-site). ~~bouncer~~ 폐기 2026-04-26 | +| keepanker.cv | on (Tunnel) | CF Tunnel + juiceshop 만 iron-kr-waf override. ~~bouncer~~ 폐기 2026-04-26 | +| servidor.it.com | on | ~~bouncer~~ 폐기 2026-04-26, 현재 별도 보호 layer 없음 | -## cfb-manager (CrowdSec CF Worker bouncer 관리 API) +> [!warning] cs-cf-worker-bouncer + BunnyCDN 미들웨어 64811 폐기 (2026-04-26) +> kappa zone 4개 (keepanker / actions / ironclad / servidor) + inouter / anvil 에서 CrowdSec 결정 enforce layer가 사라짐. CrowdSec ban은 현재 `netbis-cf-firewall` (netbis 6 zone) 만 enforce. 자세한 영향: [[../../history/2026-04-26-bouncer-consolidation|history]] -| 항목 | 값 | -|---|---| -| 위치 | K3s `default/cfb-manager` (`10.43.68.76:8000`) | -| 구현 | Python FastAPI | -| 기능 | bouncer 보호 도메인 추가/삭제, decision 조회, CF zone 동기화, bouncer 재시작 트리거 | -| SSH 키 | K8s `default/cfb-ssh-key` (ed25519) | +## ~~cfb-manager~~ (폐기 2026-04-26) -```bash -BASE=http://cfb-manager.default.svc.cluster.local:8000 -curl $BASE/status # bouncer_running, pids, protected_domains -curl $BASE/domains # 보호 중인 zone 상세 -curl $BASE/decisions # 현재 결정 -curl -X POST $BASE/domains/ # zone 추가 -curl -X DELETE $BASE/domains/ # zone 제거 (destructive — bouncer restart + widget rotate) -``` - -**중요**: `DELETE /domains/` 는 단순 config 항목 제거가 아니라 bouncer restart 를 트리거하며, restart 가 모든 zone 의 widget 을 force-rotate 하고 제거된 zone 의 widget 을 destroy 한다. 외부에서 baked-in 으로 사용 중인 sitekey 가 있다면 동시에 깨진다. - -BunnyCDN 미들웨어와는 무관. BunnyCDN 미들웨어 64811 의 bloom filter 동기화는 jp1 `infra-tool` 컨테이너 `/opt/crowdsec-bouncer/bouncer.py` (3분 delta + 매시 full sync) 가 담당. +> [!warning] cs-cf-worker-bouncer 폐기와 함께 cfb-manager도 의미 상실 +> cs-cf-worker-bouncer 자체가 사라져 `bouncer_running` / `widget rotate` 등 cfb-manager의 핵심 기능이 동작하지 않음. K8s `default/cfb-manager` Deployment는 별도 정리 결정 필요 (보존 / 폐기). [[../../history/2026-04-26-bouncer-consolidation|history]] ## 관련 문서 diff --git a/infra/security/crowdsec-safeline.md b/infra/security/crowdsec-safeline.md index 31693ea..af8a3f1 100644 --- a/infra/security/crowdsec-safeline.md +++ b/infra/security/crowdsec-safeline.md @@ -269,7 +269,7 @@ CrowdSec 공식 가이드 명시 사항 ([blog](https://www.crowdsec.net/blog/mi | 비용 | $0 (Free plan 영역, IP List + Firewall Rule). Worker bouncer 대비 비용 구조 우월 | | 한계 | CF 공식 deprecation 표기 ("isn't actively supported anymore"). 동작은 정상이나 향후 호환성 변화 가능 | -cs-cf-worker-bouncer (kappa 계정용)는 별도 컨테이너에서 그대로 운영. netbis는 비용 구조 차이로 firewall bouncer만 사용. +~~cs-cf-worker-bouncer (kappa 계정용)는 별도 컨테이너에서 그대로 운영~~ — **2026-04-26 폐기**. 현재 LAPI 등록 bouncer는 본 항목(`cs-cloudflare-bouncer-1777082222`) 단 하나. [[../../history/2026-04-26-bouncer-consolidation|history]] ### ~~bunny-cdn-bouncer (BunnyCDN Edge Script)~~ — 폐기 (2026-04-26) diff --git a/ops-agents/overview.md b/ops-agents/overview.md index dadecec..23455cb 100644 --- a/ops-agents/overview.md +++ b/ops-agents/overview.md @@ -74,11 +74,11 @@ fingerprint: `SHA256:eBCIglGmK/FnDxJLqxT0CJvRGFEGaIKRWnZ3ZpTaugU` - Obsidian 정본 전체 쓰기 권한 **Syn 전담 (Heimdall 손대지 말 것)**: -- BunnyCDN: 풀존, 엣지 스크립트(MiddlewareScriptId 64811 `crowdsec-bouncer-middleware` 포함), Shield/WAF, 캐시 정책 +- BunnyCDN: 풀존, Shield/WAF, Rate Limit, MonthlyBandwidthLimit, 캐시 정책 (Edge Script 64811 `crowdsec-bouncer-middleware`는 2026-04-26 폐기) - SafeLine WAF: K3s `safeline` ns, Traefik middleware, 탐지 규칙, APISIX 통합 - APISIX: 모든 인스턴스 (K3s 서울 / osaka-gw / sandbox-tokyo / zlambda), 라우트, 플러그인, Admin API -- Cloudflare 엣지 관련: Turnstile 위젯, cs-cf-worker-bouncer, cfb-manager -- Obsidian 중 엣지 범위 파일 쓰기: `infra/apisix.md`, `infra/crowdsec-safeline.md` 의 엣지 섹션, `services/bunnycdn*.md` +- Cloudflare 엣지 관련: Turnstile 위젯, Worker 라우트 (`cs-cf-worker-bouncer` / `cfb-manager`는 2026-04-26 폐기) +- Obsidian 중 엣지 범위 파일 쓰기: `infra/network/apisix.md`, `infra/security/crowdsec-safeline.md` 의 엣지 섹션, `services/bunnycdn*.md` **공동/협업**: - CrowdSec 시나리오: Heimdall 소유, Syn은 APISIX/SafeLine용 시나리오 파라미터 튜닝 제안만 diff --git a/services/bunnycdn-security.md b/services/bunnycdn-security.md index 18f122a..f7ae013 100644 --- a/services/bunnycdn-security.md +++ b/services/bunnycdn-security.md @@ -1,57 +1,41 @@ --- -title: BunnyCDN 엣지 보안 (CrowdSec + 국가 차단) -updated: 2026-04-10 -tags: [cdn, bunnycdn, security, crowdsec, edge-script] +title: BunnyCDN 엣지 보안 (Shield + Rate Limit + 대역폭 한도) +updated: 2026-04-26 bouncer 단일화로 Edge Script 64811 + bloom filter + Turnstile inouter-bunny 모두 폐기 반영 +tags: [cdn, bunnycdn, security] --- -## 구성 +> [!warning] 2026-04-26 bouncer 단일화로 다음 layer 폐기 +> - **Edge Script 64811** (`crowdsec-bouncer-middleware`) — 전 풀존에서 detach + 스크립트 자체 삭제 +> - **CrowdSec bloom filter 동기화** — `infra-tool` 컨테이너의 `/opt/crowdsec-bouncer/bouncer.py` 정지 + 삭제 +> - **국가 차단 layer** — Edge Script 64811 안에 구현됐던 분기라 함께 사라짐 +> - **Turnstile `inouter-bunny-middleware` 위젯** — 미들웨어 env에서만 사용했어서 함께 폐기 +> +> 정리 경과: [[../history/2026-04-26-bouncer-consolidation|history]] +> CrowdSec ban은 이제 `netbis-cf-firewall` (Cloudflare Firewall Rule, netbis 6 zone에만 적용) 만 enforce. BunnyCDN 풀존 (iron-jp / iron-kr 등)에는 IP-list 기반 차단 layer 없음. -- 엣지 스크립트: `crowdsec-bouncer-middleware` (ID `64811`, ScriptType `2` Middleware) -- 연결된 Pull Zone: **iron-kr (5555227)**, **iron-jp (5555247)** — 둘 다 `MiddlewareScriptId: 64811` 공유 -- 미장착 풀존: `iron-git` (git smart HTTP 보호 우회, 의도), `iron-kr-waf` (SafeLine 다운스트림), `i-gate` (idle) -- bloom filter 동기화: jp1 `infra-tool` 컨테이너의 `/opt/crowdsec-bouncer/bouncer.py` (3분 delta + 매시 full sync) -- 소스: [[crowdsec-safeline|CrowdSec]] bloom filter (FNV-1a 임베디드 `BLOOM_B64`) + Cloudflare Turnstile 캡차 - -`cfb-manager` (K8s `default/cfb-manager`) 는 **Cloudflare Worker bouncer 관리 API** 이며 BunnyCDN 미들웨어 64811 와 무관. - -## 동작 순서 +## 현재 보호 layer (2026-04-26 기준) ``` 요청 → BunnyCDN 엣지 - 1. 국가 차단 (Cdn-RequestCountryCode 헤더 기반) - - 차단 국가 → 403 반환 - 2. CrowdSec bloom filter (악성 IP 판별) - - hit → 캡차 또는 403 - - miss → 통과 - 3. 캡차 (Cloudflare Turnstile) - - bloom hit IP 에게 캡차 제시 - - 통과 시 4시간 허용 (DB + 쿠키) - 4. 정상 → Origin 으로 전달 + 1. Bunny Shield WAF (OWASP CRS) — 모든 풀존 활성 + 2. Bunny Shield Rate Limiting — 풀존당 1개 (IPBurst200per10s) + 3. MonthlyBandwidthLimit — 풀존당 100GB (i-gate 10GB) + 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 자동 발급/갱신 정상 동작 +IP-list 기반 차단/국가 차단은 현재 layer에 없음. CrowdSec 시나리오 발동 IP는 `netbis-cf-firewall` 경로 (netbis 6 zone) 또는 SafeLine WAF / APISIX limit-req 경로로만 차단. ## Pull Zone -| ID | 이름 | OriginUrl | Middleware | Smart Cache | IgnoreQS | BlockNoRef | 비고 | -|---|---|---|---|---|---|---|---| -| 5555227 | `iron-kr` | `https://220.120.65.245` | 64811 | ✅ | false | true | 메인 inouter.com 계열 | -| 5555247 | `iron-jp` | `https://172.233.93.180` | 64811 | ✅ | false | true | **미사용 (2026-04-17 호스트네임 전부 제거)** | -| 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 슬롯 | +| ID | 이름 | OriginUrl | Smart Cache | IgnoreQS | BlockNoRef | 비고 | +|---|---|---|---|---|---|---| +| 5555227 | `iron-kr` | `https://220.120.65.245` | ✅ | false | true | 메인 inouter.com 계열 | +| 5555247 | `iron-jp` | `https://172.233.93.180` | ✅ | false | true | **미사용 (2026-04-17 호스트네임 전부 제거)** | +| 5555224 | `iron-kr-waf` | `https://220.120.65.245:9443` | ❌ | true | true | SafeLine WAF 다운스트림 보호 | +| 5584382 | `iron-git` | `https://220.120.65.245` | ❌ | true | false | git smart HTTP — Rate Limit 미적용 | +| 5557897 | `i-gate` | `https://172.233.93.180` | ❌ | true | true | idle 슬롯 | -공통 설정: `EnableLogging: true`, `EnableWebSockets: true (max 500)`, `EnableGeoZone*: true (전 지역)`, `BlockedCountries: []`, `BlockedIps: []`, `EdgeRules: []` (모든 분기는 미들웨어 코드 안에서), `OriginType: 0 (URL)`, `VerifyOriginSSL: false`, `EnableOriginShield: false`. `OptimizerEnabled` 는 `iron-kr` / `iron-jp` 만 `true`. +전 풀존 `MiddlewareScriptId: null` (2026-04-26 Edge Script 64811 폐기 후 자동 정리). 공통 설정: `EnableLogging: true`, `EnableWebSockets: true (max 500)`, `EnableGeoZone*: true`, `BlockedCountries: []`, `BlockedIps: []`, `EdgeRules: []`, `OriginType: 0 (URL)`, `VerifyOriginSSL: false`, `EnableOriginShield: false`. ## 호스트네임 인벤토리 @@ -72,52 +56,11 @@ tags: [cdn, bunnycdn, security, crowdsec, edge-script] | iron-git | `gitea.inouter.com` | | | i-gate | `i-gate.b-cdn.net` | ✅ | -총 13 (사용자 8 + 시스템 5). 전부 `HasCertificate: true` (Let's Encrypt 자동 발급/갱신). Bunny API 응답에는 인증서 만료일이 노출되지 않아 만료 모니터링은 외부 cert 체크 또는 Bunny 대시보드 알림에 의존. - -## Edge Script / Middleware attach - -| Script ID | 이름 | Type | 부착 풀존 | -|---|---|---|---| -| 64811 | `crowdsec-bouncer-middleware` | 2 (Middleware) | iron-kr, iron-jp | - -기타 풀존 미장착 사유: `iron-git` 은 git smart HTTP 바이너리 보호 불가라 의도적 우회, `iron-kr-waf` 는 SafeLine 이 담당, `i-gate` 는 idle. - -## CrowdSec bloom filter 동기화 - -``` -CrowdSec LAPI (jp1, 10.253.100.240:8080) → decision stream - ↓ -infra-tool 컨테이너 /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 통과 -``` - -## Turnstile sitekey - -미들웨어 64811 의 `TURNSTILE_SITE_KEY` 와 `TURNSTILE_SECRET_KEY` 는 env 변수로 주입 (코드에 hardcoded 아님). 현재 값은 [[cloudflare#Turnstile 위젯]] 의 `inouter-bunny-middleware` (`0x4AAAAAAC3otPWhldI96Aks`). 이 위젯은 cs-cf-worker-bouncer 의 이름 패턴 (`crowdsec-cloudflare-worker-bouncer-widget`) 과 다르므로 bouncer rotation 대상 외 — 수동 관리. - -위젯 교체 절차: -1. 신규 위젯 생성 (이름에 `bouncer` 포함 금지) -2. Vault `secret/cloud/cloudflare/turnstile-inouter-bunny` 에 `sitekey`, `secret`, `name` 저장 -3. 미들웨어 64811 의 `TURNSTILE_SITE_KEY` / `TURNSTILE_SECRET_KEY` env 두 변수 **동시** 갱신 + publish -4. 옛 sitekey 가 미들웨어 env 에 남아있지 않은지 검증 (grep), 옛 위젯 삭제 가능 - -## 특이사항 - -- **i-gate (5557897)**: 시스템 호스트 1개, 0 byte 트래픽. 빈 슬롯 — 용도 부여 또는 제거 필요 -- ~~**Turnstile sitekey zone gap**~~: 2026-04-17 해결. `inouter-bunny-middleware` 위젯 domains에 `inouter.com`, `anvil.it.com`, `actions.it.com`, `n8n.anvil.it.com`, `tg.anvil.it.com`, `linode.actions.it.com`, `iron-kr.b-cdn.net`, `iron-jp.b-cdn.net` 등록 완료. Cloudflare Turnstile는 루트 도메인 등록 시 서브도메인 자동 커버 (inouter.com → *.inouter.com). 위젯 도메인 상한 10개. +총 13 (사용자 8 + 시스템 5). 전부 `HasCertificate: true` (Let's Encrypt 자동 발급/갱신). ## DDoS 과금 정책 (2026-04-17 지원팀 확인, Ticket #386429) -- **WAF 차단 요청**: 과금됨. 차단 응답도 outgoing bandwidth로 집계. 단, Origin 응답보다 크기가 작아 비용은 적음 +- **WAF 차단 요청**: 과금됨. 차단 응답도 outgoing bandwidth로 집계. 단 Origin 응답보다 크기가 작아 비용은 적음 - **DDoS PoW 챌린지 페이지**: 과금 안 됨. 챌린지는 Bunny 소유 별도 도메인에서 호스팅되어 내 계정 대역폭 미포함 - **DDoS 크레딧/보호**: 공식 보장 없음. Shield가 정상 동작했음에도 피해가 큰 경우 케이스별 goodwill 크레딧 검토 가능 (보장 아님) - **대응**: Rate Limiting으로 불필요한 차단 응답 자체를 줄이고, MonthlyBandwidthLimit으로 비용 상한 설정 @@ -149,11 +92,23 @@ DDoS 비용 폭탄 방지용. 정상 월 사용량 ~1.2GB 대비 약 40배 여 무료 플랜 1/2 슬롯 사용. MidRate 규칙은 NAT/공유기 환경 오탐 + 비브라우저 클라이언트(git, API) 호환 문제로 삭제 (2026-04-17). -⚠️ **iron-git (101013)은 rate limit 규칙 없음** — git smart HTTP는 push/pull 시 단기간에 대량 요청을 보내므로 rate limit에 걸림. git 클라이언트는 Challenge도 통과 불가. 2026-04-17 rate limit으로 인한 접속 장애 발생 후 규칙 전부 삭제. -또한 iron-git에 `MiddlewareScriptId: 64811`이 장착되어 있음 (Obsidian 기존 기록과 불일치 — 확인 필요). +⚠️ **iron-git (5584382)은 rate limit 규칙 없음** — git smart HTTP는 push/pull 시 단기간에 대량 요청을 보내므로 rate limit에 걸림. git 클라이언트는 Challenge도 통과 불가. 2026-04-17 rate limit으로 인한 접속 장애 발생 후 규칙 전부 삭제. + +## 폐기된 자산 (참고 — 재가동 시 history 참조) + +| 자산 | 폐기일 | 비고 | +|---|---|---| +| Edge Script 64811 `crowdsec-bouncer-middleware` | 2026-04-26 | DELETE `/compute/script/64811` HTTP 204. iron-jp/iron-kr/iron-kr-waf/iron-git MiddlewareScriptId 자동 null | +| `infra-tool:/opt/crowdsec-bouncer/bouncer.py` (bloom sync) | 2026-04-26 | cron + 디렉토리 삭제 | +| Turnstile `inouter-bunny-middleware` (`0x4AAAAAAC3otPWhldI96Aks`) | 2026-04-26 | env baked-in, 미들웨어 폐기와 함께 | +| 국가 차단 layer (Edge Script 코드 내 분기) | 2026-04-26 | 미들웨어 코드 자체가 사라짐 | +| Vault `secret/cloud/cloudflare/turnstile-inouter-bunny` | 보존 | 폐기 결정 후속 | +| Gitea `kaffa/crowdsec-bunny-bouncer` (소스) | 보존 | 재구축 reference | + +상세: [[../history/2026-04-26-bouncer-consolidation|history]] ## 관련 문서 - [[bunnycdn]] — BunnyCDN API 레퍼런스 -- [[crowdsec-safeline]] — CrowdSec 및 SafeLine WAF 설정 -- [[cloudflare]] — Cloudflare DNS/CDN (Turnstile 위젯 정본) +- [[../infra/security/crowdsec-safeline|crowdsec-safeline]] — CrowdSec 및 SafeLine WAF 설정 +- [[../infra/security/cloudflare|cloudflare]] — Cloudflare DNS/CDN (Turnstile 위젯 정본)