APISIX: chaitin-waf 글로벌→개별 전환, git push/http-logger 트러블슈팅 기록
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: APISIX 설정 및 운영
|
title: APISIX 설정 및 운영
|
||||||
updated: 2026-03-16
|
updated: 2026-03-15
|
||||||
---
|
---
|
||||||
|
|
||||||
## 아키텍처
|
## 아키텍처
|
||||||
@@ -27,17 +27,16 @@ BunnyCDN(inouter, ID 5316471) → apisix-osaka(172.233.93.180) → 백엔드
|
|||||||
|
|
||||||
#### global_rules
|
#### global_rules
|
||||||
- `real-ip` — source: http_x_real_ip, trusted: 0.0.0.0/0
|
- `real-ip` — source: http_x_real_ip, trusted: 0.0.0.0/0
|
||||||
- `chaitin-waf` — mode: block, SafeLine detector: 10.165.246.10:8000 (OVN 네트워크, plugin_metadata)
|
- `http-logger` → CrowdSec (10.253.100.240:8085, auth_header: apisix-crowdsec-log-2024)
|
||||||
- `http-logger` → CrowdSec (10.253.100.240:8085, 인증: apisix-crowdsec-log-2024)
|
|
||||||
|
|
||||||
#### 라우트 및 limit-req
|
#### 라우트 및 플러그인
|
||||||
|
|
||||||
| 라우트 ID | 호스트 | upstream | limit-req (rate/burst) |
|
| 라우트 ID | 호스트 | upstream | chaitin-waf | limit-req (rate/burst) |
|
||||||
|-----------|--------|----------|----------------------|
|
|-----------|--------|----------|-------------|----------------------|
|
||||||
| gitea-anvil-it-com | gitea.anvil.it.com | 192.168.9.100:8418 | 50/30 |
|
| gitea-anvil-it-com | gitea.anvil.it.com | 192.168.9.100:8418 | block, match: `.git/` 제외 | 50/30 |
|
||||||
| hcv-inouter-com | hcv.inouter.com | K3s Traefik :443 (roundrobin) | 20/10 |
|
| hcv-inouter-com | hcv.inouter.com | K3s Traefik :443 (roundrobin) | block | 20/10 |
|
||||||
| nocodb | nocodb.inouter.com | K3s Traefik :443 (roundrobin) | 100/50 |
|
| nocodb | nocodb.inouter.com | K3s Traefik :443 (roundrobin) | block | 100/50 |
|
||||||
| nocodb-nuxt | nocodb.inouter.com | K3s Traefik :443 (roundrobin) | 100/50 |
|
| nocodb-nuxt | nocodb.inouter.com | K3s Traefik :443 (roundrobin) | block | 100/50 |
|
||||||
|
|
||||||
### BunnyCDN Pull Zone 매핑
|
### BunnyCDN Pull Zone 매핑
|
||||||
|
|
||||||
@@ -80,8 +79,39 @@ BunnyCDN WAF가 NocoDB JS를 오탐 차단하여 CDN 우회 처리 (2026-03-15).
|
|||||||
|
|
||||||
오사카/서울 양쪽 APISIX → CrowdSec (10.253.100.240:8085) http-logger global_rules로 전송.
|
오사카/서울 양쪽 APISIX → CrowdSec (10.253.100.240:8085) http-logger global_rules로 전송.
|
||||||
|
|
||||||
인증: Authorization: apisix-crowdsec-log-2024
|
인증: `auth_header: apisix-crowdsec-log-2024` (주의: `headers` 필드가 아님)
|
||||||
|
|
||||||
커스텀 파서: custom/apisix-json-logs (403 응답만 필터)
|
커스텀 파서: custom/apisix-json-logs (403 응답만 필터)
|
||||||
|
|
||||||
시나리오 매칭으로 반복 공격자 탐지.
|
시나리오 매칭으로 반복 공격자 탐지.
|
||||||
|
|
||||||
|
## 트러블슈팅 기록
|
||||||
|
|
||||||
|
### git push 500 에러 (2026-03-15)
|
||||||
|
|
||||||
|
**증상**: `gitea.anvil.it.com`으로 git push 시 BunnyCDN에서 403 반환 (오리진 500)
|
||||||
|
|
||||||
|
**원인 1 — client_body_temp 퍼미션**:
|
||||||
|
- nginx가 큰 POST body(git pack ~20KB)를 `/usr/local/apisix/client_body_temp/`에 임시 파일로 쓸 때 퍼미션 거부
|
||||||
|
- 디렉토리 소유자가 `nobody`인데 APISIX는 `apisix` 사용자로 실행
|
||||||
|
- 작은 요청은 메모리 버퍼로 처리되어 정상, 큰 요청만 실패
|
||||||
|
- **수정**: `chown apisix:apisix /usr/local/apisix/client_body_temp`
|
||||||
|
|
||||||
|
**원인 2 — chaitin-waf 글로벌 적용**:
|
||||||
|
- `chaitin-waf`가 global_rules에 있어서 모든 요청에 WAF 검사 적용
|
||||||
|
- SafeLine detector가 git pack 바이너리를 파싱 실패 시 `mode: block`이면 500 반환 (fail-closed)
|
||||||
|
- 라우트 레벨에서 match 제외를 넣어도 global_rule이 먼저 적용되어 무시됨
|
||||||
|
- **수정**: global_rules에서 `chaitin-waf` 제거, 각 라우트에 개별 적용. gitea 라우트는 `match: [{"vars": [["uri", "!", "~*", "\\.git/"]]}]`로 git 경로 WAF 제외
|
||||||
|
|
||||||
|
**교훈**:
|
||||||
|
- SafeLine WAF는 바이너리 프로토콜(git pack 등)을 처리할 수 없음 → 해당 경로는 WAF에서 제외 필요
|
||||||
|
- global_rules의 WAF는 예외 처리가 어려움 → 라우트별 개별 적용이 유연함
|
||||||
|
- BunnyCDN `errorcode: 112`는 오리진 에러를 나타냄 → 실제 원인은 오리진 로그에서 확인
|
||||||
|
|
||||||
|
### http-logger 401 에러 (2026-03-15)
|
||||||
|
|
||||||
|
**증상**: 서울 APISIX http-logger가 CrowdSec으로 로그 전송 시 401 Unauthorized
|
||||||
|
|
||||||
|
**원인**: http-logger 플러그인은 Authorization 헤더를 `auth_header` 필드로 설정해야 하는데, `headers.Authorization`으로 설정되어 있었음 (무시됨)
|
||||||
|
|
||||||
|
**수정**: `"headers": {"Authorization": "..."}` → `"auth_header": "apisix-crowdsec-log-2024"`
|
||||||
|
|||||||
Reference in New Issue
Block a user