Runner
Descripción general
Sección titulada «Descripción general»runner.sh es el orquestador de suites que ejecuta todos los scripts numerados de un directorio de suite en orden, captura la salida y registra los metadatos de los resultados. Se instala en /opt/traffic-generator/suites/runner.sh en la VM.
runner.sh <suite-name> [--dry-run]Argumentos:
| Argumento | Requerido | Descripción |
|---|---|---|
suite-name | Sí | Nombre del directorio de la suite (p. ej., web-app-attacks, api-attacks) |
--dry-run | No | Muestra lo que se ejecutaría sin ejecutar ningún script |
Ejemplos:
# Run the web-app-attacks suite/opt/traffic-generator/suites/runner.sh web-app-attacks
# Dry-run to preview api-attacks scripts/opt/traffic-generator/suites/runner.sh api-attacks --dry-run
# Run bot simulation/opt/traffic-generator/suites/runner.sh bot-simulationConfiguración
Sección titulada «Configuración»config.env
Sección titulada «config.env»El runner lee la configuración desde /opt/traffic-generator/config.env:
# Required: target FQDN (F5 XC load balancer domain)TARGET_FQDN=demo.example.com
# Optional: direct origin IP for baseline testing (bypasses F5 XC)TARGET_ORIGIN_IP=Este archivo se escribe automáticamente durante el aprovisionamiento de Terraform a partir de las variables target_fqdn y target_origin_ip. Para cambiar el destino después del despliegue, edite este archivo directamente en la VM.
Anulación mediante variables de entorno
Sección titulada «Anulación mediante variables de entorno»Cualquier variable en config.env puede anularse exportándola antes de ejecutar la suite:
# Override target FQDN for a single runTARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh web-app-attacks
# Override via exportexport TARGET_FQDN=staging.example.com/opt/traffic-generator/suites/runner.sh web-app-attacksLa ruta al archivo de configuración también puede anularse:
CONFIG_FILE=/tmp/my-config.env /opt/traffic-generator/suites/runner.sh web-app-attacksModo Dry-Run
Sección titulada «Modo Dry-Run»El indicador --dry-run muestra cada script que se ejecutaría sin ejecutarlo:
/opt/traffic-generator/suites/runner.sh web-app-attacks --dry-runSalida:
=== 01-sqli.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/01-sqli.sh demo.example.com=== 02-xss.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/02-xss.sh demo.example.com=== 03-command-injection.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/03-command-injection.sh demo.example.com=== 04-path-traversal.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/04-path-traversal.sh demo.example.com=== 05-nikto-scan.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/05-nikto-scan.sh demo.example.com=== 06-nuclei-scan.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/06-nuclei-scan.sh demo.example.com=== Suite Complete ===Passed: 0 | Failed: 0 | Skipped: 6Results: /opt/traffic-generator/results/20260425-143000-web-app-attacksUtilice el modo dry-run para verificar la estructura de la suite tras el despliegue o antes de ejecutarla contra un nuevo destino.
Directorio de resultados
Sección titulada «Directorio de resultados»Cada ejecución de suite crea un directorio de resultados con marca de tiempo:
/opt/traffic-generator/results/<YYYYMMDD-HHMMSS>-<suite-name>/Estructura:
/opt/traffic-generator/results/20260425-143000-web-app-attacks/ meta.json 01-sqli.sh.log 02-xss.sh.log 03-command-injection.sh.log 04-path-traversal.sh.log 05-nikto-scan.sh.log 06-nuclei-scan.sh.logLa salida estándar y los errores de cada script se capturan en un archivo .log con el nombre del script.
Formato de meta.json
Sección titulada «Formato de meta.json»El archivo meta.json registra los metadatos de ejecución de la suite:
{ "suite": "web-app-attacks", "target": "demo.example.com", "started": "2026-04-25T14:30:00Z", "completed": "2026-04-25T14:45:23Z", "status": "completed", "passed": 5, "failed": 1, "skipped": 0}| Campo | Descripción |
|---|---|
suite | Nombre de la suite |
target | FQDN de destino utilizado en la ejecución |
started | Marca de tiempo UTC cuando inició la suite |
completed | Marca de tiempo UTC cuando finalizó la suite |
status | running durante la ejecución, completed al terminar |
passed | Número de scripts que finalizaron con código 0 |
failed | Número de scripts que finalizaron con código distinto de cero |
skipped | Número de scripts omitidos (no ejecutables o en modo dry-run) |
Ejecución de scripts individuales
Sección titulada «Ejecución de scripts individuales»Cada script puede ejecutarse de forma independiente sin el runner:
# Run a single script directly/opt/traffic-generator/suites/web-app-attacks/01-sqli.sh demo.example.com
# Run a specific API attack/opt/traffic-generator/suites/api-attacks/01-vampi-owasp-top10.sh demo.example.comLos scripts aceptan el FQDN de destino como primer argumento posicional. No leen config.env directamente; solo el runner lo hace. Al ejecutar de forma independiente, debe pasar el FQDN explícitamente.
Ejecución de todas las suites en secuencia
Sección titulada «Ejecución de todas las suites en secuencia»Para ejecutar todas las suites una tras otra:
for suite in web-app-attacks api-attacks bot-simulation reconnaissance ssl-scanning javascript-exploits traffic-generation; do echo "=========================================" echo "Starting suite: ${suite}" echo "=========================================" /opt/traffic-generator/suites/runner.sh "$suite" echo ""doneEsto genera tráfico exhaustivo a través de todas las funcionalidades de seguridad de F5 XC. Se espera que la ejecución completa tome entre 45 y 80 minutos según los tiempos de respuesta del destino.
Ejecución remota mediante SSH
Sección titulada «Ejecución remota mediante SSH»Ejecute suites desde su máquina local sin mantener una sesión SSH activa:
TGEN_IP=$(terraform output -raw public_ip)
# Run a single suitessh azureuser@${TGEN_IP} '/opt/traffic-generator/suites/runner.sh web-app-attacks'
# Run a suite with target overridessh azureuser@${TGEN_IP} 'TARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh api-attacks'
# Run in background (disconnection-safe)ssh azureuser@${TGEN_IP} 'nohup /opt/traffic-generator/suites/runner.sh web-app-attacks > /tmp/web-app-attacks.log 2>&1 &'
# Check results laterssh azureuser@${TGEN_IP} 'ls -la /opt/traffic-generator/results/ | tail -5'ssh azureuser@${TGEN_IP} 'cat /opt/traffic-generator/results/$(ls -t /opt/traffic-generator/results/ | head -1)/meta.json'Para suites de larga duración, utilice nohup o tmux para evitar que la desconexión SSH interrumpa el proceso:
ssh azureuser@${TGEN_IP} 'tmux new-session -d -s traffic "/opt/traffic-generator/suites/runner.sh reconnaissance"'
# Reattach later to watch progressssh -t azureuser@${TGEN_IP} 'tmux attach-session -t traffic'Flujo de ejecución
Sección titulada «Flujo de ejecución»-
Cargar configuración — El runner lee
config.env(o la anulaciónCONFIG_FILE), luego verificaTARGET_FQDNen el entorno. -
Validar la suite — Confirma que el directorio de suite indicado existe bajo el directorio de suites. Lista las suites disponibles si no se encuentra.
-
Crear el directorio de resultados — Crea
/opt/traffic-generator/results/<timestamp>-<suite>/y escribe elmeta.jsoninicial constatus: running. -
Ejecutar los scripts — Itera sobre los archivos que coinciden con
[0-9]*en el directorio de la suite, ordenados por nombre. Omite los archivos no ejecutables. PasaTARGET_FQDNcomo primer argumento. Captura la salida en<script-name>.log. -
Registrar los resultados — Actualiza
meta.jsoncon la marca de tiempo de finalización y los conteos de scripts aprobados, fallidos y omitidos.