Desarrollo de una arquitectura simple y segura con AWS
Para desarrollar este ejemplo debes tener un conocimiento básico de AWS, TCP/IP, y Linux. De igual forma explicaré un poco sobre los componentes, pero te recomiendo tener nociones básicas de AWS.
- La infraestructura AWS se encuentra en la región US-EAST (Virginia)
- Se presentan los siguientes componentes:
- 1 Virtual Private Cloud ubicada en la Región US-East (Virginia).
- 3 Zonas de Disponibilidad, Availability Zone A, B y C
- 2 Subredes privadas y 1 Subred Pública
- 3 Instancias EC2
- Un Bucket S3
- 1 ELB , Route 53
Tabla de contenidos
Creando la VPC
Una VPC es una red privada virtual, esta red es una sección en la nube de AWS. Dentro de la cual podemos desplegar los servicios, instancias y lo que se necesite.
Configurando las Subnets Publicas y Privadas
Dentro de nuestra VPC podemos crear múltiples subnets. Segun la arquitectura propuesta, tenemos que tener una pública y 2 privadas. ¿A qué me refiero con esto?
Nuestras subredes privadas no tendrán salida a internet por motivos de seguridad. Dentro de estas subnets privadas levantaremos nuestro servidor web y las bases de datos.
Pero, ¿cómo vamos a instalar los paquetes necesarios?, ¿cómo accederemos a través de ssh para configurar el servidor?.
Para conectarnos por SSH usaremos la red pública, en la cual estará un Bastion Host a través del cual podremos conectarnos a nuestro servidor. Y también habilitaremos el acceso a internet para nuestras subredes privadas, pero sólo para poder descargar paquetes dentro de nuestro servidor web a través de un Nat Gateway. Explicaré poco a poco estos conceptos mientras avanzamos.
Nuestras Subnets quedarían de la siguiente forma:
Tablas de Enrutamiento (parte 1)
Tenemos que crear 2 tablas de enrutamiento, una pública y una privada.
Internet Gateway y NAT Gateway
En ese caso utilizaremos un NAT Gateway, que nos permite tener acceso a internet en nuestras redes privadas, redes que no queremos publicar en internet.
Esta es una explicación muy sencilla, para mayor información consultar estos enlaces:
Configurando el Internet Gateway
Ahora, asignamos el IG a la VPC creada.
Tablas de Enrutamiento (parte 2)
Una vez hayamos asignado el IG a la VPC, tenemos que definir en nuestras tablas de enrutamiento lo siguiente:
- Primero, dentro de la Route Table “Public”, definimos que para el destino “0.0.0.0/0”, nuestro Target será el Internet Gateway.
Quedará de la siguiente forma:
Tambien se tiene que asociar las subnets PUBLICAS, a esta tabla de enrutamiento.
Configurando el NAT Gateway
Ahora, asociamos las subredes privadas al Nat Gateway
Instancias EC2
Para mayor información, consultar los siguientes enlaces:
Bastion Host
Un Bastion Host, es un concepto muy interesante a la hora de configurar una red segura.
Basicamente tenemos que configurar un servidor, el cual tendrá acceso a través de internet(SSH), este servidor estará configurado con TODAS las políticas de seguridad necesarias (Hardening), Tiene que haber pasado por un proceso de ethical hacking, tener algún honeypot, Firewall… etc etc.
Esto es porque el servidor estará expuesto a internet.
A través de este servidor, podremos acceder a la red interna de nuestra organización (VPC),
El siguiente gráfico representa como funciona un Bastion Host.
Creando las instancias EC2
Instancia EC2 (Bastion Host)
Primero crearemos una instancia para nuestro bastion host, utilizando una AMI del market. El cual será un servidor Ubuntu.
Ahora configuramos los detalles de la instancia:
- Seleccionamos nuestra VPC.
- Utilizaremos la subnet Pública que previamente hemos configurado.
- Habilitamos la opción para que se nos asigne una dirección IP pública.
Configurando el Security Group.
Un security Group es una especie de Firewall virtual, para nuestras instancias, aquí configuraremos las reglas de entrada y salida de nuestra instancia, habilitaremos puertos, servicios, y accesos a la red.
En esta parte, elegiremos un Security Group existente o crearemos uno nuevo.
Mas información de los Security Groups en este enlace.
Lanzamos la instancia y en unos minutos estará online, para verificar el estado de la instancia, debería ser algo similara la imagen. Ahí tambien figura la Key SSH que hemos configurado para esta instancia. Tambien podemos ver la direccion IP pública para el acceso, pues nuestro bastion Host está dentro de la subnet Pública, y previamente configuramos que se le auto asigne una IP.
Accediendo a través de SSH a nuestro bastion host, para esto previamente hemos descargado la Key-SSH.
Instancia EC2 (Servidor WEB)
Ahora creamos la instancia para el servidor web, utilizaremos otra AMI con Ubuntu para este caso.
- Seleccionamos nuestra VPC.
- Utilizaremos la subnet Privada que previamente hemos configurado.
- Desactivamos la auto-asignación de una ip pública.
Configuramos el nuevo Security Group para nuestra instancia.
En este caso, sòlo habilitaremos el acceso a SSH, pero para una determinada IP, en este caso, la ip privada del Bastion Host. Y habilitamos el puerto 80 para todos.
Revisando los detalles finales de nuestra instancia.
Conexión SSH a nuestro Servidor Web, utilizando el Bastion Host.
SSH Agent Forwarding
Al momento de realizar la conexión SSH, no es recomendable que la llave de nuestro servidor Web se guarde dentro del Bastion Host. Si por algún caso, alguien lograra hackear nuestro bastion host, podría acceder a nuestro servidor web sin necesidad de tener la contraseña. Para esto utilizaremos una opción de SSH, hablo de SSH Agent Forwarding. Para resumir, es un “agente intermediario” entre dos servidores, dentro del “intermediario” no existe ninguna credencial guardada para el acceso a nuestro servidor. Es un poco confuso la primera vez que se ve esto, así que aquí hay un gráfico.
Primero guardamos las llaves SSH en nuestra pc local (tanto la del Bastion host, como la del servidor Web), ten en cuenta, que aún teniendo la LLave del Servidor Web, no puedo acceder desde mi PC-Local, pues el Servidor Web no está expuesto en internet.
Ahora nos conectamos al Bastion host, utilizando la opcion “- A” para decirle que el bastion host será un Agent Forwarding.
Ahora, desde el Bastion Host, ya podremos conectarnos al Servidor Web utilizando una conexión normal de SSH. Si previamente no hubiecemos puesto la opcion “-A”, la petición sería denegada. Nos conectamos a través de la IP privada.
Elastic Load Balancer (ELB)
Ahora utilizaremos un balanceador de carga, y para que esto se haga de forma automática, primero debemos crear una AMI de nuestro servidor Web, pues a partir de esta AMI, se contruirán los demás servidores que utilizará el balanceador de carga.
Creando la AMI
en base a esta AMI, vamos a crear 3 instancias, que serán réplicas de nuestro Servidor Web, las cules serán las que utilizaremos en el ELB. Esto se podría automatizar utilizando un Auto Scaling Group, que también utiliza una AMI para replicar la instancia, pero para nuestro ejemplo no lo utilizamos.
Creamos y Configuramos nuestro ELB
- Configuramos el nombre, y definimos la Zonas de Disponibilidad en las cuales podrá correr nuestro ELB, tambien configuramos las subnets asociadas a estas Zonas.
- Agregamos un Listener, y el tipo de protocolo utilizará, en este caso HTTP.
Verificamos nuestro Listener
Ahora, en nuestros Targets, configuramos las instancias que serán parte de nuestro ELB.
Verificamos el Status de nuestro ELB, debe figurar en “Active”.
Resultado Final
- Tres instancias EC2, cada una en diferentes subnets y distintas Zonas de Disponibilidad.
- Sólo el Bastion Host tiene salida/ingreso a internet a través de una IP pública
- El Bastion host sólo permite la conexión a través de SSH, mediante el uso de una llave.
- En el Bastion Host, no se almacenó ninguna credencial ni ninguna llave.
- El Nat Gateway (quien provee de salida a internet para las instancias privadas), está en la subnet pública, de esta forma es como tiene acceso a internet, pero nuestras instancias de los servidores Web siguen en las subnets privadas.
- La tabla de enrutamiento del Nat Gateway, con las 2 subnets privadas.
- Para probar nuestro balanceador de carga, basta con acceder a nuestro sitio web y actualizar la página repetidas veces, de esta forma se podrá visualizar que cambia de servidores. Para esto, hice una simple página en HTML, que tiene un mensaje distinto para cada servidor.
Conclusiones
- Se pudo aprender algunos conceptos generales sobre como funciona AWS.
- Todo este ejemplo se hizo bajo la capa gratuita de AWS.
- Se desplegó una arquitectura simple y segura, con algunas recomendaciones de seguridad.
- Es recomendable estudiar la mayoría de conceptos en la documentación oficial de AWS.