En este artículo vamos a ver como configurar la aplicación web de Camunda BPM y el servidor Keycloak para realizar el inicio de sesión mediante Single Sign-On (SSO), a través del protocolo OpenID Connect. Ambos compartirán el mismo repositorio de usuarios y grupos en LDAP.
Para configurar la aplicación web, usaremos el plugin Keycloak Camunda Identity Provider, ya que facilita la integración con Keycloak.
1. Configuración de Keycloak
Antes de nada debemos configurar un nuevo realm en Keycloak, que será compartido con la aplicación web de Camunda. Un realm es un conjunto de usuarios, credenciales, roles y grupos. En este caso vamos a configurar un realm en un repositorio de usuarios LDAP ya existente.
1.1 Configuración del realm de LDAP
En este punto configuraremos el realm de usuarios LDAP. Los pasos a seguir son:
1.Desde el panel de administración, seleccionamos la opción Add Realm
y creamos un realm con nombre Ldap. A continuación añadimos un proveedor de tipo ldap en Add user federation provider
.
2. Luego configuramos los parámetros de nuestro LDAP en el siguiente formulario:
3. Y activamos la sincronización con las opciones Periodic Full Sync
y Periodic Changed Users Sync
.
4. Por último guardamos y ejecutamos la opción Synchronize all users.
Llegados a este punto, desde la pestaña Users ya podremos ver los usuarios existentes en nuestro LDAP:
1.2 Configuración de grupos de LDAP
Una vez hayamos acabado con el primer punto, configuraremos grupos de LDAP.
1.Dentro de User Federation
, en la pestaña Mappers
, configuraremos tambien los grupos de LDAP, y para ello debemos añadir un nuevo mapper. Los parámetros serán los siguientes:
2. Si volvemos a sincronizar los usuarios, podremos ver el listado de grupos en LDAP:
1.3 Configuración de la aplicación cliente Camunda en Keycloak
En este paso, configuraremos la aplicación cliente Camunda en Keycloack, seguiremos los siguientes pasos:
1. Vamos a dar de alta la aplicación de Camunda en Keycloak. Para ello primero crearemos un nuevo cliente llamado camunda-id-service
:
2. Después seleccionaremos las opciones:
- Access Type: confidential
- Service Accounts Enabled: ON
- Valid Redirect URIs
3. En la pestaña Service Account Roles, añadiremos los roles query-groups
, query-users
, view-users
a los client roles del service account realm-management
(si estuvieramos en el realm master, usaríamos el realm master-realm
).
4. Por último, tomaremos nota de las credenciales de cliente en:
2. Configuración de Camunda
En este penúltimo paso, haremos la configuración de Camunda y LDAP así como también la configuración de Camunda y Single sign-on (SSO).
2.1 Configuración de Camunda y LDAP
1.Para conectar Camunda con LDAP, agregaremos la configuración al fichero conf/bpm-platform.xml
como en el siguiente ejemplo:
<plugin> <class>org.camunda.bpm.identity.impl.ldap.plugin.LdapIdentityProviderPlugin</class> <properties> <property name="serverUrl">ldap://sandbox-openldap:389/</property> <property name="acceptUntrustedCertificates">false</property> <property name="managerDn">cn=admin,dc=demo,dc=chakray,dc=cloud</property> <property name="managerPassword">password</property> <property name="baseDn">dc=demo,dc=chakray,dc=cloud</property> <property name="userSearchBase">ou=Users</property> <property name="userSearchFilter">(objectclass=person)</property> <property name="userIdAttribute">uid</property> <property name="userFirstnameAttribute">cn</property> <property name="userLastnameAttribute">sn</property> <property name="userEmailAttribute">mail</property> <property name="userPasswordAttribute">userpassword</property> <property name="groupSearchBase">ou=Groups</property> <property name="groupSearchFilter">(objectclass=groupOfNames)</property> <property name="groupIdAttribute">cn</property> <property name="groupNameAttribute">cn</property> <property name="groupMemberAttribute">member</property> <property name="sortControlSupported">false</property> </properties> </plugin> <!-- LDAP CONFIGURATION --> <!-- The following plugin allows you to grant administrator authorizations to an existing LDAP user --> <plugin> <class>org.camunda.bpm.engine.impl.plugin.AdministratorAuthorizationPlugin</class> <properties> <!--<property name="administratorUserName">camunda-admin</property>--> <property name="administratorGroupName">camunda-admins</property> </properties> </plugin>
2.2 Configuración de Camunda y Single sign-on (SSO)
1. En este paso hay que ditar el fichero conf/bpm-platform.xml
y añadir la siguiente configuración del plugin. En este caso estamos incluyendo la clave que obtuvimos en Keycloak.
<plugin> <class>org.camunda.bpm.extension.keycloak.plugin.KeycloakIdentityProviderPlugin</class> <properties> <property name="keycloakIssuerUrl">http://localhost:8081/auth/realms/Ldap</property> <property name="keycloakAdminUrl">http://localhost:8081/auth/admin/realms/Ldap</property> <property name="clientId">camunda-id-service</property> <property name="clientSecret">84d2bfb5-5ced-45de-8123-3a8b5c531248</property> <property name="useUsernameAsCamundaUserId">true</property> <property name="useGroupPathAsCamundaGroupId">true</property> <property name="administratorGroupName">camunda-admin</property> <property name="disableSSLCertificateValidation">true</property> <property name="authorizationCheckEnabled">true</property> </properties> </plugin>
2. Editar tambien el fichero webapps/camunda/WEB-INF/web.xml y configurar el siguiente filtro después del elemento session-config
:
<filter> <filter-name>KeyCloak OpenID Connect Filter</filter-name> <filter-class>org.keycloak.adapters.servlet.KeycloakOIDCFilter</filter-class> </filter> <filter-mapping> <filter-name>KeyCloak OpenID Connect Filter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> <!-- Container Based Authentication filter --> <filter> <filter-name>Container Based Authentication Filter</filter-name> <filter-class>org.camunda.bpm.webapp.impl.security.auth.ContainerBasedAuthenticationFilter</filter-class> <init-param> <param-name>authentication-provider</param-name> <param-value>org.camunda.community.auth.keycloak.sso.KeycloakSSOAuthenticationProvider</param-value> </init-param> </filter> <filter-mapping> <filter-name>Container Based Authentication Filter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
3. Editar los siguientes ficheros con el mismo contenido y copiar el Secret obtenido en un paso anterior, además de la url de Keycloak y el nombre del cliente que hemos creado:
-
webapps/camunda/WEB-INF/keycloak.json
-
webapps/engine-rest/WEB-INF/keycloak.json
{ "realm": "Ldap", "auth-server-url": "http://localhost:8081/auth", "ssl-required": "external", "resource": "camunda-id-service", "verify-token-audience": true, "credentials": { "secret": "84d2bfb5-5ced-45de-8123-3a8b5c531248" }, "use-resource-role-mappings": true, "confidential-port": 0 }
3. Prueba de Single sign-on (SSO)
Una vez hecha la configuración, haremos una prueba para ver si los pasos anteriores están realizados correctamente:
1. Si hemos configurado correctamente los servidores y reiniciado, cuando accedemos la página de Camunda sin estar autenticados, esta nos redigira a la página de Keycloak:
Si quieres saber más al respecto, no dudes en contactarnos para obtener más información.