runbook + coffre : le jeton SAS de l'archive de secours (#70) #239

Merged
justine merged 7 commits from marvin/70-sas-archive into develop 2026-09-09 14:56:15 +00:00
Member

Le jeton SAS de l'archive de secours (#70)

Donne au serveur de la salle de quoi deposer l'archive quotidienne sur
Azure Blob -- ecriture seule, revocable sans toucher a la cle du compte.

Contenu

  • docs/runbooks/secrets.md -- generation, rotation, revocation par la stored
    access policy, recette, retour arriere
  • infra/ansible/group_vars/all/vault.yml -- vault_sas_archive_depot (jeton
    SAS de service, adosse a la policy depot-archive : cwl, HTTPS, exp.
    2026-10-05)
  • vault.yml.example -- la variable, nom seul
  • ligne dans docs/runbooks/README.md

Fait sur Azure (09/09)

  • Acces debloques : Devops sur le compte stenervisiong2tfstate + Reader
    sur rg-FHeuze2023... (le role Devops est cantonne par membre a son RG)
  • #69 applique partiellement pour creer le conteneur archive (#223 mergee
    jamais appliquee) -- import compte + conteneur, via apply -target
  • Stored access policy depot-archive posee, jeton SAS genere

Criteres du ticket

  • Stored access policy sur le conteneur -- revocation sans rotation de cle
  • Jeton SAS w c l, HTTPS, expiration 2026-10-05
  • Jeton chiffre et versionne -- ansible-vault au lieu de SOPS/age
    (critere 3 amende, accord obtenu -- voir commentaire du ticket)
  • docs/runbooks/secrets.md : rotation, jeton adosse a la cle du compte
  • Recette : ecriture OK, lecture refusee (commentaire du ticket)

Hors de cette PR

  • #71 : la tache Ansible backup qui utilise vault_sas_archive_depot
  • #223 / #69 : l'alerte de capacite et la retention 30 j ne sont
    applicables par personne (Microsoft.Insights/metricAlerts et
    managementPolicies/write absents du role Devops). #69 reste a moitie
    applique.

Closes #70. Depend de #69 (#223).

## Le jeton SAS de l'archive de secours (#70) Donne au serveur de la salle de quoi **deposer** l'archive quotidienne sur Azure Blob -- ecriture seule, revocable sans toucher a la cle du compte. ## Contenu - `docs/runbooks/secrets.md` -- generation, rotation, revocation par la stored access policy, recette, retour arriere - `infra/ansible/group_vars/all/vault.yml` -- `vault_sas_archive_depot` (jeton SAS de service, adosse a la policy `depot-archive` : `cwl`, HTTPS, exp. 2026-10-05) - `vault.yml.example` -- la variable, nom seul - ligne dans `docs/runbooks/README.md` ## Fait sur Azure (09/09) - Acces debloques : `Devops` sur le compte `stenervisiong2tfstate` + `Reader` sur `rg-FHeuze2023...` (le role `Devops` est cantonne par membre a son RG) - #69 applique partiellement pour creer le conteneur `archive` (#223 mergee jamais appliquee) -- import compte + conteneur, via `apply -target` - Stored access policy `depot-archive` posee, jeton SAS genere ## Criteres du ticket - [x] Stored access policy sur le conteneur -- revocation sans rotation de cle - [x] Jeton SAS `w c l`, HTTPS, expiration 2026-10-05 - [x] Jeton chiffre et versionne -- **ansible-vault** au lieu de SOPS/age (critere 3 amende, accord obtenu -- voir commentaire du ticket) - [x] `docs/runbooks/secrets.md` : rotation, jeton adosse a la cle du compte - [x] Recette : ecriture OK, lecture refusee (commentaire du ticket) ## Hors de cette PR - **#71** : la tache Ansible `backup` qui utilise `vault_sas_archive_depot` - **#223 / #69** : l'alerte de capacite et la retention 30 j ne sont applicables par personne (`Microsoft.Insights/metricAlerts` et `managementPolicies/write` absents du role `Devops`). #69 reste a moitie applique. Closes #70. Depend de #69 (#223).
runbook : le jeton SAS de l'archive de secours (#70)
All checks were successful
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 48s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 7s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 17s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 6m19s
553eddda29
Manuel des gestes autour du jeton SAS que le serveur utilise pour deposer
l'archive quotidienne : generation adossee a la stored access policy
depot-archive, rotation, revocation sans rotation de cle, chiffrement age/SOPS.

La stored access policy et le jeton sont poses sur Azure (09/09). Le
chiffrement SOPS (.sops.yaml + fichier chiffre) et la consommation Ansible
(#71) restent a faire : les sections concernees le signalent.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y9GaXoZ17B3o9kxsb3P973
runbook + coffre : le jeton SAS passe par ansible-vault, pas SOPS (#70)
All checks were successful
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 1m17s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 14s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 29s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m34s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 6m0s
46b7446204
Un seul secret ne justifie pas un second outil de chiffrement. Le jeton SAS
rejoint le coffre ansible-vault du projet comme tous les autres secrets
d'exploitation.

- secrets.md reecrit autour de vault_sas_archive_depot
- vault.yml.example : la variable remplace la note d'attente

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y9GaXoZ17B3o9kxsb3P973
coffre : le jeton SAS d'ecriture sur l'archive Azure (#70)
All checks were successful
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 9s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 42s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 32s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m51s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 6m15s
7b78f288c5
vault_sas_archive_depot : jeton SAS de service adosse a la stored access
policy depot-archive (permissions cwl, HTTPS, expiration 2026-10-05). Genere
le 09/09 depuis un poste, consomme par le role backup (#71).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y9GaXoZ17B3o9kxsb3P973
marvin changed title from WIP: runbook du jeton SAS de l'archive de secours (#70) to runbook + coffre : le jeton SAS de l'archive de secours (#70) 2026-09-09 11:42:31 +00:00
marvin requested review from justine 2026-09-09 11:43:33 +00:00
marvin self-assigned this 2026-09-09 11:43:57 +00:00
Member

Relu les trois commits. Le fond est bon : le choix ansible-vault plutôt que SOPS/age est le bon, et il est cohérent avec le projet (docs/api/securite.md:35 pose déjà la même règle pour vault_api_jwt_secret, et .gitignore:33 acte que vault.yml est commité chiffré — précédents #42 et #113). Le raisonnement policy → révocation sans rotation de clé, et la section « le jeton est adossé à la clé du compte », sont justes. La recette en commentaire du #70 (PUT 201 / GET 403 AuthorizationPermissionMismatch / LIST 200) sert le critère de vérification, et le test direct en HTTP est plus probant que az storage, dont l'auto-détection d'auth aurait pu masquer une retombée sur la clé.

Ce qui cloche, par ordre de criticité.

🔴 Bloquant — le critère 3 est proposé, pas acté -> je m'en occupe
La description dit « accord obtenu — voir commentaire du ticket », mais le commentaire du #70 se termine par « si quelqu'un tient au critère d'origine, on en discute — sinon je considère le critère 3 amendé ». Un silence n'est pas un accord obtenu, et c'est un critère d'acceptation. L'argumentaire est convaincant ; il lui manque une trace. Au choix : un « OK » explicite d'un pair en commentaire du #70, ou dans secrets.md la mention «critère 3 amendé, proposé le 09/09, sans objection au ». Sans ça, une relecture du dossier EC01 verra un critère non tenu et non levé. -> je vais mettre un OK en commentaire

🟠 Important — secrets.md décrit un état antérieur à son propre commit

7b78f28 a posé vault_sas_archive_depot dans le coffre, mais trois passages parlent encore au futur :

  • l'encart d'entête : « La variable de coffre et la consommation côté Ansible (#71) restent à faire » — seul #71 reste à faire ;
  • le tableau : vault_sas_archive_depot (à ajouter, #70) ;
  • la section « Où il vit », rédigée à l'impératif (« Ajouter : »).

Un lecteur en conclut que le jeton n'est pas au coffre, c'est-à-dire l'inverse de ce que la PR livre.

🟠 Important — l'exemple de jeton n'a pas la forme du jeton réel

secrets.md illustre la valeur par se=2026-10-05T00%3A00%3A00Z&sp=cwl&sr=c&sig=… : c'est un SAS ad hoc. Le jeton posé est adossé à la policy — le commentaire du #70 le dit lui-même, si=depot-archive — donc il porte si= et, avec --https-only, spr=https, et ne porte ni sp ni se, qui viennent de la policy. La section « Vérifier la sortie » deux lignes plus bas demande justement spr=https : en l'état, la doc invalide son propre exemple.

🟡 À corriger dans cette PR — deux renvois devenus faux

  • docs/runbooks/README.md:26, la ligne d'index du runbook, annonce encore « chiffrement age/SOPS ». 46b7446 a réécrit le corps sans l'index.
  • docs/api/securite.md:44-45 : « SOPS + age n'est utilisé nulle part dans infra/. Le nom apparaît au backlog pour un autre secret — le jeton SAS Azure du #70, encore ouvert ». Même décision, même PR : autant la refermer ici.

🟢 Détails

  • Le conteneur s'appelle archive et non daily-archive comme l'écrit le #70 (infra/terraform/variables.tf:54, default = "archive"). C'est le nom réel depuis le #43 : une ligne au ticket évitera qu'on lise le critère 1 comme
    manqué.
  • docs/runbooks/stockage-secours.md:30 renvoie au « client de dépôt (#70, #71) » sans lien vers secrets.md.
  • La recette étant jouée, la section « Recette (preuve à joindre à #70) » peut passer au passé et pointer le commentaire.
Relu les trois commits. Le fond est bon : le choix ansible-vault plutôt que SOPS/age est le bon, et il est cohérent avec le projet (docs/api/securite.md:35 pose déjà la même règle pour vault_api_jwt_secret, et .gitignore:33 acte que vault.yml est commité chiffré — précédents #42 et #113). Le raisonnement policy → révocation sans rotation de clé, et la section « le jeton est adossé à la clé du compte », sont justes. La recette en commentaire du #70 (PUT 201 / GET 403 AuthorizationPermissionMismatch / LIST 200) sert le critère de vérification, et le test direct en HTTP est plus probant que az storage, dont l'auto-détection d'auth aurait pu masquer une retombée sur la clé. Ce qui cloche, par ordre de criticité. 🔴 Bloquant — le critère 3 est proposé, pas acté -> je m'en occupe La description dit « accord obtenu — voir commentaire du ticket », mais le commentaire du #70 se termine par « si quelqu'un tient au critère d'origine, on en discute — sinon je considère le critère 3 amendé ». Un silence n'est pas un accord obtenu, et c'est un critère d'acceptation. L'argumentaire est convaincant ; il lui manque une trace. Au choix : un « OK » explicite d'un pair en commentaire du #70, ou dans secrets.md la mention «critère 3 amendé, proposé le 09/09, sans objection au <date> ». Sans ça, une relecture du dossier EC01 verra un critère non tenu et non levé. -> je vais mettre un OK en commentaire 🟠 Important — secrets.md décrit un état antérieur à son propre commit 7b78f28 a posé vault_sas_archive_depot dans le coffre, mais trois passages parlent encore au futur : - l'encart d'entête : « La variable de coffre et la consommation côté Ansible (#71) restent à faire » — seul #71 reste à faire ; - le tableau : vault_sas_archive_depot (à ajouter, #70) ; - la section « Où il vit », rédigée à l'impératif (« Ajouter : »). Un lecteur en conclut que le jeton n'est pas au coffre, c'est-à-dire l'inverse de ce que la PR livre. 🟠 Important — l'exemple de jeton n'a pas la forme du jeton réel secrets.md illustre la valeur par se=2026-10-05T00%3A00%3A00Z&sp=cwl&sr=c&sig=… : c'est un SAS ad hoc. Le jeton posé est adossé à la policy — le commentaire du #70 le dit lui-même, si=depot-archive — donc il porte si= et, avec --https-only, spr=https, et ne porte ni sp ni se, qui viennent de la policy. La section « Vérifier la sortie » deux lignes plus bas demande justement spr=https : en l'état, la doc invalide son propre exemple. 🟡 À corriger dans cette PR — deux renvois devenus faux - docs/runbooks/README.md:26, la ligne d'index du runbook, annonce encore « chiffrement age/SOPS ». 46b7446 a réécrit le corps sans l'index. - docs/api/securite.md:44-45 : « SOPS + age n'est utilisé nulle part dans infra/. Le nom apparaît au backlog pour un autre secret — le jeton SAS Azure du #70, encore ouvert ». Même décision, même PR : autant la refermer ici. 🟢 Détails - Le conteneur s'appelle archive et non daily-archive comme l'écrit le #70 (infra/terraform/variables.tf:54, default = "archive"). C'est le nom réel depuis le #43 : une ligne au ticket évitera qu'on lise le critère 1 comme manqué. - docs/runbooks/stockage-secours.md:30 renvoie au « client de dépôt (#70, #71) » sans lien vers secrets.md. - La recette étant jouée, la section « Recette (preuve à joindre à #70) » peut passer au passé et pointer le commentaire.
marvin referenced this pull request from a commit 2026-09-09 13:49:13 +00:00
retours de Justine sur la #239 (#70)
All checks were successful
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 42s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 8s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m14s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 6m2s
37677d2ad0
- secrets.md : la variable de coffre est posee, plus au futur ; section
  « Ou il vit » au present ; exemple de jeton a la forme reelle (si=, spr=,
  ni sp ni se) ; recette au passe, pointe le commentaire du #70
- README.md : la ligne d'index disait encore age/SOPS
- securite.md : la note « SOPS nulle part » devient la decision, prise ici
- stockage-secours.md : lien vers secrets.md depuis la ligne du client de depot
- note du nom archive vs daily-archive dans le tableau d'entete

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y9GaXoZ17B3o9kxsb3P973
Author
Member

Merci pour la relecture. Corrige en 37677d2.

secrets.md

  • Encart d'entete : la variable de coffre est posee, plus au futur. Seul #71 reste.
  • Tableau : vault_sas_archive_depot, sans « a ajouter ».
  • « Ou il vit » : au present, ansible-vault view/edit, et la forme reelle de la valeur.
  • Exemple de jeton : spr=https&sv=...&si=depot-archive&sr=c&sig=... partout. Ajoute une phrase : sp/se presents = jeton qui ne s'adosse pas a la policy. La section « Verifier la sortie » demande maintenant si=depot-archive et l'absence de sp/se, coherente avec l'exemple.
  • Recette : au passe, pointe le commentaire du #70, avec le curl pour rejouer.

Renvois

  • README.md:26 : « age/SOPS » -> « coffre ansible-vault ».
  • securite.md : la note « SOPS nulle part » devient la decision, prise dans cette PR.
  • stockage-secours.md:30 : lien [secrets.md] sur la ligne du client de depot.

Detail archive vs daily-archive : note ajoutee au tableau d'entete de secrets.md. Une ligne ira aussi au #70.

Pour le 🔴 : j'attends ton OK sur le critere 3 en commentaire du #70, ou je date la mention dans secrets.md apres 24 h sans objection.

Merci pour la relecture. Corrige en `37677d2`. **secrets.md** - Encart d'entete : la variable de coffre est posee, plus au futur. Seul #71 reste. - Tableau : `vault_sas_archive_depot`, sans « a ajouter ». - « Ou il vit » : au present, `ansible-vault view/edit`, et la forme reelle de la valeur. - Exemple de jeton : `spr=https&sv=...&si=depot-archive&sr=c&sig=...` partout. Ajoute une phrase : `sp`/`se` presents = jeton qui ne s'adosse pas a la policy. La section « Verifier la sortie » demande maintenant `si=depot-archive` et l'absence de `sp`/`se`, coherente avec l'exemple. - Recette : au passe, pointe le commentaire du #70, avec le `curl` pour rejouer. **Renvois** - `README.md:26` : « age/SOPS » -> « coffre ansible-vault ». - `securite.md` : la note « SOPS nulle part » devient la decision, prise dans cette PR. - `stockage-secours.md:30` : lien `[secrets.md]` sur la ligne du client de depot. **Detail archive vs daily-archive** : note ajoutee au tableau d'entete de secrets.md. Une ligne ira aussi au #70. Pour le 🔴 : j'attends ton OK sur le critere 3 en commentaire du #70, ou je date la mention dans secrets.md apres 24 h sans objection.
Merge branch 'develop' into marvin/70-sas-archive
Some checks failed
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 9s
Intégration / Terraform — format, validité et lint (pull_request) Successful in 28s
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 45s
Intégration / Workflows — lint et audit de sécurité (pull_request) Failing after 20s
Intégration / Checkov — audit de la configuration (pull_request) Failing after 41s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m37s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m46s
3f96c447b3
Merge branch 'develop' into marvin/70-sas-archive
Some checks failed
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 47s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 8s
Intégration / Terraform — format, validité et lint (pull_request) Successful in 24s
Intégration / Checkov — audit de la configuration (pull_request) Failing after 47s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 2m2s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 6m0s
52453a5b51
Merge branch 'develop' into marvin/70-sas-archive
All checks were successful
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 47s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 7s
Intégration / Terraform — format, validité et lint (pull_request) Successful in 13s
Intégration / Checkov — audit de la configuration (pull_request) Successful in 15s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 19s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m34s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m48s
0aa15f4e83
justine approved these changes 2026-09-09 14:54:30 +00:00
justine merged commit 0dc919c9ea into develop 2026-09-09 14:56:15 +00:00
justine deleted branch marvin/70-sas-archive 2026-09-09 14:56:15 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
g2/enervision!239
No description provided.