Set-OPS-Public/roles/serveur_keycloak
Daniel Allaire b4e3520561 annuaire : un compte de service par consommateur, et la porte se ferme
Keycloak, Dovecot, Postfix et Icinga Web 2 se liaient TOUS avec cn=admin, le compte
d administration de la base. C est le rootDN : slapd lui fait contourner toutes les
ACL. Un seul secret, quatre services, tous les droits sur l arbre — pour ce qui est,
trois fois sur quatre, une simple lecture.

Et les droits livres par Debian etaient intacts : `to * by * read`. Sur ldap://, sans
s authentifier, une machine du reseau enumerait tous les comptes et toutes les
adresses. Des comptes a droits mesures n auraient rien valu tant que cette ligne
restait : on aurait ferme la porte en laissant la fenetre.

L indice etait deja dans le depot. `validatePasswordPolicy` existe parce que slapd
n applique pas ses controles de qualite au rootDN : la consequence etait compensee,
la cause intacte.

- ou=services, un compte par consommateur, secret propre en voute
- sept regles d acces posees EN ENTIER (state: exact) : l ordre est la regle, et
  inserer c est parier sur ce que le paquet aura mis avant nous
- amorcage_acces garde le compte d administration, NOMME comme l exception : il ne
  consomme pas l annuaire, il le provisionne depuis la socket locale
- la sonde passe de -x a -Y EXTERNAL : elle lisait en anonyme et aurait annonce un
  annuaire VIDE sur un annuaire parfaitement sain
- la rotation du compte d administration devient possible (elle n etait posee qu a
  l installation, par debconf : la voute et slapd divergeaient en silence)

Quatre marches payees en chemin :
1. un cinquieme appelant oublie, dont l echec etait masque par no_log — la garde
   refuse desormais SANS no_log : elle nomme la cle absente, jamais son contenu
2. la federation Keycloak ne reecrivait son bindDn que si l URL ou le mode changeaient
   — nouveau secret, ancien nom, error code 49
3. la rotation placee APRES les taches qui se lient en administrateur
4. ansible-vault et son tube : sortie non bloquante = echec silencieux, la voute
   paraissait tournee et etait identique a l octet

P72 exige que tout role incluant resoudre_annuaire NOMME son compte, et qu aucun sauf
amorcage_acces ne nomme admin. Eprouvee dans les deux sens.

Verifie sur l infrastructure : chaque compte lit ce qu il doit, aucun ne voit les
autres, la lecture anonyme rend 0 entree, et les quatre services repondent (doveadm
user, postmap -q, decouverte OIDC 200, portier SSO 200).

vault_openldap_admin et vault_ldap_bind_postfix renouveles : les deux avaient transite
en clair par une session d exploitation. Les anciennes valeurs rendent Invalid
credentials (49).

make prouver : 71 OK, 0 echec, 1 saute. ansible-lint : 0 failure, profil production.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-13 13:36:38 -04:00
..
defaults sondes : quatorze, une par role, derivees en objets Icinga 2026-09-10 03:00:21 -04:00
files keycloak : verifier la signature PGP contre une empreinte epinglee 2026-08-10 23:35:32 -04:00
handlers Rendre le dry-run (--check) fiable sur les rôles applicatifs 2026-07-01 21:01:53 -04:00
meta sondes : quatorze, une par role, derivees en objets Icinga 2026-09-10 03:00:21 -04:00
tasks annuaire : un compte de service par consommateur, et la porte se ferme 2026-09-13 13:36:38 -04:00
templates sondes : quatorze, une par role, derivees en objets Icinga 2026-09-10 03:00:21 -04:00
README.md docs(keycloak) : documenter le thème Alliance + la compatibilité MAJ 2026-07-04 10:05:58 -04:00

serveur_keycloak

SSO / IAM Keycloak (distribution Quarkus) — hub d'authentification centralisée (OIDC/SAML) pour les services internes.

Rôle

  • Installe un JRE, télécharge et extrait la distribution Keycloak dans /opt/keycloak.
  • Configure la base PostgreSQL via le registre instance/plan/bases-donnees.yml (entrée keycloak).
  • Publie derrière serveur_nginx (TLS à l'edge) : hostname, proxy-headers=xforwarded, http-enabled=true.
  • Secrets (mot de passe BD + admin bootstrap) dans /etc/keycloak/keycloak.env (0640, no_log).
  • kc.sh build --db=postgres (une fois par version) puis service systemd start --optimized.

Premier consommateur du registre de BD

L'entrée keycloak de instance/plan/bases-donnees.yml fait que :

  1. serveur_postgresql crée la base keycloak + le compte propriétaire keycloak.
  2. Ce rôle lit la même entrée pour bâtir sa connexion (db-url-database, db-username, mot de passe = vault_bd_keycloak).

Mot de passe partagé, source unique. Dépendance serveur_keycloak requiert serveur_postgresql actif déjà dans docs/dependances-groupes.yml.

Secrets requis (Vault)

serveur_keycloak_admin_password: "{{ vault_keycloak_admin }}"   # admin bootstrap
vault_bd_keycloak: "..."                                          # mot de passe BD (partage avec postgres)

Variables principales

Variable Défaut Rôle
serveur_keycloak_version 26.0.7 Version (à vérifier/bumper sur keycloak.org/downloads)
serveur_keycloak_hostname keycloak.exemple.internal Hostname public (via nginx)
serveur_keycloak_db_host 10.0.13.11 IP de data-01 (serveur_postgresql)
serveur_keycloak_admin_user admin Admin bootstrap
serveur_keycloak_login_theme "" Thème de login du realm (vide = défaut Keycloak)
serveur_keycloak_account_theme "" Thème de la console de compte
serveur_keycloak_theme_cache true Cache des ressources de thème (true=prod/perf, false=lab/itération)

Thème (identité Alliance Boréale)

Un thème alliance-boreale (dans files/themes/) applique l'identité visuelle du site de l'Alliance : ciel nocturne aurore + constellation animée, cartes en verre, accents aurore, logo étoile, police système. Il couvre le login (login/) et la console de compte (account/).

Comment ça marche :

  • theme.properties : parent=keycloak (login) / parent=keycloak.v3 (account) + styles= (CSS)
    • scripts= (la constellation JS). C'est un calque CSS/JS posé sur la structure PatternFly de Keycloak.
  • Déployé dans {{ serveur_keycloak_home }}/themes/ (copie inconditionnelle, à chaque déploiement, après l'extraction de Keycloak) et appliqué au realm via kcadm -s loginTheme/accountTheme.
  • serveur_keycloak_theme_cache: false (lab) sert les ressources en no-cache — sinon Keycloak les marque « immuables » et le navigateur garde l'ancien CSS même en Ctrl+Shift+R (piège classique ; utiliser une fenêtre privée pour vérifier un changement).
  • Le JS de constellation s'initialise sur DOMContentLoaded (Keycloak injecte le <script> dans <head>, avant que <body> existe).

⚠️ Mise à jour de Keycloak — à savoir :

  • Pas de réapparition de l'ancien thème : le thème est codifié + réappliqué à chaque make deployer (la copie survit à l'extraction et n'a pas de garde creates). Une MAJ via Set-OPS réinstalle le thème.
  • Le vrai risque = compatibilité : le calque dépend des classes PatternFly (.pf-c-* / .pf-v5-*) et des thèmes parents (keycloak, keycloak.v3). Une MAJ majeure de Keycloak peut changer PatternFly ou renommer un parent → le rendu se dégrade ou tombe sur le défaut ; il faut alors retoucher le CSS / le parent (le thème ne « redevient » pas l'ancien, il demande un ajustement).
  • Check-list MAJ : après un bump de serveur_keycloak_version, ouvrir le login + la console de compte et vérifier le rendu (~2 min). La version étant épinglée, les MAJ sont délibérées.

Notes / limites

  • Version : à confirmer/bumper ; l'URL suit le motif officiel des releases GitHub.
  • L'unité systemd est dérivée des conventions Keycloak (la doc officielle ne fournit pas d'unité) — sandboxing volontairement modéré pour ne pas casser le démarrage.
  • Le site nginx publiant Keycloak se déclare côté serveur_nginx (serveur_nginx_sites), pas ici.
  • Certificats : TLS terminé à l'edge ; aucun certificat sur Keycloak.

Prérequis

  • Réseau sortant pour télécharger la distribution.
  • Base PostgreSQL atteignable (dépendance serveur_postgresql).