Autenticación por certificados
Desde la versión 4.1.0-outlaw se podrá activar la autenticación por certificados en nuestro Identity Manager avanzado.
A continuación vamos a detallar como activar la autenticación por certificados en el IM avanzado de plataforma.
Esta funcionalidad permite a los usuarios iniciar sesión en la plataforma y aplicación desarrolladas sobre la misma mediante certificados de cliente X509, con la ventaja de poder seguir utilizando Oauth2 como estándar de seguridad en las comunicaciones.
Configuración de Nginx
Legacy (Rancher 1.6)
Como el nginx termina la conexión SSL, necesitas configurar el forwarding del certificado a Keycloak primero.
Al nivel de server, añade:
#x509
ssl_verify_client optional_no_ca;
#se puede poner a optional y checkear la cadena de confianza con el siguiente parámetro
#CA.pem deberá contener todos los certificados concatenados de los issuers
#de certificados que vaya a aceptar nuestro sistema
#ssl_client_certificate /etc/nginx/ssl/CA.pem;
ssl_verify_depth 2;
A nivel de location, añade:
location /auth {
proxy_set_header X509-Cert $ssl_client_escaped_cert;
....
}
Kubernetes (Rancher 2.6+)
Como requisito para configurar un entorno con kubernetes, necesitas tener la versión 1.21+ de k8s para que el Ingress Controller soporte las anotaciones networking.k8s.io/v1
Creación del secret con las CAs
En primer lugar debes crear el secreto que contendrá los certificados concatenados de las CA necesarias para validar los certificados de cliente que se quieran autenticar.
Crea un secret llamado platform-ca en el namespace de onesaitplatform, por ejemplo, y como clave del secret, llámalo ca.crt , dejando como valor la cadena de certificados.
Configuración del Ingress Controller
En el Ingress Controller, tienes que poner las siguientes anotaciones:
nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
nginx.ingress.kubernetes.io/auth-tls-secret: onesaitplatform/platform-ca
nginx.ingress.kubernetes.io/auth-tls-verify-client: optional
nginx.ingress.kubernetes.io/auth-tls-verify-depth: "2"
Configuración del Config Map loadbalancer
Por último tienes que añadir la siguiente directiva al config map de nuestro balanceador, con el objetivo de propagar la cabecera HTTP que inyecta el Ingress Controller con el certificado:
Configuración Keycloak
Flujo de autenticación
Lo primero será modificar el flujo principal de autenticación, ‘Multitenant-browser-flow’:
Añade una execution, ‘X509 Onesait Platform’:
Márcala como alternativa en el flujo de autenticación, y ponla en el tercer nivel:
Configuración de la execution
Ahora tienes que configurar la execution para el mapeo de certificado - usuario.
Haz click en actions → config:
En este ejemplo, vas a configurarlo para aceptar DNIe como fuente de certificado electrónico.
Tienes que configurar los siguientes campos:
Import User after first log in: déjalo marcado para que importe a los usuarios después de la primera autenticación.
User Identity Source: déjalo a Match SubjectDN using RegEx, ya que de ahí se extraerá el ID de usuario.
User ID: expresión regular para extraer el ID único de usuario. En el caso del DNIe se extrae del campo SERIALNUMBER del DN del certificado.
Email: expresión regular para extraer el correo. En el caso del DNIe, no aplica. Déjalo vacío, ya que no aparece este campo.
Email suffix: sufijo del correo que se usará en caso de que no exista un RegEx para extraer el correo. El correo se compondrá de ID Usuario + @ + email suffix.
Full user name: RegEx para extraer el nombre de usuario completo, se pueden usar múltiples RegEx separadas por ‘;;’ como en el ejemplo, ya que en el DNIe el nombre de pila y el apellido vienen separados. El nombre completo será una concatenación de los valores obtenidos por las expresiones regulares.
Import DN as extrafields: márcalo si quieres almacenar en el campo extra fields de los usuarios de plataforma el DN completo extraído del certificado.
Administrators whitelist: lista de ID de usuarios, separados por comas, a los que se les va a dar rol administrador.
Default import Role: rol por defecto de importación de usuarios.
User mapping method: déjalo a Username or Email.
El resto de opciones, no hace falta configurarlas.
Truststore
Por último habrá que añadir los certificados de los issuers de los certificados electrónicos que vaya a aceptar el sistema. En el caso del DNIe, tienes que añadir el de la Policia Nacional.
Para añadirlo, solicítalo a través de soporte de plataforma.
El keystore de keycloak está ubicado en /opt/jboss/keycloak/standalone/configuration/keystore.jks, la contraseña es la misma que el JKS de la JVM.
En el directorio que tenemos de /onesait-cloud-platform/tools/keycloak/server se encuentra el keystore.jks con las CAs más comunes pedidas por los clientes. Siempre puedes añadir más y regenerar la imagen del keycloak server.
Conectar front/back al sistema de autenticación
Como se comentaba al principio del post, para integrar una aplicación con este sistema de autenticación, se seguirá usando Oauth2, con el flujo de código de autorización, de tal forma que la aplicación redireccionará al IM, este leerá el certificado del cliente si lo tiene configurado, y devolverá a la aplicación original un token JWT.
Existen librerías para configurar este tipo de flujo tanto para Spring Boot como para Vue JS, y habrá que configurar una serie de parámetros del estilo de: