Simplificación de la autenticación de aplicaciones con TLS mutuo en Amazon ECS mediante el equilibrador de carga de aplicación
Olawale Olaleye y Shamanth Devagari, Amazon Web Services
Resumen
Este patrón le permite simplificar la autenticación de sus aplicaciones y a reducir las cargas de seguridad con el TLS mutuo en Amazon Elastic Container Service (Amazon ECS) mediante el equilibrador de carga de aplicación (ALB). Con el equilibrador de carga de aplicación, puede autenticar los certificados de cliente X.509 desde AWS Private Certificate Authority. Esta eficiente combinación ayuda a lograr una comunicación segura entre sus servicios, lo que reduce la necesidad de mecanismos de autenticación complejos en las aplicaciones. Además, el patrón utiliza Amazon Elastic Container Registry (Amazon ECR) para almacenar imágenes de contenedor.
En el ejemplo de este patrón se utilizan imágenes de Docker de una galería pública para crear las cargas de trabajo de muestra desde un inicio. Posteriormente, se crean nuevas imágenes de Docker para almacenarlas en Amazon ECR. Para el origen, considere usar un sistema basado en Git, como GitHub, GitLab o Bitbucket, o utilice Amazon Simple Storage Service (Amazon S3). Para crear las imágenes de Docker, considere la posibilidad de utilizar AWS CodeBuild para las imágenes siguientes.
Requisitos previos y limitaciones
Requisitos previos
Una Cuenta de AWS activa con acceso para implementar las pilas de AWS CloudFormation. Asegúrese de tener permisos de usuario o rol de AWS Identity and Access Management (IAM) para implementar CloudFormation.
La AWS Command Line Interface (AWS CLI) instalada. Configure las credenciales de AWS en su máquina local o en su entorno mediante AWS CLI o configure las variables de entorno del archivo
~/.aws/credentials.OpenSSL instalado
. Docker instalado
. Familiaridad con los Servicios de AWS descritos en Herramientas.
Conocimientos de Docker y NGINX.
Limitaciones
La TLS mutua para el equilibrador de carga de aplicación solo admite certificados de cliente X.509v3. No se admiten los certificados de cliente X.509v1.
La plantilla de CloudFormation que se proporciona en el repositorio de código de este patrón no incluye el aprovisionamiento de un proyecto de CodeBuild como parte de la pila.
Algunos Servicios de AWS no están disponibles en todas las Regiones de AWS. Para obtener información sobre la disponibilidad en regiones, consulte AWS Services by Region
. Para ver los puntos de conexión específicos, consulte Service endpoints and quotas y elija el enlace del servicio.
Versiones de producto
La versión 27.3.1 o posterior de Docker
AWS CLI versión 2.14.5 o posterior
Arquitectura
En el diagrama siguiente se muestran los componentes de la arquitectura de este patrón.

En el diagrama, se muestra el siguiente flujo de trabajo:
Cree un repositorio de Git y confirme el código de la aplicación en el repositorio.
Cree una autoridad de certificación (CA) en AWS Private CA.
Cree un proyecto de CodeBuild. El proyecto de CodeBuild se desencadena al confirmar los cambios y crea la imagen de Docker y publica la imagen compilada en Amazon ECR.
Copie la cadena del certificado y el cuerpo del certificado de la autoridad de certificación y cargue la agrupación de certificados en Amazon S3.
Cree un almacén de confianza con la agrupación de CA que cargó en Amazon S3. Asocie el almacén de confianza a los oyentes de la TLS mutua del equilibrador de carga de aplicación (ALB).
Utilice la CA privada para emitir certificados de cliente para las cargas de trabajo del contenedor. También cree un certificado TLS privado con AWS Private CA.
Importe el certificado TLS privado a AWS Certificate Manager (ACM) y utilícelo con el equilibrador de carga de aplicación.
La carga de trabajo del contenedor en
ServiceTwoutiliza el certificado de cliente emitido para autenticarse con el equilibrador de carga de aplicación cuando se comunica con la carga de trabajo del contenedor enServiceOne.La carga de trabajo del contenedor en
ServiceOneutiliza el certificado de cliente emitido para autenticarse con el equilibrador de carga de aplicación cuando se comunica con la carga de trabajo del contenedor enServiceTwo.
Automatizar y escalar
Este patrón se puede automatizar por completo mediante CloudFormation, AWS Cloud Development Kit (AWS CDK) u operaciones de API de un SDK para aprovisionar los recursos de AWS.
Puede utilizar AWS CodePipeline para implementar una canalización de integración e implementación continua (CI/CD) mediante CodeBuild para automatizar el proceso de creación de imágenes de contenedor e implementar nuevas versiones en los servicios de clúster de Amazon ECS.
Herramientas
Servicios de AWS
AWS Certificate Manager (ACM) lo ayuda a crear, almacenar y renovar certificados y claves SSL/TLS X.509 públicos y privados que protegen sus sitios web y aplicaciones de AWS.
AWS CloudFormation ayuda a configurar los recursos de AWS, aprovisionarlos de manera rápida y coherente y administrarlos durante todo su ciclo de vida en las Cuentas de AWS y Regiones de AWS.
AWS CodeBuild es un servicio de compilación completamente administrado que le permite compilar código fuente, poner en marcha pruebas unitarias y producir artefactos listos para implementar.
Amazon Elastic Container Registry (Amazon ECR) es un servicio de registro de imágenes de contenedor administrado que es seguro, escalable y fiable.
Amazon Elastic Container Service (Amazon ECS) es un servicio de administración de contenedores altamente escalable y rápido que permite ejecutar, detener y administrar contenedores en un clúster. Las tareas y los servicios se pueden ejecutar en una infraestructura sin servidor administrada por AWS Fargate. Alternativamente, para obtener más control sobre su infraestructura, puede ejecutar sus tareas y servicios en un clúster de instancias de Amazon Elastic Compute Cloud (Amazon EC2) que administre.
Amazon ECS Exec le permite interactuar de manera directa con los contenedores sin necesidad de interactuar primero con el sistema operativo del contenedor host, abrir puertos entrantes o administrar claves SSH. Puede utilizar ECS Exec para ejecutar comandos en un contenedor, u obtener un intérprete de comandos en un contenedor, que se ejecute en una instancia de Amazon EC2 o en AWS Fargate.
Elastic Load Balancing (ELB) distribuye el tráfico entrante de aplicaciones o redes entre varios destinos. Así, por ejemplo, puede distribuir el tráfico entre instancias de Amazon EC2, contenedores y direcciones IP de una o varias zonas de disponibilidad. ELB supervisa el estado de los destinos registrados y enruta el tráfico solo a los destinos con un estado correcto. ELB escala el equilibrador de carga a medida que el tráfico entrante va cambiando con el tiempo. Puede escalarse automáticamente para adaptarse a la mayoría de las cargas de trabajo.
AWS Fargate le permite ejecutar contenedores sin necesidad de administrar servidores o instancias de Amazon EC2. Fargate es compatible tanto con Amazon ECS como con Amazon Elastic Kubernetes Service (Amazon EKS). Puede ejecutar las tareas y servicios de Amazon ECS con el tipo de lanzamiento de Fargate o con un proveedor de capacidad de Fargate. Todo lo que tiene que hacer es empaquetar su aplicación en contenedores, especificar los requisitos de CPU y de memoria, definir las políticas de IAM y de redes, y lanzar la aplicación. Cada tarea de Fargate tiene su propio límite de aislamiento y no comparte el kernel subyacente, los recursos de CPU, los recursos de memoria ni la interfaz de red elástica con otra tarea.
AWS Private Certificate Authority permite la creación de jerarquías de entidades de certificación (CA) privadas, incluidas las entidades de certificación raíz y subordinadas, sin los costos de inversión y mantenimiento de operar una entidad de certificación en las instalaciones.
Otras herramientas
Docker
es un conjunto de productos de plataforma como servicio (PaaS) que utiliza la virtualización a nivel del sistema operativo para entregar software en contenedores. GitHub
, GitLab y Bitbucket son algunos de los sistemas de control de código fuente basados en Git más utilizados para realizar un seguimiento de los cambios en el código fuente. NGINX Open Source
es un equilibrador de carga, caché de contenido y servidor web de código abierto. Este patrón lo utiliza como servidor web. OpenSSL
es una biblioteca de código abierto que proporciona servicios que utilizan las implementaciones OpenSSL de TLS y CMS.
Repositorio de código
El código de este patrón está disponible en el repositorio MTLS-with-Application-Load-Balancer-in-Amazon-ECS
Prácticas recomendadas
Utilice Amazon ECS Exec para ejecutar comandos en un contenedor u obtener un intérprete de comandos en un contenedor que se ejecute en Fargate. Puede también utilizar ECS Exec como ayuda para recopilar información de diagnóstico para la depuración.
Utilice grupos de seguridad y listas de control de acceso (ACL) a la red para controlar el tráfico entrante y saliente entre los servicios. Las tareas de Fargate reciben una dirección IP de la subred configurada en la nube privada virtual (VPC).
Epics
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Descargue el código fuente. | Para descargar el código fuente de este patrón, bifurque o clone el repositorio MTLS-with-Application-Load-Balancer-in-Amazon-ECS | Ingeniero de DevOps |
Cree un repositorio de Git. | Para crear un repositorio de Git que contenga el Dockerfile y los archivos
| Ingeniero de DevOps |
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Cree una CA privada en AWS Private CA. | Para crear una autoridad de certificación (CA) privada, ejecute los siguientes comandos en su terminal. Sustituya los valores de las variables de ejemplo por sus propios valores.
Para más información, consulte Create a private CA in AWS Private CA en la documentación de AWS. | Ingeniero de DevOps, DevOps de AWS |
Cree e instale su certificado CA privado. | Para crear e instalar un certificado para su CA raíz privada, ejecute los comandos siguientes en su terminal:
| DevOps de AWS, ingeniero de DevOps |
Solicite un certificado administrado. | Para solicitar un certificado privado en AWS Certificate Manager para utilizarlo con su ALB privado, utilice el comando siguiente:
| Ingeniero de DevOps, DevOps de AWS |
Utilice la CA privada para emitir un certificado de cliente. |
Este comando devuelve la CSR y la clave privada de los dos servicios.
Para más información, consulte Issue private end-entity certificates en la documentación de AWS. | Ingeniero de DevOps, DevOps de AWS |
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Aprovisione Servicios de AWS con la plantilla de CloudFormation. | Para aprovisionar la nube privada virtual (VPC), el clúster de Amazon ECS, los servicios de Amazon ECS, el Equilibrador de carga de aplicación y Amazon Elastic Container Registry (Amazon ECR), utilice la plantilla de CloudFormation. | Ingeniero de DevOps |
Obtenga las variables. | Verifique que tiene un clúster de Amazon ECS con dos servicios en ejecución. Para recuperar los detalles del recurso y almacenarlos como variables, utilice los comandos siguientes:
| Ingeniero de DevOps |
Cree un proyecto de CodeBuild. | Para utilizar un proyecto de CodeBuild para crear las imágenes de Docker para los servicios de Amazon ECS, haga lo siguiente:
Para más información, consulte Create a build project in AWS CodeBuild en la documentación de AWS. | DevOps de AWS, ingeniero de DevOps |
Cree las imágenes de Docker. | Puede usar CodeBuild para llevar a cabo el proceso de creación de imágenes. CodeBuild necesita permisos para interactuar con Amazon ECR y trabajar con Amazon S3. Como parte del proceso, la imagen de Docker se compila y envía al registro de Amazon ECR. Para obtener información sobre la plantilla y el código, consulte Información adicional. (Opcional) Para compilar localmente con fines de prueba, utilice el siguiente comando:
| Ingeniero de DevOps |
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Cargue el certificado CA en Amazon S3. | Para cargar el certificado CA en el bucket de Amazon S3, utilice el comando de ejemplo siguiente:
| DevOps de AWS, ingeniero de DevOps |
Cree un almacén de confianza. | Para crear el almacén de confianza, utilice el comando de ejemplo siguiente:
| DevOps de AWS, ingeniero de DevOps |
Cargue los certificados de cliente. | Para cargar los certificados de cliente en Amazon S3 para las imágenes de Docker, utilice el comando de ejemplo siguiente:
| DevOps de AWS, ingeniero de DevOps |
Modifique el oyente. | Para habilitar el TLS mutuo en el ALB, modifique los oyentes HTTPS con los comandos siguientes:
Para más información, consulte Configuring mutual TLS on an Application Load Balancer en la documentación de AWS. | DevOps de AWS, ingeniero de DevOps |
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Actualice la definición de tareas de Amazon ECS. | Para actualizar la definición de tareas de Amazon ECS, modifique el parámetro Para obtener los valores de los servicios respectivos, actualice las definiciones de tareas con la nueva URI de imágenes de Docker que creó en los pasos anteriores:
Para más información, consulte Actualización de una definición de tareas de Amazon ECS mediante la consola en la documentación de AWS. | DevOps de AWS, ingeniero de DevOps |
Actualice el servicio Amazon ECS. | Actualice el servicio con la última definición de tareas. Esta definición de tareas es el esquema de las imágenes de Docker recién creadas y contiene el certificado de cliente que se requiere para la autenticación de TLS mutua. Para actualizar el servicio, proceda de la manera siguiente:
Repita los pasos para el otro servicio. | Administrador de AWS, DevOps de AWS, ingeniero de DevOps |
| Tarea | Descripción | Habilidades requeridas |
|---|---|---|
Copie la URL de la aplicación. | Utilice la consola de Amazon ECS para ver la tarea. Cuando el estado de la tarea se haya actualizado a En ejecución, seleccione la tarea. En la sección Tarea, copie el ID de la tarea. | Administrador de AWS, DevOps de AWS |
Pruebe su aplicación. | Para probar la aplicación, utilice ECS Exec para acceder a las tareas.
| Administrador de AWS, DevOps de AWS |
Recursos relacionados
Documentación de Amazon ECS
Otros recursos de AWS
Información adicional
Edición del Dockerfile
El siguiente código muestra los comandos que edita en el Dockerfile para el servicio 1:
FROM public.ecr.aws/nginx/nginx:latest WORKDIR /usr/share/nginx/html RUN echo "Returning response from Service 1: Ok" > /usr/share/nginx/html/index.html ADD client_cert1.cert client_private-key1.pem /usr/local/share/ca-certificates/ RUN chmod -R 400 /usr/local/share/ca-certificates/
El siguiente código muestra los comandos que edita en el Dockerfile para el servicio 2:
FROM public.ecr.aws/nginx/nginx:latest WORKDIR /usr/share/nginx/html RUN echo "Returning response from Service 2: Ok" > /usr/share/nginx/html/index.html ADD client_cert2.cert client_private-key2.pem /usr/local/share/ca-certificates/ RUN chmod -R 400 /usr/local/share/ca-certificates/
Si está creando las imágenes de Docker con CodeBuild, el archivo buildspec utiliza el número de compilación de CodeBuild para identificar de manera exclusiva las versiones de las imágenes como un valor de etiqueta. Puede cambiar el archivo buildspec para adaptarlo a sus necesidades, como se muestra en el código personalizado buildspec :
version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REPOSITORY_URI - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} build: commands: # change the S3 path depending on the service - aws s3 cp s3://$YOUR_S3_BUCKET_NAME/serviceone/ $CodeBuild_SRC_DIR/ --recursive - echo Build started on `date` - echo Building the Docker image... - docker build -t $ECR_REPOSITORY_URI:latest . - docker tag $ECR_REPOSITORY_URI:latest $ECR_REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $ECR_REPOSITORY_URI:latest - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG - echo Writing image definitions file... # for ECS deployment reference - printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json artifacts: files: - imagedefinitions.json