Authentification LDAP depuis PostgreSQL

Il est fréquent dans une organisation qu’une politique de mots de passe doive être respectée sur les systèmes d’information. Le système de gestion de bases de données PostgreSQL propose pour cela le module passwordcheck qui est un module contrib qui permet de mettre en place des critères de complexité sur les mots de passe, mais ce dernier est assez pauvre en fonctionnalités.
En effet, il permet seulement de faire respecter les critères suivants :

  • Longueur du mot de passe.
  • Présence de majuscules et minuscules.
  • Présence de caractères numériques.

Au-delà de ces contrôles basiques, il est certes possible d’étendre la fonctionnalité, mais cela nécessite de modifier les sources du module (C).

Une alternative très intéressante en terme de fonctionnalités est d’interfacer l’instance PostgreSQL avec l’annuaire Active Directory de l’organisation. Avec cette option, on profite de la possibilité de mettre en place des règles de complexité et/ou d’expiration de mots de passe très évoluées. La mise en place de cet interfaçage est par ailleurs relativement simple.

 

Prérequis

Le lab pour cette installation est constitué des machines suivantes :

  • Un DC Windows Server 2019 (10.0.0.120). L’installation Active Directory ne sera pas décrite ici, le serveur est déjà promu contrôleur de domaine sur le domaine pglab.lan.
  • Un cluster PostgreSQL 12 (10.0.0.100) basé sur un serveur CentOS 7.
  • Le flux réseau sur le port 389 ouvert depuis le serveur PostgreSQL vers le contrôleur de domaine.
  • La création d’un user AD uniquement dédié au requêtage LDAP.

 

Préparation Active Directory

Afin de mettre en œuvre l’interfacage avec l’AD, on commence par créer un utilisateur pour le lookup LDAP. Ce compte ne sera pas celui qui doit s’authentifier auprès du cluster PostgreSQL, mais plutôt celui qui sera utilisé par le cluster pour rechercher des comptes utilisateur dans l’annuaire.

Pour créer un utilisateur, lancer la console « Utilisateurs et ordinateurs Active Directory » sur le contrôleur de domaine et créer un nouvel utilisateur dans l’UO Users :

Saisir son nom, ici on le nomme ldaplookup.

Saisir un mot de passe, décocher l’option « L’utilisateur doit changer son mot de passe à la prochaine ouverture de session ». Cocher l’option « Le mot de passe n’expire jamais ».

Répéter cette opération si aucun utilisateur n’existe pour la connexion PostgreSQL. Ici, nous avons créé l’utilisateur pguser1, dans l’UO Users également.

 

Connexion depuis PostgreSQL

Pour s’interfacer avec un annuaire LDAP, le moteur PostgreSQL a besoin d’un client LDAP, qu’il faut donc installer en tant que root sur le serveur.

yum install open-ldap-client

Se rendre dans le répertoire PGDATA de l’instance (variable d’environnement $PGDATA si l’environnement du cluster est bien configuré) et éditer le fichier pg_hba.conf.

cd $PGDATA
vi pg_hba.conf

Ce fichier est lu de manière séquentielle lors d’une tentative de connexion.
Il permet de configurer très finement les autorisations, et peut par exemple n’autoriser la connexion aux bases de données que via l’annuaire LDAP.
Ajouter la ligne suivante en début de fichier :

host all all 10.0.0.0/24 ldap ldapserver=10.0.0.120 ldapbasedn="cn=Users,dc=pglab,dc=lan" ldapbinddn="CN=ldaplookup,CN=Users,dc=pglab,dc=lan" ldapbindpasswd="secret" ldapsearchattribute="sAMAccountName"

Bien vérifier ou adapter les valeurs positionnées pour :

  • Le réseau IP concerné avec le masque CIDR correspondant, on autorise ici la connexion depuis tout le réseau 10.0.0 (10.0.0.0/24)
  • ldapserver : L’IP du contrôleur de domaine
  • ldapbasedn : Le path LDAP du user de lookup : CN=ldaplookup,CN=Users,dc=pglab,dc=lan
  • ldapbinddn : Le path LDAP de l’UO qui contient les utilisateur à authentifier, ici il s’agit de l’UO Users : cn=Users,dc=pglab,dc=lan
  • ldapbindpasswd : Password du user de lookup

Il convient alors de recharger la configuration du cluster PostgreSQL pour prendre en compte la modification dans le fichier pg_hba.conf :

pg_ctl reload

La connexion doit désormais être possible pour tous les utilisateurs qui se trouvent dans l’UO Users, et ce pour toutes les bases de données du cluster.
On peut bien entendu gérer plus finement quelles bases de données sont autorisées dans le fichier pg_hba.conf.
Une fois ce lien LDAP en place, la gestion des critères de complexité et d’expiration des mots de passe est entièrement déléguée à l’annuaire Active Directory, qui est très riche en fonctionnalités en la matière.