Article publié le 05/01/2022 par Mayane Maman
Cet article est une introduction à l'implémentation d'un Remote Connector Server (RCS) afin d'utiliser les utilisateurs présent sur un annuaire LDAP externe pour s'authentifier sur des applications qu'on a connecté sur Forgerock Identity Cloud.
Le RCS va jouer le rôle de passerelle entre le FIC et notre annuaire LDAP. On pourra alors visualiser les utilisateurs de l'annuaire LDAP depuis la console du FIC (en décidant attribut par attribut quoi synchroniser). En ce qui concerne le mot de passe, on peut choisir de synchroniser les mots de passe (ou leur hash) ou décider de ne pas stocker de mot de passe dans le FIC et toujours reposer sur le mot de passe de l'annuaire. On parlera du mot de passe dans l'article suivant.
Dans notre cas, nous allons mettre en place le RCS en mode client, les flux ne seront donc que dans le sens sortant du RCS server vers le FIC.
Prérequis :
un tenant FIC et d'un compte administrateur.
un annuaire LDAP externe (on va utiliser un Forgerock DS en mode évaluation)
un serveur disposant d'une JRE 11 où installer le RCS, capable de dialoguer via un flux sortant HTTPS vers le FIC et en LDAPS vers l'annuaire LDAP
Il faudra se rendre sur https://<tenant>.forgeblocks.com/platform/?realm=alpha#/connect .
-Cliquer sur New Connector Server, ajouter un nom: rcs1 par exemple et activer SSL
-Réinitialiser le Client Secret en cliquant sur Reset
Comme on le voit, le statut du connecteur est en "waiting to connect...", c'est normal, il nous reste à installer et configurer le RCS.
Lorsque l'on a créé le connecteur cela a automatiquement créé une application de type "machine to machine" appelée "RCSClient":
Nous allons donc commencer à télécharger le Remote Connector Server en version Java, puis nous allons le configurer.
Il nous faut installer le RCS sur un serveur qui peut dialoguer avec notre serveur LDAP externe.
L'installation est simple:
$ cd /path/to/rcs
$ unzip openicf-zip-1.5.20.2.zip.
Le rcs sera donc disponible sur: /path/to/rcs/openicf/
Nous allons éditer le fichier : /path/to/rcs/openicf/conf/ConnectorServer.properties avec toutes nos configurations :
Ajouter les credentials de OAuth2 pour obtenir le token de OAuth2 :
connectorserver.clientId=RCSClient
connectorserver.clientSecret=password
Décommenter ces paramètres et les adapter par rapport à l’environnement :
connectorserver.tokenEndpoint=https://<tenant>.forgeblocks.com/am/oauth2/realms/root/realms/alpha/access_token #Pour récupérer l’access token
connectorServerName=rcs1 #Nom du connecteur lorsque nous l'avons ajouté dans la première étape sur Forgerock Identity Cloud
connectorserver.scope=fr:idm:* #OAuth2 token scope
connectorserver.url=wss://<tenant>.forgeblocks.com/openicf/0 wss://<tenant>.forgeblocks.com/openicf/1 wss://<tenant>.forgeblocks.com/openicf/2 #Utiliser wss plutôt que HTTPS pour que le client puisse obtenir un token de support via OpenID.
connectorserver.webSocketConnections=3 #Spécifie le nombre de sockets que le serveur de connecteurs établira et conservera pour chaque IDM auquel il se connecte.
connectorserver.pingPongInterval=60
connectorserver.usessl=true
connectorserver.housekeepingInterval=20
connectorserver.groupCheckInterval=900
connectorserver.newConnectionsInterval=10
connectorserver.connectionTtl=3000
Démarrons le Remote Server sur le client OAuth 2.0 :
$ cd /path/to/rcs/openicf
$ bin/ConnectorServer.sh /run
ou bien en mode debug:
bin/ConnectorServer.sh jpda /run #En mode débug
Sur Forgerock Identity Cloud, le connecteur devrait être maintenant connecté:
Evidement, il faudra mettre en place une solution plus pérenne pour la gestion du service RCS (comme la mise en place d'un daemon linux ou équivalent).
Avant d'implémenter le LDAP externe, nous allons d'abord importer les certificats DS pour pouvoir utiliser SSL.
Exportons le certificat du Directory Server grâce à cette commande :
/path/to/opendj/bin/dskeymgr export-ca-cert \
--deploymentKey XXXXX \
--deploymentKeyPassword 'password' \
--alias ds-ca-cert \
--outputFile /path/to/ds-ca-cert.pem
Pour la configuration SSL du RCS nous allons décommenter ces lignes dans le fichier /path/to/rcs/openicf/conf/ConnectorServer.properties :
connectorserver.trustStoreFile=security/truststore.pkcs12
connectorserver.trustStoreType=PKCS12
connectorserver.trustStorePass=changeit
Mettre ensuite notre certificat DS dans le truststore du RCS :
$ keytool -import -file /path/to/ds-ca-cert.pem -alias server-cert -keystore /path/to/rcs/openicf/security/truststore.pkcs12
Enfin, exportons tous les certificats du truststore de Java dans notre truststore :
$ keytool -importkeystore -srckeystore /etc/pki/java/cacerts -destkeystore /path/to/rcs/openicf/security/truststore.pkcs12 -deststoretype jks -srcstorepass
changeit -deststorepass changeit -v -noprompt
Nous allons maintenant ajouter le connecteur LDAP dans la console Identity Management du FIC et marquer tous les paramètres du serveur LDAP.
On commence déjà par donner
un nom au connecteur (ici on a fait original en l'appelant LDAP, mais mieux vaut être plus précis)
le nom du "remote host" correspond au connecteur que nous avons configuré plus haut.
le type de connecteur est LDAP (mais on pourra regarder tout ce qui est disponible grâce au menu déroulant)
Il faut ensuite indiquer au RCS comment contacter le serveur LDAP.
Dans notre cas le rcs est installé sur le même serveur que l'annuaire LDAP, donc nous avons mis l'hôte localhost,
on indiquera le port du serveur ldap et s'il faut utiliser SSL
ainsi qu'un compte de service (avec le DN et son mot de passe)
et on indiquera les détails sur le base DN, le user filter, le group filter...
Dans notre cas, nous avons utilisé un serveur DS installé en mode démonstration.
Lors de l'accès à la page des utilisteurs dans l'onglet data https://<tenant>.forgeblocks.com/admin/?realm=alpha#connectors/data/provisioner.openicf_ldap/, rien ne remontait et une erreur s'affichait "Internal server error, please contact your administrator".
Après analyse du problème, on a vu qu'Identity Management de Forgerock Identity Cloud avait une configuration de l'attribut CN en monovalué alors que l'annuaire DS en mode évaluation a des entrées avec cet attribut en multivalué.
En allant sur Objets Types -> account et éditer cn en attribuant flags à multivalued, le problème a été résolu.
Nous pouvons constater dans l'onglet data que tous les utilisateurs du ldap sont bien affichés.
Pour le moment, les utilisateurs du LDAP ne sont visibles que dans l'affichage du Connector dans l'onglet data -> users. Cela permet de confirmer si Forgerock Identity Cloud a réussi à recevoir les données du LDAP. Nous allons donc maintenant pouvoir importer les utilisateurs.
VI) Import des données de l'annuaire dans le FIC via un mapping
Afin d'importer les utilisateurs, nous allons réaliser un mapping.
Attribuer la source au serveur LDAP et la target au realm utilisé dans Forgerock Identity Cloud.
Ajouter ensuite les attributes grid et changer les behaviors par Default-actions.
On ne décrira pas ici toutes les configurations possibles et nécessaires du mapping.
En plus des attributs du ldap, on peut aussi choisir de synchroniser le mot de passe.
Nous avons plusieurs choix concernant les mots de passe mais là n'est pas le but de cet article.
Dans Manage Identities, nous devrions voir les utilisateurs importés.
Récapitulatif :
À la fin de cet article, nous avons un RCS opérationnel sur FIC qui permet d'importer un serveur LDAP et dont nous avons fait un mapping pour implémenter les utilisateurs sur Manage Identities.
Dans le cadre de la rédaction de cet article nous n'avons utilisé qu'un seul RCS, mais il est possible de mettre en place un cluster pour éviter que le RCS soit un bottleneck. Il faudra également créer un démon, gérer la rotation des logs, ou encore mettre en place un RCS Agent…
Les utilisateurs et leurs attributs importés, on peut s'occuper de leur mot de passe pour pouvoir ensuite leur permettre de s'authentifier aux applications connectés au FIC. On présente cela dans cet article.
Le RCS nous fournit des connecteurs standards dont le LDAP fait partie, mais il est également possible de développer son propre connecteur.