- ホーム
- CDN シミュレーター
- オリジンサーバーとの統合
オリジンサーバーとの統合
このページでは、2 つの統合段階について説明します:
- 直接統合 — CDN エッジがオリジンサーバーに直接転送します(ベースラインテスト)
- F5 XC 挿入 — CDN とオリジンの間に F5 XC HTTP ロードバランサーを挿入します(セキュリティデモ)
まず直接統合でベースラインを確立し、準備が整ったら F5 XC を挿入します。
オリジンサーバーリファレンス
Section titled “オリジンサーバーリファレンス”origin-server ラボコンポーネントは、セキュリティテスト用の脆弱な Web アプリケーションを提供します。
| プロパティ | 値 |
|---|---|
| ドキュメント | f5-sales-demo.github.io/origin-server |
| リポジトリ | github.com/f5-sales-demo/origin-server |
| デフォルトポート | 80 |
| ヘルスチェック | GET /health |
利用可能なアプリケーション
Section titled “利用可能なアプリケーション”オリジンサーバーの公開マニフェストから現在のアプリケーションカタログを取得します:
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マニフェストには、すべてのアプリケーションパス、ヘルスチェック、コンテナイメージ、およびデモ機能のマッピングが記載されています。
アプリケーションパス
Section titled “アプリケーションパス”| パス | アプリケーション | デモ機能 |
|---|---|---|
/ | ランディングページ | — |
/health | ヘルスチェック | — |
/juice-shop/ | OWASP Juice Shop | Web アプリファイアウォール (WAF)、Bot 標準防御、API セキュリティ |
/dvwa/ | DVWA | Web アプリファイアウォール (WAF)、Bot 標準防御 |
/vampi/ | VAmPI | API セキュリティ |
/httpbin/ | httpbin | 診断 |
/whoami/ | whoami | ヘッダー検証 |
/csd-demo/ | CSD Demo | クライアントサイド防御 |
ステージ 1:直接統合(ベースライン)
Section titled “ステージ 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 │ └─────────────────────┘オリジンの設定
Section titled “オリジンの設定”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>"すべてのアプリケーションの検証
Section titled “すべてのアプリケーションの検証”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 ヘッダーの検証
Section titled “オリジンでの 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> |
ログの相互参照
Section titled “ログの相互参照”両サーバーのアクセスログを比較して、トラフィックフローを確認します:
# 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 およびベンダー固有のヘッダーに含まれます。
キャッシュの動作
Section titled “キャッシュの動作”# 最初のリクエスト — MISS(オリジンから取得)curl -s -I "http://$CDN/whoami/" | grep X-Cache-Status
# 2 回目のリクエスト — HIT(CDN キャッシュから提供)curl -s -I "http://$CDN/whoami/" | grep X-Cache-Statusステージ 2:F5 XC 挿入(セキュリティデモ)
Section titled “ステージ 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 適用の検証:
# CDN → F5 XC WAF を通じた SQL インジェクション(ブロックされるはず)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)
マルチコンポーネントアーキテクチャ
Section titled “マルチコンポーネントアーキテクチャ”| コンポーネント | リポジトリ | 目的 |
|---|---|---|
| CDN エッジ(本リポジトリ) | cdn-simulator | キャッシュ、ベンダーヘッダー |
| オリジンサーバー | origin-server | 脆弱な Web アプリ |
| F5 XC 設定 | 各種(waf、api-protection、bot-* など) | セキュリティポリシー |
各コンポーネントは、AI アシスタントがインフラをデプロイするために読み取るドキュメントを公開しています。オリジンサーバーは、すべてのアプリケーションパスとヘルスチェックを一覧表示するエンドポイントマニフェストを GitHub リリースアーティファクトとして公開しています。