Home

bash

ehoyos/

cowsay "Bienvenido"

Bastión Inmutable en AWS implementado con Nixos, WireGuard y Terraform

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.

Arquitectura del proyecto

Arquitectura del proyecto Immutable Bastion

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.

Requisitos previos:

  • AWS CLI instalado y configurado con las credenciales de usuario adecuadas.
  • Key pair de AWS para acceder a las instancias EC2.
  • Terraform, WireGuard y Git instalados en la máquina local.

Despliegue del bastión inmutable

En el directorio del proyecto, dentro de la subcarpeta: "server-keys" usar el siguiente comando:

wg genkey | tee private.key | wg pubkey > public.key

Esto 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.key

Una vez realizado este paso, es importante cambiar los permisos de nuestra llave privada:

sudo chmod 600 /etc/wireguard/local-private.key

Con 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.

Archivo configuration.nix

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.

Key pair de AWS para acceso SSH

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.

IPs del bastion host y servidor de pruebas

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

Archivo de config local para wireguard

Una vez realizado este paso, es necesario iniciar el servicio de WireGuard en el equipo local:

sudo wg-quick up wg0

Con 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

Ping desde el equipo local a la IP privada del servidor de prueba en AWS

Conclusiones y Repositorio en GitHub del Proyecto

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