OpenIDM - Sécuriser un Connecteur Database Table

Dans un projet client qui utilise IDM 7 (après une montée de version OpenIDM 3.1 vers IDM 7 qui s'est plutôt bien passée), nous avons mis en place la gestion du cycle de vie et notamment la suppression automatique de comptes 30 jours après la fin de contrat, comme ce que l'on voit souvent.

Il a été décidé d'archiver quelques données des utilisateurs, histoire d'avoir un peu de traces.

Pour ce faire nous avons mis en place un connecteur Database Table, qui pointe sur une table d'une base PostgreSQL. La base utilisée est la même que celle qui héberge le repository IDM.

Tout fonctionnait correctement, jusqu'au moment où une insertion dans la table est tombée en erreur.

Le message d'erreur :

[122] janv. 07, 2021 9:06:00.069 AM org.identityconnectors.framework.impl.api.local.operations.CreateImpl create
GRAVE: buildSelectBasedAttributeInfo in SQL: 'SELECT * FROM openidm.archive_managed_user WHERE objectid IS NULL'
org.postgresql.util.PSQLException: FATAL: terminating connection due to administrator command
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2532)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2267)

[122] janv. 07, 2021 9:06:00.071 AM org.apache.tomcat.jdbc.pool.PooledConnection clearWarnings
AVERTISSEMENT: Unable to clear Warnings, connection will be closed.
org.postgresql.util.PSQLException: This connection has been closed.
        at org.postgresql.jdbc.PgConnection.checkClosed(PgConnection.java:865)
        at org.postgresql.jdbc.PgConnection.clearWarnings(PgConnection.java:759)
        at org.apache.tomcat.jdbc.pool.PooledConnection.clearWarnings(PooledConnection.java:837)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.returnConnection(ConnectionPool.java:977)

[122] janv. 07, 2021 9:06:00.073 AM org.forgerock.openidm.quartz.SchedulerServiceJob execute
AVERTISSEMENT: Scheduled service "scheduler-service-group.delete" invocation reported failure: org.forgerock.json.resource.ForbiddenException: {code=500, reason=Internal Server Error, message=Operation CREATE failed with ConnectorException on system object}
org.forgerock.openidm.quartz.ExecutionException: org.forgerock.json.resource.ForbiddenException: {code=500, reason=Internal Server Error, message=Operation CREATE failed with ConnectorException on system object}
        at org.forgerock.openidm.script.impl.ScriptRegistryService.execute(ScriptRegistryService.java:772)
        at org.forgerock.openidm.quartz.SchedulerServiceJob.execute(SchedulerServiceJob.java:123)

 

Analyse de la cause

En regardant dans les logs nous nous sommes aperçus que la base était indisponible périodiquement, pour une sauvegarde offline.

Autant le "moteur" IDM était capable de reprendre son activité une fois la sauvegarde terminée et la base redémarrée, autant le connecteur n'arrivait pas à relancer une connexion.

Résolution

Après différentes recherches sur le Web et l'ouverture d'un ticket "How do I ? " chez Forgerock, j'ai pu modifier le fichier de configuration provisioner.openicf-archiveDB.json pour y modifier les paramètres suivants :

  • "validationInterval" : "30000"  (permet de limiter la fréquence de validation)
  • "validationQueryTimeout" : "30" (time-out pour les requêtes de validation)
  • "validationQuery" : "SELECT 1 FROM archive_managed_user" (requête SQL utilisée pour la validation)
  • "testOnConnect" : true (permet de valider avant la connection)
  • "testOnBorrow" : true (permet de valider avant d'utiliser une connection dans le pool)

Ce sont surtout les paramètres validationQuery et testOnBorrow qui permettent de gérer les cas de déconnexion.

Une fois la nouvelle configuration mise en place, le connecteur devient fault-tolerant et peut reprendre son activité même après une perte de connexion à la base de données.

 

Catégorie

Ajouter un commentaire

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.