diff --git a/history/2026-04-21-outline-bunny-nowaf-migration.md b/history/2026-04-21-outline-bunny-nowaf-migration.md new file mode 100644 index 0000000..e2fd9a7 --- /dev/null +++ b/history/2026-04-21-outline-bunny-nowaf-migration.md @@ -0,0 +1,68 @@ +--- +date: 2026-04-21 +topic: Outline을 WAF 없는 전용 Bunny 풀존(iron-kr-nowaf)으로 분리 +areas: + - infra/platform/outline + - services/bunnycdn-security +--- + +# 2026-04-21 Outline Bunny 풀존 분리 + +`outline.inouter.com`을 WAF 없는 신규 풀존 `iron-kr-nowaf`로 이전. iron-kr의 7개 CRS 룰 복원. + +## 배경 + +2026-04-13 iron-kr Shield learning mode 종료 후 CRS 룰이 enforce로 전환되면서 Outline API JSON 요청에 다수 오탐 누적: + +| 룰 | 오탐 경로 | 누적 | +|---|---|---| +| 942100 libinjection SQLi | `api/*.list`, `api/collections.list` | 9 | +| 932235 Unix CMD Injection | `api/documents.create` | 3 | +| 932370 Windows CMD Injection | `api/documents.create` | 2 | +| 930130 Restricted File Access | `api/*` | 2 | +| 932230 Unix CMD Injection (2-3 chars) | `api/documents.create` | 1 | +| 933160 PHP Injection | `api/documents.create` | 1 | + +Outline API는 Bearer 토큰 강제 인증 — WAF가 추가 보호 거의 없고 오탐만 생성. + +Basic plan 한계로 host-per-path 커스텀 룰 불가, 따라서 **전용 풀존 분리** 채택. + +## 변경 내역 + +### Bunny + +| 항목 | 이전 | 이후 | +|---|---|---| +| Pull Zone | iron-kr (ID 5555227) | **iron-kr-nowaf** (ID 5720695, 신규) | +| Shield | iron-kr Shield 101015 (CRS 활성) | Shield 없음 | +| 국가차단 | middleware 64811 | middleware 64811 (동일) | +| OriginUrl | https://220.120.65.245 | https://220.120.65.245 (동일) | +| AddHostHeader | true | true | +| VerifyOriginSSL | false | false | +| EnableWebSockets | true | true | +| TLS 인증서 | LE 자동 | `*.inouter.com` wildcard (cert-manager 수동 업로드) | + +### DNS + +``` +outline.inouter.com CNAME iron-kr.b-cdn.net → iron-kr-nowaf.b-cdn.net +``` + +Cloudflare zone `inouter.com` (id cd84743d9c61b97bada5ce903a29ae2b), record id cb8fd1cf67b872e52600e4f868a2a992. + +### iron-kr Shield 복원 + +임시 적용했던 `wafDisabledRules: [942100, 932230, 932235, 932260, 932370, 932380, 933160]` 전부 해제 → vault/n8n/telegram-webhook/jarvis 호스트 보호 원상복구. + +## 검증 + +- `list_collections` MCP 호출 200 OK (이전 942100 차단) +- `create_document` 성공 (doc id `4bfff4c7-2fd3-478e-af00-2e25301da781` YouTube 요약) +- TLS cert SAN: `DNS:inouter.com, DNS:*.inouter.com` (GTS WR1, 만료 2026-06-21) +- HTTP/2 200, `cdn-pullzone: 5720695` 응답 헤더 확인 + +## 미해결 / 후속 + +- **Bunny LE 자동 발급 실패** — `POST /pullzone/loadFreeCertificate?hostname=outline.inouter.com`가 `The request is invalid` 반환 (원인 불명). 현재 *.inouter.com wildcard로 우회했지만 LE 자동 갱신 체계 구축하려면 재조사 필요. cert-manager 와일드카드 갱신이 2026-06-21 전에 Bunny에 재업로드 필요 — 자동화 스크립트 또는 cert-manager webhook 연동 검토 +- Advanced plan 업그레이드 시 iron-kr에서 host-per-path 커스텀 룰로 통합 관리 가능 (현재는 풀존 2개 운영) +- 이번 이슈 원인 분석과 932380 n8n/vault 21건 실제 공격 건은 별도 Outline 문서로 보존: doc `ac429f1b-...`, doc `7ac9ec42-...` diff --git a/infra/platform/outline.md b/infra/platform/outline.md index a89cee3..1dbea56 100644 --- a/infra/platform/outline.md +++ b/infra/platform/outline.md @@ -24,9 +24,9 @@ Outline은 팀 위키/문서 관리 플랫폼. K3s 클러스터에 배포. | Redis | outline-redis (outline 네임스페이스 내 전용) | | 파일 저장소 | 로컬 (Longhorn PVC 5Gi, `/var/lib/outline/data`) | | TLS (Traefik) | wildcard-inouter-tls (*.inouter.com) | -| TLS (CDN) | Let's Encrypt via BunnyCDN | -| CDN | BunnyCDN iron-kr 존 (ID 5555227, 쿠키 허용) | -| DNS | outline.inouter.com CNAME → iron-kr.b-cdn.net (Cloudflare, proxied OFF) | +| TLS (CDN) | *.inouter.com wildcard (cert-manager, GTS WR1 발급) 수동 업로드 | +| CDN | BunnyCDN **iron-kr-nowaf** 존 (ID 5720695, WAF 없음, 쿠키 허용) — 2026-04-21 iron-kr에서 분리 이전 | +| DNS | outline.inouter.com CNAME → iron-kr-nowaf.b-cdn.net (Cloudflare, proxied OFF) | | Ingress | Traefik IngressRoute (CRD) | ## 인증 (Gitea OAuth2) diff --git a/services/bunnycdn-security.md b/services/bunnycdn-security.md index fcc4d1b..18f122a 100644 --- a/services/bunnycdn-security.md +++ b/services/bunnycdn-security.md @@ -63,7 +63,8 @@ tags: [cdn, bunnycdn, security, crowdsec, edge-script] | iron-kr | `jarvis.inouter.com` | | | iron-kr | `telegram-webhook.inouter.com` | | | iron-kr | `vault.inouter.com` | | -| iron-kr | `outline.inouter.com` | | +| iron-kr-nowaf | `iron-kr-nowaf.b-cdn.net` | ✅ | +| iron-kr-nowaf | `outline.inouter.com` | (WAF 제외용, 2026-04-21 이전) | | iron-jp | `iron-jp.b-cdn.net` | ✅ (시스템만 남음, 사용자 호스트 전부 제거 2026-04-17) | | iron-kr-waf | `iron-kr-waf.b-cdn.net` | ✅ | | iron-kr-waf | `juiceshop.keepanker.cv` | |