Una VM Debian 12 en la VLAN 20 (10.2.20.2) con Elasticsearch, Kibana y Fleet Server (versión 9.4.2 en mi caso)
Elastic Agent y Sysmon en los tres Windows de GOAD, enrolados en Fleet
Detecciones de Elastic Security activas sobre los eventos que llegan
Los puertos del servidor:
9200 → Elasticsearch (donde viven los datos)
5601 → Kibana (la interfaz web)
8220 → Fleet Server (donde se enrolan los agentes)
Roles de Ludus
Ludus tiene dos roles de Ansible de la comunidad para esto. Se añaden y se hacen visibles para el usuario del laboratorio (como administrador):
terminal
ludus ansible role add badsectorlabs.ludus_elastic_containerludus ansible role add badsectorlabs.ludus_elastic_agentludus ansible role scope global badsectorlabs.ludus_elastic_containerludus ansible role scope global badsectorlabs.ludus_elastic_agent
Añadir la VM al rango
Parte de la configuración actual del rango y añade la VM de Elastic al final de la lista ludus:.
terminal
ludus --user <usuario-del-rango> range config get > goad-elastic-config.yml
{{ range_id }} es una variable de plantilla de Ludus: déjala tal cual, con las llaves. Ludus la sustituye por el ID de tu rango (el mismo que tu <usuario-del-rango>), así que la VM acaba llamándose, por ejemplo, GOADLight383ff8-elastic-server. Ese es el nombre que usas luego en el --limit.
Genera una contraseña aleatoria y no la dejes en el repositorio ni la compartas. La RAM: empecé con 8 GB y se quedó corta, mira Problemas y soluciones.
Aplica la configuración y despliega solo lo necesario para no volver a tocar GOAD:
terminal
ludus --user <usuario-del-rango> range config set -f goad-elastic-config.ymlludus --user <usuario-del-rango> range deploy -t network,vm-deploy,dns-rewritesludus --user <usuario-del-rango> range deploy --limit localhost,<usuario-del-rango>-elastic-server
El primero crea la VM y la red. El segundo instala Elastic solo en esa VM. Los despliegues son asíncronos: el comando solo responde Range deploy started, y el avance se ve con ludus --user <usuario-del-rango> range status. Si cambias algo después (a mí me tocó subir la RAM) y quieres relanzar solo el rol:
terminal
ludus --user <usuario-del-rango> range deploy -t user-defined-roles --limit <usuario-del-rango>-elastic-server
Si todo va bien, Kibana responde en https://10.2.20.2:5601 (certificado autofirmado, acepta el aviso). El usuario es elastic y la contraseña la que pusiste en role_vars.
Pantalla de login de Kibana en https://10.2.20.2:5601 una vez desplegado el rol
Agentes en los Windows
El rol ludus_elastic_agent se engancha a las VMs de GOAD con depends_on sobre el rol del servidor Elastic:
En mi caso el rol no dejó los agentes instalados y acabé instalándolos a mano en los tres Windows, replicando las tareas del rol (Elastic Agent 9.4.2 y Sysmon 15.22, política Ludus-Agent-Policy). El detalle que me costó: el token de enrolamiento tiene que ir en base64, no como id:key.
Para comprobarlo, abre Fleet en Kibana, en https://10.2.20.2:5601/app/fleet/agents (o por el menú: Management → Fleet → Agents). Deben salir Healthy los tres Windows y el propio Fleet Server, cuatro agentes en total. Tras encender las VMs, los agentes tardan unos minutos en conectar.
Fleet con los cuatro agentes en Healthy: el Fleet Server y los tres Windows de GOAD-Light, con la política Ludus-Agent-Policy
No lo confundas con la entrada Agents del menú lateral de Kibana: es el Agent Builder, una función de IA que pide licencia Enterprise y no tiene nada que ver con Elastic Agent.
Detecciones
El rol de Ludus instala las integraciones de Windows y Elastic Defend. Las alertas salen de las reglas de Security → Rules → Detection rules; sin reglas activas, los eventos de Sysmon y PowerShell quedan crudos, sin marcar. En mi caso ya había 1206 de 2025 reglas activas y habilité además las 22 de Elastic Defend que faltaban. Revisa cuáles tienes tú.
Al terminar el montaje ya habrá cientos de alertas. Son ruido del propio despliegue de GOAD (enumeración de cuentas, WinRM). Puedes limpiarlas o crear excepciones.