grafana.chezlepro.internal et tableaux.genese.internal nommaient le meme service de deux facons. Les deux deviennent observatoire. Un nom de produit dans une URL se grave aussi dans les SAN du certificat et dans les URI de redirection du SSO : remplacer Grafana obligerait alors a renommer le service. Le nom dit desormais la fonction. Le renommage a revele que les URI des clients Keycloak repetent a la main les FQDN declares dans expose:. Rien ne les reliait. P66 garde ce lien, ecrite en meme temps que le premier renommage. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
107 lines
5.3 KiB
Markdown
107 lines
5.3 KiB
Markdown
# 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 en mode **`WRITABLE`** : il écrit *à travers*, vers l'annuaire. | 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 `WRITABLE` et pas « lecture seule ».** Cette unité a écrit « lecture seule »
|
|
> jusqu'au 2026-09-06 ; ce serait plus prudent en apparence, et c'est un cul-de-sac. En
|
|
> `READ_ONLY`, un changement de mot de passe échoue sur *« Federated storage is not
|
|
> writable »* — or l'annuaire *exige* ce changement à la première connexion : la reprise du
|
|
> sysadmin butait dessus (constaté le 2026-08-07). Et `UNSYNCED` serait pire : Keycloak
|
|
> écrirait dans **sa** base, Dovecot et Postfix continueraient de valider l'ancien depuis
|
|
> LDAP — une identité, deux mots de passe, exactement ce que la doctrine interdit.
|
|
> `WRITABLE` écrit *à travers* : l'annuaire reste la source unique, Keycloak n'en est qu'un
|
|
> client.
|
|
|
|
---
|
|
|
|
## ③ 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://observatoire.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://idm-01.chezlepro.internal \
|
|
-b ou=people,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.
|