TLS mutuo (mTLS) en Load Balancers de AWS
Hace tan solo unos meses, AWS anunció el soporte dirigido a TLS mutuo (mTLS o muthual authentication) para su servicio Application Load Balancer (ALB). Esto supone una opción de seguridad adicional, ya que a diferencia de TLS estándar donde solo el servidor presenta un certificado para autenticar su identidad, mTLS requiere que tanto el cliente como el servidor se autentiquen mutuamente presentando certificados.
En este artículo vamos a explicar un poco más en detalle qué es mTLS y cómo implementarlo en ALB de AWS.
Qué es mTLS y diferencia con TLS estándar
Como ya hemos adelantado en el párrafo introductorio, mTLS se diferencia de TLS estándar en que el primero requiere que ambas partes se autentiquen mientras que el segundo solo autentica al servidor hacia el cliente.
A continuación presentamos un sencillo esquema del funcionamiento de TLS estándar:
En el caso de TLS estándar, el cliente verifica que se está conectando al servidor correcto, pero el servidor no verifica la identidad del cliente. En este caso, únicamente reside el certificado en el servidor.
Durante el proceso de negociación inicial, o handshake, el servidor envía su certificado al cliente y este lo verifica utilizando la cadena de confianza del certificado (normalmente estará firmado por una Autoridad de Certificación, una CA). A partir de aquí, si la verificación es satisfactoria, se establece la conexión segura.
Por el contrario, aquí tenemos un esquema del funcionamiento de mTLS:
Como ya habréis podido apreciar, existe algún paso adicional, y es que ambas partes deben presentar un certificado válido, el cual será verificado por la parte opuesta.
Este paso se da durante el handshake antes mencionado. En este caso, no solamente el cliente verifica el certificado del servidor, sino que además el servidor también recibe el del cliente y lo valida.
Solo si ambos certificados son válidos se establecerá la conexión segura.
Implementación de mTLS en AWS Load Balancer
Una vez visto el concepto de mTLS, vamos a ver con un ejemplo cómo configurarlo en un ALB en AWS.
Lo primero que necesitaremos será una CA, la cual la podemos traer nosotros o generarla con el servicio de AWS Certificate Manager (ACM). Sea como sea, el fichero de la CA lo tendremos que subir a un bucket de S3. En nuestro ejemplo, tenemos la CA en formato .pem y lo hemos subido al bucket que hemos nombrado “str-ca-cert”:
Esto debe ser así ya que el siguiente paso es crear un almacén de confianza o trust store, el cual solo admite como origen un bucket de S3 para los certificados Deberemos acceder a la consola del servicio EC2 > Load Balancing > Trust Store, y crear uno nuevo con el nombre que queramos indicando el bucket donde tenemos la CA:
El siguiente paso será hacer la asociación del trust store al balanceador. Para ello nos desplazamos a nuestro balanceador y seleccionamos el listener seguro (es decir, puerto 443):
Dentro del listener, en la pestaña Security seleccionaremos “Edit secure listener settings” y marcamos la casilla de “Mutual authentication (mTLS)”, eligiendo como opción “Verify with trust store”. Por último seleccionamos el trust store que hemos creado anteriormente.
Y con esto ya estaría todo listo. Podemos verificar en las configuraciones del listener que mTLS está habilitado y que además no se permite a los clientes conectar con un certificado expirado.
A partir de aquí, los clientes deberán presentar un certificado válido firmado por la CA almacenada en nuestro trust store como requisito para que se pueda establecer la conexión.