Comment connecter Pentaho à un LDAP

L’annuaire LDAP est en passe de devenir un outil indispensable aux entreprises, qui demandent de plus en plus à ce qu’il soit utilisé sur chaque application pour l’identification des utilisateurs.

Dans ce contexte, je propose de présenter la manière dont on peut configurer Pentaho pour que celui-ci utilise un annuaire LDAP.

Pentaho est une application Java qui utilise le framework Spring 2.5.6 ainsi que la partie spring-security pour gérer la couche de sécurité.

Il n’est pas sorcier de connecter Pentaho à un LDAP. De simples modifications dans des fichiers de configuration suffisent. Ceci est d’autant plus simple que Pentaho fournit déjà des modèles de configuration pour le LDAP, qu’il suffit d’adapter.

Voici l’ensemble des fichiers que nous devons modifier :

  • Pentaho-solutions/system/pentaho-spring-beans.xml
  • Pentaho-solutions/system/applicationContext-spring-security-ldap.xml
  • Pentaho-solutions/system/applicationContext-pentaho-security-ldap.xml
  • Pentaho-solutions/system/applicationContext-security-ldap.properties

Par défaut, Pentaho utilise les fichiers de configuration d’authentification par hibernate. La première étape consiste à indiquer à Pentaho d’utiliser les fichiers de configuration pour le LDAP. Pour cela, il faut modifier le fichier Pentaho-solutions/system/pentaho-spring-beans.xml et remplacer les lignes :

<import resource="applicationContext-spring-security-hibernate.xml" />
<import resource="applicationContext-pentaho-security-hibernate.xml" />

Par

<import resource="applicationContext-spring-security-ldap.xml" />
<import resource="applicationContext-pentaho-security-ldap.xml" />

Les choses sérieuses peuvent enfin commencer !

Configuration de la connexion au LDAP

Les propriétés de connexion sont à indiquer dans le fichier Pentaho-solutions/system/applicationContext-security-ldap.properties.

Modifiez les paramètres suivant en indiquant l’adresse de connexion au serveur, le userDN et le password :

contextSource.providerUrl=ldap\://localhost\:10389/ou\=system
contextSource.userDn=uid=admin,ou=system
contextSource.password=secret

Configuration de la requête de recherche des utilisateurs

Toujours dans le fichier applicationContext-security-ldap.properties, vous allez devoir configurer les propriétés de recherche des utilisateurs dans le LDAP.

L’exemple de LDIF ci-dessous va nous permettre de montrer comment identifier les utilisateurs « pierre » et « jean » situés dans la branche ou=user,dc=exemple,dc=fr.

dn: ou=user,dc=exemple,dc=fr
objectClass: top
objectClass: organizationalUnit
ou: user

dn: uid=pierre,ou=user,dc=exemple,dc=fr
objectClass: person
uid: pierre

dn: uid=jean,ou=user,dc=exemple,dc=fr
objectClass: person
uid: jean

Dans le cas d’une structure LDAP de ce type, il est nécessaire de modifier les paramètres suivants :

  • userSearch.searchBase=ou=user,dc=exemple,dc=fr : La branche de départ pour la recherche. Dans cet exemple, nous indiquons le DN de « ou=user ».
  • userSearch.searchFilter=(uid=\{0\}) : Le filtre à utiliser pour identifier l’utilisateur. Dans notre cas, nous l’identifions par son « uid ». L’argument {0} correspond au login que l’utilisateur aura rentré en se connectant.

Ajout du rôle par défaut Authenticated

Par défaut, dans Pentaho, un utilisateur doit avoir le rôle Authenticated pour être autorisé à se connecter à la console utilisateur. Lorsqu’on utilise une authentification par LDAP, il est très rare que ce rôle existe au sein du LDAP. Il est donc possible d’ajouter une propriété dans les configurations pour que les utilisateurs qui arrivent à s’authentifier possèdent automatiquement le rôle Authenticated.

Pour cela, modifiez le fichier Pentaho-solutions/system/applicationContext-spring-security-ldap.xml et définissez la propriété « defaultRole » dans le bean « populator » :

<bean id="populator"
	class="org.springframework.security.ldap.populator.DefaultLdapAuthoritiesPopulator">
	<constructor-arg index="0">
		<ref local="contextSource" />
	</constructor-arg>
	<constructor-arg index="1" value="${populator.groupSearchBase}" />
	<property name="groupRoleAttribute" value="${populator.groupRoleAttribute}" />
    	<!-- {0} will be replaced with user DN; {1} will be replaced with username -->
	<property name="groupSearchFilter" value="${populator.groupSearchFilter}" />
    	<property name="rolePrefix" value="${populator.rolePrefix}" />
    	<property name="convertToUpperCase" value="${populator.convertToUpperCase}" />
     	<property name="searchSubtree" value="${populator.searchSubtree}" />
     	<property name="defaultRole" value="Authenticated" />
</bean>

A partir de cette étape, vous pouvez normalement déjà vous connecter avec les utilisateurs définis dans le LDAP et accéder à la console utilisateur. Bien entendu, il manque une partie qui a toute son importance : la récupération des rôles en fonction de l’utilisateur.

Récupération des rôles d’un utilisateur par LDAP

Pentaho a déjà une classe préconfigurée qui permet de récupérer les rôles possédant un attribut permettant d’identifier directement un utilisateur.
L’exemple de LDIF ci-dessous va nous permettre de montrer comment récupérer le rôle « ADMIN » pour les utilisateurs « pierre » et « jean ».

dn: ou=groups,dc=exemple,dc=fr
objectClass: top
objectClass: organizationalUnit
ou: groups

dn: cn=admin,ou=groups,dc=exemple,dc=fr
objectClass: groupOfNames
objectClass: top
cn: admins
description: Administrateurs
member: uid=pierre,ou=user,dc=exemple,dc=fr
member: uid=jean,ou=user,dc=exemple,dc=fr
ou: admin

Dans le cas d’une structure LDAP de ce type, il va être nécessaire de modifier les propriétés commençant par « populator » dans le fichier Pentaho-solutions/system/applicationContext-security-ldap.properties.

  • populator.groupRoleAttribute=ou : L’attribut permettant d’identifier le nom du groupe. Dans cet exemple nous prenons l’attribut « ou » pour récupérer le nom du groupe : « admin ».
  • populator.groupSearchBase=ou=groups,dc=exemple,dc=fr : La branche à partir de laquelle la recherche commencera. Dans cet exemple c’est l’ « organizationUnit » qui s’appelle « groups » et qui à pour DN « ou=groups,dc=exemple,dc=fr »
  • populator.groupSearchFilter=(member=\{0\}) : Le filtre à utiliser pour savoir si l’utilisateur appartient au groupe. L’argument {0} est le DN entier de l’utilisateur.
  • populator.searchSubtree=false : Propriété pour indiquer si la recherche doit s’effectuer dans les sous-branches.
  • populator.rolePrefix= : Préfixe à ajouter sur les valeurs chargées depuis l’annuaire. Dans notre cas, nous ne souhaitons pas rajouter de préfixe.
  • populator.convertToUpperCase=true : Propriété pour convertir ou non le nom des rôles en majuscule. Dans cet exemple, nous la mettons à « true ».

Pentaho offre la possibilité, depuis la console utilisateur, de paramétrer des droits d’accès sur des dossiers et des fichiers. Cette fonctionnalité est accompagnée d’une liste contenant l’ensemble des utilisateurs et des rôles qui sont disponibles. Cette liste ne sort pas de nulle part, il est nécessaire de paramétrer les requêtes si l’on veut les récupérer depuis le LDAP.

Récupération de la liste de tous les rôles

Sur le même principe que précédemment, nous allons modifier certains paramètres dans le fichier Pentaho-solutions/system/applicationContext-security-ldap.properties. Les paramètres à modifier sont ceux commençant par « allAuthoritiesSearch ».

En restant dans la même structure de LDAP que dans la partie précédente, il va falloir modifier les paramètres de la façon suivante :

  • allAuthoritiesSearch.roleAttribute=ou : L’attribut permettant d’identifier le nom du groupe. Dans cet exemple nous prenons l’attribut « ou » pour récupérer le nom du groupe : « admin ».
  • allAuthoritiesSearch.searchBase= ou=groups,dc=exemple,dc=fr : La branche à partir de laquelle la recherche commencera. Dans cet exemple c’est l’ « organizationUnit » qui s’appelle « groups » et qui à pour DN « ou=groups,dc=exemple,dc=fr »
  • allAuthoritiesSearch.searchFilter=(objectClass=groupOfNames) : Le filtre pour identifier un objet étant considéré comme un groupe. Dans notre cas ce sont tous ceux de type groupOfNames

Récupération de la liste de tous les utilisateurs

Pour configurer la récupération de la liste de tous les utilisateurs, nous devons modifier le fichier Pentaho-solutions/system/applicationContext-pentaho-security-ldap.xml.

Dans la configuration du bean ayant pour id « AllUsernamesSearch », il est nécessaire de remplacer les valeurs mises par défaut par des propriétés que nous configurerons dans le fichier Pentaho-solutions/system/applicationContext-security-ldap.properties.

Remplacez : <constructor-arg index="0" value="ou=users" />
Par : <constructor-arg index="0" value="${allUsernamesSearch.searchBase}" />

Remplacez : <constructor-arg index="1" value="objectClass=Person" />
Par : <constructor-arg index="1" value="${allUsernamesSearch.searchFilter}" />

Remplacez: <constructor-arg index="0" value="uid" />
Par : <constructor-arg index="0" value="${allUsernamesSearch.userAttribute}" />

Vous obtiendrez normalement une configuration du bean allUsernamesSearch comme ci-dessous :

<bean id="allUsernamesSearch"
	class="org.pentaho.platform.plugin.services.security.userrole.ldap.search.GenericLdapSearch">
	<constructor-arg index="0" ref="contextSource" />
	<constructor-arg index="1">
		<bean
			class="org.pentaho.platform.plugin.services.security.userrole.ldap.search.LdapSearchParamsFactoryImpl">
			<constructor-arg index="0" value="${allUsernamesSearch.searchBase}" />
			<constructor-arg index="1" value="${allUsernamesSearch.searchFilter}" />
		</bean>
	</constructor-arg>
	<constructor-arg index="2">
		<bean
			class="org.pentaho.platform.plugin.services.security.userrole.ldap.transform.SearchResultToAttrValueList">
			<constructor-arg index="0" value="${allUsernamesSearch.userAttribute}" />
		</bean>
	</constructor-arg>
</bean>

Ensuite, il ne reste plus qu’à modifier le fichier Pentaho-solutions/system/applicationContext-pentaho-security-ldap.xml en ajoutant les propriétés suivantes :

  • allUsernamesSearch.searchBase= ou=user,dc=exemple,dc=fr : La branche de départ pour la recherche. Dans cet exemple, nous indiquons le DN de « ou=user ».
  • allUsernamesSearch.searchFilter =(objectClass=person) : Le filtre pour identifier un objet étant considéré comme un utilisateur. Dans notre cas, ce sont tous ceux de type person
  • allUsernamesSearch.userAttribute =uid : L’attribut permettant d’identifier le nom de l’utilisateur. Dans cet exemple nous prenons l’attribut « uid » correspondant à son login.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.