Configura el end-to-end cifrado de las aplicaciones en Amazon EKS mediante cert-manager y Let's Encrypt - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Configura el end-to-end cifrado de las aplicaciones en Amazon EKS mediante cert-manager y Let's Encrypt

Creada por Mahendra Revanasiddappa () y Vasanth Jeyaraj () AWS AWS

Repositorio de códigos: nd-to-end cifrado electrónico en Amazon EKS

Entorno: PoC o piloto

Tecnologías: DevOps contenedores y microservicios; seguridad, identidad y conformidad

Carga de trabajo: todas las demás cargas de trabajo

AWSservicios: AmazonEKS; Amazon Route 53

Resumen

La implementación del end-to-end cifrado puede resultar compleja y es necesario gestionar los certificados de cada activo de la arquitectura de microservicios. Si bien puede finalizar la conexión de Transport Layer Security (TLS) en el extremo de la red Amazon Web Services (AWS) con un Network Load Balancer o Amazon API Gateway, algunas organizaciones requieren end-to-end el cifrado.

Este patrón utiliza el controlador NGINX de ingreso para el ingreso. Esto se debe a que cuando se crea una entrada de Kubernetes, el recurso de entrada utiliza un equilibrador de carga de red. El equilibrador de carga de red no permite cargar certificados de cliente. Por lo tanto, no se puede lograr un ingreso mutuo TLS con Kubernetes.

Este patrón está pensado para las organizaciones que requieren la autenticación mutua entre todos los microservicios de sus aplicaciones. Mutual TLS reduce la carga que supone mantener los nombres de usuario o las contraseñas y también puede utilizar el marco de seguridad listo para usar. El enfoque de este patrón es compatible si su organización tiene una gran cantidad de dispositivos conectados o si debe cumplir con estrictas pautas de seguridad.

Este patrón ayuda a aumentar la postura de seguridad de su organización al implementar el end-to-end cifrado para las aplicaciones que se ejecutan en Amazon Elastic Kubernetes Service (Amazon). EKS Este patrón proporciona una aplicación y un código de muestra en el GitHub EKS repositorio de nd-to-end cifrado electrónico en Amazon para mostrar cómo se ejecuta un microservicio con el end-to-end cifrado en AmazonEKS. El enfoque del patrón utiliza cert-manager, un complemento de Kubernetes, con Let's Encrypt como autoridad de certificación (CA). Let's Encrypt es una solución rentable para administrar certificados y proporciona certificados gratuitos con una validez de 90 días. Cert-Manager automatiza el aprovisionamiento bajo demanda y la rotación de certificados cuando se implementa un nuevo microservicio en Amazon. EKS 

Destinatarios previstos

Este patrón se recomienda para los usuarios que tengan experiencia con KubernetesTLS, Amazon Route 53 y Domain Name System (). DNS

Requisitos previos y limitaciones

Requisitos previos 

  • Una cuenta de AWS activa.

  • Un EKS clúster de Amazon existente.

  • AWSInterfaz de línea de comandos (AWSCLI) versión 1.7 o posterior, instalada y configurada en macOS, Linux o Windows.

  • La utilidad de línea de kubectl comandos, instalada y configurada para acceder al EKS clúster de Amazon. Para obtener más información al respecto, consulta Instalar kubectl en la documentación de Amazon. EKS

  • Un DNS nombre existente para probar la aplicación. Para obtener más información, consulte Registrar nombres de dominio mediante Amazon Route 53 en la documentación de Amazon Route 53. 

  • La última versión de Helm, instalada en su máquina local. Para obtener más información al respecto, consulte Uso de Helm con Amazon EKS en la EKS documentación de Amazon y en el repositorio de GitHub Helm

  • El EKS repositorio de nd-to-end cifrado GitHub E en Amazon, clonado en su máquina local. 

  • Sustituya los siguientes valores en los trustpolicy.json archivos policy.json y del EKS repositorio de nd-to-end cifrado GitHub E clonado en Amazon:

    • <account number>— AWS Sustitúyalo por el ID de cuenta de la cuenta en la que quieres implementar la solución. 

    • <zone id>: sustitúyalo por el ID de zona de Route 53 del nombre de dominio. 

    • <node_group_role>— Sustitúyalo por el nombre de la función AWS Identity and Access Management (IAM) asociada a EKS los nodos de Amazon.

    • <namespace>— Sustitúyalo por el espacio de nombres de Kubernetes en el que implementas el controlador de NGINX ingreso y la aplicación de muestra.

    • <application-domain-name>— Sustitúyalo por el nombre de DNS dominio de Route 53.

Limitaciones

  • Este patrón no describe cómo rotar los certificados y solo muestra cómo usar los certificados con microservicios en AmazonEKS. 

Arquitectura

En el siguiente diagrama se muestran los componentes de la arquitectura y el flujo de trabajo de esta aplicación.

Flujo de trabajo para configurar el cifrado de aplicaciones en Amazon EKS mediante cert-manager y Let's Encrypt.

En el diagrama, se muestra el siguiente flujo de trabajo:

  1. Un cliente envía una solicitud para acceder a la aplicación con ese nombre. DNS

  2. El registro de Route 53 es CNAME para Network Load Balancer.

  3. El Network Load Balancer reenvía la solicitud al controlador de NGINX ingreso que está configurado con un listener. TLS La comunicación entre el controlador NGINX de entrada y el Network Load Balancer HTTPS sigue el protocolo.

  4. El controlador NGINX de entrada lleva a cabo el enrutamiento basado en la ruta en función de la solicitud del cliente al servicio de la aplicación.

  5. El servicio de aplicaciones reenvía la solicitud al pod de la aplicación. La aplicación está diseñada para utilizar el mismo certificado al llamar a secretos.

  6. Los pods ejecutan la aplicación de ejemplo con los certificados del administrador de certificados. La comunicación entre el controlador NGINX de ingreso y los pods utiliza. HTTPS

Nota: Cert-Manager se ejecuta en su propio espacio de nombres. Utiliza un rol de clúster de Kubernetes para aprovisionar certificados como secretos en espacios de nombres específicos. Puede adjuntar esos espacios de nombres a los pods de aplicaciones y NGINX al Ingress Controller.

Herramientas

AWSservicios

Otras herramientas

  • cert-manager es un complemento de Kubernetes que solicita certificados, los distribuye a los contenedores de Kubernetes y automatiza la renovación de los certificados.

  • NGINXIngress Controller es una solución de administración del tráfico para aplicaciones nativas de la nube en Kubernetes y entornos contenerizados.

Epics

TareaDescripciónHabilidades requeridas

Cree una zona alojada pública para Route 53.

Inicie sesión en la consola AWS de administración, abra la consola de Amazon Route 53, elija Zonas alojadas y, a continuación, elija Crear zona alojada. Cree una zona alojada pública y registre el ID de la zona. Para obtener más información, consulte Crear una zona alojada pública en la documentación de Amazon Route 53.

Nota: ACME DNS 01 utiliza el DNS proveedor para solicitar a cert-manager que emita el certificado. Este desafío le pide que demuestre que controla su nombre DNS de dominio poniendo un valor específico en un TXT registro bajo ese nombre de dominio. Cuando Let's Encrypt le da un token a tu cliente, este crea un TXT registro derivado de ese token y de tu clave de cuenta, y coloca ese registro en_acme-challenge.<YOURDOMAIN>. ACME Luego, Let's Encrypt consulta ese DNS registro. Si encuentra una coincidencia, puede proceder a emitir un certificado.

AWS DevOps
TareaDescripciónHabilidades requeridas

Cree la IAM política para cert-manager.

Se requiere una IAM política para dar permiso a cert-manager para validar que usted es propietario del dominio de Route 53. El policy.json ejemplo IAM de política se proporciona en el 1-IAMRole directorio del EKS repositorio de nd-to-end cifrado GitHub electrónico clonado en Amazon.

Introduce el siguiente comando AWS CLI para crear la IAM política.

aws iam create-policy \ --policy-name PolicyForCertManager \ --policy-document file://policy.json
AWS DevOps

Cree el IAM rol de administrador de certificados.

Tras crear la IAM política, debe crear un IAM rol. El IAM rol trustpolicy.json de ejemplo se proporciona en el 1-IAMRole directorio.

Introduzca el siguiente comando AWS CLI para crear el IAM rol.

aws iam create-role \ --role-name RoleForCertManager \ --assume-role-policy-document file://trustpolicy.json
AWS DevOps

Asocie la política de al rol.

Introduzca el siguiente comando AWS CLI para adjuntar la IAM política al IAM rol. AWS_ACCOUNT_IDSustitúyala por la ID de tu AWS cuenta.

aws iam attach-role-policy \ --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/PolicyForCertManager \ --role-name RoleForCertManager
AWS DevOps
TareaDescripciónHabilidades requeridas

Implemente el controlador NGINX de ingreso.

Instale la versión más reciente de nginx-ingress mediante Helm. Puede modificar la configuración nginx-ingress según sus requisitos antes de implementarla. Este patrón utiliza un equilibrador de carga de red anotado e interno que está disponible en el directorio 5-Nginx-Ingress-Controller

Instale el controlador NGINX de entrada ejecutando el siguiente comando Helm desde el 5-Nginx-Ingress-Controller directorio.

helm install test-nginx nginx-stable/nginx-ingress  -f  5-Nginx-Ingress-Controller/values_internal_nlb.yaml

AWS DevOps

Compruebe que el controlador NGINX de entrada esté instalado.

Escriba el comando helm list. El resultado debería mostrar que el controlador NGINX de ingreso está instalado.

AWS DevOps

Cree un registro A de Route 53.

El registro A apunta al Network Load Balancer creado por NGINX Ingress Controller.

  1. Obtenga el DNS nombre de Network Load Balancer. Para obtener instrucciones, consulta Cómo obtener el DNS nombre de un balanceador de ELB cargas.

  2. En la consola de Amazon Route 53, elija Hosted Zones (Zonas alojadas).

  3. Seleccione la zona alojada pública en la que desee crear el registro y, a continuación, elija Crear registro.

  4. Ingrese un nombre para el registro. 

  5. En Tipo de registro, selecciona A: Dirige el tráfico hacia IPv4 y algunos AWS recursos.  

  6. Habilite el Alias.

  7. En Enrutar el tráfico a, haga lo siguiente:

    1. Elija Alias para el equilibrador de carga de red.

    2. Elija la AWS región en la que se despliega el Network Load Balancer.

    3. Introduzca el DNS nombre del Network Load Balancer.

  8. Elija Crear registros.

AWS DevOps
TareaDescripciónHabilidades requeridas

Implemente NGINX VirtualServer.

El NGINX VirtualServer recurso es una configuración de equilibrio de carga que es una alternativa al recurso de entrada. La configuración para crear el NGINX VirtualServer recurso está disponible en el nginx_virtualserver.yaml archivo del 6-Nginx-Virtual-Server directorio. Introduzca el siguiente comando kubectl para crear el NGINX VirtualServer recurso.

kubectl apply -f  nginx_virtualserver.yaml

Importante: asegúrese de actualizar el nombre de dominio de la aplicación, el secreto del certificado y el nombre del servicio de la aplicación en el archivo nginx_virtualserver.yaml.

AWS DevOps

Compruebe que NGINX VirtualServer se ha creado.

Introduzca el siguiente comando kubectl para comprobar que el NGINX VirtualServer recurso se ha creado correctamente.

kubectl get virtualserver

Nota: Compruebe que la columna Host coincida con el nombre de dominio de su aplicación.

AWS DevOps

Implemente el servidor NGINX web con la TLS opción habilitada.

Este patrón utiliza un servidor NGINX web con la aplicación TLS Enabled como aplicación para probar el end-to-end cifrado. Los archivos de configuración necesarios para implementar la aplicación de prueba están disponibles en el directorio demo-webserver

Para implementar la aplicación de prueba, ejecute el siguiente comando en kubectl:

kubectl apply -f nginx-tls-ap.yaml

AWS DevOps

Compruebe que se hayan creado los recursos de la aplicación de prueba.

Introduzca los siguientes comandos en kubectl para comprobar que se han creado los recursos necesarios para la aplicación de prueba:

  • kubectl get deployments

    Nota: Valide la columnaReady y la columna Available.

  • kubectl get pods | grep -i example-deploy

    Nota: Los pods deben estar en un estado running.

  • kubectl get configmap 

  • kubectl get svc 

AWS DevOps

Validación de la solicitud.

  1. Introduzca el siguiente comando sustituyéndolo por <application-domain-name> el DNS nombre de Route53 que creó anteriormente.

    curl --verbose https://<application-domain-name>

  2. Compruebe que puede acceder a la aplicación.

AWS DevOps

Recursos relacionados

AWSrecursos

Otros recursos