Files
obsidian/infra/cloudflare.md
Syn 218c323f3f 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 의 "## 복구 완료" 섹션 참조.
2026-04-10 09:44:20 +09:00

243 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Cloudflare 서비스
updated: 2026-04-10
tags: [infra, cloudflare, cdn, dns]
---
> 2026-04-10 전수 감사 (Outline `agent-qna` doc `51b963c3-b251-48b5-a57a-a2305959c470`) 결과 반영 + 정리 1차 (`nas.inouter.com`, `ironclad.jp.inouter.com`, `k8s.jp.inouter.com` 삭제). Syn 이 엣지 관점에서 소유. 일반 DNS 관리 협업은 Heimdall.
## 계정
- ID: `d8e5997eb4040f8b489f09095c0f623c` (kappa@inouter.com)
- API 토큰: Vault `secret/cloud/cloudflare` (`api_token`, `email`)
- **Turnstile 쓰기 권한 없음** — 현 토큰은 read-only. 신규 위젯은 CF 대시보드 수동 또는 별도 권한 토큰 필요.
## Zone 전수 (6개, 2026-04-10)
| Zone | Zone ID | Status | Plan | NS | DNS rec | 비고 |
|---|---|---|---|---|---|---|
| **actions.it.com** | `dd7db273…` | active | Free | earl/raegan | 2 | apex+wildcard CNAME → BunnyCDN, **wildcard 가 dead 풀존 가리킴** ⚠ |
| **anvil.it.com** | `742f4c98…` | active | Free | earl/raegan | 9 | apex/wildcard CNAME → iron-jp, ssh.anvil.it.com A, Cloudflare Email Routing |
| **inouter.com** | `cd84743d…` | active | Free | earl/raegan | 32 | 메인 zone. 와일드카드 → k3s.inouter.com (LAN), 다수 서브가 iron-kr/iron-git 으로 분기 |
| **ironclad.it.com** | `bc8761b3…` | active | Free | earl/raegan | 14 | apex+wildcard A `172.233.93.180` (proxied), Mailgun MX, AWS SES DKIM |
| **keepanker.cv** | `118ac337…` | active | Free | lochlan/olivia | 3 | apex/wildcard → **Cloudflare Tunnel** (`cfargotunnel.com`), juiceshop CNAME → iron-kr-waf |
| **servidor.it.com** | `a6e1a3f1…` | active | Free | earl/raegan | **0** ⚠ | **DNS 레코드 0건 — orphan zone**. 워커 라우트 + Turnstile 위젯만 살아 있음 |
총 60건 (servidor 제외).
별도 계정 [[netbis]] 의 6개 zone (fall-vip / psd777 등) 은 본 문서 범위 외 — netbis-cf-bouncer 가 별도로 관리.
## DNS 레코드 — zone 별 핵심
### actions.it.com (2)
| Name | Type | Value | Proxied |
|---|---|---|---|
| `actions.it.com` | CNAME | `iron-kr.b-cdn.net` | ✅ |
| `*.actions.it.com` | CNAME | **`actions.b-cdn.net`** ⚠ dead | ✅ |
### anvil.it.com (9)
| Name | Type | Value | Proxied |
|---|---|---|---|
| `anvil.it.com` | CNAME | `iron-jp.b-cdn.net` | off |
| `*.anvil.it.com` | CNAME | `iron-jp.b-cdn.net` | off |
| `n8n.anvil.it.com` | CNAME | `iron-jp.b-cdn.net` | off |
| `kroki.anvil.it.com` | CNAME | `k3s.inouter.com` | off |
| `ssh.anvil.it.com` | A | `139.162.71.52` | off |
| MX×3 (Cloudflare Email Routing), DKIM TXT 1건 | | | |
### inouter.com (32) — 핵심
| Name | Type | Value | Proxied | 메모 |
|---|---|---|---|---|
| `*.inouter.com` | CNAME | `k3s.inouter.com` | off | LAN 직통 (BunnyCDN 우회) |
| `k3s.inouter.com` | A | `192.168.9.53` | off | Traefik MetalLB VIP |
| `kr.inouter.com` | A | `220.120.65.245` | off | OpenWrt 공인 IP |
| `jp.inouter.com` | A | `42.125.196.116` | off | jp1 |
| `derp.inouter.com` | A | `42.125.196.116` | off | jp1 derp |
| `gitea.inouter.com` | CNAME | `iron-git.b-cdn.net` | off | 별도 풀존 (미들웨어 우회) |
| `n8n.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `jarvis.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `vault.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `outline.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `telegram-webhook.inouter.com` | CNAME | `iron-kr.b-cdn.net` | off |
| `desk-api.inouter.com` | A | `172.233.93.180` | ✅ | osaka 직통, CF proxied |
| `sftp.inouter.com` | A | `220.120.65.245` | ✅ | OpenWrt 직통, CF proxied |
| `git.inouter.com` | A | `52.79.45.166` | off | relay4wd Lightsail |
| `teleport.inouter.com` | A | `52.79.45.166` | off | relay4wd Lightsail |
| `twilio.jp.inouter.com` | A | `172.233.93.180` | off |
| `bunny.mcp.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `vl.inouter.com` | CNAME | `k3s.inouter.com` | off | [[victorialogs|VictoriaLogs]] |
| `emulator.api.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `linode.api.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `namecheap.api.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `vultr.api.inouter.com` | CNAME | `k3s.inouter.com` | off |
| `email.inouter.com` | CNAME | `mailgun.org` | off |
| MX×2 Mailgun, TXT (SPF/DMARC/DKIM/google verification) | | | |
> **이전 메모(updated 2026-04-04)는 폐기**: jarvis/telegram-webhook/vault/n8n 이 `actions.b-cdn.net` 가리킨다는 기록은 dead 풀존을 가리키는 구식 정보. 실제 정본은 위 표와 같이 모두 `iron-kr.b-cdn.net`.
### ironclad.it.com (14)
| Name | Type | Value | Proxied |
|---|---|---|---|
| `ironclad.it.com` | A | `172.233.93.180` | ✅ |
| `*.ironclad.it.com` | A | `172.233.93.180` | ✅ |
| MX×2 Mailgun, AWS SES DKIM CNAME×3, TXT (SPF/DMARC/google) | | | |
> ironclad.it.com 은 **BunnyCDN 풀존을 거치지 않음**. CF proxied A 로 osaka 172.233.93.180 직통. 보호는 CF Worker (`ironclad-site` apex + bouncer wildcard) 단독.
### keepanker.cv (3)
| Name | Type | Value | Proxied |
|---|---|---|---|
| `keepanker.cv` | CNAME | `f1aa79f2-….cfargotunnel.com` | ✅ |
| `*.keepanker.cv` | CNAME | `f1aa79f2-….cfargotunnel.com` | ✅ |
| `juiceshop.keepanker.cv` | CNAME | `iron-kr-waf.b-cdn.net` | off |
apex/wildcard 는 Cloudflare Tunnel (cfargotunnel). juiceshop 은 BunnyCDN iron-kr-waf 로 override.
### servidor.it.com (0)
DNS 레코드 **없음**. zone 만 등록. 워커 라우트 + Turnstile 위젯은 살아있음 → 트래픽 자체가 불가능한데 보안 자원만 회전 중. zone 정리 또는 DNS 레코드 추가 결정 필요.
## Workers (9개)
| Worker | 라우트 부착 zones | 비고 |
|---|---|---|
| **crowdsec-cloudflare-worker-bouncer** | actions, anvil, inouter, ironclad, keepanker, servidor (전 6 zone) | CrowdSec CF bouncer 본체. cs-cf-worker-bouncer (jp1) 가 168h 마다 secret rotate. 정본 [[crowdsec-safeline]] |
| **ironclad-site** | ironclad.it.com (apex) | 정적 사이트, has_assets |
| **cf-multisite** | `*.actions.it.com/*` | 라우팅 워커 |
| chat-worker | (없음) | workers.dev only |
| cloud-instances-api | (없음) | 〃 |
| cloud-orchestrator | (없음) | 〃 |
| telegram-ai-support | (없음) | 〃 |
| telegram-cli-web | (없음) | 〃 |
| telegram-summary-bot | (없음) | 〃 |
### Worker 라우트 (zone 별, 2026-04-10 cf-audit-cleanup-2 후)
| 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 |
**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 위젯 (현재 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 생성. 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` 폐기) |
**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` 에 보관. 토큰 본체는 복제 없음.
## 특이사항
### Orphan / dead 자원
| 항목 | 내용 |
|---|---|
| **servidor.it.com zone** | DNS 레코드 0건. 워커 라우트 + Turnstile 위젯만 살아있음. 2026-04-10 kappa 판정 "죽은 도메인 아님" → **유지**. |
| ~~`nas.inouter.com → actions.b-cdn.net`~~ | **2026-04-10 삭제 완료** (cf-audit-cleanup-1). dead 풀존 참조였고 Synology 는 LAN 전용. → 같은 날 Heimdall 이 K3s `lan-proxies/nas` (Traefik IngressRoute) 로 LAN-only 복원, `*.inouter.com → k3s.inouter.com (192.168.9.53)` 폴백 활용. 상세 [[nas-storage#DSM Reverse Proxy — `nas.inouter.com` (2026-04-10)]] |
| **`*.actions.it.com → actions.b-cdn.net`** | 와일드카드 자체가 dead 풀존 가리킴. proxied=on 이라 CF 가 어디로 보내는지 의문. 일부 서브가 5xx 가능. **미정리** (영향 평가 후 별건). |
| **Worker route `vultr.actions.it.com/*`, `linode.actions.it.com/*`** | `script: null`. 등록만 되고 워커 미연결. (linode.actions.it.com 자체는 BunnyCDN iron-jp 호스트네임으로도 있음 — 중복 의도?) **미정리**. |
| **Turnstile `inouter` (sitekey `…CbmaudAjITah7y7`)** | 이름은 inouter 인데 허용 도메인은 anvil.it.com 단일. legacy 후보. **미정리** (CF 토큰 read-only 라 대시보드 수동 필요). |
### 사설 IP 공개 DNS 노출 — 2026-04-10 정리 완료
| 레코드 | 값 | 상태 |
|---|---|---|
| ~~`ironclad.jp.inouter.com`~~ | ~~A `10.19.228.193`~~ | **2026-04-10 삭제** (cf-audit-cleanup-1) |
| ~~`k8s.jp.inouter.com`~~ | ~~A `10.253.103.124`~~ | **2026-04-10 삭제** (cf-audit-cleanup-1) |
향후 사설 IP 가 필요하면 Tailscale Magic DNS 또는 split-horizon (예: jp.inouter.com 내부 zone) 으로 처리.
### CF proxy on/off 패턴 (중요)
- **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.
### 정책 일관성
- iron-kr `IgnoreQueryStrings: true` vs iron-jp `IgnoreQueryStrings: false` — 같은 미들웨어 64811 공유인데 캐시 키 정책이 다름. iron-jp 트래픽이 미미해 영향 작지만 통일이 운영 단순화.
## cfb-manager (CrowdSec CF Worker bouncer 관리 API)
| 항목 | 값 |
|---|---|
| 위치 | K3s `default/cfb-manager` (10.43.68.76:8000) |
| 구현 | Python FastAPI |
| 기능 | bouncer 보호 도메인 추가/삭제, decision 조회, CF zone 동기화, bouncer 재시작 트리거 |
| SSH 키 | K8s `default/cfb-ssh-key` 시크릿 (ed25519, 2026-04-09 재생성) |
```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/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]]
- 별도 계정: [[netbis]] (Netbis 계정 6 zone, 별도 cs-cf-worker-bouncer)
- DNS 프리셋: cloudflare, aws, google, github, bunnycdn
## 관련 문서
- [[netbis]] — Netbis 계정 Cloudflare (별도)
- [[cf-multisite]] — `*.actions.it.com` 라우팅 워커
- [[crowdsec-safeline]] — CrowdSec CF Worker Bouncer 연동
- [[bunnycdn-security]] — BunnyCDN 엣지 보안