Acceder a un host bastión mediante Session Manager y Amazon EC2 Instance Connect - Recomendaciones de AWS

Acceder a un host bastión mediante Session Manager y Amazon EC2 Instance Connect

Piotr Chotkowski y Witold Kowalik, Amazon Web Services

Resumen

Un host bastión, también denominado jump box, es un servidor que proporciona un único punto de acceso desde una red externa a los recursos ubicados en una red privada. Un servidor expuesto a una red pública externa, como Internet, supone un posible riesgo de seguridad en caso de acceso no autorizado. Es importante proteger y controlar el acceso a estos servidores.

Este patrón describe cómo puede utilizar Session Manager y Amazon EC2 Instance Connect para conectarse de forma segura a un host bastión de Amazon Elastic Compute Cloud (Amazon EC2) implementado en su Cuenta de AWS. Session Manager es una capacidad de AWS Systems Manager. Las ventajas de este patrón incluyen:

  • El host bastión implementado no tiene ningún puerto de entrada abierto expuesto a la Internet pública. Esto reduce la posible superficie expuesta a ataques.

  • No necesita almacenar ni mantener las claves de Secure Shell (SSH) a largo plazo en su Cuenta de AWS. En su lugar, cada usuario genera un nuevo par de claves SSH cada vez que se conecta al host bastión. AWS Identity and Access Management Las políticas de (IAM) adjuntas a las credenciales del usuario de AWS controlan el acceso al host bastión.

Destinatarios previstos

Este patrón está pensado para lectores que tienen experiencia con conocimientos básicos de Amazon EC2, Amazon Virtual Private Cloud (Amazon VPC) y Hashicorp Terraform.

Requisitos previos y limitaciones

Requisitos previos

  • Una Cuenta de AWS activa

  • La versión 2 de la AWS Command Line Interface (AWS CLI) instalada y configurada

  • El complemento de Session Manager para la AWS CLI está instalado.

  • CLI de Terraform, instalada

  • Almacenamiento para el estado de Terraform, como un bucket de Amazon Simple Storage Service (Amazon S3) y una tabla de Amazon DynamoDB que sirven como un backend remoto para almacenar el estado de Terraform. Para obtener más información sobre el uso de backends remotos para el estado de Terraform, consulte los backends de Amazon S3 (documentación de Terraform). Para ver un código de muestra que configura la administración remota del estado con un backend de Amazon S3, consulte remote-state-s3-backend (Terraform Registry). Tenga en cuenta los siguientes requisitos:

    • El bucket de Amazon S3 y la tabla de DynamoDB deben estar en la misma Región de AWS.

    • Al crear la tabla de DynamoDB, la clave de partición debe ser LockID (distingue entre mayúsculas y minúsculas) y el tipo de clave de partición debe ser String. Todos los demás valores de la tabla deben estar en sus valores predeterminados. Para obtener más información, consulte Acerca de las claves principales y Crear una tabla en la documentación de DynamoDB.

  • Un cliente SSH, instalado.

Limitaciones

  • Este patrón pretende ser una prueba de concepto (PoC) o una base para un mayor desarrollo. No debe utilizarse en su forma actual en entornos de producción. Antes de la implementación, ajuste el código de muestra del repositorio para que se adapte a sus requisitos y a su caso de uso.

  • Este patrón supone que el host bastión de destino utiliza Amazon Linux 2 como sistema operativo. Si bien es posible utilizar otras imágenes de máquina de Amazon (AMI), otros sistemas operativos están fuera del ámbito de aplicación de este patrón.

    nota

    Se acerca el fin de la compatibilidad de Amazon Linux 2. Para obtener más información, consulte Amazon Linux 2 FAQs.

  • En este patrón, el host bastión está ubicado en una subred privada sin una puerta de enlace NAT ni una puerta de enlace de Internet. Este diseño aísla la instancia de Amazon EC2 de la red de Internet pública. Puede añadir una configuración de red específica que le permita comunicarse con Internet. Para obtener más información, consulte Conectar su nube privada virtual (VPC) a otras redes en la documentación de Aamazon VPC. Del mismo modo, siguiendo el principio de privilegio mínimo, el host bastión no tiene acceso a ningún otro recurso de su Cuenta de AWS a menos que usted conceda permisos de forma explícita. Para más información, consulte Políticas basadas en recursos en la documentación de IAM.

Versiones de producto

  • CLI de AWS versión 2

  • Terraform versión 1.3.9

Arquitectura

Pila de tecnología de destino

  • Una VPC con una única subred privada

  • Los siguientes puntos de conexión de VPC de interfaz:

    • amazonaws.<region>.ssm: el punto de conexión del servicio de AWS Systems Manager.

    • amazonaws.<region>.ec2messages: Systems Manager utiliza este punto de conexión para realizar llamadas desde SSM Agent al servicio de Systems Manager.

    • amazonaws.<region>.ssmmessages: Session Manager utiliza este punto de conexión para conectarse a la instancia de Amazon EC2 a través de un canal de datos seguro.

  • Una instancia t3.nano de Amazon EC2 que ejecute Amazon Linux 2.

  • Rol de IAM y perfil de instancia

  • Grupos de seguridad de Amazon VPC y reglas de grupos de seguridad para los puntos de conexión y la instancia de Amazon EC2

Arquitectura de destino

Diagrama de arquitectura del uso de Session Manager para acceder a un host bastión.

El diagrama muestra el proceso siguiente:

  1. El usuario asume un rol de IAM que tiene permisos para hacer lo siguiente:

    • Autenticar, autorizar y conectarse a la instancia de Amazon EC2

    • Iniciar una sesión con Session Manager

  2. El usuario inicia una sesión SSH a través de Session Manager.

  3. Session Manager autentica al usuario, verifica los permisos de las políticas de IAM asociadas, comprueba los ajustes de configuración y envía un mensaje al agente SSM para abrir una conexión bidireccional.

  4. El usuario envía la clave pública SSH al host bastión mediante los metadatos de Amazon EC2. Esto debe hacerse antes de cada conexión. La clave pública SSH permanece disponible durante 60 segundos.

  5. El host bastión se comunica con los puntos de conexión de VPC de la interfaz para Systems Manager y Amazon EC2.

  6. El usuario accede al host bastión a través de Session Manager mediante un canal de comunicación bidireccional cifrado con TLS 1.2.

Automatización y escala

Las siguientes opciones están disponibles para automatizar la implementación o escalar esta arquitectura:

  • Puede implementar la arquitectura mediante una canalización de integración y entrega continuas (CI/CD).

  • Puede modificar el código para cambiar el tipo de instancia del host bastión.

  • Puede modificar el código para implementar varios hosts bastión. En el archivo bastion-host/main.tf, en el bloque de recursos aws_instance, añada el meta argumento count. Para obtener más información, consulte la documentación de Terraform.

Herramientas

Servicios de AWS

  • La AWS Command Line Interface (AWS CLI) es una herramienta de código abierto que le permite interactuar con los Servicios de AWS mediante comandos en el intérprete de comandos de la línea de comandos.

  • Amazon Elastic Compute Cloud (Amazon EC2) brinda capacidad de computación escalable en la Nube de AWS. Puede lanzar tantos servidores virtuales como necesite y escalarlos o reducirlos con rapidez.

  • AWS Identity and Access Management(IAM) lo ayuda a administrar de forma segura el acceso a sus recursos AWS al controlar quién está autenticado y autorizado a usarlos.

  • AWS Systems Manager lo ayuda a administrar las aplicaciones y la infraestructura que se ejecutan en la Nube de AWS. Simplifica la administración de aplicaciones y recursos, reduce el tiempo requerido para detectar y resolver problemas operativos y ayuda a utilizar y administrar los recursos de AWS a gran escala. Este patrón utiliza el Administrador de sesiones, una capacidad de Administrador de sistemas.

  • Amazon Virtual Private Cloud (Amazon VPC) le permite lanzar recursos de AWS en una red virtual que haya definido. Esa red virtual es similar a la red tradicional que utiliza en su propio centro de datos, con los beneficios de usar la infraestructura escalable de AWS.

Otras herramientas

  • HashiCorp Terraform es una herramienta de infraestructura como código (IaC) que facilita usar el código para aprovisionar y administrar la infraestructura y los recursos en la nube. Este patrón usa Terraform CLI.

Repositorio de código

El código de este patrón está disponible en el repositorio de GitHub Acceder al host bastión mediante Session Manager y Amazon EC2 Instance Connect.

Prácticas recomendadas

  • Recomendamos usar herramientas de escaneo de código automatizadas para mejorar la seguridad y la calidad del código. Este patrón se escaneó con Checkov, una herramienta de análisis de código estático para IaC. Como mínimo, le recomendamos que realice comprobaciones básicas de validación y formato mediante los comandos terraform validate y terraform fmt -check -recursive de Terraform.

  • Es una buena práctica añadir pruebas automatizadas para la iAC. Para obtener más información sobre los diferentes enfoques para probar el código de Terraform, consulte Pruebas de HashiCorp Terraform (entrada del blog de Terraform).

  • Durante la implementación, Terraform utiliza la instancia de Amazon EC2 que reemplaza cada vez que se detecta una nueva versión de la AMI de Amazon Linux 2. Esto implementa la nueva versión del sistema operativo, que incluye los parches y las actualizaciones. Si el programa de implementación no es frecuente, esto puede suponer un riesgo para la seguridad, ya que la instancia no tiene los parches actualizados. Es importante actualizar y aplicar con frecuencia los parches de seguridad a las instancias de Amazon EC2 implementadas. Para obtener más información, consulte Actualizar la gestión en Amazon EC2.

  • Como este patrón es una prueba de concepto, utiliza políticas administradas de AWS, como AmazonSSMManagedInstanceCore. Las políticas administradas de AWS cubren casos de uso comunes, pero no otorgan permisos con privilegios mínimos. Según sea necesario en su caso, le recomendamos que cree políticas personalizadas que concedan permisos con privilegios mínimos para los recursos implementados en esta arquitectura. Para más información, consulte Introducción a las políticas administradas de AWS y el objetivo de los permisos de privilegios mínimos.

  • Use una contraseña para proteger el acceso a las claves SSH y guarde las claves en un lugar seguro.

  • Configure el registro y la supervisión del host bastión. El registro y la supervisión son partes importantes del mantenimiento de los sistemas, tanto desde una perspectiva operativa como de seguridad. Existen varias formas de supervisar las conexiones y la actividad en su host bastión. Para obtener más información, consulte los siguientes temas en la documentación de Systems Manager.

Epics

TareaDescripciónHabilidades requeridas

Clone el repositorio de código.

  1. En una interfaz de la línea de comandos, cambie el directorio de trabajo a la ubicación en la que desee almacenar los archivos de muestra.

  2. Escriba el siguiente comando.

    git clone https://github.com/aws-samples/secured-bastion-host-terraform.git

Ingeniero de DevOps, desarrollador

Inicialice el directorio de trabajo de Terraform.

Este paso solo es necesario para la primera implementación. Si va a realizar una reimplementación del patrón, vaya al paso siguiente.

En el directorio raíz del repositorio clonado, introduzca el siguiente comando, donde:

  • $S3_STATE_BUCKET es el nombre del bucket de Amazon S3 que contiene el estado de Terraform

  • $PATH_TO_STATE_FILE es la clave del archivo de estado de Terraform, como infra/bastion-host/tetfstate

  • $AWS_REGION es la región donde se implementa el bucket de Amazon S3

terraform init \ -backend-config="bucket=$S3_STATE_BUCKET" \ -backend-config="key=$PATH_TO_STATE_FILE" \ -backend-config="region=$AWS_REGION
nota

También puede abrir el archivo config.tf y, en la sección terraform, proporcionar estos valores manualmente.

Ingeniero de DevOps, desarrollador, Terraform

Implementación de recursos.

  1. En el directorio raíz del repositorio clonado, introduzca el siguiente comando.

    terraform apply -var-file="dev.tfvars"
  2. Revise la lista de todos los cambios que se aplicarán a su Cuenta de AWS y, a continuación, confirme la implementación.

  3. Espere a que se implementen todos los recursos.

Ingeniero de DevOps, desarrollador, Terraform
TareaDescripciónHabilidades requeridas

Configure la conexión SSH.

Actualice el archivo de configuración de SSH para permitir las conexiones SSH a través de Session Manager. Para obtener instrucciones, consulte Permitir conexiones SSH para Session Manager. Esto permite a los usuarios autorizados introducir un comando proxy que inicia una sesión de Session Manager y transfiere todos los datos a través de una conexión bidireccional.

Ingeniero de DevOps

Genere las claves SSH.

Introduzca el siguiente comando para general un par de claves de SSH locales privadas y publicas. Use este par de claves para conectarse al host bastión.

ssh-keygen -t rsa -f my_key
Ingeniero de DevOps, desarrollador
TareaDescripciónHabilidades requeridas

Obtenga el ID de la instancia.

  1. Para conectarse al host bastión implementado, necesita el ID de la instancia de Amazon EC2. Realice una de las siguientes acciones para localizar la ID:

    • Abra la consola de Amazon EC2. En el panel de navegación, seleccione Instances (Instancias). Localice la instancia del host bastión.

    • En la AWS CLI, introduzca el comando siguiente.

      aws ec2 describe-instances

      Para filtrar los resultados, introduzca el siguiente comando, donde $BASTION_HOST_TAG es la etiqueta que asignó al host bastión. El valor predeterminado para esta etiqueta es sandbox-dev-bastion-host.

      aws ec2 describe-instances \ --filters "Name=tag:Name,Values=$BASTION_HOST_TAG" \ --output text \ --query 'Reservations[*].Instances[*].InstanceId' \ --output text
  2. Copie el ID de la instancia de Amazon EC2. Usará este ID más tarde.

AWS general

Envíe la clave pública SSH.

nota

En esta sección, debe cargar la clave pública en los metadatos de la instancia del host bastión. Una vez cargada la clave, dispone de 60 segundos para iniciar una conexión con el host bastión. Transcurridos 60 segundos, se elimina la clave pública. Para obtener más información, consulte la sección Solución de problemas de este patrón. Complete los siguientes pasos rápidamente para evitar que se extraiga la clave antes de conectarse al host bastión.

  1. Envíe la clave SSH al host bastión mediante Amazon EC2 Instance Connect. Escriba el siguiente comando, cuando:

    • $INSTANCE_ID es el ID de la instancia de Amazon EC2.

    • $PUBLIC_KEY_FILE es la ruta al archivo de claves públicas, como my_key.pub

      importante

      Asegúrese de usar la clave pública y no la clave privada.

    aws ec2-instance-connect send-ssh-public-key \ --instance-id $INSTANCE_ID \ --instance-os-user ec2-user \ --ssh-public-key file://$PUBLIC_KEY_FILE
  2. Espere hasta que reciba un mensaje que indique que la clave se ha cargado correctamente. Continúe inmediatamente al siguiente paso.

AWS general

Conéctese al host bastión.

  1. Por ejemplo, introduzca el siguiente comando para conectarse al host bastión a través de Session Manager, donde:

    • $PRIVATE_KEY_FILE es la ruta a su clave privada, como my_key

    • $INSTANCE_ID es el ID de la instancia de Amazon EC2.

    ssh -i $PRIVATE_KEY_FILE ec2-user@$INSTANCE_ID
  2. Confirme la conexión introduciendo yes. Esto abre una conexión SSH mediante Session Manager.

nota

Existen otras opciones para abrir una conexión SSH con el host bastión. Para obtener más información, consulte Enfoques alternativos para establecer una conexión SSH con el host bastión en la sección de Información adicional de este patrón.

AWS general
TareaDescripciónHabilidades requeridas

Elimine los recursos implementados.

  1. Para eliminar todos los recursos implementados, ejecute el siguiente comando del directorio raíz del repositorio clonado.

    terraform destroy -var-file="dev.tfvars"
  2. Confirme la eliminación de los recursos.

Ingeniero de DevOps, desarrollador, Terraform

Solución de problemas

ProblemaSolución

TargetNotConnected error al intentar conectarse al host bastión

  1. Reinicie el host bastión según las instrucciones de Reiniciar la instancia en la documentación de Amazon EC2.

  2. Cuando la instancia se haya reiniciado correctamente, vuelva a enviar la clave pública al host bastión y vuelva a intentar la conexión.

Permission denied error al intentar conectarse al host bastión

Una vez cargada la clave pública en el host bastión, solo dispondrá de 60 segundos para iniciar la conexión. Transcurridos 60 segundos, la clave se elimina automáticamente y no puede usarla para conectarse a la instancia. Si esto ocurre, puede repetir el paso para volver a enviar la clave a la instancia.

Recursos relacionados

AWS Documentación de

Otros recursos

Información adicional

Enfoques alternativos para establecer una conexión SSH con el host bastión

Enrutamiento de puertos

Puede usar la opción -D 8888 para abrir una conexión SSH con reenvío dinámico de puertos. Para más información, consulte las instrucciones en explainshell.com. El siguiente es un ejemplo de un comando para abrir una conexión SSH mediante el reenvío de puertos.

ssh -i $PRIVATE_KEY_FILE -D 8888 ec2-user@$INSTANCE_ID

Este tipo de conexión abre un proxy SOCKS que puede reenviar el tráfico de su navegador local a través del host bastión. Si utiliza Linux o macOS, para ver todas las opciones, introduzca man ssh. Se mostrará el manual de referencia de SSH.

Uso del script proporcionado

En lugar de ejecutar manualmente los pasos descritos en Conectar al host bastión mediante Session Manager en la sección Epics, puede utilizar el script connect.sh incluido en el repositorio de código. Este script genera el par de claves SSH, envía la clave pública a la instancia de Amazon EC2 e inicia una conexión con el host bastión. Al ejecutar el script, se pasan la etiqueta y el nombre de la clave como argumentos. A continuación se muestra un ejemplo del comando para ejecutar el script.

./connect.sh sandbox-dev-bastion-host my_key