Ir al contenido

Diagnóstico y verificación

Esta página proporciona una matriz de verificación UAT por capas para validar el despliegue de Defensa del lado del cliente de extremo a extremo. Cada caso de prueba sigue la cadena de dependencias de infraestructura — desde la resolución DNS hasta la telemetría de CSD — para que pueda demostrar sistemáticamente que cada componente funciona correctamente.

Estos comandos son el equivalente de API del Recorrido por la consola de CSD — utilícelos cuando necesite verificar desde el terminal, automatizar la supervisión o demostrar las capacidades de CSD sin la interfaz de usuario.

Configure las variables de entorno tal como se describe en Automatización de API — Configuración del entorno:

Ventana de terminal
set -a && source .env && set +a

Todos los comandos a continuación utilizan el formato de marcador de posición xTOKENx. Sustitúyalo con sus variables de entorno ($F5XC_API_TOKEN, $F5XC_NAMESPACE, etc.) o use el formulario interactivo en la parte superior de la página.

Muchos endpoints de CSD requieren marcas de tiempo en formato epoch (segundos desde el epoch Unix). Estas instrucciones de una línea calculan los tiempos de inicio/fin para rangos comunes.

Multiplataforma (macOS + Linux):

Ventana de terminal
# Hora actual como segundos epoch
NOW=$(date +%s)
# Hace 1 hora
START_1H=$(( NOW - 3600 ))
# Hace 24 horas
START_24H=$(( NOW - 86400 ))
# Hace 7 días
START_7D=$(( NOW - 604800 ))
# Hace 30 días
START_30D=$(( NOW - 2592000 ))
PreajusteSegundosExpresión en shell
1 hora3.600$(( $(date +%s) - 3600 ))
24 horas86.400$(( $(date +%s) - 86400 ))
7 días604.800$(( $(date +%s) - 604800 ))
30 días2.592.000$(( $(date +%s) - 2592000 ))

Cada prueba a continuación sigue esta estructura:

CampoDescripción
ID de pruebaNúmero de capa + ID secuencial (p. ej., DNS-1, TLS-2)
Qué demuestraEl hecho específico de infraestructura que se verifica
ComandoComando curl o dig listo para ejecutar
CORRECTO / INCORRECTOSalida esperada para estado saludable vs. no saludable
SoluciónEnlace a la sección de configuración o resolución de problemas correspondiente

El DNS es la base — si el dominio no resuelve a la VIP del balanceador de carga, nada más funcionará.

Qué demuestra: El dominio resuelve a la dirección IP VIP del balanceador de carga.

Ventana de terminal
dig +short xF5XC_DOMAINNAMEx A
ResultadoSignificado
CORRECTO — IP VIP devuelta (p. ej., 72.19.3.185)El dominio resuelve a la IP virtual del LB
INCORRECTO — respuesta vacíaRegistro A de DNS no configurado

Solución: Automatización de API — Paso 4: Configurar DNS

Qué demuestra: El registro de desafío ACME existe para el aprovisionamiento automático de certificados TLS.

Ventana de terminal
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
dig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT
ResultadoSignificado
CORRECTO — CNAME a *.autocerts.ves.volterra.io. (DNS externo)El CNAME de desafío ACME está en su lugar
CORRECTO — registro TXT con valor de dominio (DNS administrado por F5 Distributed Cloud (F5 XC))Desafío ACME gestionado por la plataforma mediante registro TXT
INCORRECTO — ambos vacíosRegistro ACME no configurado; el certificado permanecerá en PreDomainChallengePending

Solución: Para DNS externo, cree el CNAME: _acme-challenge.xF5XC_DOMAINNAMEx*.autocerts.ves.volterra.io. Para DNS administrado por F5 XC, habilite allow_http_lb_managed_records en la zona DNS — consulte DNS-4. Consulte Automatización de API — Paso 4.

Qué demuestra: Si F5 XC es el proveedor DNS autoritativo para el dominio raíz.

Ventana de terminal
dig +short NS xF5XC_ROOT_DOMAINx
ResultadoSignificado
Incluye ns1.f5clouddns.com y ns2.f5clouddns.comDNS administrado por F5 XC — los registros pueden crearse automáticamente
Otros servidores de nombresDNS externo — los registros deben crearse manualmente

Solución: Automatización de API — Detectar autoridad DNS

DNS-4: Registros administrados por F5 XC habilitados

Sección titulada «DNS-4: Registros administrados por F5 XC habilitados»

Qué demuestra: La zona DNS de F5 XC permite la creación automática de registros para balanceadores de carga (solo para DNS administrado por F5 XC).

Ventana 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'
ResultadoSignificado
CORRECTOtrueLa plataforma creará automáticamente registros A y ACME para los LB
INCORRECTOfalse o nullRegistros administrados deshabilitados; habilítelos mediante actualización de la zona

Solución: Automatización de API — Opción A: DNS administrado por F5 XC


Una vez que el DNS resuelve, el balanceador de carga debe tener un certificado TLS válido.

Qué demuestra: El certificado TLS automático ha sido emitido en el LB HTTPS.

Ventana 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'
ResultadoSignificado
CORRECTO"CertificateValid" o "AutoCertRenewing"El certificado es válido y está activo
ADVERTENCIA"DomainChallengePending" o "DomainChallengeStarted"Desafío ACME en curso — espere entre 5 y 10 minutos
INFO"AutoCertDomainRateLimited"Límite de tasa de Let’s Encrypt alcanzado — esperado en entornos de demostración, no afecta al LB HTTP
INCORRECTO"PreDomainChallengePending"Registro de desafío ACME faltante — consulte DNS-2

Solución: Asegúrese de que el registro de desafío ACME esté en su lugar (CNAME para DNS externo, o habilite los registros administrados para DNS de F5 XC). El aprovisionamiento del certificado tarda 5 a 10 minutos después de configurar el registro. Si sigue bloqueado después de 15 minutos, consulte Certificado bloqueado — Recreación limpia. Si se alcanzó el límite de tasa, el LB HTTP no se ve afectado.

Qué demuestra: El certificado cubre el dominio esperado y muestra información de vencimiento. Solo aplica al LB HTTPS.

Ventana 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
}'
ResultadoSignificado
CORRECTOauto_cert_info contiene dns_records y metadatos del certificadoDetalles de aprovisionamiento del certificado disponibles
INCORRECTOauto_cert_info es null o está vacíoCertificado aún no aprovisionado

Qué demuestra: El certificado TLS es válido y el protocolo de enlace (handshake) se completa desde el lado del cliente. Solo aplica cuando el LB HTTPS tiene un certificado válido.

Ventana de terminal
curl -sv "https://xF5XC_DOMAINNAMEx/" 2>&1 \
| grep -E 'SSL connection|subject:|expire date:|issuer:'
ResultadoSignificado
CORRECTO — muestra SSL connection using TLSv1.3, asunto y fecha de vencimiento válidosTLS de extremo a extremo funciona correctamente
INCORRECTO — conexión rechazada o error de certificadoCompruebe la resolución DNS y el estado del certificado; si se alcanzó el límite de tasa, use HTTP

TLS-4: Destino del registro ACME desde el LB

Sección titulada «TLS-4: Destino del registro ACME desde el LB»

Qué demuestra: El balanceador de carga HTTPS reporta el destino ACME correcto para la validación del certificado.

Ventana 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
}'
ResultadoSignificado
CORRECTOvip_ip y acme_target con valoresLos registros DNS pueden verificarse contra estos valores
INCORRECTO — valores nullEs posible que el LB no tenga configurado https_auto_cert

El balanceador de carga debe estar en un estado listo y correctamente configurado.

Qué demuestra: El balanceador de carga HTTP (principal) está completamente operativo y acepta tráfico.

Ventana 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'
ResultadoSignificado
CORRECTO"VIRTUAL_HOST_READY"El LB está operativo
INCORRECTO"VIRTUAL_HOST_PENDING_A_RECORD"Registro A de DNS no configurado — consulte DNS-1

Solución: LB bloqueado en VIRTUAL_HOST_PENDING_A_RECORD

Qué demuestra: El balanceador de carga HTTP está configurado para el dominio (o dominios) correcto.

Ventana 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'
ResultadoSignificado
CORRECTO — el array contiene su FQDN (p. ej., ["app.example.com"])El LB está configurado para el dominio esperado
INCORRECTO — dominio ausente o incorrectoActualice la especificación del LB con el dominio correcto

Qué demuestra: La Defensa del lado del cliente está habilitada en el balanceador de carga con la política de inyección de JS correcta.

Ventana 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
}'
ResultadoSignificado
CORRECTOcsd_enabled: true con js_insert_all_pages en la políticaCSD activo con inyección de JS en todas las páginas
INCORRECTOcsd_enabled: falseCSD no configurado en el LB

Solución: Referencia de API — Habilitar CSD en un balanceador de carga

Qué demuestra: El balanceador de carga referencia el pool de origen correcto con el peso y la prioridad esperados.

Ventana 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
}'
ResultadoSignificado
CORRECTO — muestra el nombre del pool de origen con peso/prioridadEl LB está enrutando al backend correcto
INCORRECTO — pool vacío o incorrectoActualice la configuración default_route_pools del LB

LB-5: Estado de despliegue (condiciones por sitio)

Sección titulada «LB-5: Estado de despliegue (condiciones por sitio)»

Qué demuestra: El balanceador de carga está desplegado e informa condiciones saludables en todos los sitios.

Ventana 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
}'
ResultadoSignificado
CORRECTOstate es VIRTUAL_HOST_READY, dns_info con valoresLB completamente desplegado con VIP asignada
INCORRECTO — estado pendiente o dns_info vacíoProblema de DNS o certificado bloqueando el despliegue

Qué demuestra: Instantánea completa de ambas configuraciones de LB para depuración.

LB HTTP (principal):

Ventana 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 (secundario — incluye estado del certificado):

Ventana 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]
}'

El pool de origen define los servidores backend a los que el balanceador de carga dirige el tráfico.

Qué demuestra: El pool de origen existe con el servidor backend correcto, el puerto y el algoritmo de LB.

Ventana 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
}'
ResultadoSignificado
CORRECTO — muestra la IP, el puerto y el algoritmo correctosPool de origen configurado correctamente
INCORRECTO404 o valores incorrectosPool de origen faltante o mal configurado

Solución: Automatización de API — Paso 2: Crear pool de origen

Qué demuestra: Si TLS está configurado para la conexión entre el LB y el Servidor de origen.

Ventana 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)
}'
ResultadoSignificado
no_tls (plaintext)El LB se conecta al origen por HTTP (esperado para la demo de Juice Shop)
use_tls (encrypted)El LB se conecta al origen por HTTPS

OP-3: Asociación de comprobación de estado

Sección titulada «OP-3: Asociación de comprobación de estado»

Qué demuestra: El pool de origen tiene la comprobación de estado correcta vinculada (si aplica).

Ventana 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'
ResultadoSignificado
CORRECTO — array con referencia de comprobación de estado (name, namespace, kind)La comprobación de estado está vinculada
ACEPTABLE — array vacío []Sin comprobación de estado (aceptable — CSD no requiere una)
INCORRECTO — se esperaba una comprobación de estado pero el array está vacíoLa comprobación de estado no se encontró en el momento de la creación — consulte Comprobación de estado no vinculada

Qué demuestra: El servidor de origen es accesible desde el lado del cliente (no prueba la ruta del LB al origen).

Ventana de terminal
curl -s -o /dev/null -w '%{http_code}' \
"http://xF5XC_ORIGIN_IPx:xF5XC_ORIGIN_PORTx/"
ResultadoSignificado
CORRECTO200 (u otro código HTTP válido)El servidor de origen está respondiendo
INCORRECTO000 o conexión rechazadaServidor de origen inaccesible desde esta red

Las comprobaciones de estado supervisan la disponibilidad del backend. Son opcionales para CSD pero útiles para despliegues en producción.

HC-1: Configuración de comprobación de estado

Sección titulada «HC-1: Configuración de comprobación de estado»

Qué demuestra: La comprobación de estado existe con el tipo, la ruta, los tiempos y los umbrales correctos.

Ventana 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
}'
ResultadoSignificado
CORRECTO — muestra tipo HTTP con ruta / y código esperado 200Comprobación de estado configurada correctamente
INCORRECTO — respuesta 404La comprobación de estado no existe (puede haberse omitido — consulte Fase 1 Paso 1)

HC-2: Listar todas las comprobaciones de estado

Sección titulada «HC-2: Listar todas las comprobaciones de estado»

Qué demuestra: Enumera todas las comprobaciones de estado en el namespace para verificar la nomenclatura y la cantidad.

Ventana 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 debe estar habilitado a nivel de tenant y tener configurada la etiqueta de inyección de JavaScript.

Qué demuestra: CSD está configurado y habilitado para el tenant.

Ventana de terminal
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \
| jq '{isConfigured, isEnabled}'
ResultadoSignificado
CORRECTO — ambos trueCSD está activo para este tenant
INCORRECTOisConfigured: falseCSD no habilitado a nivel de tenant — contacte al administrador de F5 XC
INCORRECTOisEnabled: falseCSD configurado pero no activo

Qué demuestra: La etiqueta de inyección de JavaScript de CSD está generada y lista para la inyección.

Ventana 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)}'
ResultadoSignificado
CORRECTOhas_script_tag: trueLa etiqueta de inyección de JS está configurada
INCORRECTOhas_script_tag: falseSin etiqueta de script — verifique que CSD esté habilitado y que haya un dominio protegido registrado

Qué demuestra: Muestra la etiqueta de script completa para verificación o inyección manual.

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

Qué demuestra: El dominio raíz está registrado como dominio protegido de CSD en el tenant.

Ventana 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}'
ResultadoSignificado
CORRECTO — muestra un elemento con name no vacíoEl dominio está protegido
INCORRECTO — los elementos tienen campos name y namespace vacíosNo hay dominios protegidos registrados — consulte Fase 1 Paso 6

CSD-5: Verificación de inyección de JS en vivo

Sección titulada «CSD-5: Verificación de inyección de JS en vivo»

Qué demuestra: El JavaScript de CSD se está inyectando efectivamente en las respuestas de página servidas por el balanceador de carga.

Ventana de terminal
curl -s "http://xF5XC_DOMAINNAMEx/" \
| grep -oE '(zeronaught|shape)\.com[^"]*' | head -1
ResultadoSignificado
CORRECTO — devuelve un fragmento de URL de zeronaught.com o shape.com (p. ej., zeronaught.com/__imp_apg__/js/...)El JavaScript de CSD se está inyectando en las páginas
INCORRECTO — salida vacíaJS no inyectado — compruebe LB-3 y CSD-1

Verifique que el tráfico en vivo está llegando al balanceador de carga y siendo procesado correctamente.

TV-1: Recuento de solicitudes (últimas 24 horas)

Sección titulada «TV-1: Recuento de solicitudes (últimas 24 horas)»

Qué demuestra: El tráfico está llegando al balanceador de carga. Un resultado de cero significa que no llega ningún tráfico.

Ventana 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}'
ResultadoSignificado
CORRECTOtotal_requests es una cadena no nula (p. ej., "380")El tráfico fluye a través del LB
INCORRECTO"0" o sin datosSin tráfico llegando al LB — compruebe DNS-1 y LB-1

Qué demuestra: El desglose de códigos de estado de respuesta revela patrones de error.

Ventana 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

Salida esperada para un sitio saludable:

STATUS_CLASS COUNT
2xx 82
downstream_remote_disconnect 18
ResultadoSignificado
CORRECTO — mayoría 2xxEl sitio está sirviendo respuestas exitosas
ADVERTENCIA — alto recuento de 4xxErrores del cliente (URLs incorrectas, recursos faltantes)
INCORRECTO — alto recuento de 5xxErrores del servidor — compruebe el estado del servidor de origen

La clase downstream_remote_disconnect indica que el cliente cerró la conexión antes de que la respuesta se completara (común para solicitudes de long-polling o de actualización WebSocket).

Qué demuestra: Las solicitudes individuales se están registrando con los campos correctos.

Ventana 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: Inyección de JS de CSD en los registros de acceso

Sección titulada «TV-4: Inyección de JS de CSD en los registros de acceso»

Qué demuestra: Los registros de acceso confirman que el JavaScript de CSD se está inyectando en las respuestas.

Ventana 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}'
ResultadoSignificado
CORRECTOinjected_count > 0El JS de CSD se está inyectando en las respuestas de página
INCORRECTOinjected_count: 0JS no inyectado — compruebe CSD-1 y LB-3

TV-5: Prueba de conectividad de extremo a extremo

Sección titulada «TV-5: Prueba de conectividad de extremo a extremo»

Qué demuestra: Una solicitud completa fluye desde el cliente a través del DNS, el LB y el origen, y devuelve una respuesta válida.

Ventana de terminal
curl -sv "http://xF5XC_DOMAINNAMEx/" 2>&1 \
| grep -E 'Connected to|< HTTP|< content-type'
ResultadoSignificado
CORRECTO — muestra conexión, HTTP 200 y content-typeLa pila completa está operativa
INCORRECTO — conexión rechazada o error de DNSComience la depuración en Capa 1: DNS

Capa 8: Telemetría de CSD y política de dominio

Sección titulada «Capa 8: Telemetría de CSD y política de dominio»

Estos comandos consultan los mismos datos que se muestran en el panel de control de la consola CSD, la lista de scripts, los campos de formulario y las vistas de red.

Qué demuestra: CSD está detectando y catalogando los scripts que se ejecutan en el dominio protegido.

Ventana 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
ResultadoSignificado
CORRECTO — scripts listados con niveles de riesgoCSD está supervisando activamente los scripts
INCORRECTO — array vacíoConsulte Resolución de problemas: Array de scripts vacío

Qué demuestra: CSD ha detectado dominios de origen de scripts y los ha clasificado por estado.

Ventana 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)
}]
}'
ResultadoSignificado
CORRECTOtotal > 0 con dominios listadosCSD está rastreando dominios de scripts
ADVERTENCIAaction_needed > 0Algunos dominios necesitan revisión
INCORRECTO — respuesta vacíaSin datos de telemetría — compruebe CSD-5

Qué demuestra: Muestra la distribución de dominios permitidos vs. mitigados y si la política es consistente.

Ventana 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]
}'
ResultadoSignificado
CORRECTOaction_needed: 0Todos los dominios han sido revisados y clasificados
ADVERTENCIAaction_needed > 0Los dominios listados en domains_needing_action requieren revisión

Qué demuestra: CSD ha detectado campos de formulario que los scripts están leyendo, con clasificación de sensibilidad.

Ventana 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
ResultadoSignificado
CORRECTO — campos de formulario listados con sensibilidadCSD está rastreando el acceso a campos de formulario
INFO — array vacíoNo se detectaron campos de formulario (esperado si el sitio no tiene formularios)

Qué demuestra: Información detallada sobre un script específico, incluyendo riesgo, comportamientos e interacciones de red.

Primero, obtenga un ID de script de TEL-1 y luego consulte sus detalles:

Ventana de terminal
SCRIPT_ID="your-script-id"
# Resumen (nivel de riesgo, tipo, dominio de origen)
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}'
# Comportamientos a lo largo del tiempo
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/behaviors" \
| jq '.behaviors'
# Interacciones de red (dominios con los que se comunica el script)
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/scripts/${SCRIPT_ID}/networkInteractions" \
| jq '.network_interactions'

Qué demuestra: Lista los usuarios impactados por un script específico, mostrando el alcance de la exposición.

Ventana 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

TEL-7: Recuento de scripts por nivel de riesgo

Sección titulada «TEL-7: Recuento de scripts por nivel de riesgo»

Qué demuestra: Distribución de riesgo agregada en todos los scripts detectados.

Ventana 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)'
ResultadoSignificado
CORRECTO — todo No RiskNo se detectaron scripts de riesgo
ADVERTENCIALow Risk o High Risk presentesRevise los scripts marcados en TEL-5

Qué demuestra: Los datos de telemetría de CSD son recientes, confirmando que la supervisión está activa.

Ventana 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)
})
}'
ResultadoSignificado
CORRECTOlatest_seen es dentro de las últimas 24 horasLa telemetría está recopilando datos activamente
ADVERTENCIAlatest_seen tiene más de 24 horasEl tráfico puede haberse detenido o el procesamiento de CSD tiene retraso

Ejecute un único comando que comprueba todos los indicadores de estado críticos en cada capa y produce una tabla de resumen:

Ventana de terminal
echo "=== Panel de verificación de CSD ==="
echo ""
# Capa 1: DNS
DNS_A=$(dig +short xF5XC_DOMAINNAMEx A | head -1)
DNS_ACME=$(dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME | head -1)
# Capas 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(", ")')
# Capa 6: Estado de 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')
# Capa 6: Configuración de 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')
# Capa 7: Tráfico (últimas 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" "COMPROBACIÓN" "ESTADO"
printf "%-28s %s\n" "----------------------------" "----------------------------"
printf "%-28s %s\n" "[DNS] Registro A" "${DNS_A:-NOT_FOUND}"
printf "%-28s %s\n" "[DNS] CNAME ACME" "${DNS_ACME:-NOT_FOUND}"
printf "%-28s %s\n" "[TLS] Certificado" "$CERT_STATE"
printf "%-28s %s\n" "[LB] Estado" "$LB_STATE"
printf "%-28s %s\n" "[LB] Dominios" "$DOMAINS"
printf "%-28s %s\n" "[LB] Pool de ruta" "$ROUTE_POOL"
printf "%-28s %s\n" "[LB] CSD en LB" "$CSD_ON_LB"
printf "%-28s %s\n" "[CSD] Configurado (tenant)" "$CSD_CONFIGURED"
printf "%-28s %s\n" "[CSD] Habilitado" "$CSD_ENABLED"
printf "%-28s %s\n" "[CSD] Etiqueta script JS" "$JS_TAG"
printf "%-28s %s\n" "[Tráfico] Solicitudes (24h)" "$TRAFFIC"

CampoTipoDescripción
@timestampstringMarca de tiempo de la solicitud (ISO 8601). Tenga en cuenta el prefijo @ — acceda con .["@timestamp"] en jq
methodstringMétodo HTTP (GET, POST, etc.)
req_pathstringRuta URI de la solicitud
rsp_codestringCódigo de estado HTTP de la respuesta como cadena (p. ej., "200", "404")
rsp_code_classstringClase del código de estado (2xx, 3xx, 4xx, 5xx o downstream_remote_disconnect)
src_ipstringDirección IP de origen del cliente
dst_ipstringDirección IP de destino (VIP)
domainstringValor del encabezado Host de la solicitud
user_agentstringCadena User-Agent del cliente
rsp_sizestringTamaño del cuerpo de la respuesta en bytes (devuelto como cadena)
req_sizestringTamaño del cuerpo de la solicitud en bytes (devuelto como cadena)
duration_with_data_tx_delaystringDuración total de la solicitud en segundos (devuelto como cadena, p. ej., "0.024219")
csd_js_injectionstring"true" cuando se inyectó JavaScript de CSD (solo presente cuando está activo)
CampoEndpointDescripción
isConfiguredstatusCSD habilitado a nivel de tenant
isEnabledstatusCSD activo para este namespace
scripts[]scriptsArray de objetos de scripts detectados
.script_namescriptsURL completa del archivo JavaScript
.risk_levelscriptsNivel de riesgo (No Risk, Low Risk, High Risk)
.statusscriptsAN (Action Needed) o NA (No Action Needed)
.form_fields_readscriptsNúmero de campos de formulario que lee el script
.affected_users_countscriptsNúmero de usuarios/sesiones únicas afectadas
domain_summarydetected_domainsRecuentos por estado: .actionNeededCount.count, .mitigatedDomains.count, .allowedDomains.count, .totalDomains.count (cada uno tiene .count y .lastUpdated)
domains_list[]detected_domainsArray de objetos de dominio detectados con .domain, .status, .category, .firstSeenDate, .latestSeenDate (segundos epoch como cadenas)
form_fields[]formFieldsArray de objetos de campos de formulario detectados
.analysisformFieldsClasificación de sensibilidad (Sensitive, Not Sensitive)

Si TV-1 devuelve 0:

  1. Compruebe la resolución DNS — verifique que el dominio resuelve a la VIP del LB:

    Ventana de terminal
    dig +short xF5XC_DOMAINNAMEx A

    Si está vacío, el DNS no está configurado. Consulte Automatización de API — Paso 4.

  2. Compruebe el estado del LB — el balanceador de carga debe estar en VIRTUAL_HOST_READY:

    Ventana 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. Envíe una solicitud de prueba — genere tráfico para confirmar la conectividad de extremo a extremo:

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

    Busque una respuesta HTTP exitosa. Use https:// solo si el certificado del LB HTTPS es válido.

Registros administrados deshabilitados en la zona DNS

Sección titulada «Registros administrados deshabilitados en la zona DNS»

Si DNS-4 devuelve false, la creación automática de registros está deshabilitada aunque F5 XC sea el proveedor DNS autoritativo. Esta es una mala configuración común que provoca que falten tanto el registro A como el CNAME ACME, lo que impide que el balanceador de carga alcance VIRTUAL_HOST_READY y que se emita el certificado.

Para habilitar los registros administrados, actualice la configuración de la zona DNS para establecer allow_http_lb_managed_records: true. Consulte Automatización de API — Opción A: DNS administrado por F5 XC para la llamada de API.

LB bloqueado en VIRTUAL_HOST_PENDING_A_RECORD

Sección titulada «LB bloqueado en VIRTUAL_HOST_PENDING_A_RECORD»

El balanceador de carga está esperando un registro A de DNS que apunte a su VIP. Consulte LB bloqueado en VIRTUAL_HOST_PENDING_A_RECORD para ver los pasos detallados de resolución.

Certificado bloqueado en PreDomainChallengePending

Sección titulada «Certificado bloqueado en PreDomainChallengePending»

El certificado TLS automático requiere un registro de desafío ACME. El método depende de su proveedor DNS:

DNS administrado por F5 XC: Habilite allow_http_lb_managed_records en la zona DNS (DNS-4). La plataforma crea automáticamente un registro de desafío ACME basado en TXT en el grupo de conjuntos de registros x-ves-io-managed. Si el certificado permanece bloqueado después de habilitar los registros administrados, elimine y vuelva a crear el balanceador de carga para activar una nueva solicitud de certificado.

DNS externo: Cree un registro CNAME en su proveedor DNS:

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

Verifique que el registro existe:

Ventana de terminal
dig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAME
dig +short _acme-challenge.xF5XC_DOMAINNAMEx TXT

Si ambos están vacíos, el registro ACME no está configurado. El aprovisionamiento del certificado tarda entre 5 y 10 minutos después de que el registro esté en su lugar. Compruebe el estado de error del LB para ver errores de validación ACME específicos:

Ventana 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 debe ser habilitado a nivel de tenant por un administrador de F5 XC. Esta es una configuración de todo el tenant que no puede configurarse a través de la API del namespace. Contacte a su administrador para habilitar la Defensa del lado del cliente.

Si TEL-1 devuelve un array vacío:

  1. Compruebe el dominio protegido — CSD supervisa los scripts solo en los dominios registrados:

    Ventana 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. Verifique la inyección de JS — confirme que la etiqueta de script de CSD se está inyectando en las páginas:

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

    Si no hay coincidencia, el JavaScript de CSD no se está inyectando. Compruebe que el LB tenga client_side_defense habilitado.

  3. Espere el tiempo de procesamiento — después de habilitar CSD por primera vez o registrar un nuevo dominio protegido, la detección de scripts puede tardar entre 5 y 15 minutos. Genere tráfico hacia el sitio y espere antes de volver a comprobar.

PeríodoDesplazamiento epochISO 8601 (Linux)ISO 8601 (macOS)
1 hora$(( $(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 horas$(( $(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 días$(( $(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 días$(( $(date +%s) - 2592000 ))date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZdate -u -v-30d +%Y-%m-%dT%H:%M:%SZ
CapaPruebasQué cubre
1. Resolución DNSDNS-1 a DNS-4Registro A, CNAME ACME, autoridad de servidores de nombres, registros administrados
2. Certificado TLSTLS-1 a TLS-4Estado del certificado, detalles, handshake en vivo, destino ACME
3. Balanceador de carga HTTPLB-1 a LB-6Estado, dominios, indicador CSD, pools de rutas, despliegue, resumen
4. Pool de origenOP-1 a OP-4Configuración, modo TLS, asociación de HC, conectividad al origen
5. Comprobación de estadoHC-1 a HC-2Configuración de HC, listar todos los HC
6. Configuración de CSDCSD-1 a CSD-5Estado del tenant, etiqueta JS, dominios protegidos, inyección en vivo
7. Verificación de tráficoTV-1 a TV-5Recuento de solicitudes, códigos de estado, muestras, JS en registros, prueba E2E
8. Telemetría de CSDTEL-1 a TEL-8Scripts, dominios, política, campos de formulario, análisis detallado, usuarios, riesgo, actualidad
DiagnósticoEndpointMétodoFormato de tiempo
Recuento de solicitudes/api/data/namespaces/\{ns\}/access_logs/aggregationPOSTISO 8601
Códigos de estado/api/data/namespaces/\{ns\}/access_logsPOSTISO 8601
Solicitudes recientes/api/data/namespaces/\{ns\}/access_logsPOSTISO 8601
Estado del LB/api/config/namespaces/\{ns\}/http_loadbalancers/\{name\}GETNinguno
Pool de origen/api/config/namespaces/\{ns\}/origin_pools/\{name\}GETNinguno
Comprobación de estado/api/config/namespaces/\{ns\}/healthchecks/\{name\}GETNinguno
Zona DNS/api/config/dns/namespaces/system/dns_zones/\{zone\}GETNinguno
Estado de CSD/api/shape/csd/namespaces/\{ns\}/statusGETNinguno
Configuración de JS/api/shape/csd/namespaces/\{ns\}/js_configurationGETNinguno
Dominios protegidos/api/shape/csd/namespaces/\{ns\}/protected_domainsGETNinguno
Lista de scripts/api/shape/csd/namespaces/\{ns\}/scriptsPOSTSegundos epoch
Dominios detectados/api/shape/csd/namespaces/\{ns\}/detected_domainsGETNinguno
Campos de formulario/api/shape/csd/namespaces/\{ns\}/formFieldsGETSegundos epoch (parámetros de consulta)
Detalles del script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/dashboardGETNinguno
Comportamientos del script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/behaviorsGETNinguno
Red del script/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/networkInteractionsGETNinguno
Usuarios afectados/api/shape/csd/namespaces/\{ns\}/scripts/\{id\}/affectedUsersPOSTSegundos epoch