
Marco de pruebas automatizado y reproducible de seguridad de redes usando Ansible y BATS para verificar DNS, disponibilidad de hosts, puertos abiertos y configuración TLS desde múltiples puntos de vista.
Este proyecto utiliza Ansible para generar archivos de prueba BATS que verifican supuestos de seguridad sobre la infraestructura de red. Las pruebas se ejecutan desde máquinas de prueba ("nodos prober") en las que se despliega Prober.
Esta herramienta está diseñada para pruebas automatizadas y reproducibles de redes propias. Admite múltiples nodos prober ejecutando pruebas, cada uno con una vista diferente de la red sondada — por ejemplo, una vista desde la zona externa, desde una zona interna, y una vista desde dentro de la DMZ.
Usar Prober para sondear redes para las que no estás autorizado podría ser ilegal.
En el maestro de Ansible utilizado para desplegar pruebas a los nodos prober:
ansible (¡obvio!)python*-netaddr (en GNU/Linux) / py*-netaddr (en FreeBSD)En los propios nodos prober:
bashsshnmapdig/kdigtestsslEn un sistema donde revises los resultados (archivos *.tap), quizás quieras instalar tappy. Los resultados se mantienen en cada nodo prober, en repositorios git locales (por defecto, en /var/run/prober/results/, ver más abajo las opciones de configuración), con commits etiquetados con la fecha de finalización de cada ejecución de escaneo, para registro histórico y fácil comparación.
Se utiliza Ansible para generar pruebas en los nodos prober. Un nodo prober puede ser cualquier host FreeBSD o GNU/Linux, siempre que sea posible instalar las dependencias de Prober. No necesita estar dedicado a pruebas, pero se recomienda — un escaneo de una red de tamaño razonable tomará horas, usará mucha CPU y generará bastante tráfico.
Tiene sentido desplegar Prober en varias máquinas diferentes para comprobar cómo se ve tu red desde distintos puntos de observación (por ejemplo: red interna, DMZ, Internet).
En el directorio de pruebas en los nodos prober se crea un script run-tests.sh para facilitar la ejecución de las pruebas. Las pruebas se ejecutan de manera que se asegure que <simultaneous_tests_count> pruebas se estén ejecutando simultáneamente en todo momento — esta variable es la forma principal de controlar cuántos recursos usa un escaneo y cuánto ancho de banda necesita.
Los resultados de las pruebas se guardan luego en un repositorio git local, con commits etiquetados con la fecha en que finalizó una ejecución determinada (que puede ser diferente de la fecha de inicio para algunas ejecuciones largas de escaneo).
Si se trata de una infraestructura más grande que solo unos pocos hosts, puede tener sentido usar una herramienta como Mitogen para acelerar drásticamente la generación de pruebas.
Prepara un servidor Debian o FreeBSD para usarlo como nodo prober (llamémoslo prober.example.com), asegúrate de tener acceso SSH a él y poder hacer sudo en él.
Copia el inventario de ejemplo como inventories/test/.
En ese inventario test:
group_vars/all.yml y establece zone_nameserver, zone_domains, address_blocks a tu gusto; supongamos que agregas example.com como el único dominio a sondear.hosts, configurando tu nodo prober prober.example.com en la sección [prober-nodes]; digamos que estableces tested_zone como test.Copia la configuración de zona de ejemplo como data/<tested_zone>.yml (por lo tanto, en nuestro caso: data/test.yml) y edítala; como mínimo, la clave tested_zone_settings.name debe contener el tested_zone (es decir, test).
Exporta tu zona DNS y guárdala como data/<dns_zone>.zone (en nuestro caso: example.com).
Ejecuta el playbook:
ansible-playbook prober.yml -i inventories/test/ -vvv
Esto generará las pruebas en el nodo prober y configurará un cronjob para ejecutarlas cada noche a la 01:00 AM
Ahora puedes hacer ssh al nodo prober e inspeccionar las pruebas generadas en /opt/prober/. Una vez que estés satisfecho, puedes ejecutarlas con: /opt/prober/run_tests.sh. Los resultados se guardarán en /var/run/prober/results.
Variables de configuración (definidas en probers.yml):
tests_directory (por defecto: /opt/prober):
directorio en los nodos prober donde se generan los archivos de prueba (archivos *.bats).
results_repo_directory (por defecto: /var/run/prober/results):
directorio del repositorio para los resultados de las pruebas (archivos *.tap); allí se inicializa un repositorio git y se crea un subdirectorio tap/ para los resultados reales;
los resultados se confirman en el repositorio git, los commits se etiquetan con una fecha
en formato yyyy-mm-dd (el commit con los resultados de una prueba que finalizó el 19 de marzo de 2020
se etiqueta como 2020-03-19, por ejemplo).
simultaneous_tests_count (por defecto: 20):
cuántas pruebas se ejecutan simultáneamente.
prober_dev (por defecto: sin definir):
omite ciertas tareas que no tienen sentido en una máquina de desarrollo
(como configurar cron o zabbix).
Las zonas se definen en archivos ./data/<nombre_de_zona>.yml con la clave principal siendo la cadena "tested_zone_settings", que a su vez contiene las claves:
name: el nombre de la zona, que coincide con el nombre del archivo (sin extensión); por ejemplo: "internal", "external", "dmz"default (opcional): la configuración predeterminada para todos los hosts en esta zona^") que coinciden con múltiples FQDNLa clave default, cada clave de expresión regular y cada clave de dominio a su vez pueden contener estas claves:
resolve: si el host debe resolver a la dirección IP relevante (booleano true/false, o la cadena "skip")ping: si el host debe responder a ping (booleano true/false, o la cadena "skip")ports: lista de puertos TCP y UDP permitidos para estar abiertos (subclaves "tcp" y "udp", cada una contiene un array de enteros que definen los puertos permitidos, o la cadena "skip"), y puertos con TLS habilitado para hacer una inspección más profunda (la subclave tls, que contiene un dict con números de puerto como claves y el tipo de servicio TLS o la palabra "skip" como valor)ports: "skip" es una abreviatura de:
ports:
tcp: "skip"
udp: "skip"
tls: "skip"
Los tipos de servicio TLS son los que testssl.sh soporta para la opción -t/--starttls, "https" para prueba HTTPS (incluyendo cabeceras), o "tls" para prueba TLS genérica."tcp".skip: si el host debe omitirse por completo (booleano)Puedes ver la configuración de ejemplo aquí.
Los valores predeterminados globales se definen en probers.yml. Para cada host sondado, estos se combinen con los valores predeterminados de la zona relevante, luego con las claves de expresión regular que coinciden con un nombre de host dado, y finalmente con la configuración específica del host.