Infraestructura inmutable: redes
17 de abril de 2015
0 minutos de lecturaNota del editor
Este blog se publicó originalmente en fugue.co. Fugue se unió a Snyk en 2022 y es un componente clave de Snyk IaC.
Si trabajas con infraestructura de red, sabes que puede acumular defectos; es decir, desviarse de su configuración original. Uno de nuestros objetivos al crear Fugue como sistema operativo (SO) para la nube y como fuente única de verdad y confianza para tu infraestructura es evitar esta desviación y mantenerla en un estado conocido y confiable. Después de todo, «un sistema confiable solo hace lo que su autor pretende».
Anteriormente, nos enfocamos en los «defectos» que acumulan las instancias de cómputo, pero este problema también está presente en otros componentes de la infraestructura, como las redes. La desviación de la configuración de las redes suele ocurrir cuando se interviene manualmente para implementarlas y mantenerlas. He visto configuraciones de red que ocupan cientos de filas en hojas de cálculo y se implementan a mano, línea por línea. Cuando la aplicación no funciona correctamente, la solución habitual suele ser intervenir directamente de forma manual para abrir puertos y rangos de direcciones IP.
Esto suele significar que la nueva configuración no se actualiza en la hoja de cálculo original. Entonces, las soluciones temporales se vuelven permanentes porque se olvidan. Cuando se agrega un nuevo servicio a la aplicación, se requiere más intervención manual. Esta intervención manual no solo expone las aplicaciones a posibles riesgos de seguridad —al abrir inadvertidamente reglas de grupos de seguridad—, sino que también puede causar un tiempo de inactividad significativo si se eliminan reglas o rutas por error.
El desafío de configurar redes se ha resuelto en parte gracias a herramientas y servicios de DevOps como AWS CloudFormation, que reemplaza la implementación manual por la automatización de la infraestructura. En este entorno, las configuraciones de red pueden expresarse en un lenguaje específico de dominio (DSL) controlado o en una plantilla que se puede repetir, auditar y probar.
Sin embargo, muchas de estas herramientas se quedan cortas. Simplemente implementan las configuraciones de red, pero no hacen cumplir el estado previsto después de la implementación inicial. Esto se hace evidente cuando se realiza un cambio manual en la red después de implementarla con estas herramientas. En el peor de los casos, los cambios quedan tal cual. En el mejor de los casos, solo se hacen cumplir las reglas que se implementaron originalmente.
Fugue lleva un paso más allá la automatización y el control de las redes. Fugue busca que las redes siempre vuelvan al estado previsto al implementarlas. Si se eliminan reglas definidas originalmente en una composición, Fugue las restaurará. Si aparecen en tu red reglas nuevas que no estaban definidas en la composición, Fugue las eliminará.
Para ilustrarlo, veamos un ejemplo breve pero eficaz con grupos de seguridad de AWS:
En el código de Ludwig anterior, definimos el grupo de seguridad web-server-sg, que permite el tráfico entrante por el puerto 80 originado desde web-elb-sg. Cuando este código se compila y ejecuta, Fugue Conductor se asegura de que los grupos y las reglas de seguridad que definiste en tu composición se implementen en tu cuenta de AWS.
Pero Conductor no se detiene ahí. Al igual que con las instancias EC2, Conductor compara periódicamente (actualmente, cada 10 segundos) tu composición en ejecución con lo que se definió y compiló originalmente. Si la infraestructura de red no coincide con lo que Conductor ve en la composición, hará los cambios necesarios en tu infraestructura para mantenerla fiel a la configuración original.
Pongamos a prueba Fugue provocando algunos defectos en nuestra red. Para hacerlo, interpretaré el papel de un administrador de sistemas novato, pero bienintencionado, que quería revisar algunos registros del servidor mientras los servidores web estaban en funcionamiento (supondremos que no sabía que acababan de implementar un sistema de administración de registros).
Al iniciar sesión en la consola de administración de AWS, agregaré una regla de grupo de seguridad que permite SSH desde 0.0.0.0/0. Como puedes ver en el video de abajo, la regla se elimina segundos después de agregarla y el grupo de seguridad vuelve a su configuración original.

Ahora veámoslo desde otro ángulo. Supongamos que es viernes por la tarde y que nuestro administrador de sistemas bienintencionado quería revisar las reglas de seguridad de la cuenta de AWS antes de irse el fin de semana. En este caso, simularemos una situación en la que elimina por error la regla del grupo de seguridad que permite el tráfico entrante por el puerto 80 a los servidores web. Sin darse cuenta de lo que hizo, cierra rápidamente su laptop y se va al bar.
En una situación típica, esto podría causar una interrupción importante del sitio. Si revisamos el caso, vemos que el sitio solo estaría inactivo hasta 10 segundos. Conductor realiza la verificación y vuelve a crear rápidamente la regla del grupo de seguridad, tal como se definió en la composición de Ludwig.

Esto no se aplica solo a los grupos y las reglas de seguridad. Conductor también mantiene la fidelidad de otras configuraciones de red, como las rutas de VPC, las ACL de red, las puertas de enlace de Internet y las subredes, entre otras.
Pero ¿qué pasa si quiero cambiar algo en mi composición?
Hacer cambios en una composición en ejecución es sencillo. Supongamos que quieres agregar una regla al grupo de seguridad de ELB que permita el tráfico por el puerto 443 desde Internet. Primero, modifica tu composición de Ludwig para reflejar esos cambios.
Cuando termines de editar, ve a la CLI de Fugue y ejecuta los siguientes comandos:
El comando load de Fugue compila la composición modificada y la carga en S3. Luego, el comando update de Fugue indica a Conductor que obtenga la versión actualizada de S3 y aplique los cambios a la composición en ejecución.
¿Por qué es importante?
Puedes pasar horas cada semana modificando y manteniendo manualmente las configuraciones de red y, aun así, los defectos seguirán apareciendo. No es una forma inteligente de aprovechar los recursos del equipo. Fugue ofrece una manera automatizada y determinista de implementar, mantener y actualizar los componentes de la infraestructura. Dile a Conductor qué quieres y lo hará realidad, y se asegurará de que siga así.
Con Fugue, puedes mantener la fidelidad de tus redes y, al mismo tiempo, reducir los tiempos de implementación y la carga de mantenimiento continuo. Como el DSL de Ludwig se basa en la intención, se puede repetir, hacer cumplir y auditar. Así, puedes operar tus aplicaciones con la confianza de saber que las configuraciones de red se mantienen constantemente en el estado previsto.
Con una infraestructura de red inmutable, cumplir con los estrictos requisitos internos y externos de seguridad y cumplimiento para tus aplicaciones está a solo unas líneas de código.
