From 9d2e4035e8c6d755a37ea5741ab378ad3103b262 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 29 Sep 2026 03:10:15 -0400 Subject: [PATCH] client_pki : la cle de signature vient du depot, non d un CDN tiers Le depot porte deja cette cle : `serveur_step_ca` la pose depuis ses `files/`, et les deux fichiers ont le meme SHA-256. Le client la telechargeait. Une flotte d AMORCAGE n a ni serveur d artefacts ni cache, donc le schema reste `https` et chaque hote sort en direct ; le telechargement echouait trois amorcages sur quatre, sur une bordure amont que rien ici ne controle. Le repli reste. Verifie sur une grappe jetable : la copie joue sur l hote qui echouait, le telechargement est saute, et le CDN n est appele aucune fois. Assisted-by: Claude Opus 5 --- roles/client_pki/defaults/main.yml | 15 +++++++++++++++ roles/client_pki/tasks/main.yml | 30 +++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/roles/client_pki/defaults/main.yml b/roles/client_pki/defaults/main.yml index 963591f..848a6c1 100644 --- a/roles/client_pki/defaults/main.yml +++ b/roles/client_pki/defaults/main.yml @@ -67,6 +67,21 @@ client_pki_provisioner_password: "{{ vault_step_ca_provisioner_password | defaul # Depot apt officiel Smallstep (partage avec serveur_step_ca). client_pki_depot_cle_url: "{{ client_pki_depot_schema }}://packages.smallstep.com/keys/apt/repo-signing-key.gpg" client_pki_depot_cle_fichier: "/etc/apt/keyrings/smallstep.asc" + +# LA MEME CLE QUE `serveur_step_ca` POSE, et c'est le DEPOT qui la porte : les deux +# fichiers ont le meme SHA-256. La chercher ici d'abord evite de sortir sur un CDN tiers +# pour des octets qu'on possede. +# +# CE N'EST PAS THEORIQUE POUR UNE FLOTTE D'AMORCAGE. Elle n'a par definition ni serveur +# d'artefacts ni cache, donc `client_pki_depot_schema` reste `https` et chaque hote sort +# EN DIRECT ; le telechargement echouait alors trois amorcages sur quatre, avec cinq +# reprises, sur une bordure amont que rien ici ne controle. +# +# Le chemin traverse `serveur_step_ca` plutot que de dupliquer le fichier : deux copies +# d'une meme cle divergent le jour ou l'amont la remplace, et rien ne dirait laquelle +# fait foi. +client_pki_depot_cle_locale: >- + {{ role_path }}/../serveur_step_ca/files/smallstep-repo-signing-key.asc client_pki_depot_uri: "{{ client_pki_depot_schema }}://packages.smallstep.com/stable/debian" client_pki_depot_suite: "debs" diff --git a/roles/client_pki/tasks/main.yml b/roles/client_pki/tasks/main.yml index dd27bbd..1b3203c 100644 --- a/roles/client_pki/tasks/main.yml +++ b/roles/client_pki/tasks/main.yml @@ -103,8 +103,36 @@ - telecharger_la_cle_de_signature_smallste_present.stat.exists - (telecharger_la_cle_de_signature_smallste_present.stat.size | default(0)) == 0 +- name: Voir si le depot porte la cle de signature Smallstep + ansible.builtin.stat: + path: "{{ client_pki_depot_cle_locale }}" + delegate_to: localhost + become: false + changed_when: false + check_mode: false + register: client_pki_cle_depot_locale + +# LE DEPOT D'ABORD, LE RESEAU ENSUITE. `serveur_step_ca` pose deja cette cle depuis ses +# `files/` sans rien demander a personne ; le client la telechargeait. Les deux fichiers +# sont identiques — meme SHA-256 — si bien que la sortie n'achetait rien et exposait +# chaque amorcage a une bordure tierce. +- name: Poser la cle de signature Smallstep depuis le depot + ansible.builtin.copy: + src: "{{ client_pki_depot_cle_locale }}" + dest: "{{ client_pki_depot_cle_fichier }}" + owner: root + group: root + mode: "0644" + when: + - not (telecharger_la_cle_de_signature_smallste_present.stat.exists and telecharger_la_cle_de_signature_smallste_present.stat.size | default(0) > 0) + - client_pki_cle_depot_locale.stat.exists + +# LE REPLI RESTE, et il n'est pas mort : un depot qui ne porterait plus ce fichier doit +# encore pouvoir amorcer. Ce qui change est l'ORDRE — on ne sort que faute de mieux. - name: Telecharger la cle de signature Smallstep - when: not (telecharger_la_cle_de_signature_smallste_present.stat.exists and telecharger_la_cle_de_signature_smallste_present.stat.size | default(0) > 0) + when: + - not (telecharger_la_cle_de_signature_smallste_present.stat.exists and telecharger_la_cle_de_signature_smallste_present.stat.size | default(0) > 0) + - not client_pki_cle_depot_locale.stat.exists # `force` PARCE QU'UNE REPRISE CONDITIONNELLE NE REPREND RIEN (2026-09-12). # # Sans lui, `get_url` envoie un `If-Modified-Since` des que le fichier existe. Le cache