Source docs/ldap.fr.md · 1de96aa

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

  1. La personne choisit l’annuaire sur l’écran de connexion et saisit son identifiant et son mot de passe d’annuaire.
  2. Libris se connecte à l’annuaire en TLS (ldaps://, ou ldap:// avec StartTLS) et vérifie le certificat du serveur et son nom d’hôte.
  3. 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.
  4. 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 ».
  5. 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.
  6. Le compte Libris est retrouvé par l’identifiant stable de l’entrée (entryUUID ou objectGUID), 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, ou ldap://hôte:389 avec 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églageExemple
Type d’annuaireOpenLDAP
Adresse de l’annuaireldaps://ldap.example.com
DN du compte de servicecn=libris,ou=services,dc=example,dc=com
Base de rechercheou=people,dc=example,dc=com
Filtre utilisateur(vide : (&(objectClass=inetOrgPerson)(uid={username})))
Attributs(vides : uid, mail, entryUUID, memberOf)
Groupes autoriséscn=libris-users,ou=groups,dc=example,dc=com
Groupe administrateurcn=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églageExemple
Type d’annuaireActive Directory
Adresse de l’annuaireldaps://dc01.corp.example.com (port 636 ; un certificat doit être installé sur les contrôleurs de domaine)
DN du compte de serviceCN=svc-libris,OU=Service Accounts,DC=corp,DC=example,DC=com
Base de rechercheOU=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ésCN=Libris Users,OU=Groups,DC=corp,DC=example,DC=com
Groupe administrateurCN=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

  1. 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é.
  2. 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.
  3. 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é.
  4. 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 journalSignification
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_refusedLe DN ou le mot de passe du compte de service est faux, ou le compte est verrouillé.
ldap=lookup_refused entries=0 / entries=manyLe filtre n’a trouvé personne, ou plusieurs entrées : vérifiez la base de recherche et le filtre.
ldap=refused code=not_allowedLa personne n’est dans aucun groupe autorisé (vérifiez memberOf, et les groupes imbriqués sur AD).
ldap=missing_identifierL’entrée n’a pas d’attribut d’identifiant stable : vérifiez Attribut d’identifiant stable.
ldap=refused code=unknown_accountLa création de comptes est désactivée et aucun compte Libris n’est rattaché à cette personne.
ldap=last_admin_keptLe 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.