Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions docs/.vitepress/sidebar.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,40 @@
{
"text": "Plugins",
"link": "/administration/plugins"
},
{
"text": "Droits fins (RBAC outils)",
"collapsed": true,
"items": [
{
"text": "Console CPiN",
"link": "/administration/rbac/console-cpin"
},
{
"text": "Vault",
"link": "/administration/rbac/vault"
},
{
"text": "Keycloak",
"link": "/administration/rbac/keycloak"
},
{
"text": "Harbor",
"link": "/administration/rbac/harbor"
},
{
"text": "Nexus",
"link": "/administration/rbac/nexus"
},
{
"text": "SonarQube",
"link": "/administration/rbac/sonarqube"
},
{
"text": "Grafana",
"link": "/administration/rbac/grafana"
}
]
}
]
},
Expand Down
86 changes: 86 additions & 0 deletions docs/administration/rbac/console-cpin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Utilisateurs, groupes et droits Console CPiN

Ce document décrit le **modèle d'accès** de la Console CPiN elle-même : comment ses rôles admin et projet se traduisent en permissions, et comment ils sont propagés vers Keycloak.

---

## Vue par rôle

Ce que chaque rôle peut réellement faire dans la Console CPiN. Les chemins `/console/<rôle>` sont **réservés à l'administration plateforme** et distincts des rôles projet `/<slug>/console/<rôle>` :

| Rôle Console | Groupe Keycloak | Ce que je peux faire |
| --------------------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| Admin plateforme (administration) | `/console/admin` | Administration globale : tous les projets, utilisateurs, plugins |
| Administrateur projet | `/<slug>/console/admin` | Gérer le projet : membres, environnements, dépôts, suppression |
| DevOps | `/<slug>/console/devops` | Gérer environnements + dépôts, rejouer les hooks, voir les secrets. **Pas** de déploiement applicatif ni de gestion des membres |
| Développeur | `/<slug>/console/developer` | Gérer et lister les dépôts, lister les environnements. **Pas** d'accès aux secrets ni de rejeu du projet |
| Lecture seule (projet) | `/<slug>/console/reader` | Lister environnements et dépôts uniquement |
| Lecture seule (administration) | `/console/reader` | Lecture transverse (tous projets) |
| Security (projet) | `/<slug>/console/security` | Lecture transverse du projet (audit). _Groupe non créé par défaut : alimenté par les outils qui le référencent_ |
| Security (administration) | `/console/security` | Lecture transverse (tous projets, audit) |
| Guest (utilisateur externe sans groupe) | — | Aucun accès jusqu'à ajout à un projet |

---

## 1. Authentification : OIDC via Keycloak

- La Console authentifie ses utilisateurs via **OIDC Keycloak**.
- Les permissions effectives d'un utilisateur = agrégation (OU binaire) des `permissions` de tous ses rôles (admin + projet).

---

## 2. Rôles projet et permissions

Chaque projet reçoit 4 rôles système par défaut, liés aux groupes `/<slug>/console/*`.

| Rôle Console | Groupe Keycloak | Permissions (bits `PROJECT_PERMS`) |
| ------------------ | --------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Administrateur** | `/<slug>/console/admin` | `MANAGE` (gérer le projet) |
| **DevOps** | `/<slug>/console/devops` | `SEE_SECRETS`, `REPLAY_HOOKS`, `MANAGE_ENVIRONMENTS`, `MANAGE_REPOSITORIES`, `LIST_ENVIRONMENTS`, `LIST_REPOSITORIES` |
| **Développeur** | `/<slug>/console/developer` | `MANAGE_REPOSITORIES`, `LIST_ENVIRONMENTS`, `LIST_REPOSITORIES` |
| **Lecture seule** | `/<slug>/console/reader` | `LIST_ENVIRONMENTS`, `LIST_REPOSITORIES` |

### Bits `PROJECT_PERMS` disponibles

`GUEST(0)`, `MANAGE(1)`, `MANAGE_MEMBERS(2)`, `MANAGE_ENVIRONMENTS(3)`, `MANAGE_REPOSITORIES(4)`, `MANAGE_ROLES(5)`, `SEE_SECRETS(6)`, `REPLAY_HOOKS(7)`, `LIST_ENVIRONMENTS(8)`, `LIST_REPOSITORIES(9)`, `LIST_MEMBERS(10)`, `LIST_ROLES(11)`, `MANAGE_DEPLOYMENTS(12)`, `LIST_DEPLOYMENTS(13)`.

---

## 3. Rôles admin et permissions

| Rôle Console | Groupe Keycloak (chemin) | Permissions (`ADMIN_PERMS`) |
| ------------------------------------------------ | ------------------------ | ----------------------------------------------------------------------------------- |
| Admin plateforme (`/console/admin`) | `/console/admin` | `MANAGE` + toutes les `MANAGE_*`, `LIST_*` (admin global) |
| Security (`/console/security`) | `/console/security` | lecture transverse (portée audit, `*RO`) |
| Lecture seule (`/console/reader`) | `/console/reader` | lecture transverse (`*RO`) |

> **Groupes Keycloak d'administration plateforme** : le chemin plateforme d'administration est `/admin`, groupe d'amorçage géré en dehors de la Console ; `/console/admin` (admin), `/console/security` (audit) et `/console/reader` (lecture) sont les groupes plateforme réconciliés, propagés vers les outils.

> **Axe ABAC `userType`** : indépendamment des groupes, certains endpoints restreignent l'accès selon le type d'utilisateur (`human` / `bot` / `ghost`, colonne `User.type`). Cet axe s'ajoute au masque de bits admin/projet.

> **Chemin Keycloak réel des rôles projet** : la Console crée `/<slug>/console/<rôle>` (ex. `/monprojet/console/admin`), sous le groupe racine `/<slug>`. Ce chemin est l'identité OIDC effective — il ne porte pas le nom `project-<name>-<rôle>` (qui n'existe pas côté Keycloak).
>
> **Seul un rôle admin peut être lié à un groupe Keycloak existant** via un groupe d'application externe (chemin commençant par `/`). Les rôles projet ont leur groupe d'application préfixé automatiquement par `/<slug>`.

---

## 4. Points d'attention

- **Permissions = masque de bits.** Un rôle est la somme de permissions ; l'agrégation inter-rôles se fait en OU binaire.
- **`/admin` donne l'administration globale.** Groupe d'amorçage géré en dehors de la Console.
- **Le développeur n'accède pas aux secrets.** Le rôle `developer` couvre la gestion des dépôts et la lecture des environnements ; ni `SEE_SECRETS` ni `REPLAY_HOOKS` ne lui sont accordés (contrairement à DevOps).
- **DevOps sans déploiement applicatif.** Le déploiement applicatif n'est pas couvert par le rôle DevOps par défaut ; ses droits portent sur les environnements, dépôts, hooks et secrets.
- **Groupe `everyonePerms`.** Un projet peut définir des permissions pour _Tout le monde_, appliquées au-delà des rôles nominatifs.

---

## 5. Qui gère quoi ?

| Élément | Géré par |
| --------------------------------- | ---------------------------------- |
| Identité OIDC | **Keycloak** |
| Rôles admin / projet, permissions | **Console** (base de données) |
| Groupes Keycloak dérivés | **Console** (automatique) |
| Application des droits | **Console** + outils consommateurs |

---
66 changes: 66 additions & 0 deletions docs/administration/rbac/grafana.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Utilisateurs, groupes et droits Grafana

Ce document décrit le **modèle d'accès** mis en place dans Grafana pour chaque projet DSO. Contrairement aux autres outils, l'accès Grafana est **scopé par environnement** (prod / hors-prod) et non par rôle projet.

---

## Vue par rôle

Ce que chaque rôle Console obtient réellement dans Grafana (scopé par environnement). Les chemins `/console/<rôle>` sont **réservés à l'administration plateforme** et distincts des rôles projet `/<slug>/console/<rôle>` :

| Rôle Console | Groupe Keycloak | Accès obtenu dans Grafana |
| --------------------- | ---------------------------------- | -------------------------------- |
| Administrateur projet | `/<slug>/console/admin` | **Editor** (hors-prod + prod) |
| DevOps | `/<slug>/console/devops` | **Editor** (hors-prod + prod) |
| Développeur | `/<slug>/console/developer` | **Viewer** (hors-prod + prod) |
| Lecture seule | `/<slug>/console/reader` | **Viewer** (projet) |
| Lecture seule | `/console/reader` | **Viewer** (globale) |
| Security | `/<slug>/console/security` | **Viewer** (projet) |
| Security | `/console/security` | **Viewer** (globale) |
| Guest | — | Aucun accès |

> L'accès réel dépend de la capacité Console par bucket d'environnement : `MANAGE_ENVIRONMENTS` → Editor, `LIST_ENVIRONMENTS` → Viewer, séparément pour hors-prod (`hprod`) et prod.

---

## 1. Authentification : Grafana via OIDC Keycloak

- Grafana est fédéré au fournisseur OIDC Keycloak. Le mapping **groupe Keycloak → rôle Grafana** est configuré côté Grafana (son fichier de configuration OIDC), pas par la Console.
- La Console crée et maintient, **sous le groupe racine `/<slug>`**, le sous-groupe `grafana` et ses sous-groupes `hprod-RO/RW` et `prod-RO/RW`.

---

## 2. Groupes Keycloak et rôle Grafana résultant

| Groupe Keycloak | Rôle Grafana (mapping OIDC) | Portée |
| -------------------------------------- | --------------------------- | -------------------------- |
| `/console/security`, `/console/reader` | **Viewer** | Globale (lecture) |
| `/<slug>/console/admin` | **Editor** | Projet `<name>` |
| `/<slug>/console/devops` | **Editor** | Projet `<name>` |
| `/<slug>/console/developer` | **Viewer** | Projet `<name>` |
| `/<slug>/console/security` | **Viewer** | Projet `<name>` |
| `/<slug>/console/reader` | **Viewer** | Projet `<name>` |
| `/<slug>/grafana/hprod-RW` | **Editor** (hors-prod) | Projet `<slug>`, hors-prod |
| `/<slug>/grafana/hprod-RO` | **Viewer** (hors-prod) | Projet `<slug>`, hors-prod |
| `/<slug>/grafana/prod-RW` | **Editor** (prod) | Projet `<slug>`, prod |
| `/<slug>/grafana/prod-RO` | **Viewer** (prod) | Projet `<slug>`, prod |

---

## 3. Points d'attention

- **Scoping prod / hors-prod.** Un utilisateur avec droits sur un environnement `prod` est ajouté aux sous-groupes `prod-*` ; sinon aux `hprod-*` (hors-prod). Les deux peuvent coexister.
- **RW vs RO.** `RW` ⇔ capacité `MANAGE_ENVIRONMENTS` (édition) ; `RO` ⇔ `LIST_ENVIRONMENTS` (visualisation). Le propriétaire du projet est toujours RW.
- **Le rôle Grafana réel est défini par la config OIDC de Grafana**, pas par la Console. La Console se contente de maintenir l'arborescence de groupes Keycloak.

---

## 4. Qui gère quoi ?

| Élément | Géré par |
| ------------------------------------ | ------------------------- |
| Identité OIDC / groupes Keycloak | **Keycloak** |
| Arborescence des groupes `grafana/*` | **Console** (automatique) |
| Mapping groupe → rôle Grafana | **Grafana** (config OIDC) |

---
66 changes: 66 additions & 0 deletions docs/administration/rbac/harbor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Groupes Keycloak et Harbor

Ce document décrit comment la Console propage les **groupes Keycloak** en **rôles Harbor** (membres d'un projet Harbor), et quels droits en résultent.

---

## Vue par rôle

Ce que chaque rôle Console obtient réellement dans Harbor. Les chemins `/console/<rôle>` sont **réservés à l'administration plateforme** et distincts des rôles projet `/<slug>/console/<rôle>` :

| Rôle Console | Groupe Keycloak | Accès obtenu dans Harbor |
| --------------------- | --------------------------- | ------------------------------------------------------- |
| Admin plateforme | `/console/admin` | **Admin** sur tous les projets Harbor |
| Administrateur projet | `/<slug>/console/admin` | **Developer** sur le projet (push/pull d'images) |
| DevOps | `/<slug>/console/devops` | **Guest** sur le projet (pull/lecture, pas de push) |
| Développeur | `/<slug>/console/developer` | **Guest** sur le projet (pull/lecture) |
| Lecture seule | `/<slug>/console/reader` | **Guest** sur le projet (lecture) |
| Lecture seule | `/console/reader` | **Guest** sur **tous** les projets (lecture transverse) |
| Security | `/<slug>/console/security` | **Guest** sur le projet (lecture) |
| Security | `/console/security` | **Guest** sur **tous** les projets (lecture transverse) |
| Guest | — | Aucun accès |

---

## 1. Authentification : Harbor via OIDC Keycloak

- Harbor est fédéré au fournisseur OIDC Keycloak ; les utilisateurs se connectent sans mot de passe local.
- La Console approvisionne, pour chaque projet, le **projet Harbor** et y ajoute les groupes Keycloak comme **membres** avec un rôle (Admin / Developer / Guest).

---

## 2. Groupes Keycloak et rôle Harbor résultant

La Console mappe chaque groupe OIDC vers un **rôle Harbor** et une **portée** (projet ou global).

| Groupe Keycloak | Rôle Harbor | Portée |
| ---------------------------------- | ------------------ | ------------------------- |
| `/console/admin` | **Admin** | Tous projets |
| `/console/security` | **Guest** | Tous projets (plateforme) |
| `/console/reader` | **Guest** | Tous projets (plateforme) |
| `/<slug>/console/admin` | **Developer** | Projet `<name>` |
| `/<slug>/console/devops` | **Guest** | Projet `<name>` |
| `/<slug>/console/developer` | **Guest** | Projet `<name>` |
| `/<slug>/console/security` | **Guest** | Projet `<name>` |
| `/<slug>/console/reader` | **Guest** | Projet `<name>` |

> Le groupe racine du projet (`/<slug>`) est ajouté en tant que membre avec un niveau **Limited Guest** (lecture seule : pull d'images sans administration) pour l'ensemble de ses membres.

---

## 3. Points d'attention

- **Seul `/<slug>/console/admin` pousse des images.** Tous les autres rôles projet (`devops`, `developer`, `security`, `reader`) sont en **Guest** (pull/lecture uniquement).
- **Groupes `security`/`reader` = Guest transverse.** Ils sont ajoutés en Guest sur **tous** les projets Harbor (portée plateforme), ce qui donne une lecture globale des registres.

---

## 4. Qui gère quoi ?

| Élément | Géré par |
| -------------------------------- | ------------------------- |
| Identité OIDC / groupes Keycloak | **Keycloak** |
| Projets Harbor, membres & rôles | **Console** (automatique) |
| Application des droits | **Harbor** |

---
Loading
Loading