Skip to content

ADR 024 — SSO des UI d'ops : OIDC via GitLab (2026-06-22)

Statut

Accepté (2026-06-22), validé en live le 2026-06-23. Issue #106. Couvre les deux MR : MR1 ArgoCD, MR2 Grafana (toutes deux livrées). Suite du thÚme « accÚs plateforme » du Sprint 5, aprÚs l'exposition d'ArgoCD (#105, ADR 022/023). Deux correctifs sont issus de la validation live (cf. #111) : voir Décisions 2 et 3.

Contexte

Les UI d'ops (ArgoCD #105, Grafana #76) ont chacune leur mot de passe admin. On veut un SSO : une seule identité pour se connecter à toutes les consoles, avec un RBAC centralisé sur l'appartenance à un groupe. Premier palier sur EKS : déléguer l'authentification à un fournisseur OIDC.

DĂ©cision 1 — GitLab plutĂŽt que GitHub comme fournisseur OIDC

Tout le projet vit sur gitlab.com (gitlab.com/yk-devops), c'est déjà notre identité. Trois avantages décisifs sur GitHub :

  1. Cohérence : un seul écosystÚme, l'IdP qu'on utilise déjà.
  2. RBAC par groupe : on a le groupe yk-devops → on gate l'accùs dessus (membre → admin) au lieu de coder en dur un username.
  3. Une seule application OAuth : GitLab accepte plusieurs redirect URIs par application (GitHub n'en accepte qu'une). Une app de groupe yk-devops couvre donc ArgoCD et Grafana, avec un seul client_id / client_secret.

DĂ©cision 2 — Une app OAuth GitLab (groupe), RBAC par groupe

  • Application OAuth au niveau du groupe yk-devops, deux redirect URIs : https://argocd.devopsyouss.com/api/dex/callback (ArgoCD/Dex) et https://grafana.devopsyouss.com/login/gitlab (Grafana).
  • Scopes (corrigĂ©s en live, #111) : openid, read_user, read_api. Chaque client rĂ©clame un scope diffĂ©rent : le connecteur Dex (ArgoCD) demande read_user openid et Ă©choue si l'app n'autorise pas read_user (erreur "requested scope is invalid") ; Grafana, lui, utilise read_api pour rĂ©cupĂ©rer les groupes. L'app doit donc autoriser read_user ET read_api. (Le read_api seul ne fournit PAS les groupes cĂŽtĂ© Dex, contrairement Ă  ce qu'on avait notĂ©.)
  • RBAC : membres de yk-devops → role:admin, readonly par dĂ©faut.

DĂ©cision 3 — ArgoCD via Dex, Grafana via son provider GitLab natif

  • ArgoCD (MR1) : connecteur Dex gitlab dans configs.cm.dex.config (baseURL: https://gitlab.com, clientID en clair, clientSecret: $dex.gitlab.clientSecret, redirectURI, filtre groups: [yk-devops]). RBAC dans configs.rbac (g, yk-devops, role:admin + policy.default: role:readonly). Ces rĂ©glages sont des paramĂštres d'install → ils vivent dans les values du helm install (bootstrap Ansible), comme server.insecure (#105).
  • Grafana (MR2) : provider [auth.gitlab] natif dans grafana.ini (allowed_groups: yk-devops). Le mapping de rĂŽle (role_attribute_path) doit passer par une variable d'env GF_AUTH_GITLAB_ROLE_ATTRIBUTE_PATH, pas par grafana.ini : le parser INI de Grafana retire les guillemets, transformant le JMESPath littĂ©ral 'Admin' en identifiant de champ → rĂ©sultat nul → repli Viewer. En env la valeur n'est pas re-parsĂ©e (corrigĂ© en live, #111).

DĂ©cision 4 — Le client secret via ESO, dans le secret ArgoCD existant

Le client secret GitLab est une valeur externe (fournie par GitLab), traitĂ©e comme le webhook Slack (#77) : variable TF_VAR_argocd_gitlab_client_secret, jamais commitĂ©e. Il est rangĂ© comme clĂ© supplĂ©mentaire du secret fastapi-eks/argocd existant (qui porte dĂ©jĂ  le bcrypt admin) : l'IRSA ESO couvre dĂ©jĂ  cet ARN → aucune modif IRSA. L'ExternalSecret (#105, Merge) est Ă©tendu d'une clĂ© pour patcher dex.gitlab.clientSecret dans argocd-secret, oĂč Dex la rĂ©sout via la rĂ©fĂ©rence $dex.gitlab.clientSecret. (Grafana, MR2, aura son client secret via ESO cĂŽtĂ© monitoring.)

Conséquences

  • « Un seul compte partout » : on se connecte Ă  ArgoCD et Grafana avec son compte GitLab. Le mot de passe admin (#105) devient un accĂšs break-glass (secours), rangĂ© hors infra (coffre perso) ; Ă  terme admin.enabled: false.
  • ValidĂ© en live le 2026-06-23 (conjointement avec #105) : login GitLab sur ArgoCD (membre yk-devops → admin, claim groups vĂ©rifiĂ© dans User Info) et sur Grafana (membre yk-devops → Admin). Hors infra on valide helm template/ansible syntax/kustomize/mkdocs. Deux correctifs ont Ă©tĂ© nĂ©cessaires en live (scope read_user, rĂŽle Grafana via env — cf. #111).
  • Aucun secret en clair dans Git : client_id public dans argocd-cm, client_secret via ESO.

Évolution possible

  • MR2 : Grafana via [auth.gitlab] ferme #106.
  • Keycloak central sur le homelab : remplacer gitlab.com par un IdP self-hosted pour un vrai SSO cross-cluster (EKS + homelab + platform). On ne changera que le connecteur (Dex/Grafana → Keycloak), le reste du cĂąblage est identique.

Date : 2026-06-22 Sprint : 5 Issue : #106