- Inicio
- Defensa del lado del cliente
- Demo
- Fase 1 — Construcción
Fase 1 — Construcción
La Fase 1 despliega y valida la infraestructura completa de CSD. Complete todos los pasos en orden — cada paso debe superar la verificación (PASS) antes de continuar. Regrese al índice para completar la configuración del entorno y la resolución de variables antes de ejecutar estos comandos.
Paso 0: Verificar y crear el namespace (condicional)
Sección titulada «Paso 0: Verificar y crear el namespace (condicional)»Compruebe si el namespace de destino ya existe en el tenant. Si no existe, créelo. Registre el resultado en la variable de shell NAMESPACE_CREATED — el proceso de desmontaje de la Fase 4 utiliza este valor para decidir si eliminar el namespace.
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"fiEvidencia
Sección titulada «Evidencia»Confirme que el namespace existe y registre si fue creado:
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"| Campo | Esperado | Estado |
|---|---|---|
| Estado HTTP | 200 | PASS si se devuelve, FAIL si 404 u otro |
NAMESPACE_CREATED | true (creado) o false (preexistente) | Informativo — utilizado por el desmontaje de la Fase 4 |
Paso 1: Crear el Healthcheck (opcional)
Sección titulada «Paso 1: Crear el Healthcheck (opcional)»Cree un healthcheck HTTP que el grupo de origen pueda utilizar para supervisar el estado del 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 .Una respuesta 200 con el objeto creado confirma que el healthcheck fue creado. Si la respuesta contiene "code": 8 con un mensaje como "Object kind healthcheck has exhausted limits(150)", el tenant ha alcanzado su límite de healthchecks — continúe con el Paso 2 y omita la referencia al healthcheck. CSD no depende de la supervisión del estado.
Evidencia
Sección titulada «Evidencia»Confirme que el healthcheck 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}'| Campo | Esperado | Estado |
|---|---|---|
| Estado HTTP | 200 con objeto | PASS si se devuelve, FAIL si 404 |
name | Coincide con F5XC_HC_NAME | PASS |
path | / | PASS |
Paso 1 omitido (código de error 8, límite agotado) | — | PASS (el healthcheck es opcional para CSD) |
Paso 2: Crear el grupo de origen
Sección titulada «Paso 2: Crear el grupo de origen»Cree un grupo de origen que apunte a su servidor backend. Si creó un healthcheck en el Paso 1, incluya la referencia healthcheck. Si se omitió el Paso 1, utilice un array vacío.
Con healthcheck (Paso 1 exitoso):
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 .Sin healthcheck (Paso 1 omitido):
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 .Una respuesta 200 confirma que el grupo de origen fue creado.
Verificar que el healthcheck está vinculado
Sección titulada «Verificar que el healthcheck está vinculado»Si incluyó una referencia al healthcheck, confirme que está correctamente vinculado:
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 array con contenido confirma el vínculo. Un array vacío [] es el resultado esperado si se omitió el Paso 1, o indica que el healthcheck no fue encontrado si tenía intención de vincularlo.
Evidencia
Sección titulada «Evidencia»Confirme que el grupo de origen existe y tiene la configuración correcta:
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)}'| Campo | Esperado | Estado |
|---|---|---|
| Estado HTTP | 200 | PASS si se devuelve, FAIL si 404 |
name | Coincide con F5XC_ORIGIN_POOL | PASS |
origin_ip | Coincide con F5XC_ORIGIN_IP | PASS |
port | Coincide con F5XC_ORIGIN_PORT | PASS |
healthcheck_count | 1 (con HC) o 0 (sin HC) | PASS en ambos casos |
Paso 3: Crear balanceadores de carga HTTP con CSD
Sección titulada «Paso 3: Crear balanceadores de carga HTTP con CSD»Cree dos balanceadores de carga con Defensa del lado del cliente habilitada — un LB HTTP (primario, puerto 80) y un LB HTTPS (secundario, puerto 443 con gestión automática de certificados). El LB HTTP es el predeterminado para todo el tráfico de la demostración. El LB HTTPS es complementario y depende del aprovisionamiento de certificados Let’s Encrypt, que puede alcanzar límites de frecuencia en entornos de demostración.
Balanceador de carga HTTP (primario)
Sección titulada «Balanceador de carga HTTP (primario)»Este es el balanceador de carga primario para las demostraciones. Utiliza un listener http en el puerto 80 con DNS gestionado por F5 XC. No depende del aprovisionamiento de certificados TLS, por lo que queda listo inmediatamente después de que el DNS se resuelva.
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 .Una respuesta 200 confirma que el balanceador de carga HTTP fue creado con CSD habilitado.
Balanceador de carga HTTPS (secundario)
Sección titulada «Balanceador de carga HTTPS (secundario)»Este es el balanceador de carga secundario. Utiliza https_auto_cert en el puerto 443 con aprovisionamiento automático de certificados Let’s Encrypt. Antes de crearlo, verifique si existe un LB HTTPS esqueleto de un desmontaje anterior — si es así, restáurelo mediante PUT en lugar de POST para preservar el certificado Let’s Encrypt existente y evitar los límites de frecuencia (5 certificados duplicados por conjunto exacto de identificadores cada 7 días).
Verificar si el LB HTTPS ya existe:
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 es 200, existe un LB HTTPS esqueleto — utilice la Ruta A (PUT). Si es 404, utilice la Ruta B (POST).
Ruta A: Restaurar esqueleto mediante PUT (el LB HTTPS existe)
Sección titulada «Ruta A: Restaurar esqueleto mediante PUT (el LB HTTPS existe)»Cuando existe un LB HTTPS esqueleto de un desmontaje anterior, restaure la configuración completa mediante PUT. Esto vuelve a conectar el grupo de origen y re-habilita CSD sin activar una nueva solicitud de certificado Let’s Encrypt — el certificado existente permanece válido.
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 .Una respuesta 200 confirma que el esqueleto fue restaurado con la configuración completa. El estado del certificado debería permanecer en CertificateValid — no se activa ningún nuevo aprovisionamiento de Let’s Encrypt.
Ruta B: Crear nuevo mediante POST (el LB HTTPS no existe)
Sección titulada «Ruta B: Crear nuevo mediante POST (el LB HTTPS no existe)»Cuando no existe un LB HTTPS (primera ejecución o tras un desmontaje completo), créelo mediante POST. Esto activa el aprovisionamiento del certificado Let’s Encrypt, que puede tardar entre 5 y 10 minutos.
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 .Una respuesta 200 confirma que el balanceador de carga HTTPS fue creado. El aprovisionamiento del certificado comienza automáticamente.
Evidencia
Sección titulada «Evidencia»Confirme que ambos balanceadores de carga existen con CSD habilitado. Utilice siempre un GET para la evidencia — la respuesta del POST devuelve valores de estado transitorios que pueden no reflejar la configuración establecida.
LB HTTP (primario):
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}'| Campo | Esperado | Estado |
|---|---|---|
| Estado HTTP | 200 | PASS si se devuelve, FAIL si 404 |
name | ${F5XC_LB_NAME}-http | PASS |
domains | Contiene F5XC_DOMAINNAME | PASS |
csd_enabled | true | PASS — CSD está configurado en este LB |
state | VIRTUAL_HOST_READY o VIRTUAL_HOST_PENDING_A_RECORD | Esperado — el LB HTTP pasa a READY una vez que el DNS se resuelve. Cualquier otro estado (por ejemplo, VIRTUAL_HOST_FAILED) es un FAIL — informe al operador y no continúe |
LB HTTPS (secundario):
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}'| Campo | Esperado | Estado |
|---|---|---|
| Estado HTTP | 200 | PASS si se devuelve, FAIL si 404 |
name | ${F5XC_LB_NAME}-https | PASS |
domains | Contiene F5XC_DOMAINNAME | PASS |
csd_enabled | true | PASS — CSD está configurado en este LB |
creation_method | PUT (esqueleto restaurado) o POST (nuevo) | INFO — PUT preserva el certificado existente |
state | VIRTUAL_HOST_READY (PUT) o VIRTUAL_HOST_PENDING_A_RECORD (POST) | Esperado — la ruta PUT puede ya estar en READY dado que el DNS persistió desde el esqueleto |
cert_state | CertificateValid (PUT) o PreDomainChallengePending (POST) | PUT preserva el certificado existente; POST activa nuevo aprovisionamiento |
Paso 4: Configurar DNS
Sección titulada «Paso 4: Configurar DNS»Después de crear el balanceador de carga, este pasa al estado VIRTUAL_HOST_PENDING_A_RECORD y el certificado automático permanece en PreDomainChallengePending. Deben existir dos registros DNS antes de que el LB quede completamente operativo:
- Registro A —
xF5XC_DOMAINNAMExapuntando a la dirección IP VIP (obtenida dedns_infoen la respuesta del LB) - Registro de desafío ACME —
_acme-challenge.xF5XC_DOMAINNAMExpara la validación del certificado TLS (gestionado automáticamente cuando se utiliza DNS de F5 XC con registros gestionados; se requiere CNAME manual para DNS externo)
El enfoque depende de si F5 XC es el proveedor DNS autoritativo para su dominio.
Detectar la autoridad DNS
Sección titulada «Detectar la autoridad DNS»Compruebe los servidores de nombres para su dominio raíz:
dig +short NS xF5XC_ROOT_DOMAINxSi la respuesta incluye ns1.f5clouddns.com y ns2.f5clouddns.com, F5 XC es el proveedor DNS autoritativo — siga la Opción A. De lo contrario, siga la Opción B para DNS externo.
Opción A: DNS gestionado por F5 XC
Sección titulada «Opción A: DNS gestionado por F5 XC»Cuando F5 XC es el proveedor DNS autoritativo, la plataforma puede crear automáticamente tanto el registro A como el CNAME del desafío ACME — pero solo cuando la zona DNS tiene habilitado allow_http_lb_managed_records.
1. Verificar si los registros gestionados están habilitados:
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 respuesta es true, la plataforma creará automáticamente los registros DNS para los balanceadores de carga — continúe en 3. Verificar la resolución DNS. Si es false o null, continúe con el paso siguiente.
2. Habilitar los registros gestionados:
Recupere la configuración actual de la zona, habilite los registros gestionados y actualice:
# 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 .Una respuesta 200 (vacía \{\}) confirma que la zona fue actualizada. F5 XC creará el registro A y el registro del desafío ACME en el grupo de registros gestionados automáticamente de la zona. Si los registros gestionados no aparecen en 60 segundos, vuelva a aplicar el balanceador de carga para activar la creación de registros:
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 .Esta reaplicación GET+PUT no modifica la configuración del LB — simplemente indica a la plataforma que vuelva a evaluar la zona DNS y cree los registros gestionados. Si el registro A aún no se resuelve en los 60 segundos posteriores a la reaplicación, deténgase e informe al operador — no reintente la reaplicación más de una vez.
3. Verificar la resolución DNS:
dig +short xF5XC_DOMAINNAMEx ALa respuesta debería devolver la dirección IP VIP. La propagación DNS suele ser inmediata para las zonas gestionadas por F5 XC, pero espere hasta 60 segundos.
Opción B: Proveedor DNS externo
Sección titulada «Opción B: Proveedor DNS externo»Cuando su dominio utiliza un proveedor DNS externo, debe crear los registros manualmente. Extraiga los valores requeridos del balanceador de carga:
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 }'Cree estos registros en su proveedor DNS:
| Tipo | Nombre | Valor |
|---|---|---|
| A | xF5XC_DOMAINNAMEx | IP VIP de dns_info[0].ip_address |
| CNAME | _acme-challenge.xF5XC_DOMAINNAMEx | *.autocerts.ves.volterra.io |
Después de crear los registros, verifique la resolución:
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEEvidencia
Sección titulada «Evidencia»| Prueba | Comando | Esperado | Estado |
|---|---|---|---|
| DNS-1: Registro A | dig +short $F5XC_DOMAINNAME A | Dirección IP VIP devuelta | PASS si se devuelve IP, FAIL si está vacío |
| DNS-2: CNAME ACME | dig +short _acme-challenge.$F5XC_DOMAINNAME CNAME | *.autocerts.ves.volterra.io | PASS si se devuelve CNAME |
| Autoridad DNS | dig +short NS $F5XC_ROOT_DOMAIN | Servidores de nombres de F5 XC o externos | Informativo — determina Opción A vs B |
Si DNS-1 devuelve vacío después de 60 segundos, consulte Solución de problemas — LB bloqueado en VIRTUAL_HOST_PENDING_A_RECORD.
Paso 5: Verificar que CSD está habilitado
Sección titulada «Paso 5: Verificar que CSD está habilitado»Compruebe que la Defensa del lado del cliente está habilitada para el tenant. CSD se configura a nivel de tenant — si aún no se ha habilitado, contacte a su administrador de F5 XC.
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq .Una respuesta que contiene "isConfigured": true e "isEnabled": true confirma que CSD está activo.
Evidencia
Sección titulada «Evidencia»curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/status" \ | jq '{configured: .isConfigured, enabled: .isEnabled}'| Campo | Esperado | Estado |
|---|---|---|
configured | true | PASS |
enabled | true | PASS |
Alguno es false | — | FAIL — contacte al administrador de F5 XC para habilitar CSD a nivel de tenant |
Paso 6: Registrar el dominio protegido
Sección titulada «Paso 6: Registrar el dominio protegido»Registre el dominio raíz que CSD supervisará. El campo protected_domain debe ser el dominio raíz eTLD+1 (por ejemplo, f5demos.com), no el FQDN completo.
Verificar si ya está registrado
Sección titulada «Verificar si ya está registrado»Antes de crear, compruebe si el dominio ya está registrado en el tenant. Una respuesta 409 al POST significa que el dominio ya existe — esta es una condición de éxito, no un error.
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 .| Respuesta | Significado | Acción |
|---|---|---|
200 | Dominio registrado correctamente | Continúe con el Paso 7 |
409 (el dominio ya existe) | El dominio fue registrado anteriormente en este tenant | Ya realizado — continúe con el Paso 7 |
"code": 8 (límite agotado) | Cuota de dominios protegidos llena | Bloqueante — los dominios protegidos son obligatorios para CSD. Elimine dominios protegidos no utilizados o contacte a su administrador. |
Evidencia
Sección titulada «Evidencia»La respuesta del POST en sí es la evidencia principal — devuelve el objeto del dominio registrado con spec.protected_domain coincidiendo con su dominio raíz. Alternativamente, liste todos los dominios protegidos para confirmar:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \ | jq '.items | length'| Campo | Esperado | Estado |
|---|---|---|
POST devolvió protected_domain | Coincide con F5XC_ROOT_DOMAIN | PASS |
POST devolvió 200 o 409 | Dominio registrado o ya existe | PASS |
| Recuento de elementos en la lista | > 0 | PASS |
Paso 7: Verificar
Sección titulada «Paso 7: Verificar»Resolución DNS
Sección titulada «Resolución DNS»Confirme que el registro A se está resolviendo y que el CNAME del desafío ACME está en su lugar:
dig +short xF5XC_DOMAINNAMEx Adig +short _acme-challenge.xF5XC_DOMAINNAMEx CNAMEEl registro A debería devolver la dirección IP VIP. El CNAME debería apuntar a *.autocerts.ves.volterra.io (o un destino autocerts relacionado).
Estado del balanceador de carga
Sección titulada «Estado del balanceador de carga»Compruebe que ambos balanceadores de carga han salido de sus estados pendientes. El LB HTTP es la verificación principal — debería alcanzar VIRTUAL_HOST_READY una vez que el DNS se resuelva, sin dependencia de certificados. El estado del certificado del LB HTTPS es solo informativo.
LB HTTP (primario — debe estar en READY para continuar):
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}'| Campo | Esperado | Estados intermedios |
|---|---|---|
state | VIRTUAL_HOST_READY | VIRTUAL_HOST_PENDING_A_RECORD — DNS no configurado (consulte el Paso 4) |
LB HTTPS (secundario — informativo, no bloquea la progresión):
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}'| Campo | Esperado | Estados intermedios |
|---|---|---|
state | VIRTUAL_HOST_READY | VIRTUAL_HOST_PENDING_A_RECORD — DNS no configurado; VIRTUAL_HOST_DNS_A_RECORD_ADDED — registro A encontrado, esperando certificado |
cert_state | CertificateValid | PreDomainChallengePending — esperando CNAME ACME; DomainChallengeStarted — desafío ACME en progreso; AutoCertDomainRateLimited — límite de frecuencia de Let’s Encrypt alcanzado (esperado en entornos de demostración, no afecta al LB HTTP) |
Configuración de JS
Sección titulada «Configuración de JS»curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/js_configuration" \ | jq .La respuesta contiene un campo scriptTag con la etiqueta HTML <script> completa que el balanceador de carga inyecta en las respuestas de página.
Dominios detectados
Sección titulada «Dominios detectados»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 detectados
Sección titulada «Scripts detectados»El endpoint de scripts requiere un rango de tiempo usando marcas de tiempo epoch (segundos desde el epoch Unix). El ejemplo siguiente consulta los últimos 7 días.
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}]'Campos de formulario
Sección titulada «Campos de formulario»El endpoint de campos de formulario requiere un rango de tiempo usando marcas de tiempo epoch, pasadas como parámetros de consulta.
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'Resumen de evidencias de la Fase 1
Sección titulada «Resumen de evidencias de la Fase 1»Después de completar todas las verificaciones, el asistente de IA debe presentar una tabla de estado consolidada:
| ID de prueba | Verificación | Esperado | Obligatorio | Estado |
|---|---|---|---|---|
| DNS-1 | Registro A resuelve | IP VIP devuelta | Sí | PASS / FAIL |
| DNS-2 | CNAME ACME existe | *.autocerts.ves.volterra.io | No | PASS / PENDING |
| LB-1 | Estado del LB HTTP | VIRTUAL_HOST_READY | Sí | PASS / PENDING |
| LB-2 | Estado del LB HTTPS | VIRTUAL_HOST_READY | No | PASS / PENDING / INFO |
| TLS-1 | Estado del certificado | CertificateValid | No | PASS / PENDING / INFO |
| CSD-1 | Configuración de JS | scriptTag presente | Sí | PASS / FAIL |
| CSD-2 | Estado de CSD | isEnabled: true | Sí | PASS / FAIL |
| CSD-3 | Dominio protegido | Dominio registrado | Sí | PASS / FAIL |
Si LB-1 muestra PENDING, sondee cada 30 segundos hasta 4 iteraciones (2 minutos en total). Si LB-1 sigue sin estar en VIRTUAL_HOST_READY después de 4 iteraciones, verifique la resolución DNS con dig e informe al operador — no continúe hasta que LB-1 alcance READY. Para LB-2 y TLS-1, sondee cada 60 segundos hasta 10 iteraciones (10 minutos). Si aún se encuentra en un estado intermedio después de 10 iteraciones, registre el estado actual como INFO y continúe — estos son informativos y no bloquean la progresión de la demostración.
Fase 1 completada. Continúe con la Fase 2 — Ataque para ejecutar la simulación de ataque.