- ホーム
- クライアントサイド防御
- Demo
- フェーズ 1 — 構築
フェーズ 1 — 構築
フェーズ 1 では、CSD インフラ全体を展開し検証します。すべてのステップを順番に完了してください — 各ステップは次に進む前に PASS である必要があります。これらのコマンドを実行する前に、インデックスに戻って環境セットアップと変数解決を完了してください。
ステップ 0: 名前空間の確認と作成 (条件付き)
Section titled “ステップ 0: 名前空間の確認と作成 (条件付き)”テナントにターゲットの名前空間がすでに存在するか確認します。存在しない場合は作成します。結果を NAMESPACE_CREATED シェル変数に記録します — フェーズ 4 のティアダウンでは、この変数を使用して名前空間を削除するかどうかを判断します。
NS_CHECK=$(curl -s -o /dev/null -w '%\{http_code\}' \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx")
NAMESPACE_CREATED="false"if [ "$NS_CHECK" = "404" ]; then curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{"metadata": {"name": "xF5XC_NAMESPACEx"}, "spec": {}}' \ "xF5XC_API_URLx/api/web/namespaces" | jq . NAMESPACE_CREATED="true"fi名前空間が存在することを確認し、作成されたかどうかを記録します。
curl -s -o /dev/null -w '%\{http_code\}' \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx"echo "NAMESPACE_CREATED=$NAMESPACE_CREATED"| フィールド | 期待値 | ステータス |
|---|---|---|
| HTTP ステータス | 200 | 返された場合は PASS、404 またはその他の場合は FAIL |
NAMESPACE_CREATED | true(作成済み)または false(既存) | 情報提供 — フェーズ 4 のティアダウンで使用 |
ステップ 1: ヘルスチェックの作成 (オプション)
Section titled “ステップ 1: ヘルスチェックの作成 (オプション)”オリジンプールがバックエンドの健全性を監視するために使用できる HTTP ヘルスチェックを作成します。
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "metadata": { "name": "xF5XC_HC_NAMEx", "namespace": "xF5XC_NAMESPACEx", "labels": {}, "annotations": {}, "disable": false }, "spec": { "http_health_check": { "use_origin_server_name": {}, "path": "/", "use_http2": false, "headers": {}, "request_headers_to_remove": [], "expected_status_codes": ["200"] }, "timeout": 3, "interval": 15, "jitter": 0, "unhealthy_threshold": 1, "healthy_threshold": 3, "jitter_percent": 30 } }' \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks" \ | jq .作成されたオブジェクトを含む 200 レスポンスで、ヘルスチェックが作成されたことを確認します。レスポンスに "code": 8 と "Object kind healthcheck has exhausted limits(150)" のようなメッセージが含まれている場合、テナントはヘルスチェックの上限に達しています — ステップ 2 にスキップし、ヘルスチェック参照を省略してください。CSD は健全性監視に依存しません。
ヘルスチェックが存在することを確認します。
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks/xF5XC_HC_NAMEx" \ | jq '{name: .metadata.name, namespace: .metadata.namespace, path: .spec.http_health_check.path, interval: .spec.interval}'| フィールド | 期待値 | ステータス |
|---|---|---|
| HTTP ステータス | 200 とオブジェクト | 返された場合は PASS、404 の場合は FAIL |
name | F5XC_HC_NAME と一致 | PASS |
path | / | PASS |
ステップ 1 をスキップ(エラーコード 8、上限超過) | — | PASS(ヘルスチェックは CSD においてオプション) |
ステップ 2: オリジンプールの作成
Section titled “ステップ 2: オリジンプールの作成”バックエンドサーバーを指すオリジンプールを作成します。ステップ 1 でヘルスチェックを作成した場合は、healthcheck 参照を含めてください。ステップ 1 をスキップした場合は、空の配列を使用してください。
ヘルスチェックあり(ステップ 1 が成功した場合):
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "metadata": { "name": "xF5XC_ORIGIN_POOLx", "namespace": "xF5XC_NAMESPACEx", "labels": {}, "annotations": {}, "description": "Origin pool for CSD demo", "disable": false }, "spec": { "origin_servers": [{ "public_ip": { "ip": "xF5XC_ORIGIN_IPx" }, "labels": {} }], "no_tls": {}, "port": xF5XC_ORIGIN_PORTx, "same_as_endpoint_port": {}, "healthcheck": [{ "namespace": "xF5XC_NAMESPACEx", "name": "xF5XC_HC_NAMEx", "kind": "healthcheck" }], "loadbalancer_algorithm": "LB_OVERRIDE", "endpoint_selection": "LOCAL_PREFERRED" } }' \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools" \ | jq .ヘルスチェックなし(ステップ 1 をスキップした場合):
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "metadata": { "name": "xF5XC_ORIGIN_POOLx", "namespace": "xF5XC_NAMESPACEx", "labels": {}, "annotations": {}, "description": "Origin pool for CSD demo", "disable": false }, "spec": { "origin_servers": [{ "public_ip": { "ip": "xF5XC_ORIGIN_IPx" }, "labels": {} }], "no_tls": {}, "port": xF5XC_ORIGIN_PORTx, "same_as_endpoint_port": {}, "healthcheck": [], "loadbalancer_algorithm": "LB_OVERRIDE", "endpoint_selection": "LOCAL_PREFERRED" } }' \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools" \ | jq .200 レスポンスで、オリジンプールが作成されたことを確認します。
ヘルスチェックがリンクされていることの確認
Section titled “ヘルスチェックがリンクされていることの確認”ヘルスチェック参照を含めた場合は、正しくリンクされていることを確認します。
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \ | jq '.spec.healthcheck'配列にデータがある場合はリンクを確認します。空の配列 [] は、ステップ 1 をスキップした場合に期待される結果です。リンクするつもりだった場合は、ヘルスチェックが見つからなかったことを意味します。
オリジンプールが存在し、正しい構成であることを確認します。
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \ | jq '{name: .metadata.name, origin_ip: .spec.origin_servers[0].public_ip.ip, port: .spec.port, healthcheck_count: (.spec.healthcheck | length)}'| フィールド | 期待値 | ステータス |
|---|---|---|
| HTTP ステータス | 200 | 返された場合は PASS、404 の場合は FAIL |
name | F5XC_ORIGIN_POOL と一致 | PASS |
origin_ip | F5XC_ORIGIN_IP と一致 | PASS |
port | F5XC_ORIGIN_PORT と一致 | PASS |
healthcheck_count | 1(HC あり)または 0(なし) | いずれの場合も PASS |
ステップ 3: CSD 付き HTTP ロードバランサーの作成
Section titled “ステップ 3: CSD 付き HTTP ロードバランサーの作成”クライアントサイド防御を有効にした2 つのロードバランサーを作成します — HTTP LB(プライマリ、ポート 80)と HTTPS LB(セカンダリ、ポート 443 で自動証明書管理)。HTTP LB はすべてのデモトラフィックのデフォルトです。HTTPS LB は Let’s Encrypt 証明書のプロビジョニングに依存するオプション機能であり、デモ環境ではレート制限に達することがあります。
HTTP ロードバランサー(プライマリ)
Section titled “HTTP ロードバランサー(プライマリ)”これはデモのプライマリロードバランサーです。F5 XC 管理 DNS を使用して、ポート 80 の http リスナーを使用します。TLS 証明書のプロビジョニングに依存しないため、DNS が解決されるとすぐに準備完了になります。
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "metadata": { "name": "xF5XC_LB_NAMEx-http", "namespace": "xF5XC_NAMESPACEx", "labels": {}, "annotations": {}, "description": "HTTP LB with Client-Side Defense enabled (primary demo LB)", "disable": false }, "spec": { "domains": ["xF5XC_DOMAINNAMEx"], "http": { "dns_volterra_managed": true, "port": 80 }, "advertise_on_public_default_vip": {}, "default_route_pools": [{ "pool": { "namespace": "xF5XC_NAMESPACEx", "name": "xF5XC_ORIGIN_POOLx", "kind": "origin_pool" }, "weight": 1, "priority": 1 }], "client_side_defense": { "policy": { "js_insert_all_pages": {} } }, "disable_rate_limit": {}, "no_service_policies": {}, "round_robin": {}, "disable_waf": {}, "no_challenge": {}, "disable_bot_defense": {}, "disable_api_definition": {}, "disable_api_discovery": {}, "disable_ip_reputation": {}, "disable_malicious_user_detection": {}, "single_lb_app": { "disable_discovery": {}, "disable_ddos_detection": {}, "disable_malicious_user_detection": {} }, "disable_trust_client_ip_headers": {}, "user_id_client_ip": {}, "disable_threat_mesh": {}, "l7_ddos_action_default": {}, "system_default_timeouts": {}, "default_sensitive_data_policy": {}, "disable_malware_protection": {}, "disable_api_testing": {} } }' \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers" \ | jq .200 レスポンスで、CSD が有効な HTTP ロードバランサーが作成されたことを確認します。
HTTPS ロードバランサー(セカンダリ)
Section titled “HTTPS ロードバランサー(セカンダリ)”これはセカンダリロードバランサーです。自動 Let’s Encrypt 証明書プロビジョニングにより、ポート 443 で https_auto_cert を使用します。作成する前に、以前のティアダウンからスケルトン HTTPS LB が存在するかどうかを確認します — 存在する場合は、POST ではなく PUT を使用して復元し、既存の Let’s Encrypt 証明書を保持してレート制限(7 日間に正確な識別子セットごとに 5 つの重複証明書)を回避します。
HTTPS LB がすでに存在するか確認します:
HTTPS_CHECK=$(curl -s -o /dev/null -w '%\{http_code\}' \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")HTTPS_CHECK が 200 の場合、スケルトン HTTPS LB が存在します — パス A (PUT) を使用します。404 の場合は、パス B (POST) を使用します。
パス A: PUT によるスケルトンの復元(HTTPS LB が存在する場合)
Section titled “パス A: PUT によるスケルトンの復元(HTTPS LB が存在する場合)”以前のティアダウンからスケルトン HTTPS LB が存在する場合は、PUT を使用して完全な構成を復元します。これにより、オリジンプールを再アタッチし、CSD を再有効化しますが、新しい Let’s Encrypt 証明書リクエストはトリガーされません — 既存の証明書は有効なままです。
curl -s -X PUT \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "metadata": { "name": "xF5XC_LB_NAMEx-https", "namespace": "xF5XC_NAMESPACEx", "labels": {}, "annotations": {}, "description": "HTTPS LB with Client-Side Defense enabled (secondary, cert-dependent)", "disable": false }, "spec": { "domains": ["xF5XC_DOMAINNAMEx"], "https_auto_cert": { "http_redirect": false, "add_hsts": false, "port": 443, "default_header": {}, "enable_path_normalize": {}, "no_mtls": {}, "default_loadbalancer": {} }, "advertise_on_public_default_vip": {}, "default_route_pools": [{ "pool": { "namespace": "xF5XC_NAMESPACEx", "name": "xF5XC_ORIGIN_POOLx", "kind": "origin_pool" }, "weight": 1, "priority": 1 }], "client_side_defense": { "policy": { "js_insert_all_pages": {} } }, "disable_rate_limit": {}, "no_service_policies": {}, "round_robin": {}, "disable_waf": {}, "no_challenge": {}, "disable_bot_defense": {}, "disable_api_definition": {}, "disable_api_discovery": {}, "disable_ip_reputation": {}, "disable_malicious_user_detection": {}, "single_lb_app": { "disable_discovery": {}, "disable_ddos_detection": {}, "disable_malicious_user_detection": {} }, "disable_trust_client_ip_headers": {}, "user_id_client_ip": {}, "disable_threat_mesh": {}, "l7_ddos_action_default": {}, "system_default_timeouts": {}, "default_sensitive_data_policy": {}, "disable_malware_protection": {}, "disable_api_testing": {} } }' \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq .200 レスポンスで、スケルトンが完全な構成で復元されたことを確認します。証明書の状態は CertificateValid のままであるはずです — 新しい Let’s Encrypt プロビジョニングはトリガーされません。
パス B: POST による新規作成(HTTPS LB が存在しない場合)
Section titled “パス B: POST による新規作成(HTTPS LB が存在しない場合)”HTTPS LB が存在しない場合(初回実行または完全なティアダウン後)は、POST で作成します。これにより Let’s Encrypt 証明書のプロビジョニングがトリガーされ、5〜10 分かかる場合があります。
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "metadata": { "name": "xF5XC_LB_NAMEx-https", "namespace": "xF5XC_NAMESPACEx", "labels": {}, "annotations": {}, "description": "HTTPS LB with Client-Side Defense enabled (secondary, cert-dependent)", "disable": false }, "spec": { "domains": ["xF5XC_DOMAINNAMEx"], "https_auto_cert": { "http_redirect": false, "add_hsts": false, "port": 443, "default_header": {}, "enable_path_normalize": {}, "no_mtls": {}, "default_loadbalancer": {} }, "advertise_on_public_default_vip": {}, "default_route_pools": [{ "pool": { "namespace": "xF5XC_NAMESPACEx", "name": "xF5XC_ORIGIN_POOLx", "kind": "origin_pool" }, "weight": 1, "priority": 1 }], "client_side_defense": { "policy": { "js_insert_all_pages": {} } }, "disable_rate_limit": {}, "no_service_policies": {}, "round_robin": {}, "disable_waf": {}, "no_challenge": {}, "disable_bot_defense": {}, "disable_api_definition": {}, "disable_api_discovery": {}, "disable_ip_reputation": {}, "disable_malicious_user_detection": {}, "single_lb_app": { "disable_discovery": {}, "disable_ddos_detection": {}, "disable_malicious_user_detection": {} }, "disable_trust_client_ip_headers": {}, "user_id_client_ip": {}, "disable_threat_mesh": {}, "l7_ddos_action_default": {}, "system_default_timeouts": {}, "default_sensitive_data_policy": {}, "disable_malware_protection": {}, "disable_api_testing": {} } }' \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers" \ | jq .200 レスポンスで、HTTPS ロードバランサーが作成されたことを確認します。証明書のプロビジョニングが自動的に開始されます。
両方のロードバランサーが存在し、CSD が有効であることを確認します。エビデンスには常に GET を使用してください — POST レスポンスは、落ち着いた構成を反映しない可能性のある一時的な状態値を返します。
HTTP LB(プライマリ):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '{name: .metadata.name, domains: .spec.domains, csd_enabled: (.spec.client_side_defense != null), state: .spec.state}'| フィールド | 期待値 | ステータス |
|---|---|---|
| HTTP ステータス | 200 | 返された場合は PASS、404 の場合は FAIL |
name | ${F5XC_LB_NAME}-http | PASS |
domains | F5XC_DOMAINNAME を含む | PASS |
csd_enabled | true | PASS — この LB に CSD が構成されています |
state | VIRTUAL_HOST_READY または VIRTUAL_HOST_PENDING_A_RECORD | 期待値 — DNS が解決されると HTTP LB は READY に移行します。その他の状態(例: VIRTUAL_HOST_FAILED)は FAIL — オペレーターに報告し、進めないでください |
HTTPS LB(セカンダリ):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '{name: .metadata.name, domains: .spec.domains, csd_enabled: (.spec.client_side_defense != null), state: .spec.state, cert_state: .spec.cert_state}'| フィールド | 期待値 | ステータス |
|---|---|---|
| HTTP ステータス | 200 | 返された場合は PASS、404 の場合は FAIL |
name | ${F5XC_LB_NAME}-https | PASS |
domains | F5XC_DOMAINNAME を含む | PASS |
csd_enabled | true | PASS — この LB に CSD が構成されています |
creation_method | PUT(スケルトン復元)または POST(新規) | INFO — PUT は既存の証明書を保持します |
state | VIRTUAL_HOST_READY(PUT)または VIRTUAL_HOST_PENDING_A_RECORD(POST) | 期待値 — スケルトンから DNS が保持されているため、PUT パスではすでに READY になっている場合があります |
cert_state | CertificateValid(PUT)または PreDomainChallengePending(POST) | PUT は既存の証明書を保持します; POST は新しいプロビジョニングをトリガーします |
ステップ 4: DNS の設定
Section titled “ステップ 4: DNS の設定”ロードバランサーを作成した後、VIRTUAL_HOST_PENDING_A_RECORD 状態になり、自動証明書は PreDomainChallengePending のままになります。LB が完全に動作するようになる前に、2 つの DNS レコードが存在する必要があります:
- A レコード — VIP IP アドレス(LB レスポンスの
dns_infoから)を指すxF5XC_DOMAINNAMEx - ACME チャレンジレコード — TLS 証明書検証のための
_acme-challenge.xF5XC_DOMAINNAMEx(F5 XC DNS と管理レコードを使用する場合は自動管理; 外部 DNS の場合は手動 CNAME が必要)
アプローチは、F5 XC がドメインの権威 DNS プロバイダーであるかどうかによって異なります。
DNS 権限の検出
Section titled “DNS 権限の検出”ルートドメインのネームサーバーを確認します:
dig +short NS xF5XC_ROOT_DOMAINxレスポンスに ns1.f5clouddns.com と ns2.f5clouddns.com が含まれている場合、F5 XC が権威 DNS プロバイダーです — オプション A に従ってください。それ以外の場合は、外部 DNS のオプション B に従ってください。
オプション A: F5 XC 管理 DNS
Section titled “オプション A: F5 XC 管理 DNS”F5 XC が権威 DNS プロバイダーの場合、プラットフォームは A レコードと ACME チャレンジ CNAME の両方を自動的に作成できます — ただし、DNS ゾーンで allow_http_lb_managed_records が有効になっている場合に限ります。
1. 管理レコードが有効かどうかを確認します:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx" \ | jq '.spec.primary.allow_http_lb_managed_records'レスポンスが true の場合、プラットフォームはロードバランサーの DNS レコードを自動作成します — 3. DNS 解決の確認までスキップしてください。false または null の場合は、次のステップに進みます。
2. 管理レコードを有効にします:
現在のゾーン構成を取得し、管理レコードを有効にして更新します:
# 現在のゾーン設定を取得ZONE_CONFIG=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx")
# 管理レコードを有効にして更新echo "$ZONE_CONFIG" \ | jq '.spec.primary.allow_http_lb_managed_records = true' \ | curl -s -X PUT \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d @- \ "xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx" \ | jq .200 レスポンス(空の \{\})で、ゾーンが更新されたことを確認します。F5 XC は、ゾーンの自動管理レコードグループに A レコードと ACME チャレンジレコードを作成します。60 秒以内に管理レコードが表示されない場合は、ロードバランサーを再適用してレコード作成をトリガーします:
LB_CONFIG=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http")echo "$LB_CONFIG" | curl -s -X PUT \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d @- \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq .この GET+PUT 再適用は LB 構成を変更しません — プラットフォームに DNS ゾーンを再評価させて管理レコードを作成させるだけです。再適用後 60 秒以内に A レコードが解決しない場合は、停止してオペレーターに報告してください — 再適用を 2 回以上試みないでください。
3. DNS 解決を確認します:
dig +short xF5XC_DOMAINNAMEx Aレスポンスは VIP IP アドレスを返すはずです。DNS 伝播は F5 XC 管理ゾーンでは即時であることが多いですが、最大 60 秒かかる場合があります。
オプション B: 外部 DNS プロバイダー
Section titled “オプション B: 外部 DNS プロバイダー”ドメインが外部 DNS プロバイダーを使用している場合は、手動でレコードを作成する必要があります。ロードバランサーから必要な値を取得します:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '{ vip_ip: .spec.dns_info[0].ip_address, acme_target: .spec.auto_cert_info.dns_records }'DNS プロバイダーで次のレコードを作成します:
| タイプ | 名前 | 値 |
|---|---|---|
| A | xF5XC_DOMAINNAMEx | dns_info[0].ip_address の VIP IP |
| CNAME | _acme-challenge.xF5XC_DOMAINNAMEx | *.autocerts.ves.volterra.io |
レコードを作成したら、解決を確認します:
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME| テスト | コマンド | 期待値 | ステータス |
|---|---|---|---|
| DNS-1: A レコード | dig +short $F5XC_DOMAINNAME A | VIP IP アドレスが返される | IP が返された場合は PASS、空の場合は FAIL |
| DNS-2: ACME CNAME | dig +short _acme-challenge.$F5XC_DOMAINNAME CNAME | *.autocerts.ves.volterra.io | CNAME が返された場合は PASS |
| DNS 権限 | dig +short NS $F5XC_ROOT_DOMAIN | F5 XC または外部ネームサーバー | 情報提供 — オプション A と B を決定します |
60 秒後に DNS-1 が空を返す場合は、トラブルシューティング — VIRTUAL_HOST_PENDING_A_RECORD で LB が停止を参照してください。
ステップ 5: CSD が有効であることの確認
Section titled “ステップ 5: CSD が有効であることの確認”テナントに対してクライアントサイド防御が有効になっていることを確認します。CSD はテナントレベルで構成されます — まだ有効になっていない場合は、F5 XC 管理者に連絡してください。
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq ."isConfigured": true と "isEnabled": true を含むレスポンスで、CSD がアクティブであることを確認します。
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq '{configured: .isConfigured, enabled: .isEnabled}'| フィールド | 期待値 | ステータス |
|---|---|---|
configured | true | PASS |
enabled | true | PASS |
いずれかが false | — | FAIL — テナントレベルで CSD を有効にするために F5 XC 管理者に連絡してください |
ステップ 6: 保護対象ドメインの登録
Section titled “ステップ 6: 保護対象ドメインの登録”CSD が監視するルートドメインを登録します。protected_domain フィールドは、完全な FQDN ではなく、eTLD+1 のルートドメイン(例: f5demos.com)である必要があります。
既に登録されているかどうかを確認する
Section titled “既に登録されているかどうかを確認する”作成する前に、ドメインがテナントにすでに登録されているかどうかを確認してください。POST への 409 レスポンスは、ドメインがすでに存在することを意味します — これはエラーではなく成功条件です。
curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{ "metadata": { "name": "xF5XC_DOMAINNAMEx", "namespace": "xF5XC_NAMESPACEx" }, "spec": { "protected_domain": "xF5XC_ROOT_DOMAINx" } }' \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \ | jq .| レスポンス | 意味 | アクション |
|---|---|---|
200 | ドメインが正常に登録されました | ステップ 7 に進む |
409(ドメインがすでに存在する) | ドメインはこのテナントに以前登録されていました | 完了済み — ステップ 7 に進む |
"code": 8(上限超過) | 保護対象ドメインのクォータが満杯 | ブロッキング — 保護対象ドメインは CSD に必須です。未使用の保護対象ドメインを削除するか、管理者に連絡してください。 |
POST レスポンス自体が主なエビデンスです — spec.protected_domain がルートドメインと一致する登録済みドメインオブジェクトが返されます。または、すべての保護対象ドメインをリストして確認します:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \ | jq '.items | length'| フィールド | 期待値 | ステータス |
|---|---|---|
POST が protected_domain を返した | F5XC_ROOT_DOMAIN と一致 | PASS |
POST が 200 または 409 を返した | ドメインが登録済みまたは既存 | PASS |
| リストアイテム数 | > 0 | PASS |
ステップ 7: 確認
Section titled “ステップ 7: 確認”DNS 解決
Section titled “DNS 解決”A レコードが解決され、ACME チャレンジ CNAME が設定されていることを確認します:
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEA レコードは VIP IP アドレスを返すはずです。CNAME は *.autocerts.ves.volterra.io(または関連する autocerts ターゲット)を指すはずです。
ロードバランサーの状態
Section titled “ロードバランサーの状態”両方のロードバランサーが保留状態から移行したことを確認します。HTTP LB は主要なチェックです — DNS が解決されると VIRTUAL_HOST_READY に達するはずです(証明書の依存関係なし)。HTTPS LB の証明書状態は情報提供のみです。
HTTP LB(プライマリ — 進める前に READY である必要があります):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http" \ | jq '{state: .spec.state}'| フィールド | 期待値 | 中間状態 |
|---|---|---|
state | VIRTUAL_HOST_READY | VIRTUAL_HOST_PENDING_A_RECORD — DNS が構成されていません(ステップ 4 を参照) |
HTTPS LB(セカンダリ — 情報提供のみ、進行をブロックしません):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '{state: .spec.state, cert_state: .spec.cert_state}'| フィールド | 期待値 | 中間状態 |
|---|---|---|
state | VIRTUAL_HOST_READY | VIRTUAL_HOST_PENDING_A_RECORD — DNS が構成されていません; VIRTUAL_HOST_DNS_A_RECORD_ADDED — A レコードが見つかり、証明書を待機中 |
cert_state | CertificateValid | PreDomainChallengePending — ACME CNAME を待機中; DomainChallengeStarted — ACME チャレンジ進行中; AutoCertDomainRateLimited — Let’s Encrypt レート制限に達しました(デモ環境では想定内、HTTP LB には影響なし) |
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq .レスポンスには、ロードバランサーがページレスポンスに挿入する完全な HTML <script> タグを含む scriptTag フィールドが含まれています。
検出されたドメイン
Section titled “検出されたドメイン”curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \ | jq '{summary: .domain_summary, domains: .domains_list}'検出されたスクリプト
Section titled “検出されたスクリプト”スクリプトエンドポイントには、エポックタイムスタンプ(Unix エポックからの秒数)を使用した時間範囲が必要です。以下の例では過去 7 日間をクエリします。
NOW=$(date +%s)START=$(( NOW - 604800 ))curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d "{\"startTime\": \"$START\", \"endTime\": \"$NOW\"}" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts" \ | jq '[.scripts[]? | {script_name: .script_name, risk_level: .risk_level}]'フォームフィールド
Section titled “フォームフィールド”フォームフィールドエンドポイントには、クエリパラメーターとして渡されるエポックタイムスタンプを使用した時間範囲が必要です。
NOW=$(date +%s)START=$(( NOW - 604800 ))curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/formFields?startTime=$START&endTime=$NOW" \ | jq '.form_fields'フェーズ 1 エビデンスサマリー
Section titled “フェーズ 1 エビデンスサマリー”すべての確認チェックを完了した後、AI アシスタントは統合ステータステーブルを表示する必要があります:
| テスト ID | チェック | 期待値 | 必須 | ステータス |
|---|---|---|---|---|
| DNS-1 | A レコードが解決される | VIP IP が返される | はい | PASS / FAIL |
| DNS-2 | ACME CNAME が存在する | *.autocerts.ves.volterra.io | いいえ | PASS / PENDING |
| LB-1 | HTTP LB の状態 | VIRTUAL_HOST_READY | はい | PASS / PENDING |
| LB-2 | HTTPS LB の状態 | VIRTUAL_HOST_READY | いいえ | PASS / PENDING / INFO |
| TLS-1 | 証明書の状態 | CertificateValid | いいえ | PASS / PENDING / INFO |
| CSD-1 | JS 構成 | scriptTag が存在する | はい | PASS / FAIL |
| CSD-2 | CSD ステータス | isEnabled: true | はい | PASS / FAIL |
| CSD-3 | 保護対象ドメイン | ドメインが登録済み | はい | PASS / FAIL |
LB-1 が PENDING を示す場合は、30 秒ごとに最大 4 回(合計 2 分)ポーリングします。4 回のイテレーション後も LB-1 が VIRTUAL_HOST_READY でない場合は、dig で DNS 解決を確認してオペレーターに報告してください — LB-1 が READY に達するまで進めないでください。LB-2 と TLS-1 については、60 秒ごとに最大 10 回(10 分)ポーリングします。10 回のイテレーション後もまだ中間状態の場合は、現在の状態を INFO として記録して進めてください — これらは情報提供であり、デモの進行をブロックしません。
フェーズ 1 完了。 フェーズ 2 — 攻撃に進み、攻撃シミュレーションを実行してください。