client_pki : recharger le vrai consommateur au renouvellement de cert

Bug latent de flotte : cert-renewer rechargeait un service nommé d'après le
cert (%i = FQDN, inexistant) au lieu du consommateur réel → nginx/postfix/
dovecot/slapd servaient l'ancien cert jusqu'à expiration. Symptôme : cert
edge périmé en mémoire → échec TLS OIDC → login SSO cassé.

Correctif : client_pki_reload_services (vrais consommateurs), par groupe.
Fix immédiat de l'incident : reload nginx sur l'edge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-07-04 17:18:13 -04:00
parent c5df8fac4a
commit 94c9277c3d
3 changed files with 21 additions and 0 deletions

View file

@ -2,6 +2,17 @@
## 2026-07-04
### Corrigé
- **Renouvellement de cert : recharger le VRAI consommateur (bug latent de flotte).** Le
`cert-renewer@.service` (client_pki) renouvelait le cert sur disque mais son `ExecStartPost`
rechargeait un service nommé *d'après le cert* (`%i` = FQDN), inexistant → **nginx (et postfix,
dovecot, slapd) n'étaient jamais rechargés** et servaient l'**ancien cert jusqu'à expiration**.
Symptôme vécu : cert edge expiré en mémoire (renouvelé sur disque), échec TLS de l'échange
code→jeton OIDC → **login Grafana/SSO cassé** (tous les services derrière l'edge). Correctif :
`client_pki_reload_services` (liste des vrais consommateurs), câblée par groupe (edge→nginx,
mail→postfix/dovecot, annuaire→slapd). Appliqué + vérifié sur les 4 hôtes. Fix immédiat de
l'incident : `systemctl reload nginx` sur l'edge.
### Ajouté
- **UI des logs Loki : dashboard Grafana provisionné.** Loki n'a pas d'UI ; son UI est Grafana.
Ajout d'un **dashboard « Journaux de la flotte »** (dossier Set-OPS) : sélecteur d'hôte multi +

View file

@ -29,3 +29,8 @@ client_pki_depot_cle_url: "https://packages.smallstep.com/keys/apt/repo-signing-
client_pki_depot_cle_fichier: "/etc/apt/keyrings/smallstep.asc"
client_pki_depot_uri: "https://packages.smallstep.com/stable/debian"
client_pki_depot_suite: "debs"
# Services a recharger apres un renouvellement de cert : les VRAIS consommateurs
# (nginx sur l'edge, postfix/dovecot sur le mail, slapd sur l'annuaire). Sans ca,
# le cert est renouvele sur disque mais le service sert l'ancien jusqu'a un reload.
client_pki_reload_services: []

View file

@ -14,7 +14,12 @@ Environment=CERT_LOCATION={{ client_pki_steppath }}/certs/%i.crt
Environment=KEY_LOCATION={{ client_pki_steppath }}/certs/%i.key
ExecCondition=/usr/bin/step certificate needs-renewal ${CERT_LOCATION}
ExecStart=/usr/bin/step ca renew --force ${CERT_LOCATION} ${KEY_LOCATION}
{% if client_pki_reload_services | default([]) | length > 0 %}
# Recharge les VRAIS consommateurs du cert (nginx, postfix…), pas un service nomme d'apres le cert.
ExecStartPost=/usr/bin/env sh -c "{% for svc in client_pki_reload_services %}systemctl try-reload-or-restart {{ svc }}; {% endfor %}true"
{% else %}
ExecStartPost=/usr/bin/env sh -c "! systemctl --quiet is-active %i.service || systemctl try-reload-or-restart %i"
{% endif %}
[Install]
WantedBy=multi-user.target