コンテンツにスキップ

フェーズ 1 — 構築

フェーズ 1 では、CSD インフラ全体を展開し検証します。すべてのステップを順番に完了してください — 各ステップは次に進む前に PASS である必要があります。これらのコマンドを実行する前に、インデックスに戻って環境セットアップと変数解決を完了してください。

ステップ 0: 名前空間の確認と作成 (条件付き)

Section titled “ステップ 0: 名前空間の確認と作成 (条件付き)”

テナントにターゲットの名前空間がすでに存在するか確認します。存在しない場合は作成します。結果を NAMESPACE_CREATED シェル変数に記録します — フェーズ 4 のティアダウンでは、この変数を使用して名前空間を削除するかどうかを判断します。

Terminal window
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

名前空間が存在することを確認し、作成されたかどうかを記録します。

Terminal window
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_CREATEDtrue(作成済み)または false(既存)情報提供 — フェーズ 4 のティアダウンで使用

ステップ 1: ヘルスチェックの作成 (オプション)

Section titled “ステップ 1: ヘルスチェックの作成 (オプション)”

オリジンプールがバックエンドの健全性を監視するために使用できる HTTP ヘルスチェックを作成します。

Terminal window
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 は健全性監視に依存しません。

ヘルスチェックが存在することを確認します。

Terminal window
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
nameF5XC_HC_NAME と一致PASS
path/PASS
ステップ 1 をスキップ(エラーコード 8、上限超過)PASS(ヘルスチェックは CSD においてオプション)

ステップ 2: オリジンプールの作成

Section titled “ステップ 2: オリジンプールの作成”

バックエンドサーバーを指すオリジンプールを作成します。ステップ 1 でヘルスチェックを作成した場合は、healthcheck 参照を含めてください。ステップ 1 をスキップした場合は、空の配列を使用してください。

ヘルスチェックあり(ステップ 1 が成功した場合):

Terminal window
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 をスキップした場合):

Terminal window
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 “ヘルスチェックがリンクされていることの確認”

ヘルスチェック参照を含めた場合は、正しくリンクされていることを確認します。

Terminal window
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 をスキップした場合に期待される結果です。リンクするつもりだった場合は、ヘルスチェックが見つからなかったことを意味します。

オリジンプールが存在し、正しい構成であることを確認します。

Terminal window
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
nameF5XC_ORIGIN_POOL と一致PASS
origin_ipF5XC_ORIGIN_IP と一致PASS
portF5XC_ORIGIN_PORT と一致PASS
healthcheck_count1(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 が解決されるとすぐに準備完了になります。

Terminal window
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 がすでに存在するか確認します:

Terminal window
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_CHECK200 の場合、スケルトン HTTPS LB が存在します — パス A (PUT) を使用します。404 の場合は、パス B (POST) を使用します。

パス A: PUT によるスケルトンの復元(HTTPS LB が存在する場合)

Section titled “パス A: PUT によるスケルトンの復元(HTTPS LB が存在する場合)”

以前のティアダウンからスケルトン HTTPS LB が存在する場合は、PUT を使用して完全な構成を復元します。これにより、オリジンプールを再アタッチし、CSD を再有効化しますが、新しい Let’s Encrypt 証明書リクエストはトリガーされません — 既存の証明書は有効なままです。

Terminal window
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 分かかる場合があります。

Terminal window
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(プライマリ):

Terminal window
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}-httpPASS
domainsF5XC_DOMAINNAME を含むPASS
csd_enabledtruePASS — この LB に CSD が構成されています
stateVIRTUAL_HOST_READY または VIRTUAL_HOST_PENDING_A_RECORD期待値 — DNS が解決されると HTTP LB は READY に移行します。その他の状態(例: VIRTUAL_HOST_FAILED)は FAIL — オペレーターに報告し、進めないでください

HTTPS LB(セカンダリ):

Terminal window
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}-httpsPASS
domainsF5XC_DOMAINNAME を含むPASS
csd_enabledtruePASS — この LB に CSD が構成されています
creation_methodPUT(スケルトン復元)または POST(新規)INFO — PUT は既存の証明書を保持します
stateVIRTUAL_HOST_READY(PUT)または VIRTUAL_HOST_PENDING_A_RECORD(POST)期待値 — スケルトンから DNS が保持されているため、PUT パスではすでに READY になっている場合があります
cert_stateCertificateValid(PUT)または PreDomainChallengePending(POST)PUT は既存の証明書を保持します; POST は新しいプロビジョニングをトリガーします

ロードバランサーを作成した後、VIRTUAL_HOST_PENDING_A_RECORD 状態になり、自動証明書は PreDomainChallengePending のままになります。LB が完全に動作するようになる前に、2 つの DNS レコードが存在する必要があります:

  1. A レコード — VIP IP アドレス(LB レスポンスの dns_info から)を指す xF5XC_DOMAINNAMEx
  2. ACME チャレンジレコード — TLS 証明書検証のための _acme-challenge.xF5XC_DOMAINNAMEx(F5 XC DNS と管理レコードを使用する場合は自動管理; 外部 DNS の場合は手動 CNAME が必要)

アプローチは、F5 XC がドメインの権威 DNS プロバイダーであるかどうかによって異なります。

ルートドメインのネームサーバーを確認します:

Terminal window
dig +short NS xF5XC_ROOT_DOMAINx

レスポンスに ns1.f5clouddns.comns2.f5clouddns.com が含まれている場合、F5 XC が権威 DNS プロバイダーです — オプション A に従ってください。それ以外の場合は、外部 DNS のオプション B に従ってください。

F5 XC が権威 DNS プロバイダーの場合、プラットフォームは A レコードと ACME チャレンジ CNAME の両方を自動的に作成できます — ただし、DNS ゾーンで allow_http_lb_managed_records が有効になっている場合に限ります。

1. 管理レコードが有効かどうかを確認します:

Terminal window
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. 管理レコードを有効にします:

現在のゾーン構成を取得し、管理レコードを有効にして更新します:

Terminal window
# 現在のゾーン設定を取得
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 秒以内に管理レコードが表示されない場合は、ロードバランサーを再適用してレコード作成をトリガーします:

Terminal window
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 解決を確認します:

Terminal window
dig +short xF5XC_DOMAINNAMEx A

レスポンスは VIP IP アドレスを返すはずです。DNS 伝播は F5 XC 管理ゾーンでは即時であることが多いですが、最大 60 秒かかる場合があります。

オプション B: 外部 DNS プロバイダー

Section titled “オプション B: 外部 DNS プロバイダー”

ドメインが外部 DNS プロバイダーを使用している場合は、手動でレコードを作成する必要があります。ロードバランサーから必要な値を取得します:

Terminal window
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 プロバイダーで次のレコードを作成します:

タイプ名前
AxF5XC_DOMAINNAMExdns_info[0].ip_address の VIP IP
CNAME_acme-challenge.xF5XC_DOMAINNAMEx*.autocerts.ves.volterra.io

レコードを作成したら、解決を確認します:

Terminal window
dig +short xF5XC_DOMAINNAMEx A
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
テストコマンド期待値ステータス
DNS-1: A レコードdig +short $F5XC_DOMAINNAME AVIP IP アドレスが返されるIP が返された場合は PASS、空の場合は FAIL
DNS-2: ACME CNAMEdig +short _acme-challenge.$F5XC_DOMAINNAME CNAME*.autocerts.ves.volterra.ioCNAME が返された場合は PASS
DNS 権限dig +short NS $F5XC_ROOT_DOMAINF5 XC または外部ネームサーバー情報提供 — オプション A と B を決定します

60 秒後に DNS-1 が空を返す場合は、トラブルシューティング — VIRTUAL_HOST_PENDING_A_RECORD で LB が停止を参照してください。

ステップ 5: CSD が有効であることの確認

Section titled “ステップ 5: CSD が有効であることの確認”

テナントに対してクライアントサイド防御が有効になっていることを確認します。CSD はテナントレベルで構成されます — まだ有効になっていない場合は、F5 XC 管理者に連絡してください。

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq .

"isConfigured": true"isEnabled": true を含むレスポンスで、CSD がアクティブであることを確認します。

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq '{configured: .isConfigured, enabled: .isEnabled}'
フィールド期待値ステータス
configuredtruePASS
enabledtruePASS
いずれかが falseFAIL — テナントレベルで CSD を有効にするために F5 XC 管理者に連絡してください

ステップ 6: 保護対象ドメインの登録

Section titled “ステップ 6: 保護対象ドメインの登録”

CSD が監視するルートドメインを登録します。protected_domain フィールドは、完全な FQDN ではなく、eTLD+1 のルートドメイン(例: f5demos.com)である必要があります。

既に登録されているかどうかを確認する

Section titled “既に登録されているかどうかを確認する”

作成する前に、ドメインがテナントにすでに登録されているかどうかを確認してください。POST への 409 レスポンスは、ドメインがすでに存在することを意味します — これはエラーではなく成功条件です。

Terminal window
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 がルートドメインと一致する登録済みドメインオブジェクトが返されます。または、すべての保護対象ドメインをリストして確認します:

Terminal window
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
リストアイテム数> 0PASS

A レコードが解決され、ACME チャレンジ CNAME が設定されていることを確認します:

Terminal window
dig +short xF5XC_DOMAINNAMEx A
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME

A レコードは VIP IP アドレスを返すはずです。CNAME は *.autocerts.ves.volterra.io(または関連する autocerts ターゲット)を指すはずです。

両方のロードバランサーが保留状態から移行したことを確認します。HTTP LB は主要なチェックです — DNS が解決されると VIRTUAL_HOST_READY に達するはずです(証明書の依存関係なし)。HTTPS LB の証明書状態は情報提供のみです。

HTTP LB(プライマリ — 進める前に READY である必要があります):

Terminal window
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}'
フィールド期待値中間状態
stateVIRTUAL_HOST_READYVIRTUAL_HOST_PENDING_A_RECORD — DNS が構成されていません(ステップ 4 を参照)

HTTPS LB(セカンダリ — 情報提供のみ、進行をブロックしません):

Terminal window
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}'
フィールド期待値中間状態
stateVIRTUAL_HOST_READYVIRTUAL_HOST_PENDING_A_RECORD — DNS が構成されていません; VIRTUAL_HOST_DNS_A_RECORD_ADDED — A レコードが見つかり、証明書を待機中
cert_stateCertificateValidPreDomainChallengePending — ACME CNAME を待機中; DomainChallengeStarted — ACME チャレンジ進行中; AutoCertDomainRateLimited — Let’s Encrypt レート制限に達しました(デモ環境では想定内、HTTP LB には影響なし)
Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq .

レスポンスには、ロードバランサーがページレスポンスに挿入する完全な HTML <script> タグを含む scriptTag フィールドが含まれています。

Terminal window
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}'

スクリプトエンドポイントには、エポックタイムスタンプ(Unix エポックからの秒数)を使用した時間範囲が必要です。以下の例では過去 7 日間をクエリします。

Terminal window
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}]'

フォームフィールドエンドポイントには、クエリパラメーターとして渡されるエポックタイムスタンプを使用した時間範囲が必要です。

Terminal window
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-1A レコードが解決されるVIP IP が返されるはいPASS / FAIL
DNS-2ACME CNAME が存在する*.autocerts.ves.volterra.ioいいえPASS / PENDING
LB-1HTTP LB の状態VIRTUAL_HOST_READYはいPASS / PENDING
LB-2HTTPS LB の状態VIRTUAL_HOST_READYいいえPASS / PENDING / INFO
TLS-1証明書の状態CertificateValidいいえPASS / PENDING / INFO
CSD-1JS 構成scriptTag が存在するはいPASS / FAIL
CSD-2CSD ステータス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 — 攻撃に進み、攻撃シミュレーションを実行してください。