edge: cf-audit-cleanup-2 + recovery 정본 반영

- infra/cloudflare.md: Worker 라우트 / Turnstile 위젯 표를 cleanup-2 후 상태로 갱신. inouter/anvil 라우트 + 6개 옛 bouncer-managed widget sitekey 폐기 표시. 신규 inouter-bunny-middleware (0x4AAAAAAC3otPWhldI96Aks) 추가, freeze 보장 근거 명시. Turnstile 토큰 권한 사실 (Vault api_token read-only vs bouncer 토큰 read+write). 인시던트 이력 섹션 추가 + 인시던트 doc 8f5c43f8 링크.
- infra/crowdsec-safeline.md: cs-cf-worker-bouncer 보호 zone 4개로 갱신, 제거된 zone 와 freeze widget 명시.
- services/bunnycdn-security.md: 미들웨어 64811 Turnstile sitekey 변경 이력표 (옛/삭제/신규 3행). sitekey gap 항목을 신규 위젯 기준으로 갱신, nas.inouter.com 정리 완료 표시.

cf-audit-cleanup-2 인시던트 + 복구 상세는 Outline doc 8f5c43f8 의 "## 복구 완료" 섹션 참조.
This commit is contained in:
Syn
2026-04-10 09:44:20 +09:00
parent 9d71167772
commit 218c323f3f
3 changed files with 56 additions and 20 deletions

View File

@@ -116,7 +116,7 @@ DNS 레코드 **없음**. zone 만 등록. 워커 라우트 + Turnstile 위젯
| telegram-cli-web | (없음) | 〃 |
| telegram-summary-bot | (없음) | 〃 |
### Worker 라우트 (zone 별)
### Worker 라우트 (zone 별, 2026-04-10 cf-audit-cleanup-2 후)
| Zone | Pattern | Script |
|---|---|---|
@@ -124,29 +124,42 @@ DNS 레코드 **없음**. zone 만 등록. 워커 라우트 + Turnstile 위젯
| 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 |
| anvil.it.com | `*anvil.it.com/*` | crowdsec-cloudflare-worker-bouncer |
| inouter.com | `*inouter.com/*` | crowdsec-cloudflare-worker-bouncer |
| 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 |
**2026-04-10 삭제 (cf-audit-cleanup-2)**:
- ~~`*inouter.com/*`~~ (inouter.com zone, crowdsec-cloudflare-worker-bouncer) — DNS proxied=false 라 enforce 안 됐음
- ~~`*anvil.it.com/*`~~ (anvil.it.com zone, 동일)
이 두 라우트는 cs-cf-worker-bouncer 의 zone 제거 사이클에 의해 자동 삭제됨 (CF API 직접 호출 불필요했음).
> Worker Custom Domains (계정 레벨): **0건**.
## Turnstile 위젯 (8개)
## Turnstile 위젯 (현재 6개, 2026-04-10 cf-audit-cleanup-2 후)
| Sitekey | 이름 | mode | 도메인 | 역할 |
|---|---|---|---|---|
| `0x4AAAAAABvmO8BKc1ss5d-S` | `crowdsec-captcha` | managed | actions / anvil / charon.my / ironclad / keepanker / n8n.my / servidor / subin.my | multi-domain 운영용 (8 도메인). 2025-08-29 생성 |
| `0x4AAAAAACbmaudAjITah7y7` | `inouter` | managed | anvil.it.com **만** | 2026-02-13 생성. **이름과 도메인 불일치 → legacy/orphan 후보** |
| `0x4AAAAAAC2cnEA797HwesRX` | `crowdsec-cloudflare-worker-bouncer-widget` | managed | anvil.it.com | bouncer 자동 (168h rotation) |
| `0x4AAAAAAC2cnZzIyNRayTcG` | 〃 | managed | servidor.it.com | bouncer 자동 |
| `0x4AAAAAAC2cntUlRC3KKMKG` | 〃 | managed | inouter.com | bouncer 자동. **현재 BunnyCDN 미들웨어 64811 이 사용 중** |
| `0x4AAAAAAC2cn8bzKBex_ihU` | 〃 | managed | actions.it.com | bouncer 자동 |
| `0x4AAAAAAC2coNrK9rRq7S_b` | 〃 | managed | keepanker.cv | bouncer 자동 |
| `0x4AAAAAAC2coU0PB8O8oJqY` | 〃 | managed | ironclad.it.com | bouncer 자동 |
| `0x4AAAAAABvmO8BKc1ss5d-S` | `crowdsec-captcha` | managed | actions / anvil / charon.my / ironclad / keepanker / n8n.my / servidor / subin.my | multi-domain 운영용 (8 도메인). 2025-08-29 생성. bouncer 관리 외 |
| `0x4AAAAAACbmaudAjITah7y7` | `inouter` | managed | anvil.it.com **만** | 2026-02-13 생성. 이름과 도메인 불일치 → legacy/orphan 후보. 별건 결정 미정 (kappa) |
| **`0x4AAAAAAC3otPWhldI96Aks`** | **`inouter-bunny-middleware`** | managed | inouter.com | **2026-04-10 신규** (cf-audit-cleanup-2 복구). **BunnyCDN 미들웨어 64811 이 TURNSTILE_SITE_KEY/SECRET_KEY env 로 baked-in 사용**. 이름이 bouncer 패턴 (`crowdsec-cloudflare-worker-bouncer-widget`) 과 다르므로 cs-cf-worker-bouncer 가 관리 대상에 넣지 않음 → freeze. **수동 관리** |
| `0x4AAAAAAC3nIMLBRKWfiY8A` | `crowdsec-cloudflare-worker-bouncer-widget` | managed | actions.it.com | bouncer 자동 (168h rotation), 2026-04-10 00:23 재생성 (이전 sitekey `…2cn8bzKBex_ihU` 폐기) |
| `0x4AAAAAAC3nIYV_A5OA0Xzv` | 〃 | managed | ironclad.it.com | bouncer 자동, 2026-04-10 00:23 재생성 (이전 `…2coU0PB8O8oJqY` 폐기) |
| `0x4AAAAAAC3nHnAB6Q9dlvHM` | 〃 | managed | keepanker.cv | bouncer 자동, 2026-04-10 00:23 재생성 (이전 `…2coNrK9rRq7S_b` 폐기) |
| `0x4AAAAAAC3nH0xXSU8kbwsn` | 〃 | managed | servidor.it.com | bouncer 자동, 2026-04-10 00:23 재생성 (이전 `…2cnZzIyNRayTcG` 폐기) |
bouncer 자동 위젯 6개는 `cs-cf-worker-bouncer` 가 rotate. **수동 편집 금지** — 다음 rotate 때 덮어써짐.
**2026-04-10 삭제 (cf-audit-cleanup-2)**:
- ~~`0x4AAAAAAC2cnEA797HwesRX`~~ (anvil.it.com bouncer-managed) — bouncer 가 zone 제거 시 자동 cleanup
- ~~`0x4AAAAAAC2cntUlRC3KKMKG`~~ (inouter.com bouncer-managed) — bouncer 가 zone 제거 시 자동 cleanup. **이로 인해 BunnyCDN 미들웨어 64811 stale 발생 → 수동 신규 위젯 `inouter-bunny-middleware` 로 복구.** 인시던트 doc `8f5c43f8-0b46-4032-b3f6-08106aa1e5e2`
bouncer 자동 위젯 4개 (actions/ironclad/keepanker/servidor) 는 `cs-cf-worker-bouncer` 가 rotate. **수동 편집 금지** — 다음 rotate 때 덮어써짐. `inouter-bunny-middleware` 는 bouncer 관리 밖이라 수동 관리 (sitekey/secret 변경 시 BunnyCDN 미들웨어 64811 env 동시 갱신 필수).
### Turnstile 토큰 권한 (2026-04-10 사실)
- **Vault `secret/cloud/cloudflare` `api_token` (`pUIZdTV0…`)**: DNS R/W + Turnstile **read-only**. 위젯 생성/수정/삭제 불가.
- **cs-cf-worker-bouncer 가 jp1 bouncer 호스트의 `/etc/crowdsec/bouncers/crowdsec-cloudflare-worker-bouncer.yaml` 안에 보유한 별도 CF 토큰** (`token: seUKZID4…`): Turnstile **read+write**. 위젯 생성/수정/삭제 가능. 이 토큰은 bouncer 의 자체 인증 자산이며 Vault 에 복제되어 있지 않음.
- **2026-04-10 cf-audit-cleanup-2 복구**: kappa 가 jp1 bouncer 호스트의 위 토큰을 일시 빌려 `inouter-bunny-middleware` 위젯을 직접 API 로 생성. 결과 (sitekey/secret/name) 만 Vault `secret/cloud/cloudflare/turnstile-inouter-bunny` 에 보관. 토큰 본체는 복제 없음.
## 특이사항
@@ -171,12 +184,10 @@ bouncer 자동 위젯 6개는 `cs-cf-worker-bouncer` 가 rotate. **수동 편집
### CF proxy on/off 패턴 (중요)
- **inouter.com / anvil.it.com**: 거의 전부 `proxied: false` — CF 는 DNS 만, 트래픽은 BunnyCDN 또는 LAN 직통. CF Worker bouncer 라우트는 등록되었으나 **DNS 가 proxied=false 면 CF 엣지를 거치지 않음** → bouncer 무효.
- **inouter.com / anvil.it.com**: 거의 전부 `proxied: false` — CF 는 DNS 만, 트래픽은 BunnyCDN 또는 LAN 직통. **2026-04-10 cf-audit-cleanup-2 에서 두 zone 의 CF Worker bouncer 라우트 + bouncer 관리 zone 항목 모두 제거**. 보호는 BunnyCDN 미들웨어 64811 이 단독 책임.
- **actions.it.com / ironclad.it.com**: apex/wildcard 모두 `proxied: true` — CF Worker 효과적으로 enforce.
- **keepanker.cv**: CF Tunnel.
> **함의**: `inouter.com` / `anvil.it.com` 의 보호는 **BunnyCDN 미들웨어 64811 이 단독 책임**. CF Worker bouncer 는 라우트 등록 + Turnstile 위젯 회전만 하고 실제 enforcement 는 안 함. 의도된 design 인지 (BunnyCDN 우선) 또는 누락인지 결정 필요. design 이라면 inouter / anvil 의 CF Worker 라우트는 제거 가능.
### 정책 일관성
- iron-kr `IgnoreQueryStrings: true` vs iron-jp `IgnoreQueryStrings: false` — 같은 미들웨어 64811 공유인데 캐시 키 정책이 다름. iron-jp 트래픽이 미미해 영향 작지만 통일이 운영 단순화.
@@ -200,9 +211,23 @@ curl -X POST $BASE/sync?auto_apply=true # CF 의 모든 zone 을 보호 목록
> **BunnyCDN 미들웨어와는 무관**. BunnyCDN 미들웨어 64811 의 bloom filter 동기화는 jp1 `infra-tool` 컨테이너 `/opt/crowdsec-bouncer/bouncer.py` (3분 delta + 매시 full sync) 가 담당.
## 인시던트 이력
### 2026-04-10 cf-audit-cleanup-2 — destructive widget cleanup + 복구
- 의도: cs-cf-worker-bouncer 의 managed zones 에서 inouter.com, anvil.it.com 제거 (DNS proxied=false 라 enforce 안 되는 dead route 정리)
- 잘못된 가정: zone 제거 시 위젯이 freeze 된 채 남는다
- 실제 동작: 다음 bouncer restart 가 모든 zone 의 bouncer-managed widget 을 새 sitekey 로 rotation 하면서, config 에서 빠진 zone 의 옛 widget 은 destroy. **BunnyCDN 미들웨어 64811 이 baked-in 으로 사용하던 inouter sitekey `…2cntUlRC3KKMKG` 가 삭제되어 stale 발생**
- 영향: 잠재 버그. 현재 ban 없으면 미발현, 첫 inouter.com 호스트 ban 시 캡차 페이지 로드 실패
- 복구: kappa 가 jp1 bouncer 호스트의 cs-cf-worker-bouncer 토큰을 일시 빌려 신규 위젯 `inouter-bunny-middleware` (`0x4AAAAAAC3otPWhldI96Aks`) 생성. 이름이 bouncer 패턴과 다르므로 향후 rotation 영향 없음. Syn 이 BunnyCDN 미들웨어 64811 의 `TURNSTILE_SITE_KEY/SECRET_KEY` env 갱신 + publish (deployment `3816dbc5-…`)
- 부수: cfb-manager YAML 두 번째 DELETE 호출 시 파싱 깨짐 (anvil zone_id 라인 12-space orphan indent), 003003 자동 백업과 002237 API 백업 보유. 직접 수동 수리 (orphan 22 라인 제거) 후 `wc -l 79` 확인, restart 없이 정상 복구
- 학습: 보안/엣지 리소스 cleanup 경로는 destructive 가능성을 디폴트로 가정. 1개 항목 dry-run 후 부작용 0 확인 후 다음 진행
- 정본: 인시던트 doc `8f5c43f8-0b46-4032-b3f6-08106aa1e5e2`, recovery 절차 동 doc `## 복구 완료` 섹션
## 참조
- 전수 감사 정본 (대화 로그): Outline `agent-qna` doc `51b963c3-b251-48b5-a57a-a2305959c470` (2026-04-10)
- cf-audit-cleanup-2 인시던트: Outline `agent-qna` doc `8f5c43f8-0b46-4032-b3f6-08106aa1e5e2` (2026-04-10)
- 워크스페이스 런북: `~/syn/cloudflare/README.md`
- BunnyCDN 매핑: [[bunnycdn-security]]
- CrowdSec/Worker bouncer: [[crowdsec-safeline]]

View File

@@ -189,8 +189,9 @@ ddos-detect AI 분석기 폐기 후 deterministic 패턴 매칭으로 대체.
| 정본 | `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 |
| 보호 zone | keepanker.cv, actions.it.com, ironclad.it.com, inouter.com, servidor.it.com |
| Turnstile | 5개 zone managed 모드, 168시간 secret key 로테이션 |
| 보호 zone (현재) | keepanker.cv, actions.it.com, ironclad.it.com, servidor.it.com (4 zone, 2026-04-10 cf-audit-cleanup-2 후) |
| 제거된 zone | inouter.com, anvil.it.com — DNS `proxied: false` 라 CF 엣지를 거치지 않아 enforce 안 되던 dead route. 보호는 BunnyCDN 미들웨어 64811 단독. 2026-04-10 cfb-manager DELETE + 002323 단계 destructive cleanup → 003943 수동 YAML 수리 |
| Turnstile | bouncer-managed 4개 (rotate 168h), + 별도 수동 위젯 `inouter-bunny-middleware` (`0x4AAAAAAC3otPWhldI96Aks`) — BunnyCDN 미들웨어 64811 전용, bouncer 관리 외 freeze. [[cloudflare#Turnstile 토큰 권한 (2026-04-10 사실)]] |
#### Decision 수동 관리

View File

@@ -106,12 +106,22 @@ bloom filter (FNV-1a) base64 → BunnyCDN compute API
> **주의**: `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` 불일치**: 같은 미들웨어 64811 공유인데 정책이 다름 (true vs false). iron-jp 트래픽 미미해 영향 작지만 통일 권장.
- **Turnstile sitekey gap**: 미들웨어 64811 의 `TURNSTILE_SITE_KEY``inouter.com` zone managed 위젯 단일 키 → `actions.it.com`, `anvil.it.com`, `*.b-cdn.net` 호스트에서 ban 발동 시 캡챠 위젯 로드 실패. zone별 dispatcher TODO.
- 옛 메모의 풀존 ID `5316471 (inouter)`, `5330178 (actions)`, `5554681 (waf-kr)` 는 현 계정에 더 이상 존재하지 않음. 그런데 `nas.inouter.com` `*.actions.it.com` Cloudflare DNS 가 아직 `actions.b-cdn.net` 을 가리키는 dead reference 가 남아 있음 — [[cloudflare]] 정리 필요.
- **Turnstile sitekey gap**: 미들웨어 64811 의 `TURNSTILE_SITE_KEY``inouter-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 에서 정리 완료)
## 참조