# Identité & SSO > **Unité d'apprentissage** — une lentille sur un fondamental des TIC. > Moule : ① le concept → ② comment Set-OPS le fait → ③ pourquoi c'est transférable → ④ à toi de jouer. --- ## ① Le concept *(générique)* **Authentification vs autorisation** — deux questions distinctes, souvent confondues : - *Authentifier* = **qui es-tu ?** (prouver son identité, ex. mot de passe). - *Autoriser* = **as-tu le droit ?** (permissions une fois identifié). **L'annuaire** = la **source de vérité** des identités. Un seul endroit où existent les comptes ; tout le reste s'y réfère. Une identité, un mot de passe — partout. **SSO (Single Sign-On)** = **une** authentification donne accès à **N** services, sans se reconnecter à chacun. **OIDC / OAuth2** = le **protocole standard** du SSO web. L'application ne voit jamais ton mot de passe : elle **délègue** la connexion à un *fournisseur d'identité* (IdP), qui lui renvoie un **jeton** signé prouvant qui tu es. **Fédération** = un système d'identité en **délègue** un autre (ex. l'IdP lit les comptes depuis l'annuaire, sans les recopier). --- ## ② Comment Set-OPS le fait *(le vrai, dans le lab)* Trois pièces, un rôle chacun : | Pièce | Rôle | Concept incarné | |---|---|---| | **OpenLDAP** (`serveur_openldap`) | l'**annuaire** — la source de vérité. `testmail` y vit. | annuaire | | **Keycloak** (`serveur_keycloak`) | le **fournisseur d'identité** (IdP) SSO. Il **fédère** OpenLDAP (lit les comptes en LDAP, lecture seule). | SSO, OIDC, fédération | | **oauth2-proxy** (`serveur_oauth2_proxy`) | une **passerelle** OIDC pour les apps **sans** OIDC natif. | motif *proxy d'authentification* | Les applications se branchent de deux façons : - **OIDC natif** — Grafana, Forgejo → bouton « *Se connecter avec Chezlepro* ». - **Sans OIDC** — Icinga Web 2 → placé **derrière oauth2-proxy**, qui fait l'OIDC à sa place. **Le flux, quand `testmail` ouvre Grafana :** ``` Navigateur ──> Grafana : "connecte-moi" Grafana ──> redirige vers Keycloak (IdP) Keycloak ──> demande le mot de passe ; le VÉRIFIE contre OpenLDAP (fédération) Keycloak ──> renvoie au navigateur un CODE Navigateur──> Grafana échange le code contre un JETON signé Grafana ──> crée la session : "tu es testmail" ✔ ``` Résultat : **une identité** (`testmail`, un seul mot de passe LDAP) ouvre **le courriel, Grafana, Forgejo et Icinga**. Change le mot de passe une fois, il change partout. --- ## ③ Pourquoi c'est transférable Tu n'as pas appris « Keycloak ». Tu as appris **l'annuaire + OIDC + la fédération + le motif passerelle**. Le même schéma existe partout : | Set-OPS | Équivalents ailleurs | |---|---| | OpenLDAP | Active Directory · FreeIPA · 389-DS | | Keycloak | Entra ID (ex-Azure AD) · Okta · Authentik · Zitadel | | oauth2-proxy | tout reverse-proxy OIDC (Traefik ForwardAuth, Pomerium…) | | Fédération LDAP→IdP | AD → ADFS/Entra ; annuaire → n'importe quel IdP | Change les produits, le **schéma reste**. C'est ça, un savoir générique. --- ## ④ À toi de jouer > Prérequis : accès au lab (VPN), `/etc/hosts` pointant les services sur l'edge. 1. **Vis le SSO.** Ouvre `https://grafana.lab.chezlepro.internal` → « *Se connecter avec Chezlepro* » → `testmail`. Puis ouvre Forgejo, puis Icinga : **tu n'es reconnecté nulle part**. 2. **Observe le flux.** Rouvre Grafana en navigation privée, ouvre les outils dév (F12 → Réseau) : repère la **redirection vers Keycloak**, puis le **retour avec un `code=`**. C'est ① en action. 3. **Interroge l'annuaire (la source de vérité).** Sur un nœud avec `ldap-utils` : ```bash ldapsearch -x -H ldaps://id-ldap-01.lab.chezlepro.internal \ -b ou=people,dc=lab,dc=chezlepro,dc=internal '(uid=testmail)' ``` Tu vois l'entrée que Keycloak **fédère** — il ne l'a pas recopiée. 4. **Casse & répare (la fédération).** Dans la console admin Keycloak → *User Federation* → désactive le fournisseur LDAP. Reconnecte-toi : **échec** (l'IdP ne voit plus l'annuaire). Réactive : ça remarche. Tu viens de *sentir* la dépendance **requise** entre l'IdP et l'annuaire. --- ## Pour aller plus loin *(référence technique — dépôt)* - Rôles : `roles/serveur_openldap`, `roles/serveur_keycloak`, `roles/serveur_oauth2_proxy`. - Passerelle générique : `roles/serveur_oauth2_proxy/` (README) — placer du SSO devant *toute* app. - Thème de connexion (identité Alliance) : `roles/serveur_keycloak/files/themes/alliance-boreale/`. - Concept de liaison **requise** (IdP ⟶ annuaire) : `docs/bindings-conception.md` §11.