

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.

# Configure autenticación TLS mutua para aplicaciones ejecutadas en Amazon EKS
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks"></a>

*Mahendra Revanasiddappa, Amazon Web Services*

## Resumen
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-summary"></a>

La seguridad mutua de la capa de transporte (TLS) basada en certificado es un componente de TLS opcional que proporciona autenticación entre pares bidireccional para servidores y clientes. Con la TLS mutua, los clientes deben proporcionar un certificado X.509 durante el proceso de negociación de la sesión. El servidor utiliza este certificado para identificar y autenticar al cliente.

El TLS mutuo es un requisito común para las aplicaciones de Internet de las cosas (IoT) y se puede usar para business-to-business aplicaciones o estándares como la [banca abierta](https://docs.aws.amazon.com/wellarchitected/latest/financial-services-industry-lens/open-banking.html).

Este patrón describe cómo configurar TLS mutua para aplicaciones ejecutadas en un clúster de Amazon Elastic Kubernetes Service (Amazon EKS) mediante un controlador de entrada de NGINX. Puede habilitar las funciones de TLS mutua integradas para el controlador de entrada de NGINX anotando el recurso de entrada. Para obtener más información sobre las anotaciones de TLS mutua en los controladores NGINX, consulte [Autenticación con certificados de cliente](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#client-certificate-authentication) en la documentación de Kubernetes.

**importante**  
Este patrón emplea certificados autofirmados. Se recomienda utilizar este patrón solo con clústeres de prueba y no en entornos de producción. Si desea usar este patrón en un entorno de producción, puede usar [AWS Private Certificate Authority (AWS Private CA)](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html) o su estándar de infraestructura de clave pública (PKI) existente para emitir certificados privados.

## Requisitos previos y limitaciones
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-prereqs"></a>

**Requisitos previos **
+ Una cuenta de Amazon Web Services (AWS) activa.
+ Un clúster existente de Amazon EKS.
+ Interfaz de la línea de comandos de AWS (AWS CLI) versión 1.7, instalada y configurada en macOS, Linux o Windows.
+ Utilidad de línea de comandos kubectl, instalada y configurada para acceder al clúster de Amazon EKS. Para obtener más información sobre esto, consulte [Instalar kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) en la documentación de Amazon EKS.
+ Un nombre existente de sistema de nombres de dominio (DNS) para probar la aplicación.

**Limitaciones**
+ Este patrón emplea certificados autofirmados. Se recomienda utilizar este patrón solo con clústeres de prueba y no en entornos de producción.

## Arquitectura
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-architecture"></a>

![Configure autenticación TLS mutua para aplicaciones ejecutadas en Amazon EKS](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/ae2761e3-7ed2-4c2a-ba54-a4ddce8a1e7e/images/cefc60f9-2f29-4052-b7ae-df4eb6395e1c.png)


**Pila de tecnología **
+ Amazon EKS
+ Amazon Route 53
+ Kubectl

## Tools (Herramientas)
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-tools"></a>
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) le ayuda a ejecutar Kubernetes en AWS sin necesidad de instalar ni mantener su propio plano de control o nodos de Kubernetes.
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) es un servicio web de sistema de nombres de dominio (DNS) escalable y de alta disponibilidad.
+ [Kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) es una utilidad de línea de comandos que se usa para interactuar con un clúster de Amazon EKS.

## Epics
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-epics"></a>

### Genere los certificados autofirmados
<a name="generate-the-self-signed-certificates"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
|  Genere el certificado y la clave del servidor. | Genere la clave y el certificado de la entidad de certificación (CA) mediante el siguiente comando.<pre>openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=Test Cert Authority'</pre> | DevOps ingeniero | 
| Genere la clave y el certificado del servidor y firme con el certificado de CA. | Genere la clave y el certificado del servidor y firme con el certificado de CA, utilizando el siguiente comando.<pre>openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN= <your_domain_name> ' && openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt</pre>Asegúrese de sustituir `<your_domain_name>` por su nombre de dominio actual. | DevOps ingeniero | 
|  Genere la clave y el certificado del cliente y firme con el certificado de CA. | Genere la clave y el certificado del cliente, y firme la entidad de certificación (CA) mediante el siguiente comando.<pre>openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=Test' && openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt</pre> | DevOps ingeniero | 

### Implemente el controlador de entrada NGINX
<a name="deploy-the-nginx-ingress-controller"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Implemente el controlador de entrada de NGINX en el clúster de Amazon EKS. | Implemente el controlador de entrada de NGINX con el comando siguiente.<pre>kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/aws/deploy.yaml</pre> | DevOps ingeniero | 
|  Compruebe que el servicio de controlador de entrada de NGINX está en ejecución. | Compruebe que el servicio de controlador de entrada de NGINX está en ejecución utilizando el siguiente comando.<pre>kubectl get svc -n ingress-nginx</pre>Asegúrese de que el campo de dirección del servicio contenga el nombre de dominio del equilibrador de carga de red. | DevOps ingeniero | 

### Cree un espacio de nombres en el clúster de Amazon EKS para probar la TLS mutua
<a name="create-a-namespace-in-the-amazon-eks-cluster-to-test-mutual-tls"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un espacio de nombres en el clúster de Amazon EKS.  | Ejecute el siguiente comando para crear un espacio de nombres llamado `mtls` en el clúster de Amazon EKS. <pre>kubectl create ns mtls</pre><br />Se implementará la aplicación de ejemplo para probar la TLS mutua. | DevOps ingeniero | 

### Cree la implementación y el servicio de la aplicación de ejemplo
<a name="create-the-deployment-and-service-for-the-sample-application"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree la implementación y el servicio de Kubernetes en el espacio de nombres mtls. | Cree un archivo denominado `mtls.yaml`. Pegue el código siguiente en el archivo. <pre>kind: Deployment<br />apiVersion: apps/v1<br />metadata:<br />  name: mtls-app<br />  labels:<br />    app: mtls<br />spec:<br />  replicas: 1<br />  selector:<br />    matchLabels:<br />      app: mtls<br />  template:<br />    metadata:<br />      labels:<br />        app: mtls<br />    spec:<br />      containers:<br />      - name: mtls-app<br />        image: hashicorp/http-echo<br />        args:<br />          - "-text=mTLS is working"<br /><br /><br />---<br /><br />kind: Service<br />apiVersion: v1<br />metadata:<br />  name: mtls-service<br />spec:<br />  selector:<br />    app: mtls<br />  ports:<br />    - port: 5678 # Default port for image</pre><br /> Crea la implementación y el servicio de Kubernetes en el espacio de nombres `mtls` ejecutando el siguiente comando.<pre>kubectl create -f mtls.yaml -n mtls</pre> | DevOps ingeniero | 
| Compruebe que se ha creado la implementación de Kubernetes. | Ejecute el siguiente comando para comprobar que la implementación se ha creado y que hay un pod en estado disponible.<pre>kubectl get deploy -n mtls</pre> | DevOps ingeniero | 
| Compruebe que el servicio Kubernetes se ha creado. | Compruebe que el servicio de Kubernetes se haya creado ejecutando el siguiente comando.<pre>kubectl get service -n mtls</pre> | DevOps ingeniero | 

### Cree un secreto en el espacio de nombres mtls
<a name="create-a-secret-in-the-mtls-namespace"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un recurso para el recurso de entrada. | Ejecute el siguiente comando para crear un secreto en el controlador de entrada NGINX con los certificados que creó anteriormente.<pre>kubectl create secret generic mtls-certs --from-file=tls.crt=server.crt --from-file=tls.key=server.key --from-file=ca.crt=ca.crt -n mtls </pre><br />Su secreto tiene un certificado de servidor para que el cliente identifique el servidor, y un certificado de CA para que el servidor verifique los certificados del cliente. | DevOps ingeniero | 

### Cree el recurso de entrada en el espacio de nombres mtls
<a name="create-the-ingress-resource-in-the-mtls-namespace"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree el recurso de entrada en el espacio de nombres mtls. | Cree un archivo denominado `ingress.yaml`. Pegue el siguiente código en el archivo (sustituya `<your_domain_name>` por su nombre de dominio actual).<pre>apiVersion: networking.k8s.io/v1<br />kind: Ingress<br />metadata:<br />  annotations:<br />    nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"<br />    nginx.ingress.kubernetes.io/auth-tls-secret: mtls/mtls-certs<br />  name: mtls-ingress<br />spec:<br />  ingressClassName: nginx<br />  rules:<br />  - host: "*.<your_domain_name>"<br />    http:<br />      paths:<br />      - path: /<br />        pathType: Prefix<br />        backend:<br />          service:<br />            name: mtls-service<br />            port:<br />              number: 5678<br />  tls:<br />  - hosts:<br />    - "*.<your_domain_name>"<br />    secretName: mtls-certs</pre><br />Cree el recurso de entrada en el espacio de nombres `mtls` ejecutando el siguiente comando.<pre>kubectl create -f ingress.yaml -n mtls</pre><br />Así, el controlador de entrada de NGINX podrá enrutar el tráfico a su aplicación de muestra. | DevOps ingeniero | 
| Compruebe que se ha creado el recurso de entrada. | Compruebe que el servicio de entrada se haya creado ejecutando el siguiente comando.<pre>kubectl get ing -n mtls</pre>Asegúrese de que la dirección del recurso de entrada muestre el equilibrador de carga creado para el controlador de entrada de NGINX. | DevOps ingeniero | 

### Configure el DNS para que dirija el nombre de host al equilibrador de carga
<a name="configure-dns-to-point-the-hostname-to-the-load-balancer"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un registro CNAME que apunte al equilibrador de carga del controlador de entrada de NGINX. | Inicie sesión en la consola de administración de AWS, abra la consola de Amazon Route 53 y cree un registro de nombre canónico (CNAME) que apunte `mtls.<your_domain_name>` al equilibrador de carga del controlador de entrada de NGINX.<br />Para obtener más información, consulte [Creación de registros con la consola de Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating.html) en la documentación de Route 53. | DevOps ingeniero | 

### Pruebe la aplicación
<a name="test-the-application"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Pruebe la configuración de TLS mutua sin certificados. | Ejecute el comando siguiente.<pre>curl -k https://mtls.<your_domain_name> </pre><br />Debería recibir la respuesta de error “400 No required SSL certificate was sent”. | DevOps ingeniero | 
| Pruebe la configuración de TLS mutua con certificados. | Ejecute el comando siguiente.<pre>curl -k https://mtls.<your_domain_name> --cert client.crt --key client.key</pre><br />Debería recibir la respuesta “mTLS is working”. | DevOps ingeniero | 

## Recursos relacionados
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-resources"></a>
+ [Creación de registros con la consola de Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating.html)
+ [Uso de un equilibrador de carga de red con el controlador de entrada de NGINX en Amazon EKS](https://aws.amazon.com/blogs/opensource/network-load-balancer-nginx-ingress-controller-eks/)
+ [Autenticación con certificado de cliente](https://kubernetes.github.io/ingress-nginx/examples/auth/client-certs/)