Ir al contenido principal

Cómo configurar single sign-on en Camunda mediante Keycloak

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.

User Federation

2. Luego configuramos los parámetros de nuestro LDAP en el siguiente formulario:

Add user

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:

User lookup

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:

User federation mapper

2. Si volvemos a sincronizar los usuarios, podremos ver el listado de grupos en LDAP:

User groups

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:

Add client

2. Después seleccionaremos las opciones:

Camunda ID service

3. En la pestaña Service Account Roles, añadiremos los roles query-groupsquery-usersview-users a los client roles del service account realm-management (si estuvieramos en el realm master, usaríamos el realm master-realm).

Camunda ID Service-2

4. Por último, tomaremos nota de las credenciales de cliente en:

Camunda ID SERVICE CREDENTIALS

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:

LDAP

2. Ya una vez autenticados, seremos redirigidos de nuevo a la aplicación web de Camunda con la sesión iniciada:

Camunda Tasklist

Si quieres saber más al respecto, no dudes en contactarnos para obtener más información.