Integración de SAML2

Disponible a partir de la versión 3.0-jailbreak

 

 

A partir de la versión 3.0-jailbreak de plataforma, es posible utilizar Keycloak como IM avanzado y configurar Identity Brokering con un IdP de SAML2.

Esto nos permitirá poder delegar la autenticación en el IdP teniendo a Keycloak como intermediario, para así poder seguir utilizando Oauth2 como estándar de autenticación/autorización en plataforma y aplicaciones que trabajen con la ésta.

Nota

Aunque se seguirá pudiendo utilizar Oauth y los tokens generados por dicho mecanismo, para la obtención del token solo se podrá usar el flujo de código de autorización. Esto es debido a que, como bien es sabido, SAML2 es un protocolo síncrono que requiere de la participación del navegador en una serie de redirecciones. Una vez obtenido el token, se podrá utilizar en las cabeceras HTTP de Authorization.

Configuración en Keycloak

El primer paso será configurar el identity brokering en Keycloak.

Identity Provider

Lo primero será dar de alta el servidor IdP SAML2. Para ello tendremos que logarnos en la consola de administración de Keycloak. (p.e. https://development.onesaitplatform.com/auth/ )

Una vez dentro, iremos al Realm “onesaitplatform” que es el que se usa por defecto si no se utiliza multitenant.

A continuación, nos dirigiremos a la sección “Identity providers” del menú, y añadiremos uno nuevo de tipo “SAML v2.0”:

Aquí tendremos que configurar una serie de parámetros relacionados con el IdP que se va a usar.

alias → Nombre del IdP configurado (p.e. saml2idp)

Single Sign-On Service URL → URL de servicio SSO del IdP (p.e. http://localhost:8082/simplesaml/saml2/idp/SSOService.php)

Single Logout Service URL → URL del servicio de Log Out del IdP (p.e. http://localhost:8082/simplesaml/saml2/idp/SingleLogoutService.php)

Principal Type → Attribute [Name]

Principal Attribute → Nombre del atributo SAML donde viene la información del userid único (p.e. uid o sAMAccountName)

El resto de parámetros los dejaremos por defecto. Le damos al botón de save para guardar la configuración.

Una vez guardada, vamos a la pestaña de mappers, donde tendremos que añadir todos los atributos que vienen de la SAML assertion y que vamos a importar para después poder mapear con un usuario de plataforma (userid, email, name).

Le damos a “create” para añadir un nuevo atributo.

A continuación se selecciona Attribute importer y el nombre del atributo a importar (p.e. uid que será el userid del usuario en plataforma)

Repetimos el proceso para email y name, quedándonos 3 mappers definidos:

 

Authentication Flow

Ahora tenemos que crear el flujo para la importación del usuario en el primer log in.

Nos dirigimos a “Authentication” en el menú, y en la misma pestaña “Flows” le damos a “New”:

Le damos un alias y hacemos click en “save”

Una vez creado el Flow, nos aparecerá en la lista del combo box de “Flows”.

Ahora deberemos darle a “Add execution”. Seleccionamos como provider “Process IdP Login Callbak” y le damos a “save”.

Volveremos a la vista de Flows con la nueva ejecución. En la misma ejecución a la derecha, le damos a “Actions → Config” para configurar la ejecución.

Aquí debemos mapear los atributos de plataforma: username, email y fullName con los atributos de SAML que se han importado anteriormente. Además, tenemos un campo “admins whitelist” donde podemos indicar una lista de usuarios separados por comas para asignarles ROLE_ADMINISTRATOR en plataforma.

Por último, volvemos a “Identity providers” a través del menú, y seleccionamos el IdP de SAML que creamos en el paso anterior. Buscamos el parámetro de configuración “First Login Flow” y seleccionamos el Flujo que acabamos de crear:

Guardamos los cambios.

Configuración en Service Provider (SP) o aplicativos

Una vez configurado Keycloak, ya solo queda configurar el cliente Oauth que vaya a hacer uso de esta autenticación.

ClientId y ClientSecret serán: onesaitplatform

URL de código de autorización Oauth: https://{HOST}//auth/realms/onesaitplatform/protocol/openid-connect/auth?scope=openid&kc_idp_hint=saml2idp

Le añadimos el parámetro kc_idp_hint=saml2idp que hace referencia al alias de nuestro SAML2 provider, para que al redirigirnos a Keycloak, éste ya sepa que queremos autenticarnos a través de SAML, y no a través de usuario y contraseña de plataforma.

Una vez levantada la aplicación, cuando se desencadene el flujo de autenticación, se nos redirigirá a IdP para logarnos. Una vez autenticados en el IdP SAML2, se nos devolverá a la aplicación cliente con un token JWT.

A continuación se muestra un ejemplo utilizando un servidor simplesaml como IdP para la demostración.

Token obtenido tras el login:

Configuración extra nginx

 

proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header Host $host;

Keycloak ENV VAR:

Esquema de autenticación con SAML