Connexion par LDAP et Active Directory
Cette page s’adresse aux administrateurs qui veulent que les personnes de leur organisation se connectent à Libris avec le compte qu’elles ont déjà dans un annuaire LDAP (OpenLDAP, 389 Directory Server…) ou dans Active Directory. Chaque réglage est décrit dans configuration.fr.md ; ce que voient les personnes est dans le guide d’utilisation.
Fonctionnement
- La personne choisit l’annuaire sur l’écran de connexion et saisit son identifiant et son mot de passe d’annuaire.
- Libris se connecte à l’annuaire en TLS (
ldaps://, ouldap://avec StartTLS) et vérifie le certificat du serveur et son nom d’hôte. - Libris se lie avec un compte de service et cherche dans la base de recherche avec le filtre utilisateur, l’identifiant étant échappé avant d’entrer dans le filtre. Exactement une entrée doit correspondre.
- Libris se lie de nouveau en tant que cette entrée, avec le mot de passe saisi. Un mot de passe vide est refusé avant cette étape : beaucoup d’annuaires traitent une liaison avec un mot de passe vide comme une liaison anonyme et répondent « succès ».
- Si des groupes sont configurés, l’attribut des groupes de l’entrée (
memberOf) doit contenir un groupe autorisé. Le groupe administrateur, s’il existe, décide du rôle d’administrateur dans Libris. - Le compte Libris est retrouvé par l’identifiant stable de l’entrée (
entryUUIDouobjectGUID), créé si l’installation le permet, et son nom et son adresse sont mis à jour depuis l’annuaire. Si le compte a une seconde étape Libris (code ou clé de sécurité), elle est demandée à ce moment.
Le mot de passe n’est jamais conservé, jamais journalisé et n’est envoyé qu’à l’annuaire. Les referrals ne sont pas suivis. Un identifiant inconnu, deux entrées correspondantes et un mauvais mot de passe reçoivent la même réponse : l’écran de connexion ne permet pas de dresser la liste des personnes de l’annuaire.
Avant de commencer
- Un compte de service qui peut chercher les personnes (et lire
memberOf) sous la base de recherche. Il n’a besoin d’aucun autre droit. Sur Active Directory, n’importe quel utilisateur ordinaire du domaine le peut ; donnez-lui un long mot de passe aléatoire. - Du TLS sur l’annuaire. Utilisez
ldaps://hôte:636, ouldap://hôte:389avec StartTLS. Le nom d’hôte de l’adresse doit figurer dans le certificat du serveur (une adresse IP est refusée). Si ce certificat est signé par une autorité interne, collez le certificat de cette autorité (PEM) dans Certificat de l’autorité ; sinon, le magasin de certificats de l’image Libris est utilisé. - Le conteneur Libris doit joindre l’annuaire sur ce port. Avec Docker, vérifiez depuis le conteneur de
l’API :
docker compose exec api python -c "import socket; socket.create_connection(('ldap.example.com', 636), 5)". - Un siège de licence par personne qui recevra un compte. Restreignez l’accès par un groupe autorisé avant d’activer la création de comptes.
OpenLDAP
Les valeurs par défaut supposent le schéma inetOrgPerson et l’overlay memberof, qui renseigne memberOf sur
les entrées des personnes.
| Réglage | Exemple |
|---|---|
| Type d’annuaire | OpenLDAP |
| Adresse de l’annuaire | ldaps://ldap.example.com |
| DN du compte de service | cn=libris,ou=services,dc=example,dc=com |
| Base de recherche | ou=people,dc=example,dc=com |
| Filtre utilisateur | (vide : (&(objectClass=inetOrgPerson)(uid={username}))) |
| Attributs | (vides : uid, mail, entryUUID, memberOf) |
| Groupes autorisés | cn=libris-users,ou=groups,dc=example,dc=com |
| Groupe administrateur | cn=libris-admins,ou=groups,dc=example,dc=com |
Un compte de service en lecture seule, en LDIF (hachez le mot de passe avec slappasswd) :
dn: cn=libris,ou=services,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: libris
userPassword: {SSHA}...
et une ACL qui lui permet de lire les personnes, par exemple :
access to dn.subtree="ou=people,dc=example,dc=com"
by dn.exact="cn=libris,ou=services,dc=example,dc=com" read
by * break
Sans l’overlay memberof, il n’y a pas d’attribut memberOf : laissez les groupes vides et restreignez l’accès
dans le filtre utilisateur, par exemple (&(objectClass=inetOrgPerson)(uid={username})(employeeType=translator)).
Pour vérifier les réglages depuis un terminal avant de les saisir dans Libris :
ldapsearch -H ldaps://ldap.example.com -D 'cn=libris,ou=services,dc=example,dc=com' -W \
-b 'ou=people,dc=example,dc=com' '(&(objectClass=inetOrgPerson)(uid=jdupont))' uid mail entryUUID memberOf
Active Directory
| Réglage | Exemple |
|---|---|
| Type d’annuaire | Active Directory |
| Adresse de l’annuaire | ldaps://dc01.corp.example.com (port 636 ; un certificat doit être installé sur les contrôleurs de domaine) |
| DN du compte de service | CN=svc-libris,OU=Service Accounts,DC=corp,DC=example,DC=com |
| Base de recherche | OU=Staff,DC=corp,DC=example,DC=com |
| Filtre utilisateur | (vide : sAMAccountName ou userPrincipalName, personnes seulement, comptes désactivés exclus) |
| Attributs | (vides : sAMAccountName, mail, objectGUID, memberOf) |
| Groupes autorisés | CN=Libris Users,OU=Groups,DC=corp,DC=example,DC=com |
| Groupe administrateur | CN=Libris Admins,OU=Groups,DC=corp,DC=example,DC=com |
Les personnes se connectent avec jdupont ou jdupont@corp.example.com. La forme DOMAINE\jdupont n’est pas
prise en charge.
memberOf ne donne que les appartenances directes. Pour admettre les membres de groupes imbriqués, laissez
Groupes autorisés vide et placez la règle d’appartenance transitive dans le filtre utilisateur :
(&(objectCategory=person)(objectClass=user)(sAMAccountName={username})(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=CN=Libris Users,OU=Groups,DC=corp,DC=example,DC=com))
Les échecs de connexion comptent dans la politique de verrouillage des comptes du domaine, comme toute autre liaison. La limite propre à Libris arrête un client après 20 échecs pour un même nom en cinq minutes : réglez le seuil de verrouillage en conséquence.
Pour vérifier depuis PowerShell : Get-ADUser jdupont -Properties mail,memberOf,objectGUID.
Mise en service
- Dans Paramètres › Authentification unique, carte Annuaire LDAP / Active Directory, renseignez les réglages ci-dessus, cochez Activer la connexion par l’annuaire et enregistrez. L’enregistrement demande une preuve récente de votre identité.
- Appuyez sur Tester l’annuaire, d’abord seul (connexion, certificat et compte de service), puis avec un identifiant dans Identifiant à rechercher (le filtre trouve exactement cette personne). Le test n’essaie aucun mot de passe.
- Choisissez comment les comptes apparaissent :
- comptes locaux existants : ouvrez chacun dans Paramètres › Utilisateurs et choisissez Rattacher à l’annuaire. Ses livres, sa seconde étape et ses jetons d’API restent ; son mot de passe Libris est oublié ;
- nouvelles personnes : cochez Créer les comptes à la première connexion depuis l’annuaire, avec un groupe autorisé.
- Connectez-vous depuis une fenêtre privée avec un compte d’annuaire, puis avec un compte local, pour vérifier les deux accès.
Gardez au moins un compte administrateur local : si l’annuaire est injoignable, c’est lui qui permet d’entrer.
Dépannage
Le journal de l’API (docker compose logs api) consigne chaque refus avec un code de raison, jamais un mot de
passe :
| Ligne du journal | Signification |
|---|---|
ldap=unreachable reason=... | Pas de connexion : adresse, port, pare-feu, ou échec de la négociation TLS (autorité inconnue, nom d’hôte absent du certificat). |
ldap=service_bind_refused | Le DN ou le mot de passe du compte de service est faux, ou le compte est verrouillé. |
ldap=lookup_refused entries=0 / entries=many | Le filtre n’a trouvé personne, ou plusieurs entrées : vérifiez la base de recherche et le filtre. |
ldap=refused code=not_allowed | La personne n’est dans aucun groupe autorisé (vérifiez memberOf, et les groupes imbriqués sur AD). |
ldap=missing_identifier | L’entrée n’a pas d’attribut d’identifiant stable : vérifiez Attribut d’identifiant stable. |
ldap=refused code=unknown_account | La création de comptes est désactivée et aucun compte Libris n’est rattaché à cette personne. |
ldap=last_admin_kept | Le groupe administrateur ne contient plus le dernier administrateur actif ; le rôle a été conservé. |
Les créations de comptes, les rattachements, les changements de rôle dus au groupe administrateur et les modifications de ces réglages sont aussi inscrits au journal d’audit.
Que se passe-t-il quand…
- quelqu’un quitte l’organisation : une fois retiré de l’annuaire, désactivé ou sorti des groupes autorisés,
il ne peut plus se connecter. Les sessions déjà ouvertes durent jusqu’à leur expiration
(
SESSION_DURATION_HOURS) ; désactivez le compte dans Libris pour les fermer immédiatement. - quelqu’un est renommé ou déplacé dans l’annuaire : le compte est retrouvé par son identifiant stable, donc le nouveau nom et la nouvelle adresse sont repris à la connexion suivante. Si le nouveau nom est pris par un autre compte Libris, un suffixe est conservé.
- l’annuaire est remplacé : les identifiants changent, donc les personnes du nouvel annuaire sont nouvelles pour Libris, et un compte déjà rattaché à l’ancien annuaire ne peut pas être déplacé vers le nouveau depuis l’interface. Préparez une telle migration avant de basculer.