obsidian: 정본에서 변경 이력 분리, history/ 도입
- history/README.md: 변경 이력/인시던트 기록 규약 - history/2026-04-10-edge-cleanup.md: 오늘의 엣지 정리·인시던트·복구 전체 연대기 - infra/cloudflare.md: 연대기 주석/strikethrough/인시던트 서사 제거, 현재 사실만 - infra/crowdsec-safeline.md: 인시던트 bullet 제거, 과거 이력은 history/ 참조 - services/bunnycdn-security.md: sitekey 이력표 제거, 현재 위젯 정보만 - infra/nas-storage.md: reverse proxy 섹션의 날짜 주석 제거
This commit is contained in:
@@ -160,10 +160,9 @@ ddos-detect AI 분석기 폐기 후 deterministic 패턴 매칭으로 대체.
|
||||
- `499-burst`: 모바일 클라이언트 끊김으로 정상 발생할 수 있어 30 임계값을 며칠 관찰 후 조정 권장.
|
||||
- `high-rate-per-ip`: APISIX `limit-req` 글로벌 룰(20 req/s burst 10)을 통과한 트래픽만 도달 → 1차 통과 후 sustained pattern을 잡는 2차 layer.
|
||||
- 현재 모두 `remediation: true` (즉시 ban). dry-run으로 시작 안 함 — false positive 발생 시 임계값 또는 ban duration 조정.
|
||||
- **2026-04-09 조정**: `high-rate-per-ip` 초기값(capacity 200, leakspeed 300ms) 사용 중 kappa 본인 트래픽이 지속 ≈3.3 req/s 한도를 넘어 오탐 ban 발생 → BunnyCDN 엣지 미들웨어가 캡챠 페이지 반환 → **POST /__captcha/verify 가 BunnyCDN 미들웨어에서 미처리 상태로 origin까지 흘러 404 반환하는 dead-end 버그**와 결합되어 outline/vault/n8n/jarvis/telegram-webhook/actions 전 호스트 접근 불가. 조치: (1) cscli로 ban decision 삭제 + BunnyCDN zone 캐시 퍼지, (2) 시나리오 완화 capacity 200→1000, leakspeed 300ms→100ms (sustained 10 req/s 허용), (3) **BunnyCDN 엣지 스크립트 64811 middleware.ts 수정** — `/__captcha/verify` 라우트를 `isBlocked` 블록 밖으로 끌어올려 bloom filter 업데이트 race와 무관하게 항상 인터셉트하도록 변경. POST는 handleCaptchaVerify, 그 외(method/ip 없음)는 302 to `/`. 소스: [gitea 7da39b2ac](https://gitea.inouter.com/kaffa/crowdsec-bunny-bouncer/commit/7da39b2acb91f5dd65e63b0ec078d37259bb2950).
|
||||
- **2026-04-09 별건**: `cs-cf-worker-bouncer.yaml` line 68-78 (anvil.it.com 블록) 들여쓰기 12칸 오타로 5일간 42,593회 systemd crash loop, Cloudflare Worker KV 동기화 중단. sed로 인덴트 4칸으로 정정, 5일 만에 정상 기동. 별건: K8s `default/cfb-ssh-key` 시크릿의 id_rsa 데이터가 libcrypto parse 실패 상태라 `cfb-manager` → `cs-cf-worker-bouncer` SSH 인증 불가, `/domains` `/status` API가 500 반환. 새 ed25519 키페어 생성·시크릿 교체·authorized_keys 등록·파드 재시작으로 복구.
|
||||
- **2026-04-09 Turnstile sitekey 교체**: BunnyCDN 엣지 스크립트 64811의 `TURNSTILE_SITE_KEY` env 변수가 `0x4AAAAAACbmaudAjITah7y7` (name `inouter`, allowed domain `['anvil.it.com']`)로 설정되어 있어 outline.inouter.com에서 Turnstile 위젯이 "웹 사이트에 연결할 수 없음" 에러. cs-cf-worker-bouncer가 managed 모드로 자동 생성한 `inouter.com` zone 위젯(`0x4AAAAAAC2cntUlRC3KKMKG`, secret `0x4AAAAAAC2cnp9fkaIBt3rixDBalNKfLZQ`)으로 교체. **Turnstile managed 위젯은 zone apex 도메인으로 등록해도 서브도메인을 암묵 허용함**이 확인됨 (outline.inouter.com 정상 동작). 단, iron-kr 풀존에는 `actions.it.com`·`iron-kr.b-cdn.net`도 포함되는데 이들은 inouter.com zone 외부라 캡챠 위젯 로드 불가. iron-jp 풀존(anvil.it.com 등)도 동일 제약. **TODO**: 스크립트를 수정해 `request.hostname`에 따라 zone별 sitekey/secret을 dispatch하거나, CF 대시보드에서 multi-domain 위젯 하나로 통합.
|
||||
- **2026-04-10 cf-audit-cleanup-2 인시던트 (3-incident chain)**: ① Syn 가 cfb-manager API 로 inouter/anvil 를 bouncer 관리에서 제외 시도. cfb-manager 의 DELETE 가 단순 config 항목 제거가 아니라 bouncer restart + destructive widget cleanup 을 트리거 → BunnyCDN 미들웨어 64811 이 baked-in 사용 중이던 inouter Turnstile 위젯 `0x4AAAAAAC2cntUlRC3KKMKG` 가 함께 삭제 (잠재 버그, ban 발동 시 캡차 깨짐). ② kappa 가 jp1 cs-cf-worker-bouncer 의 CF 토큰 (`seUKZID4...`, Turnstile R+W) 을 일시 차용해 새 위젯 `inouter-bunny-middleware` (`0x4AAAAAAC3otPWhldI96Aks`) 직접 생성, Vault `secret/cloud/cloudflare/turnstile-inouter-bunny` 보관, Syn 가 미들웨어 64811 env 갱신 + publish. ③ Syn 의 yaml 수동 fix 가 disk 에 반영되지 않아 (또는 반영 직후 원복) bouncer 가 깨진 yaml 로 crashloop, 4개 zone (keepanker/actions/ironclad/servidor) 의 Worker route 와 widget 도 함께 사라져 CF Worker enforcement 다운. 근본 원인: `/etc/cron.d/cf-zone-sync` 의 `auto-add-cf-zones.sh` 가 매 10분마다 CF API 의 zone 목록을 yaml 에 자동 추가하는데 추가 indent 가 12-space 로 잘못되어 yaml 파괴. 복구: kappa 가 cron 파일을 `cf-zone-sync.disabled.kappa-incident-20260410` 로 rename, yaml 을 `bak.20260410004004` 클린 백업으로 복원, bouncer 재기동 → 4개 zone widget/route 자동 재생성 확인. **결론: cfb-manager API 의 DELETE 는 destructive, cf-zone-sync cron 은 exclusion 미지원**. 둘 다 영구 수정 필요. 인시던트 보고서: Outline doc `8f5c43f8-0b46-4032-b3f6-08106aa1e5e2`.
|
||||
|
||||
|
||||
과거 인시던트 및 변경 이력은 `history/` 참조. 예: `history/2026-04-10-edge-cleanup.md` (cf-audit-cleanup-2 3-incident chain, Turnstile sitekey 교체, 미들웨어 64811 `/__captcha/verify` 버그 수정 등).
|
||||
|
||||
### 발견 사항: K3s APISIX 글로벌 limit-req
|
||||
|
||||
@@ -190,10 +189,10 @@ 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, 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 수리 → 005203 kappa 긴급 복구 (cron 비활성화 + 백업 복원) |
|
||||
| Turnstile | bouncer-managed 4개 (rotate 168h, 005217 신규 생성: servidor `0x4AAAAAAC3rgjWkt-40fI7d`, actions `0x4AAAAAAC3rg3VTXEllaMhY`, keepanker `0x4AAAAAAC3rhJWcBgQ5aPym`, ironclad `0x4AAAAAAC3rhaCWqBq5Qgza`), + 별도 수동 위젯 `inouter-bunny-middleware` (`0x4AAAAAAC3otPWhldI96Aks`) — BunnyCDN 미들웨어 64811 전용, bouncer 관리 외 freeze. [[cloudflare#Turnstile 토큰 권한 (2026-04-10 사실)]] |
|
||||
| **cron `cf-zone-sync` 영구 제거 (2026-04-10)** | 원본 cron 은 매 10분마다 `auto-add-cf-zones.sh` 실행 → CF 의 모든 zone 을 자동으로 yaml 에 추가 (12-space indent bug 로 yaml 파괴, cleanup-2 인시던트 근본 원인). kappa 판단: exclusion 지원 재작성보다 **자동 쓰기 자체를 제거** 가 옳음 (yaml 에 쓰는 주체가 하나여야 coordination 문제 해소). 조치: `/etc/cron.d/cf-zone-sync` 파일 삭제, `/usr/local/bin/auto-add-cf-zones.sh` 는 post-mortem 용 archive (`.disabled.20260410-incident`, chmod 600). `/usr/local/bin/sync-cf-zones.sh` (older, detect-only 버전) 는 cron 미참조 + yaml 편집 없음이라 그대로 유지. `/var/log/cf-zone-sync.log` 는 history 로 유지. 신규 zone 추가 시 = cfb-manager `POST /domains` 또는 수동 yaml edit + systemctl restart |
|
||||
| 보호 zone | keepanker.cv, actions.it.com, ironclad.it.com, servidor.it.com |
|
||||
| 비보호 zone | inouter.com, anvil.it.com — DNS `proxied: false` 라 CF 엣지를 거치지 않아 bouncer 라우트가 enforce 되지 않음. 보호는 BunnyCDN 미들웨어 64811 단독 |
|
||||
| Turnstile 위젯 | 4개 bouncer-managed (`crowdsec-cloudflare-worker-bouncer-widget` 이름, 168h rotation). BunnyCDN 미들웨어용 `inouter-bunny-middleware` 는 별도 수동 관리 — [[cloudflare#Turnstile 위젯]] |
|
||||
| yaml writer | `cfb-manager` 단일 (K8s `default/cfb-manager` REST API). 과거 `/etc/cron.d/cf-zone-sync` + `auto-add-cf-zones.sh` 자동 쓰기는 coordination 문제로 제거됨 — 신규 zone 추가는 `cfb-manager POST /domains` 또는 수동 yaml edit + systemctl restart |
|
||||
|
||||
#### Decision 수동 관리
|
||||
|
||||
@@ -245,7 +244,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-kr (5555227) — 두 풀존 모두 `MiddlewareScriptId: 64811` (2026-04-09 실측) |
|
||||
| 적용 풀존 | iron-jp (5555247), iron-kr (5555227) — 두 풀존 모두 `MiddlewareScriptId: 64811` |
|
||||
| API 키 | Vault `secret/infra/crowdsec-bunny-bouncer` |
|
||||
| 소스 | `~/crowdsec-bunny-bouncer/` |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user