outline: split to iron-kr-nowaf pull zone, restore iron-kr WAF rules

Created new Bunny pull zone iron-kr-nowaf (ID 5720695) without Shield to
host outline.inouter.com exclusively. Uploaded *.inouter.com wildcard cert
from cert-manager since Bunny LE auto-provision kept returning invalid.
Restored 7 CRS rules (942100,932230/235/260/370/380,933160) on iron-kr
Shield so vault/n8n/telegram-webhook/jarvis regain protection.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
kaffa
2026-04-21 09:32:11 +09:00
parent 782fff8fe9
commit a20c68e3a1
3 changed files with 73 additions and 4 deletions

View File

@@ -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-...`

View File

@@ -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)

View File

@@ -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` | |