cowsay "Bienvenido"
Este proyecto presenta la implementación de un bastion host inmutable en AWS, utilizando una combinación de tecnologías como Nixos Flakes para la configuración del sistema operativo, WireGuard para la conexión VPN segura y Terraform para la provisión de infraestructura como código. El bastion host actúa como un punto de acceso seguro para administrar instancias EC2 que se encuentran en subredes privadas dentro de una VPC.

WireGuard VPN: Este servicio es signifivativamente más rápido que otras soluciones VPN tradicionales, como OpenVPN o IPSec, ya que su código es más simple y eficiente, lo que resulta en una menor latencia y mayor rendimiento. Para AWS específicamente, WireGuard funciona excelentemente con instancias EC2 pequeñas, ya que no requiere muchos recursos de CPU o memoria, se intergra muy bien con los Grupos de Seguridad de AWS y su despliegue puede ser automatizado fácilmente con herramientas como Terraform.
Nixos + Flakes: Esta combinación ofrece una forma poderosa y flexible de gestionar la configuración del sistema operativo, con Flakes se obtienen builds reproducibles que permiten destruir y recrear el sistema en cualquier momento, y en cualquier región de AWS, lo cual es crucial para disaster recovery y escalabilidad. La configuración completa está versionada en Git, incluyendo WireGuard, reglas de firewall, usuarios autorizados y todo el sistema.
Terraform: Esta herramienta de infraestructura como código permite definir y gestionar todos los recursos de AWS necesarios para el bastion host inmutable de manera declarativa. Con Terraform, es posible automatizar la creación de la VPC, subredes, instancias EC2, reglas de seguridad y otros componentes, asegurando que la infraestructura sea consistente y fácil de replicar en diferentes entornos.
En el directorio del proyecto, dentro de la subcarpeta: "server-keys" usar el siguiente comando:
wg genkey | tee private.key | wg pubkey > public.keyEsto generará dos archivos: private.key y public.key. El archivo private.key es la llave privada que se usará en el bastion host, mientras que el archivo public.key es la llave pública que se compartirá con el cliente para establecer la conexión WireGuard.
Posteriormente crearemos las llaves para el equipo local en el directorio "/etc/wireguard":
wg genkey | tee local-private.key | wg pubkey > local-public.keyUna vez realizado este paso, es importante cambiar los permisos de nuestra llave privada:
sudo chmod 600 /etc/wireguard/local-private.keyCon ambos pares de llaves listos, debe editarse primero el archivo de configuration.nix que se encuentra en la subcarpeta "flake-wireguard" en la sección de "publicKey" introduciendo el contenido de la llave local-public.key.

Antes de desplegar, editar el archivo "variables.tf" y especificar en "key_name" el nombre del key pair de AWS para acceso SSH. Luego ejecutar "terraform init" y "terraform apply" desde la carpeta del proyecto para crear todos los recursos en AWS.

Una vez completado el despliegue, Terraform mostrará en la terminal la IP pública del bastion host y la IP privada del servidor de pruebas, necesarias para configurar WireGuard.

Finalmente, crear el archivo de configuración "/etc/wireguard/wg0.conf" en el equipo local con el siguiente contenido:

Una vez realizado este paso, es necesario iniciar el servicio de WireGuard en el equipo local:
sudo wg-quick up wg0Con esto, ya deberíamos tener un bastion host inmutable en AWS con WireGuard configurado y funcionando. Para probarlo podemos hacer un ping desde el equipo local a la IP privada del servidor de prueba en AWS

Este proyecto demuestra los beneficios de combinar NixOS, WireGuard y Terraform para crear infraestructura inmutable en AWS. La inmutabilidad de NixOS garantiza reproducibilidad exacta de la configuración del servidor, permitiendo rollback instantáneo ante cualquier problema. La integración con Terraform automatiza completamente el despliegue de la infraestructura, mientras que WireGuard proporciona una VPN de alto rendimiento con mínima sobrecarga. Esta arquitectura es ideal para entornos que requieren alta disponibilidad, disaster recovery y configuraciones versionadas en Git. El código fuente completo está disponible en mi repositorio de GitHub. immutable-bastion-nixos
Sitio alojado en AWS Amplify
Built with Reflex