Usar un bastion es cosa del pasado
Te cuento una muy buena alternativa al uso de una instancia bastion para poder acceder a tus redes privadas en el cloud
Table of contents
Introducción
Si te encontraste creando o administrando infraestructura en la nube, seguramente tuviste que encontrar una manera de poder acceder a los recursos que se despliegan en redes privadas, porque la información sensible la despliegas en redes sin acceso a internet, verdad?
Lo cierto es que para lograr este objetivo existen varias alternativas, pero la que se utilizaba y se sigue utilizando mucho es la de el famoso servidor bastión.
Qué es un servidor bastión?
No es más que una máquina virtual que, a nivel de red, tiene un acceso público protegido (ssh generalmente) y por otro lado acceso a las redes privadas que necesitamos.
Es una buena alternativa, se puede esconder el puerto utilizando otro que no sea el conocido 22, se pueden permitir solo ciertos accesos, controlar desde qué ip accedemos, etc...
La realidad es que sigue siendo engorroso mas cuando necesitas que desarrolladores accedan por ejemplo a las bases de datos gestionar los usuarios de este sistema, permisos y demás tareas de mantenimiento de servidores que ya están volviendose un poco obsoletas (estás deacuerdo?)
No seas misterioso, que alternativa tenemos
No vamos a descubrir nada nuevo aquí, pero sabemos que las famosas redes privadas virtuales (VPN) nos vienen como anillo al dedo para estas cosas.
El problema es que generar un servidor VPN en una máquina virtual, gestionarlo y todo lo que implica tampoco es muy tentador.
Aquí entra en juego la magia de los proveedores cloud y sus servicios gestionados, en este caso en AWS disponemos de la posibilidad de crear un "Client VPN Endpoint" (dentro de VPC --> VIRTUAL PRIVATE NETWORK (VPN))
Qué es un client VPN endpoint
Pues mira lo clarito que lo indican desde AWS, no hay mucho que agregar:
"AWS Client VPN is a managed client-based VPN service that enables you to securely access your AWS resources and resources in your on-premises network. With Client VPN, you can access your resources from any location using an OpenVPN-based VPN client."
Creación de VPN en AWS
Para el ejemplo vamos a utilizar el servicio de VPN Endpoint con una autenticación mediante certificados, podríamos utilizar Active Directory o usuarios federados con SAML
Lo primero que realizaremos será crear localmente los certificados que luego cargaremos en ACM para poder utilizarlos en el servicio de VPN endpoint
Creación de certificados
Para la creación de los certificados vamos a utilizar un repositorio oficial de open-vpn que nos simplifica este proceso: easy-rsa
Clonamos el repositorio e ingresamos a la carpeta
git clone https://github.com/OpenVPN/easy-rsa
cd easy-rsa/easyrsa3
Ejecutamos
./easyrsa init-pki
Creamos nuestro CA
./easyrsa build-ca nopass
Creamos los certificados completos para el server "myserver"
./easyrsa build-server-full myserver nopass
Creamos los certificados completos para el client "client1"
./easyrsa build-client-full client1.domain.tld nopass
Dentro de la carpeta pki tendremos nuestras claves creadas:
ca.crt
pki/issued/myserver.crt
pki/private/myserver.key
pki/issued/client1.domain.tld.crt
pki/private/client1.domain.tld.key
Ahora debemos simplemente importar estos certificados en AWS ACM, en este caso lo realizaremos desde el cli de AWS (asumimos que ya tenemos configurados los accesos programáticos)
Importamos los certificados en AWS ACM
aws acm import-certificate --certificate fileb://pki/issued/myserver.crt --private-key fileb://pki/private/myserver.key --certificate-chain fileb://pki/ca.crt --region us-east-1
aws acm import-certificate --certificate fileb://pki/issued/client1.domain.tld.crt --private-key fileb://pki/private/client1.domain.tld.key --certificate-chain fileb://pki/ca.crt --region us-east-1
Ya con estos datos podemos ir a la consola web de AWS y configurar el VPC endpoint
Configuración de VPC endpoint
Una vez nos logueamos en AWS, nos movemos a VPC--> VPN --> Client VPN Endpoints. Hacemos click en "Create Client VPN Endpoint"
Completamos los datos iniciales, con un CIDR de la red que entragara a los clientes.
Para la autenticación seleccionamos tanto el certificado del servidor como el del cliente
Luego lo importante es la VPC y el sg para la configuración
En este punto disponemos de un VPN endpoint crado y configurado pero no está asociado con ninguna de nuestras VPC, para asociarlo simplemente hacemos click en el tab "Associations" y hacemos click en Associate
Configuramos la VPC que necesitamos acceder y seleccionamos una subnet para acceder (importante es una subnet pública que es donde se asocia el endpoint y debemos poder accederlo desde internet)
Si necesitamos redundancia podemos asociar otra subnet de otra AZ en la misma VPC.
Lo que nos queda por crear es quién puede acceder a este endpoint, nos movemos al tab Authorization y creamos un nuevo ingress
Aquí ya debemos configurar nuestro CIDR privado y aceptar la configuración
Una vez terminado todo este calvario de configuraciones podemos simplemente descargarnos el archivo de configuración para el acceso haciendo click en la parte superior en "Download client configuration"
Ingresando a la VPN
Una vez descargado el archivo de configuración solo nos resta utilizar nuestro cliente de openvpn favorito pasarle el archivo y conectarnos.
AWS tiene un cliente, que podemos utilizarlo sin inconvenientes: AWSClient
Conclusión
Como podemos ver existen alternativas al clasico bastion al momento de ingresar a las redes privadas dentro de AWS, espero que sea de utilidad. Compartime tus experiencias con este tipo de accesos. Nos vemos en el próximo post!