Aller au contenu principal

LemonLDAP::NG (lemonldap-ng)

WebSSO de la plateforme, alternative à Keycloak : fournisseur OpenID Connect du portail et du Control Plane sur l'annuaire LDAP ou Active Directory de la banque, rôles issus des groupes, TOTP, sessions partagées dans PostgreSQL.

Généré depuis catalog/services/lemonldap-ng.yaml : ne pas modifier à la main.

Résumé​

Version2.23.4
Usageinstaller et configurer, configurer et connecter
Couchefonctionnelle (catalogue IA)
CatégorieIdentité et secrets
Méthodes d'installationpodman
Connexion externeoidc
Réservé au bac à sablenon

Licence​

Identifiant SPDXGPL-2.0-or-later
Politique de licenceexception de licence
Exception de licenceLEX-034 (en attente de la décision du client)
Composant de la plateformelemonldap-ng

Paquets et artefacts​

Un paquet que publie le projet du service (son image, son archive binaire, son paquet Python ou système) porte la licence du service ; un paquet tiers porte la licence écrite sur sa ligne, lue dans les métadonnées officielles du projet amont.

TypePaquetVersionLicenceDétails
image de conteneurdocker.io/lemonldapng/lemonldap-ng2.23.4GPL-2.0-or-laterclé d'image lemonldap-ng, utilisée par schema, portal, condensé sha256:f5286ec04f74ab91a17cb1b52ed23dea07a6b964dc027740889b579b0d9711b6

Les images sont épinglées par étiquette dans le descripteur, et par condensé (digest) quand le descripteur en déclare un (le bundle hors ligne refuse alors une image téléchargée qui ne le porte pas) ; le condensé est enregistré dans le miroir du Manager à l'import du bundle hors ligne, et chaque téléchargement ou chargement est vérifié par rapport à lui.

Systèmes et architectures pris en charge​

MéthodeSystèmes d'exploitationArchitectures
podmanfamille RHEL (dnf), famille Debian (apt), Arch Linux (pacman)x86_64, aarch64 (non restreintes par le descripteur)

Systèmes hôtes certifiés : RHEL 8/9/10, Rocky Linux 8/9/10, AlmaLinux 8/9/10, Oracle Linux 8/9, CentOS Stream 9/10, Ubuntu 22.04/24.04, Debian 12, Arch Linux (rolling). Le contrôle préalable des hôtes accepte ces systèmes (une autre version d'une famille connue donne un avertissement, une version en fin de vie est refusée) et les architectures x86_64 et aarch64.

Prérequis​

Hôte​

  • au moins 1024 Mo de mémoire (bloquant, memory).

Réseau et ports​

ComposantNom du portPortOuvert dans le pare-feu de l'hôte
portalhttp8543/tcpoui

Services et connexions nécessaires​

Détail et résolution : voir Dépendances.

Méthodes et modes d'installation​

MéthodeDéfautCe que la méthode utilise
podmanouiles images de conteneur du descripteur, exécutées par Podman sous systemd

Composants​

ComposantTypeMéthodes d'installationPorts
Tables des sessions (schema)ponctuelpodman-
Portail (portal)maîtrepodman8543/tcp

Nœud unique (standalone) (par défaut)​

Un seul nœud de portail.

Ce que le mode déploie :

ComposantPlacement
schemamin 1, max 1
portalmin 1, max 1

Cluster (cluster)​

Plusieurs nœuds de portail derrière un répartiteur, qui partagent les sessions dans PostgreSQL ; l'URL publique est celle du répartiteur.

Ce que le mode déploie :

ComposantPlacement
schemamin 1, max 1
portalmin 2, recommandé 2

Installer ce service​

L'assistant d'installation du Navin Manager planifie, valide et exécute l'installation ; il faut la permission services:install sur le cluster.

  1. Ouvrez l'assistant. Dans Clusters, choisissez l'action de ligne Installer des services du cluster cible. L'assistant s'ouvre sur sa première étape, Service.

  2. Choisissez le service. À l'étape Service, sélectionnez LemonLDAP::NG. La carte affiche la licence GPL-2.0-or-later et les dépendances dont l'installation a besoin. Pour enregistrer à la place un service oidc existant de votre organisation, activez Utiliser un service externe existant.

  3. Choisissez les hôtes et le mode. À l'étape Hôtes, cochez les hôtes, puis choisissez le Mode : standalone (par défaut), cluster. Chaque mode déploie les composants listés dans Méthodes et modes d'installation. Avec plusieurs composants, placez chacun sur ses hôtes dans Répartition des composants (Proposer un placement propose un placement qui respecte les cardinalités).

  4. Liez les dépendances. À l'étape Liaisons, choisissez pour chaque dépendance (database, directory) Installer avec la plateforme ou Utiliser une connexion existante ; une dépendance facultative peut rester sur Aucune liaison.

  5. Configurez. À l'étape Configuration, relisez les paramètres (voir Paramètres de configuration) ; les paramètres obligatoires sont users_base. Les mots de passe laissés vides avec une valeur générée par défaut sont générés et scellés par le Manager.

  6. Relisez et installez. À l'étape Installation, le Manager valide le plan et affiche l'ordre d'installation ; quand il indique « Le plan est valide. Prêt pour l'installation. », choisissez Installer. Un mode hautement disponible n'est installé que si ses contrôles HA réussissent.

  7. Vérifiez. L'opération se termine quand les contrôles de santé de chaque instance réussissent (voir Contrôles de santé) ; le service apparaît alors en marche dans Services.

Connecter un service existant​

Schémashttps, http
Port par défaut443
Authentificationobligatoire
Contrôle de santé/.well-known/openid-configuration
Méthode d'authentificationChampsDescription
client_credentialsclient_id, client_secretClient OpenID Connect confidentiel du portail (identifiant et secret, authentification client_secret_basic) : le Manager les vérifie au point token ; le grant client credentials n'a pas besoin d'être autorisé.

Documentation officielle : https://lemonldap-ng.org/documentation/latest/idpopenidconnect.html

Haute disponibilité​

Clusterréplicas (replication)
Haute disponibilitéexterne (external)
Basculerépartiteur (load-balancer)
Réplicationstockage partagé (shared-store)
Quorumaucun (none)
Découverteaucun (none)
Point d'entréerépartiteur (load-balancer)
Documentation officiellehttps://lemonldap-ng.org/documentation/latest/highavailability.html

Prérequis​

PrérequisDoit être hautement disponibleModesDescription
databaseouimodes de niveau ha ou clusterPostgreSQL hautement disponible portant les sessions de tous les nœuds du portail.

Topologie par mode​

ModesNiveau le plus haut du catalogueRépartitionComposant du quorumDomaines de panneDescription
standaloneautonome (standalone)unique (single)-1Un nœud de portail, sans tolérance aux pannes.
clusterha (ha)actif-actif (active-active)-2Nœuds de portail avec la même configuration, qui partagent les sessions dans PostgreSQL, derrière un répartiteur.

Remarques​

  • Les nœuds du portail ne se parlent pas : leur disponibilité est celle de PostgreSQL, de l'annuaire et du répartiteur.
  • En mode cluster, les nœuds ne gardent aucun cache local des sessions : chaque session, code et jeton est lu dans PostgreSQL, si bien qu'une requête peut arriver sur n'importe quel nœud. Chaque nœud purge les sessions expirées toutes les heures.

Paramètres de configuration​

Réseau​

ParamètreTypeDéfautValeurs permisesObligatoireSecretRedémarrageDescription
Port du portail (port)port8543-nonnonouiPort des pages de connexion et des points OpenID Connect (HTTPS quand TLS est actif, sinon HTTP).
TLS (tls_enabled)booltrue-nonnonouiServir en HTTPS avec un certificat de l'autorité du Manager (HTTP simple seulement derrière un répartiteur TLS).
URL publique (public_url)urlhttps://{{ host.fqdn }}:{{ config.port }}-nonnonnonAdresse du portail pour les navigateurs et le Control Plane, émetteur des jetons (le répartiteur en mode cluster).

Annuaire​

ParamètreTypeDéfautValeurs permisesObligatoireSecretRedémarrageDescription
DN de base des utilisateurs (users_base)string--ouinonnonSous-arbre de l'annuaire où chercher les utilisateurs, par exemple ou=people,dc=bank,dc=internal.
Type d'annuaire (directory_kind)enumopenldapopenldap, active_directorynonnonnonopenldap : utilisateurs inetOrgPerson (uid) et groupes groupOfNames ; active_directory : utilisateurs person (sAMAccountName), groupes group et règles de mot de passe d'Active Directory.
Attribut de connexion (login_attribute)string(vide)^([A-Za-z][A-Za-z0-9-]{0,63})?$nonnonnonAttribut comparé à l'identifiant saisi (vide : uid, ou sAMAccountName pour Active Directory).
Filtre des utilisateurs (user_filter)string(vide)-nonnonnonFiltre LDAP des utilisateurs, $user étant l'identifiant (vide : l'attribut de connexion et la classe d'objet du type d'annuaire).
DN de base des groupes (groups_base)string(vide)-nonnonnonSous-arbre où chercher les groupes d'un utilisateur (vide : le DN de base des utilisateurs).
Classe d'objet des groupes (group_object_class)string(vide)^([A-Za-z][A-Za-z0-9-]{0,63})?$nonnonnonClasse d'objet des groupes (vide : groupOfNames, ou group pour Active Directory).
Attribut des membres (group_member_attribute)stringmember^[A-Za-z][A-Za-z0-9-]{0,63}$nonnonnonAttribut d'un groupe qui liste ses membres : leur DN (member, uniqueMember), ou leur identifiant pour memberUid.
Groupes imbriqués (nested_groups)boolfalse-nonnonnonDonner aussi les groupes qui contiennent les groupes de l'utilisateur.
Rôles des groupes (role_groups)json{"platform_admin": "navin-platform-admins", "tenant_admin": "navin-tenant-admins", "security_officer": "navin-security-officers", "finops": "navin-finops", "developer": "navin-developers", "auditor": "navin-auditors"}-nonnonnonRôle de la plateforme donné aux membres de chaque groupe de l'annuaire (rôle : nom du groupe) ; chaque utilisateur a aussi le rôle viewer.
Attribut de l'organisation (tenant_attribute)string(vide)^([A-Za-z][A-Za-z0-9-]{0,63})?$nonnonnonAttribut de l'annuaire portant l'identifiant (slug) de l'organisation de l'utilisateur, donné dans la réclamation tenant.
Organisation par défaut (default_tenant)string(vide)^([a-z0-9][a-z0-9-]{0,62})?$nonnonnonOrganisation (slug) des utilisateurs dont l'attribut d'organisation est vide (vide : aucune).
Attribut d'habilitation (clearance_attribute)string(vide)^([A-Za-z][A-Za-z0-9-]{0,63})?$nonnonnonAttribut de l'annuaire portant le niveau de classification de l'utilisateur (public, internal, confidential, restricted ou secret), donné dans la réclamation clearance (vide : internal pour tous).

Clients​

ParamètreTypeDéfautValeurs permisesObligatoireSecretRedémarrageDescription
URL du portail (portal_url)urlhttps://{{ host.fqdn }}:3000-nonnonnonAdresse du portail de Navin Enterprise : son /auth/callback est la seule URI de redirection du client portal.
Client du portail (portal_client_id)stringportal^[A-Za-z0-9._-]{1,64}$nonnonnonIdentifiant du client du portail (portal_client_id de Navin Enterprise).
Audience du Control Plane (audience)stringcontrol-plane^[A-Za-z0-9._-]{1,64}$nonnonnonAudience ajoutée aux jetons d'accès du portail (oidc_audience de Navin Enterprise).
Autres clients (extra_clients)json[]-nonouinonAutres clients OpenID Connect, par exemple le BFF d'un agent sectoriel : une liste de {"client_id", "redirect_uris", "secret", "audiences", "post_logout_redirect_uris"} ; un client sans secret est public. Chaque client utilise PKCE S256.

Sécurité​

ParamètreTypeDéfautValeurs permisesObligatoireSecretRedémarrageDescription
TOTP obligatoire (mfa_required)booltrue-nonnonnonChaque utilisateur enregistre une application TOTP à la première connexion, puis donne un code à chaque connexion.
Durée de la session (s) (session_timeout_s)int36000min 900, max 86400nonnonnonDurée de vie maximale d'une session SSO, en secondes.
Inactivité maximale (s) (idle_timeout_s)int1800min 300, max 28800nonnonnonUne session SSO sans activité pendant ce nombre de secondes prend fin.
Durée des jetons (s) (access_token_ttl_s)int300min 60, max 3600nonnonnonDurée de vie des jetons d'accès et d'identité, en secondes.
Clé de signature des jetons (signing_key)passwordgénéré-nonouiouiClé privée RSA de 3072 bits qui signe les jetons (RS256) ; sa clé publique est publiée sur /oauth2/jwks.
Identifiant de la clé (signing_key_id)stringgénéré-nonnonouiIdentifiant (kid) de la clé de signature dans les jetons et le JWKS.
Niveau de journalisation (log_level)enumnoticeerror, warn, notice, info, debugnonnonnonNiveau des journaux du portail (journal du service).

Dépendances​

Pour chaque dépendance active, le Manager prend la première solution parmi : la liaison choisie dans l'assistant ; un service de la même installation qui la fournit ; un service déjà installé dans le cluster ; la seule connexion du type attendu. Sinon, une dépendance facultative reste non liée, et une dépendance obligatoire est ajoutée à l'installation dans son mode par défaut (la colonne ci-dessous nomme le service du catalogue ajouté).

LiaisonFournie parType de connexionPoint d'accèsFacultativeQuand rien n'est liéDescription
databasepostgresqlpostgresqlsqlnonpostgresql est ajouté à l'installationSessions du portail (SSO, persistantes avec les secrets TOTP, OpenID Connect), partagées par tous les nœuds du portail.
directory-ldap-nonl'installation est refusée (dependency_not_installable)Annuaire des utilisateurs et de leurs groupes (LDAP ou Active Directory), déclaré comme connexion LDAP du Manager.

Points d'accès​

Point d'accèsSchémaComposantPortCheminParamètre TLSParamètres de liaisonSecrets de liaisonCommande de provisionnement
httphttpportal8543 (port)-tls_enabledissuer, jwks_url, client_id--

Fichiers de configuration client​

Fichiers rendus pour le téléchargement de la configuration client :

  • lemonldap-ng.env (client.env.j2)

Contrôles de santé​

Vivacité (par instance)​

ComposantContrôleDétails
portalHTTP {{ 'https' if config.tls_enabled else 'http' }}://{{ host.fqdn }}:{{ config.port }}/.well-known/openid-configurationAttendu 200 ; 60 tentatives ; intervalle 2 s ; délai 5 s

Disponibilité (contrôle du service)​

ContrôleDétails
HTTP {{ config.public_url.rstrip('/') }}/.well-known/openid-configurationAttendu 200 ; 10 tentatives ; intervalle 3 s ; délai 5 s

Contrôles préalables​

ContrôleTypeSignificationSévéritéComposants
memorymemory_mb {"min": 1024}au moins 1024 Mo de mémoirebloquanttous les composants
port_freeport_free {"param": "port"}port 8543 libre sur l'hôtebloquanttous les composants

Désinstallation​

Chemins supprimés quand les données sont purgées : {{ paths.data }}, {{ paths.log }}.

Liens rapides​

  • Page de connexion : {{ config.public_url.rstrip('/') }}/
  • Découverte OIDC : {{ config.public_url.rstrip('/') }}/.well-known/openid-configuration

Documentation amont​