From dd84ed011cba1a7f0a403e084b281a6593072607 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Sat, 8 Aug 2026 10:57:42 -0400 Subject: [PATCH] keycloak : journaliser les evenements du realm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deux services n'aboutissaient pas et tout etait correct cote serveur — clients OIDC, URI de rappel, secret identique (meme empreinte), CA de confiance, aucune restriction de domaine. Le premier saut rejoue au curl montrait des parcours sains. Et la, plus rien a examiner : eventsEnabled = False. Keycloak ne gardait aucune trace, ni des connexions ni des echecs. Manque de diagnostic, mais surtout d'exploitation : « un sysadmin l'exploite sans IA » suppose qu'il puisse lire lui-meme ce qui s'est passe. Journal (connexions + actions d'administration, retention 14 jours) reconcilie par le role, pas active a la main dans une console. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 19 +++++++++ roles/serveur_keycloak/defaults/main.yml | 6 +++ .../serveur_keycloak/tasks/journalisation.yml | 40 +++++++++++++++++++ .../serveur_keycloak/tasks/politique-mdp.yml | 3 ++ 4 files changed, 68 insertions(+) create mode 100644 roles/serveur_keycloak/tasks/journalisation.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 93a439e..ec85604 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # CHANGELOG — Set-OPS +## 2026-08-08 — Keycloak ne gardait aucune trace des connexions + +Deux services n'aboutissaient pas pour l'exploitant (Nextcloud, Icinga Web 2). Tout a été +vérifié côté serveur et tout était correct : clients OIDC actifs, URI de rappel exactes, +secret d'`oauth2-proxy` identique à celui de Keycloak (même empreinte SHA-256), CA de +confiance depuis `mon-01` (`200` sur la découverte), `email_domains = ["*"]` donc aucune +restriction. Le premier saut de chaque parcours a été rejoué avec `curl` : Nextcloud +redirige vers sa page locale (qui propose bien le bouton SSO « Chezlepro »), Icinga part +correctement vers Keycloak, qui répond `200`. + +**Et là, plus rien à examiner** : `eventsEnabled = False`. Keycloak ne gardait aucune trace +— ni qui est entré, ni pourquoi une authentification a échoué. Impossible de savoir ce que +l'utilisateur avait rencontré. + +C'est un manque d'exploitation autant que de diagnostic : « un sysadmin l'exploite sans +IA » suppose qu'il puisse lire lui-même ce qui s'est passé. Le journal des évènements +(connexions et actions d'administration, rétention 14 jours) est désormais réconcilié par +`serveur_keycloak`, comme le reste — pas activé à la main dans une console. + ## 2026-08-08 — La livraison interne était en panne, et le devis disait CONFORME Suite de l'arbitrage sur l'adressage : **le courrier local est désormais routé par diff --git a/roles/serveur_keycloak/defaults/main.yml b/roles/serveur_keycloak/defaults/main.yml index 50979ac..d974510 100644 --- a/roles/serveur_keycloak/defaults/main.yml +++ b/roles/serveur_keycloak/defaults/main.yml @@ -176,3 +176,9 @@ serveur_keycloak_ldap_attributs: last name: "sn" email: "mail" username: "uid" + +# Journal des evenements du realm — voir tasks/journalisation.yml. Retention en +# secondes ; 14 jours suffit a diagnostiquer sans faire du journal une archive. +serveur_keycloak_journal_actif: true +serveur_keycloak_journal_admin: true +serveur_keycloak_journal_retention: 1209600 diff --git a/roles/serveur_keycloak/tasks/journalisation.yml b/roles/serveur_keycloak/tasks/journalisation.yml new file mode 100644 index 0000000..d3b1fbb --- /dev/null +++ b/roles/serveur_keycloak/tasks/journalisation.yml @@ -0,0 +1,40 @@ +--- +# Journal des evenements du realm. Sans lui, Keycloak ne garde AUCUNE trace des +# connexions : ni qui est entre, ni pourquoi une authentification a echoue. Constate +# le 2026-08-08 en cherchant a diagnostiquer deux services qui n'aboutissaient pas — +# tout etait correct cote serveur, et il n'existait aucun moyen de savoir ce que +# l'utilisateur avait rencontre. +# +# C'est aussi une exigence d'exploitation : « un sysadmin l'exploite sans IA » suppose +# qu'il puisse lire lui-meme ce qui s'est passe. + +- name: Lire la configuration du journal + ansible.builtin.uri: + url: "http://localhost:8080/admin/realms/{{ serveur_keycloak_realm }}/events/config" + headers: + Authorization: "Bearer {{ serveur_keycloak_pol_jeton.json.access_token }}" + register: serveur_keycloak_journal_actuel + no_log: true + +- name: Composer la configuration attendue + ansible.builtin.set_fact: + serveur_keycloak_journal_attendu: + eventsEnabled: "{{ serveur_keycloak_journal_actif | bool }}" + eventsExpiration: "{{ serveur_keycloak_journal_retention | int }}" + adminEventsEnabled: "{{ serveur_keycloak_journal_admin | bool }}" + adminEventsDetailsEnabled: "{{ serveur_keycloak_journal_admin | bool }}" + +- name: Activer le journal des évènements du realm + ansible.builtin.uri: + url: "http://localhost:8080/admin/realms/{{ serveur_keycloak_realm }}/events/config" + method: PUT + status_code: [204] + headers: + Authorization: "Bearer {{ serveur_keycloak_pol_jeton.json.access_token }}" + body_format: json + body: "{{ serveur_keycloak_journal_actuel.json | combine(serveur_keycloak_journal_attendu) }}" + no_log: true + changed_when: true + when: >- + (serveur_keycloak_journal_actuel.json | combine(serveur_keycloak_journal_attendu)) + != serveur_keycloak_journal_actuel.json diff --git a/roles/serveur_keycloak/tasks/politique-mdp.yml b/roles/serveur_keycloak/tasks/politique-mdp.yml index cb063d9..57f6f96 100644 --- a/roles/serveur_keycloak/tasks/politique-mdp.yml +++ b/roles/serveur_keycloak/tasks/politique-mdp.yml @@ -101,3 +101,6 @@ - name: Reconcilier les mappeurs d'attributs ansible.builtin.include_tasks: attributs-ldap.yml + +- name: Activer le journal des évènements + ansible.builtin.include_tasks: journalisation.yml