오리진 서버와 통합
이 페이지에서는 두 가지 통합 단계를 다룹니다:
- 직접 통합 — CDN 엣지가 오리진 서버로 직접 전달(기준선 테스트)
- F5 XC 삽입 — CDN과 오리진 사이에 F5 XC HTTP 로드 밸런서 삽입(보안 데모)
직접 통합으로 시작하여 기준선을 설정한 후, 준비가 되면 F5 XC를 삽입합니다.
오리진 서버 참조
섹션 제목: “오리진 서버 참조”origin-server 랩 구성 요소는 보안 테스트를 위한 취약한 웹 애플리케이션을 제공합니다.
| 속성 | 값 |
|---|---|
| 문서 | f5-sales-demo.github.io/origin-server |
| 저장소 | github.com/f5-sales-demo/origin-server |
| 기본 포트 | 80 |
| 헬스 체크 | GET /health |
사용 가능한 애플리케이션
섹션 제목: “사용 가능한 애플리케이션”오리진 서버의 게시된 매니페스트에서 현재 애플리케이션 카탈로그를 가져옵니다:
MANIFEST_URL=$(curl -sf https://api.github.com/repos/f5-sales-demo/origin-server/releases/latest \ | python3 -c "import sys,json; assets=json.load(sys.stdin).get('assets',[]); print(next((a['browser_download_url'] for a in assets if a['name']=='manifest.json'),''))")curl -sf "$MANIFEST_URL" | python3 -m json.tool릴리스가 아직 없는 경우 저장소 소스를 직접 사용합니다:
curl -sf https://raw.githubusercontent.com/f5-sales-demo/origin-server/main/manifest.json | python3 -m json.tool매니페스트에는 모든 애플리케이션 경로, 헬스 체크, 컨테이너 이미지 및 데모 기능 매핑이 나열되어 있습니다.
애플리케이션 경로
섹션 제목: “애플리케이션 경로”| 경로 | 애플리케이션 | 데모 기능 |
|---|---|---|
/ | 랜딩 페이지 | — |
/health | 헬스 체크 | — |
/juice-shop/ | OWASP Juice Shop | 웹 앱 방화벽 (WAF), Bot 표준 방어, API 보안 |
/dvwa/ | DVWA | 웹 앱 방화벽 (WAF), Bot 표준 방어 |
/vampi/ | VAmPI | API 보안 |
/httpbin/ | httpbin | 진단 |
/whoami/ | whoami | 헤더 검증 |
/csd-demo/ | CSD Demo | 클라이언트 측 방어 |
1단계: 직접 통합 (기준선)
섹션 제목: “1단계: 직접 통합 (기준선)”┌──────────┐ ┌──────────────────────┐ ┌─────────────────────┐│ Client │────▶│ CDN Edge (NGINX) │────▶│ Origin Server ││ │ │ 20.65.90.112 │ │ 20.12.78.159 │└──────────┘ │ 67+ CDN headers │ │ Juice Shop, DVWA, │ │ Disk cache │ │ VAmPI, httpbin, │ └──────────────────────┘ │ whoami, CSD Demo │ └─────────────────────┘오리진 구성
섹션 제목: “오리진 구성”CDN 엣지 NGINX 설정에서 오리진 서버 IP를 설정합니다:
ssh azureuser@<CDN_EDGE_IP>sudo sed -i 's|proxy_pass .*;|proxy_pass http://<ORIGIN_IP>;|' /etc/nginx/conf.d/cdn-edge.confsudo rm -rf /var/cache/nginx/cdn/*sudo nginx -t && sudo systemctl reload nginx또는 terraform.tfvars를 통해 Terraform 배포 시 설정합니다:
origin_server = "http://<ORIGIN_IP>"모든 애플리케이션 검증
섹션 제목: “모든 애플리케이션 검증”CDN을 통해 각 오리진 애플리케이션을 테스트합니다:
CDN=<CDN_EDGE_IP>
# 헬스 체크 (CDN 로컬)curl -sf "http://$CDN/health" | python3 -m json.tool
# 랜딩 페이지curl -sf -o /dev/null -w "/ : HTTP %{http_code}\n" "http://$CDN/"
# Juice Shopcurl -sf -o /dev/null -w "/juice-shop/ : HTTP %{http_code}\n" "http://$CDN/juice-shop/"
# DVWA (로그인으로 리디렉션 따라가기)curl -sf -o /dev/null -w "/dvwa/ : HTTP %{http_code}\n" -L "http://$CDN/dvwa/"
# VAmPI APIcurl -sf "http://$CDN/vampi/users/v1" | python3 -m json.tool | head -5
# httpbin 헤더 (JSON으로 CDN 헤더 표시)curl -sf "http://$CDN/httpbin/headers" | python3 -m json.tool | head -10
# whoami (오리진이 수신하는 모든 헤더 표시)curl -sf "http://$CDN/whoami/"
# CSD Democurl -sf -o /dev/null -w "/csd-demo/ : HTTP %{http_code}\n" "http://$CDN/csd-demo/"모든 경로는 HTTP 200을 반환해야 합니다(DVWA는 302를 반환한 후 따라가면 200을 반환합니다).
오리진에서 CDN 헤더 검증
섹션 제목: “오리진에서 CDN 헤더 검증”/whoami/ 엔드포인트는 오리진이 수신하는 모든 헤더를 표시합니다. CDN을 통해 접근하면 67개 이상의 벤더 헤더가 모두 표시됩니다:
curl -sf "http://$CDN/whoami/"다음 주요 헤더가 있는지 확인합니다:
| 벤더 | 헤더 | 예상 값 |
|---|---|---|
| 표준 | X-Forwarded-For | <your_ip>, <cdn_edge_ip> |
| Akamai | True-Client-Ip | <your_ip> |
| Cloudflare | Cf-Connecting-Ip | <your_ip> |
| CloudFront | Cloudfront-Viewer-Country | US |
| Fastly | Fastly-Client-Ip | <your_ip> |
| Azure FD | X-Azure-Clientip | <your_ip> |
로그 교차 참조
섹션 제목: “로그 교차 참조”두 서버의 액세스 로그를 비교하여 트래픽 흐름을 검증합니다:
# CDN 엣지 로그 — 클라이언트 IP가 소스로 표시됨ssh azureuser@<CDN_EDGE_IP> "sudo tail -5 /var/log/nginx/access.log"
# 오리진 로그 — CDN 엣지 IP가 소스로 표시됨ssh azureuser@<ORIGIN_IP> "sudo tail -5 /var/log/nginx/access.log"오리진 로그는 연결 클라이언트로 CDN 엣지 IP를 표시해야 하며, 실제 클라이언트 IP는 X-Forwarded-For 및 벤더별 헤더에 전달됩니다.
캐시 동작
섹션 제목: “캐시 동작”# 첫 번째 요청 — MISS (오리진에서 가져옴)curl -s -I "http://$CDN/whoami/" | grep X-Cache-Status
# 두 번째 요청 — HIT (CDN 캐시에서 제공)curl -s -I "http://$CDN/whoami/" | grep X-Cache-Status2단계: F5 XC 삽입 (보안 데모)
섹션 제목: “2단계: F5 XC 삽입 (보안 데모)”기준선 테스트 후, CDN과 오리진 사이에 F5 XC HTTP 로드 밸런서를 삽입합니다:
┌──────────┐ ┌────────────────┐ ┌──────────────────┐ ┌─────────────────┐│ Client │────▶│ CDN Edge │────▶│ F5 XC HTTP LB │────▶│ Origin Server ││ │ │ (NGINX) │ │ WAF + Bot + API │ │ │└──────────┘ └────────────────┘ └──────────────────┘ └─────────────────┘- F5 XC HTTP 로드 밸런서 생성 — 오리진 풀에 오리진 서버를 포함하여 생성
- CDN 엣지 업데이트 — 오리진으로 직접 연결하는 대신 F5 XC VIP를 가리키도록 변경:
ssh azureuser@<CDN_EDGE_IP>sudo sed -i 's|proxy_pass .*;|proxy_pass https://<F5XC_LB_VIP>;|' /etc/nginx/conf.d/cdn-edge.confsudo rm -rf /var/cache/nginx/cdn/*sudo nginx -t && sudo systemctl reload nginx- 전체 체인을 통한 WAF 적용 검증:
# SQL 인젝션 — CDN → F5 XC WAF에서 차단되어야 함curl -I "http://$CDN/dvwa/vulnerabilities/sqli/?id=%27+OR+1%3D1--"
# 일반 요청은 통과되어야 함curl -sf -o /dev/null -w "%{http_code}" "http://$CDN/juice-shop/"- F5 XC에서 신뢰할 수 있는 클라이언트 IP 헤더 구성 — CDN 헤더에서 실제 클라이언트 IP를 읽도록 설정(예: Akamai 시뮬레이션의 경우
True-Client-IP, Cloudflare 시뮬레이션의 경우CF-Connecting-IP)
멀티 구성 요소 아키텍처
섹션 제목: “멀티 구성 요소 아키텍처”| 구성 요소 | 저장소 | 목적 |
|---|---|---|
| CDN 시뮬레이터 (현재) | cdn-simulator | 캐싱, 벤더 헤더 |
| 오리진 서버 | origin-server | 취약한 웹 앱 |
| F5 XC 구성 | 다양함 (waf, api-protection, bot-* 등) | 보안 정책 |
각 구성 요소는 AI 어시스턴트가 인프라를 배포하기 위해 읽는 문서를 게시합니다. 오리진 서버는 모든 애플리케이션 경로와 헬스 체크를 나열하는 엔드포인트 매니페스트를 GitHub 릴리스 아티팩트로 게시합니다.