Villamblard, le 15 avril 2020

ldap2pg est un outil de synchronisation des rôles et des privilèges d’une instance PostgreSQL à partir d’un annuaire compatible LDAP. La configuration est simple et puissante, via un fichier YAML. ldap2pg facilite l’intégration et la sécurisation de PostgreSQL dans votre infrastructure.

Depuis la rentrée 2019, le projet a fait l’objet de plusieurs versions, ce printemps 2020 est l’occasion de faire un tour des changements. Le rythme de développement est faible, régulier et constant. Ce rythme témoigne de la stabilité et de la vitalité du projet, un engagement de Dalibo pour la communauté PostgreSQL.

Les versions 5.1 et 5.2 requièrent une attention particulière lors de la mise à jour : la casse du nom des rôles est désormais respectée, des erreurs auparavant ignorées sont désormais levées.

ldap2pg

En 6 mois, Dalibo Labs a livré deux versions de ldap2pg. La documentation du projet liste les changements de chaque versions. Voyons certains aspects en détails.

Casse des noms de rôles

Dans PostgreSQL, le nom d’un rôle est identifiant, comme les noms de table et d’autres objets SQL. Sans protection, un identifiant est mis en minuscule. Ainsi SELECT * FROM TOTO; et SELECT * FROM toto; sont les mêmes requêtes. En revanche, les guillemets doubles protègent la casse, et même un espace dans l’identifiant. C’est-à-dire que CREATE TABLE "TO TO" (id serial); va effectivement créer une table en majuscule avec un espace au milieu de son nom. PostgreSQL laisse l’utilisateur assumer le risque.

Jusqu’à la version 5.1, ldap2pg passait systématiquement les identifiants en minuscule et ne travaillait qu’avec des minuscules. Désormais, ldap2pg protège systématiquement les identifiants : la casse est préservée. Les espaces sont autorisés. Notamment, ldap2pg supprimera un usurpateur utilisant une variante du nom de rôle en jouant sur la casse.

Pour facilité la migration, ldap2pg détecte le changement de casse d’un rôle - suppression et création d’un rôle avec uniquement un changement de nom - et optimise le changement grâce à la commande ALTER USER.

ldap2pg avertit du renommage. Aussi, lors de la mise à jour, prenez soin de vérifier si un rôle est renommé et alertez les utilisateurs concernés.

La recherche de renommage est un léger coût à l’exécution. Aussi, ce code sera supprimé dans un avenir lointain. Pensez à mettre à jour régulièrement ldap2pg pour alléger le travail de rattrapage d’historique. Nous conseillons une fois par an minimum, par exemple lorsque ldap2pg publie une version validée avec la dernière version majeure de PostgreSQL.

Définition de rôles statiques

Le fichier ldap2pg.yml décrit des rôles statiques et d’autres dynamiques, générés à partir de requêtes LDAP. Jusqu’à la version 5.2, des rôles statiques pouvaient être mélangés avec des rôles dynamiques. Or, les rôles associés à une requêtes LDAP sont générés pour chaque entrée LDAP, y compris les rôles statiques. Cela signifie que si votre requête LDAP ne retourne rien, les rôles statiques ne sont pas générés.

# Risqué :
- ldap:
    base: ou=...
  roles:
  - nom_statique
  - dyn_{cn}

# Sûr :
- role: nom_statique
- ldap:
    base: ou=...
  role: dyn_{cn}

ldap2pg 5.2 refuse la configuration risquée avec une erreur explicite. En général, nous conseillons de grouper les rôles statiques dans le premier item de la liste sync_map et de grouper les rôles dynamiques par requête LDAP.

Gestion des commentaires

PostgreSQL permet de commenter à peu près tous les objets en base, y compris les rôles. ldap2pg utilise le commentaire d’un rôle pour faciliter le traçage de son origine. Par défaut, ldap2pg écrit le commentaire Managed by ldap2pg.. Le paramètre comment permet de modifier ce commentaire et peut même inclure des valeurs LDAP. Il est parfois utile d’intégrer dans le commentaire le Distinguished Name (DN) LDAP ou un champ particulier de l’entrée de l’annuaire.

Jusqu’à ldap2pg 5.1, le commentaire était unique pour tous les rôles générés par une entrée LDAP. Désormais, le commentaire est associé au nom du rôle. Pour chaque rôle, ldap2pg génère un commentaire unique. Voici un exemple:

- ldap:
    base: (ou=...)
  role:
  - name: "{member.cn}"
    comment: "DN LDAP: {member}"

Dans cet exemple, ldap2pg requête un groupe et pour chaque membre, crée un rôle avec le Common Name (CN) du membre. Le commentaire inclut le DN complet présent dans l’attribut member. ldap2pg 5.2 garantit que les valeurs member.cn et member seront cohérentes.

ldap2pg 5.2 corrige des erreurs dans l’écriture du commentaire, comme le rétablissement du commentaire par défaut en cas de changement d’options.

Et davantage

ldap2pg a reçu aussi quelques correctifs d’erreurs que vous avez put rencontré. Le Changelog fournit la liste exhaustive des correctifs. Avant de mettre à jour, procéder à un test sur un environnement de pré-production ou à défaut, avec l’option --dry, activée par défaut.

Retrouvez la documentation en anglais, des procédures et le support communautaire à ces adresses :

  • Documentation en ligne : http://ldap2pg.rtfd.io/en/latest/
  • Le projet sur GitHub : https://github.com/dalibo/ldap2pg

Étienne BERSAC est le mainteneur de ldap2pg, un projet Dalibo Labs. Pour toutes questions techniques, l’équipe recommande d’utiliser la page de ldap2pg sur GitHub.


DALIBO

DALIBO est le spécialiste français de PostgreSQL. Nous proposons du support, de la formation et du conseil depuis 2005.