Aller au contenu

Phase 1 — Construction

La Phase 1 déploie et valide l’infrastructure CSD complète. Effectuez toutes les étapes dans l’ordre — chaque étape doit être RÉUSSIE avant de poursuivre. Retournez à l’index pour effectuer la configuration de l’environnement et la résolution des variables avant d’exécuter ces commandes.

Étape 0 : Vérifier et créer l’espace de noms (Conditionnel)

Section intitulée « Étape 0 : Vérifier et créer l’espace de noms (Conditionnel) »

Vérifiez si l’espace de noms cible existe déjà sur le tenant. S’il n’existe pas, créez-le. Enregistrez le résultat dans la variable shell NAMESPACE_CREATED — la phase 4 de démontage l’utilise pour décider si l’espace de noms doit être supprimé.

Fenêtre de terminal
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

Confirmez que l’espace de noms existe et enregistrez s’il a été créé :

Fenêtre de terminal
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"
ChampAttenduStatut
Statut HTTP200RÉUSSI si retourné, ÉCHEC si 404 ou autre
NAMESPACE_CREATEDtrue (créé) ou false (préexistant)Informatif — utilisé par le démontage de la Phase 4

Étape 1 : Créer la vérification de santé (Optionnel)

Section intitulée « Étape 1 : Créer la vérification de santé (Optionnel) »

Créez une vérification de santé HTTP que le pool d’origine peut utiliser pour surveiller la santé du backend.

Fenêtre de terminal
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 .

Une réponse 200 avec l’objet créé confirme que la vérification de santé a été créée. Si la réponse contient "code": 8 avec un message tel que "Object kind healthcheck has exhausted limits(150)", le tenant a atteint sa limite de vérifications de santé — passez à l’Étape 2 et omettez la référence à la vérification de santé. CSD ne dépend pas de la surveillance de la santé.

Confirmez que la vérification de santé existe :

Fenêtre de terminal
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}'
ChampAttenduStatut
Statut HTTP200 avec objetRÉUSSI si retourné, ÉCHEC si 404
nameCorrespond à F5XC_HC_NAMERÉUSSI
path/RÉUSSI
Étape 1 ignorée (code d’erreur 8, limite épuisée)RÉUSSI (la vérification de santé est optionnelle pour CSD)

Créez un pool d’origine pointant vers votre serveur backend. Si vous avez créé une vérification de santé à l’Étape 1, incluez la référence healthcheck. Si l’Étape 1 a été ignorée, utilisez un tableau vide.

Avec vérification de santé (Étape 1 réussie) :

Fenêtre de terminal
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 .

Sans vérification de santé (Étape 1 ignorée) :

Fenêtre de terminal
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 .

Une réponse 200 confirme que le pool d’origine a été créé.

Vérifier que la vérification de santé est liée

Section intitulée « Vérifier que la vérification de santé est liée »

Si vous avez inclus une référence à une vérification de santé, confirmez qu’elle est correctement liée :

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx" \
| jq '.spec.healthcheck'

Un tableau renseigné confirme le lien. Un tableau vide [] est attendu si l’Étape 1 a été ignorée, ou signifie que la vérification de santé n’a pas été trouvée si vous aviez l’intention d’en lier une.

Confirmez que le pool d’origine existe et possède la configuration correcte :

Fenêtre de terminal
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)}'
ChampAttenduStatut
Statut HTTP200RÉUSSI si retourné, ÉCHEC si 404
nameCorrespond à F5XC_ORIGIN_POOLRÉUSSI
origin_ipCorrespond à F5XC_ORIGIN_IPRÉUSSI
portCorrespond à F5XC_ORIGIN_PORTRÉUSSI
healthcheck_count1 (avec vérification de santé) ou 0 (sans)RÉUSSI dans les deux cas

Étape 3 : Créer des équilibreurs de charge HTTP avec CSD

Section intitulée « Étape 3 : Créer des équilibreurs de charge HTTP avec CSD »

Créez deux équilibreurs de charge avec la Défense côté client activée — un LB HTTP (principal, port 80) et un LB HTTPS (secondaire, port 443 avec gestion automatique des certificats). Le LB HTTP est le choix par défaut pour tout le trafic de démonstration. Le LB HTTPS est un plus qui dépend du provisionnement des certificats Let’s Encrypt, lequel peut atteindre des limites de débit dans les environnements de démonstration.

Il s’agit de l’équilibreur de charge principal pour les démonstrations. Il utilise un listener http sur le port 80 avec le DNS géré par F5 XC. Il ne dépend pas du provisionnement des certificats TLS, il devient donc prêt immédiatement après la résolution DNS.

Fenêtre de terminal
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 .

Une réponse 200 confirme que l’équilibreur de charge HTTP a été créé avec CSD activé.

Il s’agit de l’équilibreur de charge secondaire. Il utilise https_auto_cert sur le port 443 avec le provisionnement automatique des certificats Let’s Encrypt. Avant de le créer, vérifiez si un LB HTTPS squelette existe d’un démontage précédent — si c’est le cas, restaurez-le via PUT plutôt que POST pour conserver le certificat Let’s Encrypt existant et éviter les limites de débit (5 certificats en double par ensemble d’identifiants exact par 7 jours).

Vérifiez si le LB HTTPS existe déjà :

Fenêtre de terminal
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")

Si HTTPS_CHECK est 200, un LB HTTPS squelette existe — utilisez le Chemin A (PUT). Si 404, utilisez le Chemin B (POST).

Chemin A : Restaurer le squelette via PUT (le LB HTTPS existe)

Section intitulée « Chemin A : Restaurer le squelette via PUT (le LB HTTPS existe) »

Lorsqu’un LB HTTPS squelette existe d’un démontage précédent, restaurez la configuration complète via PUT. Cela rattache le pool d’origine et réactive CSD sans déclencher une nouvelle demande de certificat Let’s Encrypt — le certificat existant reste valide.

Fenêtre de terminal
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 .

Une réponse 200 confirme que le squelette a été restauré avec la configuration complète. L’état du certificat devrait rester CertificateValid — aucun nouveau provisionnement Let’s Encrypt n’est déclenché.

Chemin B : Créer via POST (le LB HTTPS n’existe pas)

Section intitulée « Chemin B : Créer via POST (le LB HTTPS n’existe pas) »

Lorsqu’aucun LB HTTPS n’existe (première exécution ou après un démontage complet), créez-le via POST. Cela déclenche le provisionnement du certificat Let’s Encrypt, qui peut prendre 5 à 10 minutes.

Fenêtre de terminal
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 .

Une réponse 200 confirme que l’équilibreur de charge HTTPS a été créé. Le provisionnement du certificat commence automatiquement.

Confirmez que les deux équilibreurs de charge existent avec CSD activé. Utilisez toujours un GET pour les preuves — la réponse POST renvoie des valeurs d’état transitoires qui peuvent ne pas refléter la configuration stabilisée.

LB HTTP (principal) :

Fenêtre de terminal
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}'
ChampAttenduStatut
Statut HTTP200RÉUSSI si retourné, ÉCHEC si 404
name${F5XC_LB_NAME}-httpRÉUSSI
domainsContient F5XC_DOMAINNAMERÉUSSI
csd_enabledtrueRÉUSSI — CSD est configuré sur ce LB
stateVIRTUAL_HOST_READY ou VIRTUAL_HOST_PENDING_A_RECORDAttendu — le LB HTTP passe à READY une fois que le DNS est résolu. Tout autre état (par ex. VIRTUAL_HOST_FAILED) est un ÉCHEC — signalez-le à l’opérateur et ne procédez pas

LB HTTPS (secondaire) :

Fenêtre de terminal
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}'
ChampAttenduStatut
Statut HTTP200RÉUSSI si retourné, ÉCHEC si 404
name${F5XC_LB_NAME}-httpsRÉUSSI
domainsContient F5XC_DOMAINNAMERÉUSSI
csd_enabledtrueRÉUSSI — CSD est configuré sur ce LB
creation_methodPUT (squelette restauré) ou POST (nouveau)INFO — PUT conserve le certificat existant
stateVIRTUAL_HOST_READY (PUT) ou VIRTUAL_HOST_PENDING_A_RECORD (POST)Attendu — le chemin PUT peut déjà être READY car le DNS persiste depuis le squelette
cert_stateCertificateValid (PUT) ou PreDomainChallengePending (POST)PUT conserve le certificat existant ; POST déclenche un nouveau provisionnement

Après la création de l’équilibreur de charge, celui-ci entre dans l’état VIRTUAL_HOST_PENDING_A_RECORD et le certificat automatique reste en PreDomainChallengePending. Deux enregistrements DNS doivent exister avant que le LB devienne pleinement opérationnel :

  1. Enregistrement AxF5XC_DOMAINNAMEx pointant vers l’adresse IP VIP (provenant de dns_info dans la réponse du LB)
  2. Enregistrement de défi ACME_acme-challenge.xF5XC_DOMAINNAMEx pour la validation du certificat TLS (géré automatiquement lors de l’utilisation du DNS F5 XC avec des enregistrements gérés ; CNAME manuel requis pour le DNS externe)

L’approche dépend du fait que F5 XC est le fournisseur DNS faisant autorité pour votre domaine.

Vérifiez les serveurs de noms pour votre domaine racine :

Fenêtre de terminal
dig +short NS xF5XC_ROOT_DOMAINx

Si la réponse inclut ns1.f5clouddns.com et ns2.f5clouddns.com, F5 XC est le fournisseur DNS faisant autorité — suivez l’Option A. Sinon, suivez l’Option B pour le DNS externe.

Lorsque F5 XC est le fournisseur DNS faisant autorité, la plateforme peut automatiquement créer à la fois l’enregistrement A et le CNAME de défi ACME — mais uniquement lorsque la zone DNS a allow_http_lb_managed_records activé.

1. Vérifiez si les enregistrements gérés sont activés :

Fenêtre de terminal
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'

Si la réponse est true, la plateforme créera automatiquement des enregistrements DNS pour les équilibreurs de charge — passez à 3. Vérifier la résolution DNS. Si false ou null, passez à l’étape suivante.

2. Activer les enregistrements gérés :

Récupérez la configuration actuelle de la zone, activez les enregistrements gérés et mettez à jour :

Fenêtre de terminal
# Get current zone config
ZONE_CONFIG=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/dns/namespaces/system/dns_zones/xF5XC_ROOT_DOMAINx")
# Update with managed records enabled
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 .

Une réponse 200 (vide \{\}) confirme que la zone a été mise à jour. F5 XC créera l’enregistrement A et l’enregistrement CNAME de défi ACME dans le groupe d’enregistrements auto-gérés de la zone. Si les enregistrements gérés n’apparaissent pas dans les 60 secondes, réappliquez l’équilibreur de charge pour déclencher la création des enregistrements :

Fenêtre de terminal
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 .

Cette réapplication GET+PUT ne modifie pas la configuration du LB — elle demande simplement à la plateforme de réévaluer la zone DNS et de créer les enregistrements gérés. Si l’enregistrement A ne se résout toujours pas dans les 60 secondes suivant la réapplication, arrêtez et signalez-le à l’opérateur — ne réessayez pas la réapplication plus d’une fois.

3. Vérifier la résolution DNS :

Fenêtre de terminal
dig +short xF5XC_DOMAINNAMEx A

La réponse devrait retourner l’adresse IP VIP. La propagation DNS est généralement immédiate pour les zones gérées par F5 XC, mais accordez jusqu’à 60 secondes.

Lorsque votre domaine utilise un fournisseur DNS externe, vous devez créer les enregistrements manuellement. Extrayez les valeurs requises depuis l’équilibreur de charge :

Fenêtre de terminal
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
}'

Créez ces enregistrements chez votre fournisseur DNS :

TypeNomValeur
AxF5XC_DOMAINNAMExIP VIP provenant de dns_info[0].ip_address
CNAME_acme-challenge.xF5XC_DOMAINNAMEx*.autocerts.ves.volterra.io

Après avoir créé les enregistrements, vérifiez la résolution :

Fenêtre de terminal
dig +short xF5XC_DOMAINNAMEx A
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
TestCommandeAttenduStatut
DNS-1 : Enregistrement Adig +short $F5XC_DOMAINNAME AAdresse IP VIP retournéeRÉUSSI si IP retournée, ÉCHEC si vide
DNS-2 : CNAME ACMEdig +short _acme-challenge.$F5XC_DOMAINNAME CNAME*.autocerts.ves.volterra.ioRÉUSSI si CNAME retourné
Autorité DNSdig +short NS $F5XC_ROOT_DOMAINServeurs de noms F5 XC ou externesInformatif — détermine l’Option A vs B

Si DNS-1 retourne vide après 60 secondes, voir Dépannage — LB bloqué dans VIRTUAL_HOST_PENDING_A_RECORD.

Vérifiez que la Défense côté client est activée pour le tenant. CSD est configuré au niveau du tenant — s’il n’a pas encore été activé, contactez votre administrateur F5 XC.

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq .

Une réponse contenant "isConfigured": true et "isEnabled": true confirme que CSD est actif.

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq '{configured: .isConfigured, enabled: .isEnabled}'
ChampAttenduStatut
configuredtrueRÉUSSI
enabledtrueRÉUSSI
L’un ou l’autre est falseÉCHEC — contactez l’administrateur F5 XC pour activer CSD au niveau du tenant

Enregistrez le domaine racine que CSD surveillera. Le champ protected_domain doit être le domaine racine eTLD+1 (par ex., f5demos.com), et non le FQDN complet.

Avant de créer, vérifiez si le domaine est déjà enregistré sur le tenant. Une réponse 409 au POST signifie que le domaine existe déjà — c’est une condition de succès, pas une erreur.

Fenêtre de terminal
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 .
RéponseSignificationAction
200Domaine enregistré avec succèsContinuer à l’Étape 7
409 (domaine déjà existant)Le domaine a été précédemment enregistré sur ce tenantDéjà effectué — continuer à l’Étape 7
"code": 8 (limite épuisée)Quota de domaines protégés atteintBloquant — les domaines protégés sont requis pour CSD. Supprimez les domaines protégés inutilisés ou contactez votre administrateur.

La réponse POST elle-même constitue la preuve principale — elle retourne l’objet de domaine enregistré avec spec.protected_domain correspondant à votre domaine racine. Vous pouvez également lister tous les domaines protégés pour confirmer :

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \
| jq '.items | length'
ChampAttenduStatut
POST a retourné protected_domainCorrespond à F5XC_ROOT_DOMAINRÉUSSI
POST a retourné 200 ou 409Domaine enregistré ou déjà existantRÉUSSI
Nombre d’éléments dans la liste> 0RÉUSSI

Confirmez que l’enregistrement A se résout et que le CNAME de défi ACME est en place :

Fenêtre de terminal
dig +short xF5XC_DOMAINNAMEx A
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME

L’enregistrement A devrait retourner l’adresse IP VIP. Le CNAME devrait pointer vers *.autocerts.ves.volterra.io (ou une cible autocerts associée).

Vérifiez que les deux équilibreurs de charge ont quitté leurs états en attente. Le LB HTTP est la vérification principale — il devrait atteindre VIRTUAL_HOST_READY une fois que le DNS est résolu, sans dépendance aux certificats. L’état du certificat du LB HTTPS est uniquement informatif.

LB HTTP (principal — doit être READY pour continuer) :

Fenêtre de terminal
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}'
ChampAttenduÉtats intermédiaires
stateVIRTUAL_HOST_READYVIRTUAL_HOST_PENDING_A_RECORD — DNS non configuré (voir Étape 4)

LB HTTPS (secondaire — informatif, ne bloque pas la progression) :

Fenêtre de terminal
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}'
ChampAttenduÉtats intermédiaires
stateVIRTUAL_HOST_READYVIRTUAL_HOST_PENDING_A_RECORD — DNS non configuré ; VIRTUAL_HOST_DNS_A_RECORD_ADDED — Enregistrement A trouvé, en attente du certificat
cert_stateCertificateValidPreDomainChallengePending — en attente du CNAME ACME ; DomainChallengeStarted — défi ACME en cours ; AutoCertDomainRateLimited — limite de débit Let’s Encrypt atteinte (attendu dans les environnements de démonstration, n’affecte pas le LB HTTP)
Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq .

La réponse contient un champ scriptTag avec la balise HTML <script> complète que l’équilibreur de charge injecte dans les réponses de page.

Fenêtre de terminal
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}'

Le point de terminaison des scripts nécessite une plage de temps utilisant des horodatages epoch (secondes depuis l’epoch Unix). L’exemple ci-dessous interroge les 7 derniers jours.

Fenêtre de terminal
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}]'

Le point de terminaison des champs de formulaire nécessite une plage de temps utilisant des horodatages epoch, passés comme paramètres de requête.

Fenêtre de terminal
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'

Après avoir effectué toutes les vérifications, l’assistant IA doit présenter un tableau de statut consolidé :

ID du testVérificationAttenduRequisStatut
DNS-1Résolution de l’enregistrement AAdresse IP VIP retournéeOuiRÉUSSI / ÉCHEC
DNS-2CNAME ACME existant*.autocerts.ves.volterra.ioNonRÉUSSI / EN ATTENTE
LB-1État du LB HTTPVIRTUAL_HOST_READYOuiRÉUSSI / EN ATTENTE
LB-2État du LB HTTPSVIRTUAL_HOST_READYNonRÉUSSI / EN ATTENTE / INFO
TLS-1État du certificatCertificateValidNonRÉUSSI / EN ATTENTE / INFO
CSD-1Configuration JSscriptTag présentOuiRÉUSSI / ÉCHEC
CSD-2Statut CSDisEnabled: trueOuiRÉUSSI / ÉCHEC
CSD-3Domaine protégéDomaine enregistréOuiRÉUSSI / ÉCHEC

Si LB-1 affiche EN ATTENTE, interrogez toutes les 30 secondes pour un maximum de 4 itérations (2 minutes au total). Si LB-1 n’est toujours pas VIRTUAL_HOST_READY après 4 itérations, vérifiez la résolution DNS avec dig et signalez-le à l’opérateur — ne procédez pas jusqu’à ce que LB-1 atteigne READY. Pour LB-2 et TLS-1, interrogez toutes les 60 secondes pour un maximum de 10 itérations (10 minutes). Si toujours dans un état intermédiaire après 10 itérations, enregistrez l’état actuel en tant qu’INFO et continuez — ces éléments sont informatifs et ne bloquent pas la progression de la démonstration.


Phase 1 terminée. Passez à la Phase 2 — Attaque pour exécuter la simulation d’attaque.