- Accueil
- Défense côté client
- Demo
- Phase 1 — Construction
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é.
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"fiConfirmez que l’espace de noms existe et enregistrez s’il a été créé :
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"| Champ | Attendu | Statut |
|---|---|---|
| Statut HTTP | 200 | RÉUSSI si retourné, ÉCHEC si 404 ou autre |
NAMESPACE_CREATED | true (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.
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 :
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}'| Champ | Attendu | Statut |
|---|---|---|
| Statut HTTP | 200 avec objet | RÉUSSI si retourné, ÉCHEC si 404 |
name | Correspond à F5XC_HC_NAME | RÉ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) |
Étape 2 : Créer le pool d’origine
Section intitulée « Étape 2 : Créer le pool d’origine »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) :
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) :
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 :
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 :
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)}'| Champ | Attendu | Statut |
|---|---|---|
| Statut HTTP | 200 | RÉUSSI si retourné, ÉCHEC si 404 |
name | Correspond à F5XC_ORIGIN_POOL | RÉUSSI |
origin_ip | Correspond à F5XC_ORIGIN_IP | RÉUSSI |
port | Correspond à F5XC_ORIGIN_PORT | RÉUSSI |
healthcheck_count | 1 (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.
Équilibreur de charge HTTP (Principal)
Section intitulée « Équilibreur de charge HTTP (Principal) »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.
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é.
Équilibreur de charge HTTPS (Secondaire)
Section intitulée « Équilibreur de charge HTTPS (Secondaire) »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à :
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.
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.
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) :
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}'| Champ | Attendu | Statut |
|---|---|---|
| Statut HTTP | 200 | RÉUSSI si retourné, ÉCHEC si 404 |
name | ${F5XC_LB_NAME}-http | RÉUSSI |
domains | Contient F5XC_DOMAINNAME | RÉUSSI |
csd_enabled | true | RÉUSSI — CSD est configuré sur ce LB |
state | VIRTUAL_HOST_READY ou VIRTUAL_HOST_PENDING_A_RECORD | Attendu — 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) :
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}'| Champ | Attendu | Statut |
|---|---|---|
| Statut HTTP | 200 | RÉUSSI si retourné, ÉCHEC si 404 |
name | ${F5XC_LB_NAME}-https | RÉUSSI |
domains | Contient F5XC_DOMAINNAME | RÉUSSI |
csd_enabled | true | RÉUSSI — CSD est configuré sur ce LB |
creation_method | PUT (squelette restauré) ou POST (nouveau) | INFO — PUT conserve le certificat existant |
state | VIRTUAL_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_state | CertificateValid (PUT) ou PreDomainChallengePending (POST) | PUT conserve le certificat existant ; POST déclenche un nouveau provisionnement |
Étape 4 : Configurer le DNS
Section intitulée « Étape 4 : Configurer le DNS »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 :
- Enregistrement A —
xF5XC_DOMAINNAMExpointant vers l’adresse IP VIP (provenant dedns_infodans la réponse du LB) - Enregistrement de défi ACME —
_acme-challenge.xF5XC_DOMAINNAMExpour 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.
Détecter l’autorité DNS
Section intitulée « Détecter l’autorité DNS »Vérifiez les serveurs de noms pour votre domaine racine :
dig +short NS xF5XC_ROOT_DOMAINxSi 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.
Option A : DNS géré par F5 XC
Section intitulée « Option A : DNS géré par F5 XC »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 :
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 :
# Get current zone configZONE_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 enabledecho "$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 :
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 :
dig +short xF5XC_DOMAINNAMEx ALa 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.
Option B : Fournisseur DNS externe
Section intitulée « Option B : Fournisseur DNS externe »Lorsque votre domaine utilise un fournisseur DNS externe, vous devez créer les enregistrements manuellement. Extrayez les valeurs requises depuis l’équilibreur de charge :
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 :
| Type | Nom | Valeur |
|---|---|---|
| A | xF5XC_DOMAINNAMEx | IP 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 :
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME| Test | Commande | Attendu | Statut |
|---|---|---|---|
| DNS-1 : Enregistrement A | dig +short $F5XC_DOMAINNAME A | Adresse IP VIP retournée | RÉUSSI si IP retournée, ÉCHEC si vide |
| DNS-2 : CNAME ACME | dig +short _acme-challenge.$F5XC_DOMAINNAME CNAME | *.autocerts.ves.volterra.io | RÉUSSI si CNAME retourné |
| Autorité DNS | dig +short NS $F5XC_ROOT_DOMAIN | Serveurs de noms F5 XC ou externes | Informatif — 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.
Étape 5 : Vérifier que CSD est activé
Section intitulée « Étape 5 : Vérifier que CSD est activé »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.
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.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq '{configured: .isConfigured, enabled: .isEnabled}'| Champ | Attendu | Statut |
|---|---|---|
configured | true | RÉUSSI |
enabled | true | RÉUSSI |
L’un ou l’autre est false | — | ÉCHEC — contactez l’administrateur F5 XC pour activer CSD au niveau du tenant |
Étape 6 : Enregistrer le domaine protégé
Section intitulée « Étape 6 : Enregistrer le domaine protégé »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.
Vérifier s’il est déjà enregistré
Section intitulée « Vérifier s’il est déjà enregistré »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.
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éponse | Signification | Action |
|---|---|---|
200 | Domaine enregistré avec succès | Continuer à l’Étape 7 |
409 (domaine déjà existant) | Le domaine a été précédemment enregistré sur ce tenant | Déjà effectué — continuer à l’Étape 7 |
"code": 8 (limite épuisée) | Quota de domaines protégés atteint | Bloquant — 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 :
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \ | jq '.items | length'| Champ | Attendu | Statut |
|---|---|---|
POST a retourné protected_domain | Correspond à F5XC_ROOT_DOMAIN | RÉUSSI |
POST a retourné 200 ou 409 | Domaine enregistré ou déjà existant | RÉUSSI |
| Nombre d’éléments dans la liste | > 0 | RÉUSSI |
Étape 7 : Vérifier
Section intitulée « Étape 7 : Vérifier »Résolution DNS
Section intitulée « Résolution DNS »Confirmez que l’enregistrement A se résout et que le CNAME de défi ACME est en place :
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEL’enregistrement A devrait retourner l’adresse IP VIP. Le CNAME devrait pointer vers *.autocerts.ves.volterra.io (ou une cible autocerts associée).
État de l’équilibreur de charge
Section intitulée « État de l’équilibreur de charge »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) :
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}'| Champ | Attendu | États intermédiaires |
|---|---|---|
state | VIRTUAL_HOST_READY | VIRTUAL_HOST_PENDING_A_RECORD — DNS non configuré (voir Étape 4) |
LB HTTPS (secondaire — informatif, ne bloque pas la progression) :
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}'| Champ | Attendu | États intermédiaires |
|---|---|---|
state | VIRTUAL_HOST_READY | VIRTUAL_HOST_PENDING_A_RECORD — DNS non configuré ; VIRTUAL_HOST_DNS_A_RECORD_ADDED — Enregistrement A trouvé, en attente du certificat |
cert_state | CertificateValid | PreDomainChallengePending — 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) |
Configuration JS
Section intitulée « Configuration JS »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.
Domaines détectés
Section intitulée « Domaines détectés »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}'Scripts détectés
Section intitulée « Scripts détectés »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.
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}]'Champs de formulaire
Section intitulée « Champs de formulaire »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.
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'Récapitulatif des preuves de la Phase 1
Section intitulée « Récapitulatif des preuves de la Phase 1 »Après avoir effectué toutes les vérifications, l’assistant IA doit présenter un tableau de statut consolidé :
| ID du test | Vérification | Attendu | Requis | Statut |
|---|---|---|---|---|
| DNS-1 | Résolution de l’enregistrement A | Adresse IP VIP retournée | Oui | RÉUSSI / ÉCHEC |
| DNS-2 | CNAME ACME existant | *.autocerts.ves.volterra.io | Non | RÉUSSI / EN ATTENTE |
| LB-1 | État du LB HTTP | VIRTUAL_HOST_READY | Oui | RÉUSSI / EN ATTENTE |
| LB-2 | État du LB HTTPS | VIRTUAL_HOST_READY | Non | RÉUSSI / EN ATTENTE / INFO |
| TLS-1 | État du certificat | CertificateValid | Non | RÉUSSI / EN ATTENTE / INFO |
| CSD-1 | Configuration JS | scriptTag présent | Oui | RÉUSSI / ÉCHEC |
| CSD-2 | Statut CSD | isEnabled: true | Oui | RÉUSSI / ÉCHEC |
| CSD-3 | Domaine protégé | Domaine enregistré | Oui | RÉ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.