L’authentification LDAP

L’avantage de l’utilisation de LDAP est que toutes les informations des utilisateurs et des groupes peuvent être gérées de manière centralisée sur un serveur.

La première chose à faire est d’installer l’extension ldap pour PHP sur votre serveur linux :

apt install php7.4-ldap

Ensuite, pour que lizmap prenne en charge LDAP, vous devez modifier la méthode d’authentification dans la configuration comme ici.

Activation LDAP

Vous devez activer le module ldapdao avec cette commande

php lizmap/install/configurator.php ldapdao

Ensuite vous devez ajouter une section [ldap:lizmapldap] dans votre profiles.ini.php, avec des paramètres qui permettent de se connecter sur votre serveur ldap, et de rechercher des utilisateurs dans l’annuaire. La section peut déjà exister si vous avez créé profiles.ini.php à partir de profiles.ini.php.dist.

[ldap:lizmapldap]
hostname=localhost
port=389
adminUserDn="cn=admin,ou=lizmap,dc=com"
adminPassword=""
searchUserBaseDN="dc=XY,dc=fr"
searchUserFilter="(&(objectClass=posixAccount)(uid=%%LOGIN%%))"
bindUserDN="uid=%?%,ou=users,dc=XY,dc=fr"
searchAttributes="uid:login,givenName:firstname,sn:lastname,mail:email,organization:organization,street:street,postcode:postcode,city:city"
searchGroupFilter=
searchGroupProperty="cn"
searchGroupBaseDN=""

Voyez les détails sur comment écrire ces paramètres dans une section plus bas.

Pour terminer l’activation du module, lancez en ligne de commande php lizmap/install/installer.php.

Configuration ldap

Propriétés de configuration pour les données de l’utilisateur

Pour vérifier le mot de passe, ou pour créer un compte utilisateur dans Lizmap la première que l’utilisateur s’authentifie, le plugin a besoin d’informations sur celui-ci.

Vous devez lui indiquer quels attributs ldap il doit récupérer, et quel champs de la base de donnée recevra les attributs ldap.

Vous indiquez ces informations dans la propriété “searchAttributes”. Elle doit contenir une paire de noms, « <ldap attribute>:<table field> », séparé par une virgule

Dans cet exemple, searchAttributes="uid:login,firstname,sn:lastname,mail:email,dn:":

  • la valeur de l’attribut ldap “uid” sera stockée dans le champs “login”

  • la valeur de l’attribut ldap sn sera stocké dans le champs lastname

  • la valeur de l’attribut ldap firstname sera stocké dans le champs de même nom, comme il n’y pas de nom de champs ou de :.

  • Il n’y aura pas de correspondance pour la propriété dn parce qu’il y a un « : » sans de nom de champs. Elle sera cependant quand même récupérée, et peut être utilisée dans le template bindUserDN  (voir ci-dessous).

La liste des champs possible dans Lizmap sont : login, email, firstname, lastname, organization, phonenumber, street, postcode, city, country. Seul login et email sont obligatoires, les autres sont optionnels.

Propriétés de configuration pour l’authentification

Avant d’essayer d’authentifier l’utilisateur avec le ldap, le plugin récupére les propriétés de l’utilisateur. Il utilise deux paramètres de configuration : searchUserFilter et searchAttributes.

La propriété searchUserFilter doit contenir la requête ldap, et un masque « %%LOGIN%% » qui sera remplacé par le login donné par l’utilisateur.

Exemple : searchUserFilter="(&(objectClass=posixAccount)(uid=%%LOGIN%%))"

Vous pourriez aussi indiquer le DN de base pour la recherche, dans searchUserBaseDN. Exemple : searchUserBaseDN="ou=ADAM users,o=Microsoft,c=US".

Notez que vous pouvez indiquer plusieurs filtres de recherche, si vous avec une structure ldap complexe. Utilisez « [] » pour indiquer une liste d’élément :

searchUserFilter[]="(&(objectClass=posixAccount)(uid=%%LOGIN%%))"
searchUserFilter[]="(&(objectClass=posixAccount)(cn=%%LOGIN%%))"

Pour vérifier le mot de passe, le plugin a besoin du DN (Distinguished Name) correspond à l’utilisateur. Il forge le DN à partir d’un « template » indiqué dans la propriété bindUserDN et de données variées. Ces données peuvent être le login ou l’un des attributs ldap de l’utilisateur.

  • construction du DN à partir du login donné par l’utilisateur : bindUserDN doit contenir un DN, avec le masque « %%LOGIN%% » qui sera remplacé par le login.

    Exemple : bindUserDN="uid=%%LOGIN%%,ou=users,dc=XY,dc=fr". Si l’utilisateur donne john.smith comme login, l’authentification se fera avec le DN bindUserDN="uid=john.smith,ou=users,dc=XY,dc=fr".

    Pour certains LDAP, le DN peut être une simple chaîne, comme par exemple un email. Vous pouvez alors mettre bindUserDN="%%LOGIN%%@company.local". Ou même bindUserDN="%%LOGIN%%" si l’utilisateur peut mettre la valeur complète du DN ou un email etc. (Ce n’est pas vraiment recommandé de permettre à l’utilisateur d’indiquer lui même le DN complet, cela peut avoir des problèmes de sécurité).

  • construction du DN à partir des attributs ldap de l’utilisateur. Dans ce cas, le plugin va d’abord faire une première requête ldap avec le filtre searchUserFilter, pour récupérer les attributs ldap. Ensuite, dans bindUserDN, vous pouvez indiquer un DN avec des valeurs qui seront remplacées par des valeurs d’attributs, ou vous pouvez indiquer un seul nom d’attribut, correspondant à un attribut contenant le DN complet d’un utilisateur.

    Pour le premier cas, bindUserDn doit contenir un DN, avec des masques %?% qui seront remplacés par les valeur d’attributs correspondant. Exemple: bindUserDN="uid=%?%,ou=users,dc=XY,dc=fr". Ici il remplace le %?% par la valeur d’un attribut uid lu dans les attributs de l’utilisateur. Le nom d’attribut doit être présent dans la propriété de configuration searchAttributes , même si il n’est pas assigné à un champs. Ex : ...,uid:,.... Voir plus haut.

    Pour le second cas, indiquez juste le nom d’attribut, préfixé avec un $. Exemple : bindUserDN="$dn". Ici il prend l’attribut dn lu dans le résultat de recherche, et utilise sa valeur complète comme le DN pour se connecter au serveur ldap. C’est utile pour certain serveur ldap, comme parfois Active Directory qui ont besoin d’un DN complet spécifique pour chaque utilisateur. Le nom d’attribut doit être présent dans le paramètre de configuration searchAttributes, même si il n’est pas assigné à un champs. Ex : ...,dn:,....  Voir plus haut.

Notez que vous pouvez indiquer plusieurs template de DN, si vous avez une structure ldap complexe. Utilisez « [] » pour indiquer une liste d’élément :

bindUserDN[]="uid=%?%,ou=users,dc=XY,dc=fr"
bindUserDN[]="cn=%?%,ou=users,dc=XY,dc=fr"

Paramètres de configuration pour les droits utilisateurs

Si vous avez configuré des groupes de droits dans Lizmap, et si les noms de ces groupes correspondent à des groupes ldap, vous pouvez indiquer au plugin de mettre automatiquement l’utilisateur dans les groupes de lizmap correspondant aux groupes ldap dans lequel il est.

Vous devez alors indiquer dans searchGroupFilter, la requête ldap qui permet de récupérer les groupes de l’utilisateur.

Exemple : searchGroupFilter="(&(objectClass=posixGroup)(member=%%USERDN%%))"

%%USERDN%% est remplacé par le DN de l’utilisateur. %%LOGIN%% est remplacé par le login. Vous pouvez aussi utiliser n’importe quel attribut ldap indiqué dans searchAttributes, entre %%. Exemple : searchGroupFilter="(&(objectClass=posixGroup)(member=%%givenName%%))"

Attention : utiliser searchGroupFilter  supprimera l’utilisateur de tous les autres groupes de Lizmap, qui ne correspondent aux groupes ldap. Si vous ne voulez pas de synchronisation des groupes, laissez searchGroupFilter vide.

Avec searchGroupProperty, vous devez indiquer l’attribut ldap qui contient le nom du group. Ex : searchGroupProperty="cn".

Vous pouvez aussi indiquer le DN de base pour la recherche, dans searchGroupBaseDN. Exemple : searchGroupBaseDN="ou=Groups,dc=Acme,dc=pt".

Déboggage

Si l’authentification ne fonctionne pas, vous pouvez avoir plus de détails sur ce qui s’est mal passé. Pour voir ces détails, vous devez activer les traces pour ldapdao.

Dans votre var/config/localconfig.ini.php, mettez ces paramètres

[logger]
auth=file

[fileLogger]
auth=auth.log

Ensuite, dans var/log/auth.log, vous allez avoir des messages du connecteur ldap. Enlevez ces paramètres quand vous n’en avez plus besoin, pour éviter d’avoir un trop gros fichier auth.log.