Set-OPS-Public/wiki/Autorisation-et-RBAC.md
Daniel Allaire aab1bcc83a doc : rangee par lecteur, trois portes d'entree (architecture, setup, usage) et un index
README reduit au role du projet et au demarrage rapide. docs/architecture.md (schemas
Mermaid), docs/setup.md, docs/usage.md (154 cibles en 13 familles), docs/README.md (index).
Documents ranges en conception/, exploitation/, hebergement/, projet/ ; 598 chemins suivis.
QUICKSTART.md, SOLUTION.md, architecture-set-ops.md et la carte fondus puis retires.

Preuves : P48 lit l'index et conception/mecanismes.md ; les gardes parcourent docs/ sous-
dossiers compris (_documents) ; usage.md suit le Makefile dans les deux sens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 01:01:54 -04:00

90 lines
4.7 KiB
Markdown

# Autorisation & RBAC
> **Unité d'apprentissage.** Moule : ① concept → ② Set-OPS → ③ transférable → ④ à toi de jouer.
> Le pendant naturel de **[Identité & SSO](Identité-et-SSO)** : celle-là dit *qui tu es*, celle-ci dit *ce que tu as le droit de faire*.
---
## ① Le concept *(générique)*
**Authentification (authN)** : *qui es-tu ?* — **Autorisation (authZ)** : *as-tu le droit ?* Deux
questions distinctes. Se connecter ne dit **rien** sur ce qu'on peut faire.
**RBAC** (*Role-Based Access Control*) : on n'attribue pas des droits à chaque personne, mais des
**rôles** (Viewer, Editor, Admin…), et chaque rôle porte un ensemble de **permissions**. La personne
reçoit un rôle → hérite des droits. Simple, auditable, évolutif.
**Où décider ?** Deux écoles :
- *local à l'app* : chaque service gère ses propres comptes/rôles (silos, à maintenir partout) ;
- *centralisé (piloté par le SSO/annuaire)* : le rôle voyage **dans le jeton** ; l'app le lit et
l'applique. Une seule source, cohérente partout. **Moindre privilège** par défaut.
Mécanique OIDC : le fournisseur d'identité met un **claim** (ex. `roles`) dans le jeton ; l'app
**mappe** ce claim vers son niveau de droit interne.
---
## ② Comment Set-OPS le fait — l'exemple Grafana
Par défaut, un utilisateur SSO arrive en **Viewer** dans Grafana → il voit les tableaux de bord,
mais **pas Explore** (requêtes ad-hoc). Pour donner Explore aux opérateurs, sans l'ouvrir à tous :
```
Keycloak : rôle de realm 'grafana-editor' ──(assigné à testmail)
+ mapper de rôles ──> claim "roles":["grafana-editor"] dans le jeton
Grafana : role_attribute_path ──> "grafana-editor" ⇒ Editor (⇒ Explore)
"grafana-admin" ⇒ Admin ; sinon Viewer
```
Déclaratif dans Set-OPS : `serveur_keycloak_realm_roles`, `_role_mapper_clients`,
`_role_assignments` (côté IdP) + `serveur_grafana_oidc_role_path` (côté app). kcadm **à chaud** :
**zéro coupure SSO**. Une identité (`testmail`), et c'est **le rôle** — pas la connexion — qui décide
d'Explore.
> **Ce « raffinement » est construit depuis le 2026-08-08.** Cette unité le présentait comme
> un idéal à atteindre ; c'est le mécanisme en vigueur. Les **groupes LDAP** sont projetés
> dans Keycloak et émis en claim (`roles/serveur_keycloak/tasks/groupes-ldap.yml` et
> `claim-groupes.yml`), et chaque service déclare le groupe qu'il reconnaît dans son
> `meta/acces.yml` — `sysadmin ⇒ Admin`, `personnel ⇒ Viewer` chez Grafana. C'est donc bien
> **l'appartenance** qui gouverne, pas une assignation nominative.
>
> La règle qui va avec : **un service nomme un groupe, jamais une personne**. Nommer
> quelqu'un créerait une dette qu'on découvre le jour du départ, service par service — et il
> faudrait un déploiement pour révoquer. L'assignation explicite à `testmail` de l'exemple
> ci-dessus reste utile pour *comprendre* la mécanique du claim ; ce n'est pas la façon dont
> on donne un accès. Voir `docs/exploitation/autorisation.md` §5.
---
## ③ Pourquoi c'est transférable
| Set-OPS | Équivalents ailleurs |
|---|---|
| rôles de realm Keycloak → claim | claims/scopes OIDC de tout IdP (Okta, Entra…) |
| `role_attribute_path` Grafana | *role mapping* de n'importe quelle app OIDC |
| RBAC (rôles → permissions) | **Kubernetes RBAC** · IAM cloud (AWS/GCP) · SGBD (rôles SQL) |
| moindre privilège | principe **universel** de sécurité |
Tu as appris **authZ vs authN, le RBAC, l'autorisation par claim, le moindre privilège** — pas
« Grafana ».
---
## ④ À toi de jouer
1. **Sens le défaut.** Avant tout rôle, un nouvel utilisateur SSO est **Viewer** dans Grafana : il
voit le dashboard *Journaux de la flotte*, mais **pas** l'icône Explore.
2. **Donne Editor.** `testmail` a le rôle `grafana-editor` → **déconnecte/reconnecte-le** (Grafana
applique le rôle *à la connexion*) → **Explore apparaît**.
3. **Observe le claim.** Dans Keycloak (console admin) → Clients → grafana → *Client scopes* →
*Evaluate* pour `testmail` : le jeton contient `"roles": ["grafana-editor"]`. C'est ② en vrai.
4. **Casse & répare.** Retire `grafana-editor` de testmail (ou renomme-le en `grafana-viewer`),
reconnecte : **Explore disparaît**. Remets-le : il revient. Tu *sens* que c'est **le rôle**, pas
l'identité, qui ouvre la porte.
---
## Pour aller plus loin *(dépôt)*
- IdP : `roles/serveur_keycloak/tasks/rbac-oidc.yml` (rôles + mapper + assignations).
- App : `roles/serveur_grafana` (`serveur_grafana_oidc_role_path`).
- Le pendant *authentification* : unité **[Identité & SSO](Identité-et-SSO)**.