AWS Bastion Host / Jump Box
Tags: aws, networking
Published: 2022-05-23 03:13:07

Como administradores de sistemas debemos mantener la infraestructura actualizada aplicando parches de seguridad, instalando versiones nuevas del sistema operativo y configurando aplicaciones correctamente para fortalecer la seguridad de los recursos tecnológicos en la nube y cumplir con el modelo de responsabilidades compartidas de aws. Para realizar estas actividades en instancias de EC2 y bases de datos en RDS en necesario acceder a estos recursos de forma segura.


En este post vamos a ver como establecer conexión con instancias EC2 y bases de datos RDS que se encuentran en subredes privadas sin acceso desde Internet a través de un Bastion Host o Jump Box usando las herramientas **OpenSSH** y **[MySQL Workbench](https://www.mysql.com/products/workbench/)**. Utilizaremos la red privada virtual (VPC) y Subredes generadas en el post **[Redes en AWS desde 0](https://dev.to/aws-builders/redes-en-aws-desde-0-35bo)** para proteger la infraestructura creando entornos privados y seguros con topologías de red y controlando el acceso de comunicaciones entrantes o salientes hacia instancias de EC2 o bases de datos en RDS.


Iniciamos creando la instancia EC2 para el Bastion Host, posterior aprovisionando las instancias EC2 y RDS en Subred privada y estableciendo conexión por medio del Bastion Host a las instancias privadas de EC2 y MySQL RDS, comencemos:
&nbsp;



## Crear Bastion Host.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/be3qv3za0xhugthd86sm.png)


Es una instancia de EC2 desplegada en una VPC y Subred publica (con acceso desde internet) para la conexión con instancias EC2 o bases de datos RDS localizadas en VPC y Subredes privadas (sin acceso desde internet) por medio del protocolo SSH (Secure Shell) y TCP/IP. Los pasos para crear un Bastion Host son:
&nbsp;


- 
Usar asistente de lanzamiento de instancia EC2. Seleccionar AMI (Amazon Machine Image), para este ejemplo usamos Amazon Linux 2 AMI.




![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s3mfc3mae4x35mk9qvky.png)
&nbsp;


- 
Seleccionar VPC y Subred Publica en configuración de detalles de la instancia EC2.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mju96vfx0k0aovdxyzeb.png)

En el Post **[Redes en AWS desde 0](https://dev.to/aws-builders/redes-en-aws-desde-0-35bo)** creamos la subred **publicSubnet1A** con CIDR **192.168.0.0/27** y VPC **192.168.0.0/24**, la tabla de enrutamiento y la lista de control de acceso de red (Network ACL) permiten comunicaciones internas y externas.


- 
Crear Security Group (Firewall) con regla de entrada para habilitar conexión SSH por medio del protocolo TCP puerto 22 y desde la dirección IP de nuestro equipo local.




![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3a25al4eu8fzsoldgofv.png)
&nbsp;


- 
Crear llaves (publica y privada) para la autenticación por conexión con SSH.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qalns7z74x783j8kwxni.png)
&nbsp;


- 
Revisar detalles de lanzamiento de la instancia y confirmar.
&nbsp;




&nbsp;
&nbsp;
## Crear instancia EC2 en subred privada.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/btwt9rjo7fgzm5db4h9r.png)

Una instancia EC2 es privada si es desplegada en una subred con restricciones en la comunicación desde internet. Los pasos para crear una instancia EC2 y desplegarla en subred privada son:
&nbsp;


- 
Usar asistente de lanzamiento de instancia EC2. Seleccionar AMI (Amazon Machine Image), para este ejemplo usamos Amazon Linux 2 AMI.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s3mfc3mae4x35mk9qvky.png)
&nbsp;


- 
Seleccionar VPC y Subred Privada en configuración de detalles de la instancia EC2. 



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a0wrzuzmlcu2zryp0p7h.png)


En el Post **[Redes en AWS desde 0](https://dev.to/aws-builders/redes-en-aws-desde-0-35bo)** creamos la subred privateSubnet1A con CIDR **192.168.0.32/27** privada y la VPC **192.168.0.0/24**, la tabla de enrutamiento y la lista de control de acceso de red (Network ACL) permiten comunicaciones internas.
&nbsp;


- 
Crear Security Group (Firewall) con regla de entrada para habilitar conexión SSH por medio del protocolo TCP puerto 22 y desde el Security Group usado por el Bastion Host.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8b7shfb8s3tf7y3gkqic.png)
&nbsp;


- 
Crear llaves (pública y privada) para la autenticación por conexión con SSH. Estas llaves deben ser diferente a las creadas para la instancia del Bastion Host para incrementar la seguridad y mitigar el riesgo de acceso a varios recursos de infraestructura si un atacante secuestra las llaves.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ou72ox9uri90q0g4khpv.png)
&nbsp;


- 
Revisar detalles de lanzamiento de la instancia y confirmar.



&nbsp;
&nbsp;
## Crear Base de Datos RDS en subred privada.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u3omde3ta0viofk55r94.png)

Una instancia de base de datos RDS es privada si es desplegada en una subred con restricciones en la comunicación desde internet. Los pasos para crear una base de datos SQL privada en RDS son:
&nbsp;

- 
Crear Subnet Group con VPC y al menos dos Subredes en 2 zonas de disponibilidad diferentes en la región AWS:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/thvvld218kvnfnxzmhbg.png)


En el Post  **[Redes en AWS desde 0](https://dev.to/aws-builders/redes-en-aws-desde-0-35bo)** creamos la subred privada **privateSubnet1A** con CIDR **192.168.0.32/27** en zona de disponibilidad **us-east-2a** y la VPC con CIDR **192.168.0.0/24**, la tabla de enrutamiento y la lista de control de acceso de red (Network ACL) permiten comunicaciones internas. En la zona de disponibilidad **us-east-2b** tenemos la subred **publicSubnet1B** con CIDR **192.168.0.64/27** en la misma VPC. El objetivo de Subnet Group es agrupar subredes que son usadas para el despliegue de instancias de la base de datos por ejemplo read replica o standby.
&nbsp;



- 
Crear Security Group (Firewall) con regla de entrada para habilitar conexión MYSQL/Aurora por medio del protocolo TCP puerto 3306 y desde el Security Group usado por el Bastion Host



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3djjpyrc53d3l62y9otw.png)
&nbsp;


- 
Usar asistente de lanzamiento de instancia RDS. Seleccionar Motor de Base de Datos, para este ejemplo usamos MySQL:



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lv6t29myqah4a8a8n12t.png)
&nbsp;



- 
Ingresar identificador de instancia de base de datos y crear credenciales de acceso a la base de datos, Master username y Master password:



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvjzja717gkyr2wdjmqq.png)
&nbsp;



- 
Configurar propiedades de conexión a la base de datos, ingresar valores para VPC y Subnet Group (**Creado en el punto 1**), habilitar restricción acceso público, security group (**Creado en el punto 2**), seleccionar zona de disponibilidad donde se encuentra la subred privada (**us-east-2**) y puerto.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xcjqyzoe1c2uvkgj9xyo.png)
&nbsp;



- 
Asignar nombre a la base de datos:



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v0atss3lhbucf1nl0j4h.png)
&nbsp;


- 
Crear base de datos.


&nbsp;
&nbsp;
## Conexión SSH hacia el Bastion Host


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0b4gm5paox0x1vcynk3.png)


Para la conexión hacia el Bastion Host desde nuestro equipo Local podemos utilizar clientes SSH como OpenSSH, PuTTY, MobaXterm, WinSCP y otros. Necesitamos la dirección ip publica o DNS de la instancia EC2 (Bastion Host) y el nombre de usuario por defecto en la AMI usada para crear la instancia EC2. Los pasos para establecer la conexión son:
&nbsp;


- 
Buscar dirección IP publica o DNS en detalles de la instancia EC2:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ngrll9yj3j9x31p4aot0.png)
&nbsp;


- 
Buscar nombre de usuario por defecto usado para crear instancia EC2. Para Amazon Linux 2 AMI el nombre de usuario es **ec2-user**.
&nbsp;


- 
Desde nuestro equipo local usando el cliente OpenSSH por línea de comandos ejecutamos el comando `ssh-add -k` para agregar la llave privada (.pem) del Bastion Host al agente de ssh:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8awqij7vdoazt4gm65fo.png)

En Windows, iniciar el Servicio OpenSSH Authentication Agent primero para ejecutar el comando ssh-add.
&nbsp;


- 
Ejecutar el comando `ssh {user-name}@{public IP address}`, con el nombre de usuario y la dirección ip publica de la instancia EC2 para establecer conexión ssh:



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzk1p5ss7dex3qnqisub.png)


&nbsp;
&nbsp;
## Conexión SSH hacia instancia EC2 Privada



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8cgwqc8m0i9e26be1j9u.png)

Con la conexión establecida con el Bastion Host, ejecutamos los siguientes pasos desde el cliente **OpenSSH** para establecer conexión con la instancia EC2 privada::
&nbsp;


- 
Buscar dirección IP privada en detalles de la instancia EC2:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ki20y9sz334kma8huc7h.png)
&nbsp;


- 
Nombre de Usuario por defecto de la AMI (Amazon Machine Image) utilizada en la creación de la instancia EC2. Para Amazon Linux 2 AMI el nombre de usuario es **ec2-user**.
&nbsp;


- 
Desde nuestro equipo local usando el cliente OpenSSH por línea de comandos ejecutamos el comando `ssh-add -k` para agregar la llave privada (.pem) de la instancia privada al agente de ssh:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uhjgx63rdyjpaatxtffu.png)

En Windows, ejecutar el Servicio OpenSSH Authentication Agent primero para ejecutar el comando ssh-add.
&nbsp;


- 
Ejecutar el comando `ssh – J {user-name}@{public IP address} {user-name}@{private IP address}`, con el nombre de usuario y la dirección ip publica del Bastion Host y el nombre de usuario y la dirección ip de la instancia privada para establecer conexión ssh:



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kym5tmk9djmm1qqnroyr.png)


&nbsp;
&nbsp;
## Conexión Base de datos Privada


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n59k81f769ittfajcvdf.png)

Los pasos para establecer conexión con la base de datos privada por medio del cliente **MySQL Workbench** son los siguientes:
&nbsp;


- 
Buscar end-point y puerto de conexión a la base de datos en detalles de la instancia en RDS.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hiujhs11nhuaxbzevfpf.png)
&nbsp;



- 
Abrir asistente para configurar conexión estándar TCP/IP sobre SSH en MySQL Workbench. Ingresar información en los siguientes parámetros:
&nbsp;


a. **SSH Hostname:** Dirección ip publica o DNS del Bastion Host con el puerto 22.

b. **SSH Username:** Nombre de Usuario por defecto de la AMI (Amazon Machine Image) utilizada en la creación de la instancia EC2. Para Amazon Linux 2 AMI el nombre de usuario es **ec2-user**.

c. **SSH Key File:** Llave privada para la autenticación por conexión con SSH con el Bastion Host.

d. **MySQL Hostname:** End-point de conexión a la base de datos del punto 1.

e. **Username:** Nombre de usuario de la base de datos.

f. **Password:** Contraseña para la autenticación con la base de datos.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4yotbp60brclc9z9ymab.png)
&nbsp;


- 
Probar la conexión



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/87iakqr8y9flv92p2558.png)


&nbsp;
&nbsp;
## Conclusión


En este post vimos los pasos para establecer conexión con instancias de EC2 y RDS privadas de forma segura por medio del Bastion Host como servidor intermedio. Usamos las herramientas **OpenSSH** y **Workbench** como clientes en la conexión con la instancia de EC2 y base de datos en RDS.
&nbsp;


##References

**[How can I use an SSH tunnel and MySQL Workbench to connect to a private Amazon RDS MySQL DB instance that uses a public EC2 instance?](https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-ssh-workbench-connect-ec2/)**
&nbsp;

**[SSH to remote hosts though a proxy or bastion with ProxyJump](https://www.redhat.com/sysadmin/ssh-proxy-bastion-proxyjump)**