Aller au contenu

Diagnostics & Vérification

Cette page fournit une matrice de vérification UAT en couches pour valider votre déploiement de Défense côté client de bout en bout. Chaque cas de test suit la chaîne de dépendances de l’infrastructure — de la résolution DNS à la télémétrie CSD — afin que vous puissiez prouver systématiquement que chaque composant fonctionne correctement.

Ces commandes sont l’équivalent API du Guide de la console CSD — utilisez-les lorsque vous avez besoin d’effectuer des vérifications depuis le terminal, d’automatiser la surveillance ou de démontrer les capacités CSD sans l’interface utilisateur.

Configurez vos variables d’environnement comme décrit dans Automatisation API — Configuration de l’environnement :

Fenêtre de terminal
set -a && source .env && set +a

Toutes les commandes ci-dessous utilisent le format de substitution xTOKENx. Remplacez par vos variables d’environnement ($F5XC_API_TOKEN, $F5XC_NAMESPACE, etc.) ou utilisez le formulaire interactif en haut de la page.

De nombreux points de terminaison CSD nécessitent des horodatages epoch (secondes depuis l’epoch Unix). Ces commandes d’une ligne calculent les heures de début/fin pour les plages courantes.

Multiplateforme (macOS + Linux) :

Fenêtre de terminal
# Heure actuelle en secondes epoch
NOW=$(date +%s)
# Il y a 1 heure
START_1H=$(( NOW - 3600 ))
# Il y a 24 heures
START_24H=$(( NOW - 86400 ))
# Il y a 7 jours
START_7D=$(( NOW - 604800 ))
# Il y a 30 jours
START_30D=$(( NOW - 2592000 ))
PréréglageSecondesExpression shell
1 heure3 600$(( $(date +%s) - 3600 ))
24 heures86 400$(( $(date +%s) - 86400 ))
7 jours604 800$(( $(date +%s) - 604800 ))
30 jours2 592 000$(( $(date +%s) - 2592000 ))

Chaque test ci-dessous suit cette structure :

ChampDescription
ID du testNuméro de couche + ID séquentiel (ex. DNS-1, TLS-2)
Ce qu’il prouveLe fait d’infrastructure spécifique vérifié
CommandeCommande curl ou dig prête à l’emploi
RÉUSSITE / ÉCHECSortie attendue pour un état sain ou non
CorrectionLien vers la section de configuration ou de dépannage concernée

Le DNS est la fondation — si le domaine ne résout pas vers l’IP VIP de l’équilibreur de charge, rien d’autre ne fonctionne.

Ce qu’il prouve : Le domaine résout vers l’adresse IP VIP de l’équilibreur de charge.

Fenêtre de terminal
dig +short xF5XC_DOMAINNAMEx A
RésultatSignification
RÉUSSITE — IP VIP retournée (ex. 72.19.3.185)Le domaine résout vers l’IP virtuelle du LB
ÉCHEC — réponse videEnregistrement A DNS non configuré

Correction : Automatisation API — Étape 4 : Configurer le DNS

Ce qu’il prouve : L’enregistrement de défi ACME existe pour le provisionnement automatique des certificats TLS.

Fenêtre de terminal
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
dig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT
RésultatSignification
RÉUSSITE — CNAME vers *.autocerts.ves.volterra.io. (DNS externe)Le CNAME de défi ACME est en place
RÉUSSITE — enregistrement TXT avec la valeur du domaine (DNS géré par F5 Distributed Cloud (F5 XC))Défi ACME géré par la Plateforme via enregistrement TXT
ÉCHEC — les deux videsEnregistrement ACME non configuré ; le certificat restera en PreDomainChallengePending

Correction : Pour le DNS externe, créez le CNAME : _acme-challenge.xF5XC_DOMAINNAMEx*.autocerts.ves.volterra.io. Pour le DNS géré par F5 XC, activez allow_http_lb_managed_records sur la zone DNS — voir DNS-4. Voir Automatisation API — Étape 4.

Ce qu’il prouve : Si F5 XC est le fournisseur DNS faisant autorité pour le domaine racine.

Fenêtre de terminal
dig +short NS xF5XC_ROOT_DOMAINx
RésultatSignification
Inclut ns1.f5clouddns.com et ns2.f5clouddns.comDNS géré par F5 XC — les enregistrements peuvent être créés automatiquement
Autres serveurs de nomsDNS externe — les enregistrements doivent être créés manuellement

Correction : Automatisation API — Détecter l’autorité DNS

DNS-4 : Enregistrements gérés par F5 XC activés

Section intitulée « DNS-4 : Enregistrements gérés par F5 XC activés »

Ce qu’il prouve : La zone DNS F5 XC permet la création automatique d’enregistrements pour les équilibreurs de charge (DNS géré par F5 XC uniquement).

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'
RésultatSignification
RÉUSSITEtrueLa Plateforme créera automatiquement les enregistrements A et ACME pour les LBs
ÉCHECfalse ou nullLes enregistrements gérés sont désactivés ; activez-les via la mise à jour de la zone

Correction : Automatisation API — Option A : DNS géré par F5 XC


Après la résolution DNS, l’équilibreur de charge doit avoir un certificat TLS valide.

Ce qu’il prouve : Le certificat TLS automatique a été émis sur le LB HTTPS.

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 '.spec.cert_state'
RésultatSignification
RÉUSSITE"CertificateValid" ou "AutoCertRenewing"Le certificat est valide et actif
AVERTISSEMENT"DomainChallengePending" ou "DomainChallengeStarted"Défi ACME en cours — attendez 5–10 minutes
INFO"AutoCertDomainRateLimited"Limite de débit Let’s Encrypt atteinte — attendu dans les environnements de démonstration, n’affecte pas le LB HTTP
ÉCHEC"PreDomainChallengePending"Enregistrement de défi ACME manquant — voir DNS-2

Correction : Assurez-vous que l’enregistrement de défi ACME est en place (CNAME pour le DNS externe, ou activez les enregistrements gérés pour le DNS F5 XC). Le provisionnement du certificat prend 5–10 minutes après la configuration de l’enregistrement. Si bloqué au-delà de 15 minutes, voir Certificat bloqué — Recréation propre. En cas de limite de débit, le LB HTTP n’est pas affecté.

Ce qu’il prouve : Le certificat couvre le domaine attendu et affiche les informations d’expiration. Applicable uniquement au LB HTTPS.

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 '{
cert_state: .spec.cert_state,
auto_cert_info: .spec.auto_cert_info
}'
RésultatSignification
RÉUSSITEauto_cert_info contient dns_records et les métadonnées du certificatLes détails du provisionnement du certificat sont disponibles
ÉCHECauto_cert_info est null ou videCertificat pas encore provisionné

Ce qu’il prouve : Le certificat TLS est valide et l’établissement de connexion s’effectue du côté client. Applicable uniquement lorsque le LB HTTPS a un certificat valide.

Fenêtre de terminal
curl -sv "https://xF5XC_DOMAINNAMEx/" 2>&1 \
| grep -E 'SSL connection|subject:|expire date:|issuer:'
RésultatSignification
RÉUSSITE — affiche SSL connection using TLSv1.3, sujet et expiration validesTLS de bout en bout fonctionne
ÉCHEC — connexion refusée ou erreur de certificatVérifiez la résolution DNS et l’état du certificat ; si limite de débit atteinte, utilisez HTTP

TLS-4 : Cible de l’enregistrement ACME depuis le LB

Section intitulée « TLS-4 : Cible de l’enregistrement ACME depuis le LB »

Ce qu’il prouve : L’équilibreur de charge HTTPS rapporte la cible ACME correcte pour la validation du certificat.

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 '{
vip_ip: .spec.dns_info[0].ip_address,
acme_target: .spec.auto_cert_info.dns_records
}'
RésultatSignification
RÉUSSITEvip_ip et acme_target renseignésLes enregistrements DNS peuvent être vérifiés par rapport à ces valeurs
ÉCHEC — valeurs nullLe LB peut ne pas avoir https_auto_cert configuré

L’équilibreur de charge doit être dans un état prêt et correctement configuré.

Ce qu’il prouve : L’équilibreur de charge HTTP (principal) est entièrement opérationnel et accepte le trafic.

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 '.spec.state'
RésultatSignification
RÉUSSITE"VIRTUAL_HOST_READY"Le LB est opérationnel
ÉCHEC"VIRTUAL_HOST_PENDING_A_RECORD"Enregistrement A DNS non configuré — voir DNS-1

Correction : LB bloqué dans VIRTUAL_HOST_PENDING_A_RECORD

Ce qu’il prouve : L’équilibreur de charge HTTP est configuré pour le(s) domaine(s) correct(s).

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 '.spec.domains'
RésultatSignification
RÉUSSITE — le tableau contient votre FQDN (ex. ["app.example.com"])Le LB est configuré pour le domaine attendu
ÉCHEC — domaine manquant ou incorrectMettez à jour la spécification du LB avec le bon domaine

Ce qu’il prouve : La Défense côté client est activée sur l’équilibreur de charge avec la politique d’injection JS correcte.

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 '{
csd_enabled: (if .spec.client_side_defense then true else false end),
js_policy: .spec.client_side_defense.policy
}'
RésultatSignification
RÉUSSITEcsd_enabled: true avec js_insert_all_pages dans la politiqueCSD actif avec injection JS sur toutes les pages
ÉCHECcsd_enabled: falseCSD non configuré sur le LB

Correction : Référence API — Activer CSD sur un équilibreur de charge

Ce qu’il prouve : L’équilibreur de charge référence le pool d’origine correct avec le poids et la priorité attendus.

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 '.spec.default_route_pools[] | {
pool: .pool.name,
namespace: .pool.namespace,
weight: .weight,
priority: .priority
}'
RésultatSignification
RÉUSSITE — affiche le nom de votre pool d’origine avec poids/prioritéLe LB route vers le backend correct
ÉCHEC — pool vide ou incorrectMettez à jour la configuration default_route_pools du LB

LB-5 : Statut de déploiement (conditions par site)

Section intitulée « LB-5 : Statut de déploiement (conditions par site) »

Ce qu’il prouve : L’équilibreur de charge est déployé et rapporte des conditions saines sur tous les sites.

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,
dns_info: .spec.dns_info,
host_name: .spec.host_name
}'
RésultatSignification
RÉUSSITEstate est VIRTUAL_HOST_READY, dns_info renseignéLB entièrement déployé avec VIP assigné
ÉCHEC — état en attente ou dns_info videProblème DNS ou de certificat bloquant le déploiement

Ce qu’il prouve : Instantané complet des deux configurations LB pour le débogage.

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,
state: .spec.state,
domains: .spec.domains,
csd_enabled: (if .spec.client_side_defense then true else false end),
route_pools: [.spec.default_route_pools[] | .pool.name],
advertise: (if .spec.advertise_on_public_default_vip then "public_default_vip" else "custom" end)
}'

LB HTTPS (secondaire — inclut l’état du certificat) :

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,
state: .spec.state,
cert_state: .spec.cert_state,
domains: .spec.domains,
csd_enabled: (if .spec.client_side_defense then true else false end),
route_pools: [.spec.default_route_pools[] | .pool.name]
}'

Le pool d’origine définit les serveurs backend vers lesquels l’équilibreur de charge achemine le trafic.

Ce qu’il prouve : Le pool d’origine existe avec le serveur backend, le port et l’algorithme LB corrects.

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_servers: [.spec.origin_servers[] | {
ip: .public_ip.ip,
labels: .labels
}],
port: .spec.port,
lb_algorithm: .spec.loadbalancer_algorithm,
endpoint_selection: .spec.endpoint_selection
}'
RésultatSignification
RÉUSSITE — affiche l’IP, le port et l’algorithme correctsPool d’origine configuré correctement
ÉCHEC404 ou valeurs incorrectesPool d’origine manquant ou mal configuré

Correction : Automatisation API — Étape 2 : Créer le pool d’origine

Ce qu’il prouve : Si TLS est configuré pour la connexion entre le LB et le serveur d’origine.

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 '{
tls_config: (if .spec.no_tls then "no_tls (plaintext)" elif .spec.use_tls then "use_tls (encrypted)" else "unknown" end)
}'
RésultatSignification
no_tls (plaintext)Le LB se connecte à l’origine via HTTP (attendu pour la démo Juice Shop)
use_tls (encrypted)Le LB se connecte à l’origine via HTTPS

Ce qu’il prouve : Le pool d’origine a le bilan de santé correct lié (le cas échéant).

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'
RésultatSignification
RÉUSSITE — tableau avec référence au bilan de santé (nom, namespace, type)Le bilan de santé est lié
OK — tableau vide []Pas de bilan de santé (acceptable — CSD n’en requiert pas)
ÉCHEC — un bilan de santé était attendu mais le tableau est videLe bilan de santé n’a pas été trouvé lors de la création — voir Bilan de santé non lié

Ce qu’il prouve : Le serveur d’origine est accessible depuis le client (ne teste pas le chemin LB-vers-origine).

Fenêtre de terminal
curl -s -o /dev/null -w '%{http_code}' \
"http://xF5XC_ORIGIN_IPx:xF5XC_ORIGIN_PORTx/"
RésultatSignification
RÉUSSITE200 (ou autre code HTTP valide)Le serveur d’origine répond
ÉCHEC000 ou connexion refuséeServeur d’origine inaccessible depuis ce réseau

Les bilans de santé surveillent la disponibilité du backend. Ils sont optionnels pour CSD mais utiles pour les déploiements en production.

Ce qu’il prouve : Le bilan de santé existe avec le type, le chemin, les délais et les seuils corrects.

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,
type: (if .spec.http_health_check then "HTTP" elif .spec.tcp_health_check then "TCP" else "unknown" end),
path: .spec.http_health_check.path,
expected_status: .spec.http_health_check.expected_status_codes,
timeout: .spec.timeout,
interval: .spec.interval,
unhealthy_threshold: .spec.unhealthy_threshold,
healthy_threshold: .spec.healthy_threshold
}'
RésultatSignification
RÉUSSITE — affiche le type HTTP avec le chemin / et le statut attendu 200Bilan de santé configuré correctement
ÉCHEC — réponse 404Le bilan de santé n’existe pas (peut avoir été ignoré — voir Phase 1 Étape 1)

Ce qu’il prouve : Énumère tous les bilans de santé dans le namespace pour vérifier les noms et le nombre.

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks" \
| jq -r '
["NAME", "NAMESPACE", "DESCRIPTION"],
(.items[] | [
.name,
.namespace,
(.description | if length == 0 then "—" else . end)
])
| @tsv' | column -t

CSD doit être activé au niveau du tenant et avoir la balise d’injection JavaScript configurée.

Ce qu’il prouve : CSD est configuré et activé pour le tenant.

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq '{isConfigured, isEnabled}'
RésultatSignification
RÉUSSITE — les deux à trueCSD est actif pour ce tenant
ÉCHECisConfigured: falseCSD non activé au niveau du tenant — contactez l’administrateur F5 XC
ÉCHECisEnabled: falseCSD configuré mais non actif

Ce qu’il prouve : La balise d’injection JavaScript CSD est générée et prête pour l’injection.

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq '{has_script_tag: (.scriptTag | length > 0)}'
RésultatSignification
RÉUSSITEhas_script_tag: trueLa balise d’injection JS est configurée
ÉCHEChas_script_tag: falsePas de balise de script — vérifiez que CSD est activé et qu’un domaine protégé est enregistré

Ce qu’il prouve : Affiche la balise de script complète pour vérification ou injection manuelle.

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

Ce qu’il prouve : Le domaine racine est enregistré comme domaine protégé CSD sur le tenant.

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[] | {name, namespace, description}'
RésultatSignification
RÉUSSITE — affiche un élément avec un name non videLe domaine est protégé
ÉCHEC — les éléments ont des champs name et namespace videsAucun domaine protégé enregistré — voir Phase 1 Étape 6

CSD-5 : Vérification de l’injection JS en direct

Section intitulée « CSD-5 : Vérification de l’injection JS en direct »

Ce qu’il prouve : Le JavaScript CSD est effectivement injecté dans les réponses de pages servies par l’équilibreur de charge.

Fenêtre de terminal
curl -s "http://xF5XC_DOMAINNAMEx/" \
| grep -oE '(zeronaught|shape)\.com[^"]*' | head -1
RésultatSignification
RÉUSSITE — retourne un fragment d’URL zeronaught.com ou shape.com (ex. zeronaught.com/__imp_apg__/js/...)Le JavaScript CSD est injecté dans les pages
ÉCHEC — sortie videJS non injecté — vérifiez LB-3 et CSD-1

Vérifiez que le trafic en direct atteint l’équilibreur de charge et est traité correctement.

Ce qu’il prouve : Le trafic atteint l’équilibreur de charge. Un résultat à zéro signifie qu’aucun trafic n’arrive.

Fenêtre de terminal
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'"
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \
| jq '{total_requests: .total_hits}'
RésultatSignification
RÉUSSITEtotal_requests est une chaîne non nulle (ex. "380")Le trafic circule à travers le LB
ÉCHEC"0" ou pas de donnéesAucun trafic n’atteint le LB — vérifiez DNS-1 et LB-1

Ce qu’il prouve : La répartition des codes de statut de réponse révèle des modèles d’erreur.

Fenêtre de terminal
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
"sort": "DESCENDING",
"limit": 100
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \
| jq -r '
[.logs[] | fromjson | .rsp_code_class]
| group_by(.) | map({class: .[0], count: length})
| sort_by(-.count)
| ["STATUS_CLASS", "COUNT"], (.[] | [.class, .count])
| @tsv' | column -t

Sortie attendue pour un site sain :

STATUS_CLASS COUNT
2xx 82
downstream_remote_disconnect 18
RésultatSignification
RÉUSSITE — majorité 2xxLe site sert des réponses réussies
AVERTISSEMENT — nombre 4xx élevéErreurs client (mauvaises URL, ressources manquantes)
ÉCHEC — nombre 5xx élevéErreurs serveur — vérifiez la santé du serveur d’origine

La classe downstream_remote_disconnect indique que le client a fermé la connexion avant que la réponse ne soit complète (courant pour les requêtes de long-polling ou de mise à niveau WebSocket).

Ce qu’il prouve : Les requêtes individuelles sont journalisées avec les champs corrects.

Fenêtre de terminal
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
"sort": "DESCENDING",
"limit": 10
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \
| jq -r '
["TIMESTAMP", "METHOD", "PATH", "STATUS", "SRC_IP"],
(.logs[] | fromjson | [.["@timestamp"], .method, .req_path, .rsp_code, .src_ip])
| @tsv' | column -t

TV-4 : Injection JS CSD dans les journaux d’accès

Section intitulée « TV-4 : Injection JS CSD dans les journaux d’accès »

Ce qu’il prouve : Les journaux d’accès confirment que le JavaScript CSD est injecté dans les réponses.

Fenêtre de terminal
curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d '{
"start_time": "'"$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-1H +%Y-%m-%dT%H:%M:%SZ)"'",
"end_time": "'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'",
"sort": "DESCENDING",
"limit": 20
}' \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs" \
| jq '[.logs[] | fromjson | select(.csd_js_injection == "true")] | length as $injected |
{injected_count: $injected, total_sampled: 20}'
RésultatSignification
RÉUSSITEinjected_count > 0Le JS CSD est injecté dans les réponses de pages
ÉCHECinjected_count: 0JS non injecté — vérifiez CSD-1 et LB-3

Ce qu’il prouve : Une requête complète passe du client via DNS, LB et origine et retourne une réponse valide.

Fenêtre de terminal
curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 \
| grep -E 'Connected to|< HTTP|< content-type'
RésultatSignification
RÉUSSITE — affiche la connexion, HTTP 200 et content-typeLa pile complète est opérationnelle
ÉCHEC — connexion refusée ou erreur DNSCommencez le débogage à Couche 1 : DNS

Couche 8 : Télémétrie CSD & Politique de domaine

Section intitulée « Couche 8 : Télémétrie CSD & Politique de domaine »

Ces commandes interrogent les mêmes données affichées dans le tableau de bord de la Console CSD, la liste des scripts, les champs de formulaire et les vues réseau.

Ce qu’il prouve : CSD détecte et catalogue les scripts s’exécutant sur le domaine protégé.

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 -r '
["SCRIPT", "RISK", "STATUS", "FIELDS", "USERS"],
(.scripts[] | [
(.script_name | if length > 50 then .[:47] + "..." else . end),
.risk_level,
.status,
(.form_fields_read // 0),
(.affected_users_count // 0)
])
| @tsv' | column -t
RésultatSignification
RÉUSSITE — scripts listés avec niveaux de risqueCSD surveille activement les scripts
ÉCHEC — tableau videVoir Dépannage : Tableau de scripts vide

Ce qu’il prouve : CSD a détecté les domaines sources des scripts et les a classifiés par statut.

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: {
action_needed: .domain_summary.actionNeededCount.count,
mitigated: .domain_summary.mitigatedDomains.count,
allowed: .domain_summary.allowedDomains.count,
total: .domain_summary.totalDomains.count
},
domains: [.domains_list[] | {
domain: .domain,
category: .category,
status: .status,
first_seen: (.firstSeenDate | tonumber | todate),
latest_seen: (.latestSeenDate | tonumber | todate)
}]
}'
RésultatSignification
RÉUSSITEtotal > 0 avec des domaines listésCSD suit les domaines des scripts
AVERTISSEMENTaction_needed > 0Certains domaines nécessitent une révision
ÉCHEC — réponse videPas de données de télémétrie — vérifiez CSD-5

Ce qu’il prouve : Affiche la distribution des domaines autorisés vs. atténués et si la politique est cohérente.

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{
action_needed: .domain_summary.actionNeededCount.count,
mitigated: .domain_summary.mitigatedDomains.count,
allowed: .domain_summary.allowedDomains.count,
total: .domain_summary.totalDomains.count,
domains_needing_action: [.domains_list[] | select(.status == "AN") | .domain]
}'
RésultatSignification
RÉUSSITEaction_needed: 0Tous les domaines ont été examinés et classifiés
AVERTISSEMENTaction_needed > 0Les domaines listés dans domains_needing_action nécessitent une révision

Ce qu’il prouve : CSD a détecté les champs de formulaire que les scripts lisent, avec une classification de sensibilité.

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 -r '
["FIELD", "SENSITIVITY", "SCRIPTS"],
(.form_fields[] | [
.name,
.analysis,
(.scripts_count // 0)
])
| @tsv' | column -t
RésultatSignification
RÉUSSITE — champs de formulaire listés avec sensibilitéCSD suit l’accès aux champs de formulaire
INFO — tableau videAucun champ de formulaire détecté (attendu si le site n’a pas de formulaires)

Ce qu’il prouve : Informations détaillées sur un script spécifique, y compris le risque, les comportements et les interactions réseau.

Obtenez d’abord un ID de script depuis TEL-1, puis interrogez ses détails :

Fenêtre de terminal
SCRIPT_ID="your-script-id"
# Vue d'ensemble (niveau de risque, type, domaine source)
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/dashboard" \
| jq '{script_name, risk_level, type, source_domain, status}'
# Comportements dans le temps
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/behaviors" \
| jq '.behaviors'
# Interactions réseau (domaines avec lesquels le script communique)
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/networkInteractions" \
| jq '.network_interactions'

Ce qu’il prouve : Liste les utilisateurs impactés par un script spécifique, montrant l’étendue de l’exposition.

Fenêtre de terminal
SCRIPT_ID="your-script-id"
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/${SCRIPT_ID}/affectedUsers" \
| jq -r '
["IP_ADDRESS", "DEVICE_ID", "GEO", "CHANNEL", "USER_AGENT"],
(.affected_users[] | [
.ip_address,
(.device_id | if length > 12 then .[:12] + "..." else . end),
.geolocation,
.channel,
(.user_agent | if length > 30 then .[:27] + "..." else . end)
])
| @tsv' | column -t

Ce qu’il prouve : Distribution agrégée des risques sur tous les scripts détectés.

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[] | .risk_level] | group_by(.) | map({risk_level: .[0], count: length}) | sort_by(-.count)'
RésultatSignification
RÉUSSITE — tout No RiskAucun script risqué détecté
AVERTISSEMENTLow Risk ou High Risk présentExaminez les scripts signalés dans TEL-5

Ce qu’il prouve : Les données de télémétrie CSD sont récentes, confirmant une surveillance active.

Fenêtre de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/detected_domains" \
| jq '{
total_domains: .domain_summary.totalDomains.count,
latest_update: (.domain_summary.totalDomains.lastUpdated // "unknown"),
most_recent_domain: (.domains_list | sort_by(.latestSeenDate) | last | {
domain: .domain,
latest_seen: (.latestSeenDate | tonumber | todate)
})
}'
RésultatSignification
RÉUSSITElatest_seen est dans les dernières 24 heuresLa télémétrie collecte activement des données
AVERTISSEMENTlatest_seen est antérieur à 24 heuresLe trafic peut avoir cessé ou le traitement CSD est retardé

Exécutez une seule commande qui vérifie tous les indicateurs de santé critiques sur chaque couche et produit un tableau récapitulatif :

Fenêtre de terminal
echo "=== Tableau de bord de vérification CSD ==="
echo ""
# Couche 1 : DNS
DNS_A=$(dig +short xF5XC_DOMAINNAMEx A | head -1)
DNS_ACME=$(dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME | head -1)
# Couches 2-3 : LB + TLS
LB=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http")
LB_HTTPS=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")
LB_STATE=$(echo "$LB" | jq -r '.spec.state // "UNKNOWN"')
CERT_STATE=$(echo "$LB_HTTPS" | jq -r '.spec.cert_state // "UNKNOWN"')
CSD_ON_LB=$(echo "$LB" | jq -r 'if .spec.client_side_defense then "ENABLED" else "DISABLED" end')
DOMAINS=$(echo "$LB" | jq -r '.spec.domains | join(", ")')
ROUTE_POOL=$(echo "$LB" | jq -r '[.spec.default_route_pools[] | .pool.name] | join(", ")')
# Couche 6 : Statut CSD
CSD=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status")
CSD_CONFIGURED=$(echo "$CSD" | jq -r '.isConfigured // false')
CSD_ENABLED=$(echo "$CSD" | jq -r '.isEnabled // false')
# Couche 6 : Configuration JS
JS_TAG=$(curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \
| jq -r 'if (.scriptTag | length) > 0 then "PRESENT" else "MISSING" end')
# Couche 7 : Trafic (dernières 24h)
TRAFFIC=$(curl -s -X POST \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
-H "Content-Type: application/json" \
-d "{
\"start_time\": \"$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-24H +%Y-%m-%dT%H:%M:%SZ)\",
\"end_time\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"
}" \
"xF5XC_API_URLx/api/data/namespaces/xF5XC_NAMESPACEx/access_logs/aggregation" \
| jq -r '.total_hits // "0"')
printf "%-28s %s\n" "VÉRIFICATION" "STATUT"
printf "%-28s %s\n" "----------------------------" "----------------------------"
printf "%-28s %s\n" "[DNS] Enregistrement A" "${DNS_A:-NOT_FOUND}"
printf "%-28s %s\n" "[DNS] CNAME ACME" "${DNS_ACME:-NOT_FOUND}"
printf "%-28s %s\n" "[TLS] Certificat" "$CERT_STATE"
printf "%-28s %s\n" "[LB] État" "$LB_STATE"
printf "%-28s %s\n" "[LB] Domaines" "$DOMAINS"
printf "%-28s %s\n" "[LB] Pool de routes" "$ROUTE_POOL"
printf "%-28s %s\n" "[LB] CSD sur LB" "$CSD_ON_LB"
printf "%-28s %s\n" "[CSD] Configuré (tenant)" "$CSD_CONFIGURED"
printf "%-28s %s\n" "[CSD] Activé" "$CSD_ENABLED"
printf "%-28s %s\n" "[CSD] Balise de script JS" "$JS_TAG"
printf "%-28s %s\n" "[Trafic] Requêtes (24h)" "$TRAFFIC"

ChampTypeDescription
@timestampchaîneHorodatage de la requête (ISO 8601). Notez le préfixe @ — accédez-y avec .["@timestamp"] dans jq
methodchaîneMéthode HTTP (GET, POST, etc.)
req_pathchaîneChemin de l’URI de la requête
rsp_codechaîneCode de statut HTTP de la réponse sous forme de chaîne (ex. "200", "404")
rsp_code_classchaîneClasse du code de statut (2xx, 3xx, 4xx, 5xx, ou downstream_remote_disconnect)
src_ipchaîneAdresse IP source du client
dst_ipchaîneAdresse IP de destination (VIP)
domainchaîneValeur de l’en-tête Host de la requête
user_agentchaîneChaîne User-Agent du client
rsp_sizechaîneTaille du corps de la réponse en octets (retournée sous forme de chaîne)
req_sizechaîneTaille du corps de la requête en octets (retournée sous forme de chaîne)
duration_with_data_tx_delaychaîneDurée totale de la requête en secondes (retournée sous forme de chaîne, ex. "0.024219")
csd_js_injectionchaîne"true" lorsque le JavaScript CSD a été injecté (uniquement présent lorsqu’actif)
ChampPoint de terminaisonDescription
isConfiguredstatusCSD activé au niveau du tenant
isEnabledstatusCSD actif pour ce namespace
scripts[]scriptsTableau des objets de scripts détectés
.script_namescriptsURL complète du fichier JavaScript
.risk_levelscriptsNiveau de risque (No Risk, Low Risk, High Risk)
.statusscriptsAN (Action Needed) ou NA (No Action Needed)
.form_fields_readscriptsNombre de champs de formulaire que le script lit
.affected_users_countscriptsNombre d’utilisateurs/sessions uniques affectés
domain_summarydetected_domainsComptages par statut : .actionNeededCount.count, .mitigatedDomains.count, .allowedDomains.count, .totalDomains.count (chacun a .count et .lastUpdated)
domains_list[]detected_domainsTableau d’objets de domaines détectés avec .domain, .status, .category, .firstSeenDate, .latestSeenDate (secondes epoch sous forme de chaînes)
form_fields[]formFieldsTableau d’objets de champs de formulaire détectés
.analysisformFieldsClassification de sensibilité (Sensitive, Not Sensitive)

Si TV-1 retourne 0 :

  1. Vérifiez la résolution DNS — vérifiez que le domaine résout vers le VIP du LB :

    Fenêtre de terminal
    dig +short xF5XC_DOMAINNAMEx A

    Si vide, le DNS n’est pas configuré. Voir Automatisation API — Étape 4.

  2. Vérifiez l’état du LB — l’équilibreur de charge doit être en état VIRTUAL_HOST_READY :

    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 '.spec.state'
  3. Envoyez une requête de test — générez du trafic pour confirmer la connectivité de bout en bout :

    Fenêtre de terminal
    curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 | head -20

    Recherchez une réponse HTTP réussie. Utilisez https:// uniquement si le certificat du LB HTTPS est valide.

Enregistrements gérés désactivés sur la zone DNS

Section intitulée « Enregistrements gérés désactivés sur la zone DNS »

Si DNS-4 retourne false, la création automatique d’enregistrements est désactivée même si F5 XC est le fournisseur DNS faisant autorité. Il s’agit d’une mauvaise configuration courante qui entraîne l’absence de l’enregistrement A et du CNAME ACME, ce qui empêche l’équilibreur de charge d’atteindre l’état VIRTUAL_HOST_READY et le certificat d’être émis.

Pour activer les enregistrements gérés, mettez à jour la configuration de la zone DNS pour définir allow_http_lb_managed_records: true. Voir Automatisation API — Option A : DNS géré par F5 XC pour l’appel API.

L’équilibreur de charge attend un enregistrement DNS A pointant vers son VIP. Voir LB bloqué dans VIRTUAL_HOST_PENDING_A_RECORD pour les étapes de résolution détaillées.

Le certificat TLS automatique nécessite un enregistrement de défi ACME. La méthode dépend de votre fournisseur DNS :

DNS géré par F5 XC : Activez allow_http_lb_managed_records sur la zone DNS (DNS-4). La Plateforme crée automatiquement un enregistrement de défi ACME basé sur TXT dans le groupe d’enregistrements RR x-ves-io-managed. Si le certificat reste bloqué après l’activation des enregistrements gérés, supprimez et recréez l’équilibreur de charge pour déclencher une nouvelle demande de certificat.

DNS externe : Créez un enregistrement CNAME chez votre fournisseur DNS :

_acme-challenge.xF5XC_DOMAINNAMEx CNAME *.autocerts.ves.volterra.io

Vérifiez que l’enregistrement existe :

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

Si les deux sont vides, l’enregistrement ACME n’est pas configuré. Le provisionnement du certificat prend 5–10 minutes après la mise en place de l’enregistrement. Vérifiez le statut d’erreur du LB pour les erreurs de validation ACME spécifiques :

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 '[.status[]? | select(.virtual_host_status != null) | .virtual_host_status.error_description]'

CSD doit être activé au niveau du tenant par un administrateur F5 XC. Il s’agit d’un paramètre à l’échelle du tenant qui ne peut pas être configuré via l’API du namespace. Contactez votre administrateur pour activer la Défense côté client.

Si TEL-1 retourne un tableau vide :

  1. Vérifiez le domaine protégé — CSD surveille les scripts uniquement sur les domaines enregistrés :

    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[] | {name, namespace}'
  2. Vérifiez l’injection JS — confirmez que la balise de script CSD est injectée dans les pages :

    Fenêtre de terminal
    curl -s "http://xF5XC_DOMAINNAMEx/" | grep -oE '(zeronaught|shape)\.com[^"]*' | head -1

    Si aucune correspondance, le JavaScript CSD n’est pas injecté. Vérifiez que le LB a client_side_defense activé.

  3. Accordez du temps de traitement — après avoir activé CSD ou enregistré un nouveau domaine protégé, la détection des scripts peut prendre 5–15 minutes. Générez du trafic vers le site et attendez avant de vérifier à nouveau.

PériodeDécalage epochISO 8601 (Linux)ISO 8601 (macOS)
1 heure$(( $(date +%s) - 3600 ))date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-1H +%Y-%m-%dT%H:%M:%SZ
24 heures$(( $(date +%s) - 86400 ))date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-24H +%Y-%m-%dT%H:%M:%SZ
7 jours$(( $(date +%s) - 604800 ))date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-7d +%Y-%m-%dT%H:%M:%SZ
30 jours$(( $(date +%s) - 2592000 ))date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-30d +%Y-%m-%dT%H:%M:%SZ
CoucheTestsCe qu’elle couvre
1. Résolution DNSDNS-1 à DNS-4Enregistrement A, CNAME ACME, autorité des serveurs de noms, enregistrements gérés
2. Certificat TLSTLS-1 à TLS-4État du certificat, détails du certificat, établissement en direct, cible ACME
3. Équilibreur de charge HTTPLB-1 à LB-6État, domaines, indicateur CSD, pools de routes, déploiement, résumé
4. Pool d’origineOP-1 à OP-4Configuration, mode TLS, association HC, connectivité vers l’origine
5. Bilan de santéHC-1 à HC-2Configuration HC, liste de tous les HC
6. Configuration CSDCSD-1 à CSD-5Statut du tenant, balise JS, domaines protégés, injection en direct
7. Vérification du traficTV-1 à TV-5Nombre de requêtes, codes de statut, échantillons, JS dans les journaux, test E2E
8. Télémétrie CSDTEL-1 à TEL-8Scripts, domaines, politique, champs de formulaire, analyse approfondie, utilisateurs, risque, fraîcheur
DiagnosticPoint de terminaisonMéthodeFormat de temps
Nombre de requêtes/api/data/namespaces/\{ns\}/access_logs/aggregationPOSTISO 8601
Codes de statut/api/data/namespaces/\{ns\}/access_logsPOSTISO 8601
Requêtes récentes/api/data/namespaces/\{ns\}/access_logsPOSTISO 8601
État du LB/api/config/namespaces/\{ns\}/http_loadbalancers/\{name\}GETAucun
Pool d’origine/api/config/namespaces/\{ns\}/origin_pools/\{name\}GETAucun
Bilan de santé/api/config/namespaces/\{ns\}/healthchecks/\{name\}GETAucun
Zone DNS/api/config/dns/namespaces/system/dns_zones/\{zone\}GETAucun
Statut CSD/api/shape/csd/namespaces/\{ns\}/statusGETAucun
Configuration JS/api/shape/csd/namespaces/\{ns\}/js_configurationGETAucun
Domaines protégés/api/shape/csd/namespaces/\{ns\}/protected_domainsGETAucun
Liste des scripts/api/shape/csd/namespaces/\{ns\}/scriptsPOSTSecondes epoch
Domaines détectés/api/shape/csd/namespaces/\{ns\}/detected_domainsGETAucun
Champs de formulaire/api/shape/csd/namespaces/\{ns\}/formFieldsGETSecondes epoch (paramètres de requête)
Détails du script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/dashboardGETAucun
Comportements du script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/behaviorsGETAucun
Réseau du script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/networkInteractionsGETAucun
Utilisateurs affectés/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/affectedUsersPOSTSecondes epoch