[infra] Jeton SAS écriture-seule pour l'archive de secours, chiffré SOPS/age #70

Closed
opened 2026-09-02 09:04:21 +00:00 by gabriel · 4 comments
Member

Exigence couverte

ENF-12

Épreuve servie

EC04 · Cloud et sécurisation

Charge estimée

0,5 j.h

Ce qu'on veut obtenir

Donner au serveur de la salle juste de quoi déposer l'archive, sans identité humaine ni service principal, et pouvoir révoquer ce droit sans toucher à la clé du compte.

Critères d'acceptation

  • Une stored access policy sur le conteneur daily-archive, qui permet la révocation sans rotation de clé.
  • Jeton SAS généré avec les seules permissions w c l, HTTPS obligatoire, expiration au-delà de la fin du projet (ex. 2026-10-05).
  • Jeton chiffré avec age et versionné via SOPS ; .sops.yaml déclare au moins deux destinataires (Gabriel et un pair).
  • docs/runbooks/secrets.md décrit la rotation et note que le jeton est adossé à la clé du compte.

Comment on le vérifie

Commande   az storage blob upload avec le jeton réussit ; az storage blob download avec le même jeton échoue
Attendu    écriture autorisée, lecture refusée
Preuve     les deux sorties, en commentaire

Manuel d'exploitation à mettre à jour

docs/runbooks/secrets.md (créé), procédure de rotation

Risque et retour arrière

Fuite du jeton : supprimer la stored access policy, régénérer, mettre à jour SOPS. Expiration en plein projet : le cron casse, d'où l'échéance post-projet.

Dépendances

Dépend de #69 (conteneur daily-archive et clé du compte).

### Exigence couverte ENF-12 ### Épreuve servie EC04 · Cloud et sécurisation ### Charge estimée 0,5 j.h ### Ce qu'on veut obtenir Donner au serveur de la salle juste de quoi déposer l'archive, sans identité humaine ni service principal, et pouvoir révoquer ce droit sans toucher à la clé du compte. ### Critères d'acceptation - [ ] Une stored access policy sur le conteneur `daily-archive`, qui permet la révocation sans rotation de clé. - [ ] Jeton SAS généré avec les seules permissions `w` `c` `l`, HTTPS obligatoire, expiration au-delà de la fin du projet (ex. 2026-10-05). - [ ] Jeton chiffré avec `age` et versionné via SOPS ; `.sops.yaml` déclare au moins deux destinataires (Gabriel et un pair). - [ ] `docs/runbooks/secrets.md` décrit la rotation et note que le jeton est adossé à la clé du compte. ### Comment on le vérifie ``` Commande az storage blob upload avec le jeton réussit ; az storage blob download avec le même jeton échoue Attendu écriture autorisée, lecture refusée Preuve les deux sorties, en commentaire ``` ### Manuel d'exploitation à mettre à jour `docs/runbooks/secrets.md` (créé), procédure de rotation ### Risque et retour arrière Fuite du jeton : supprimer la stored access policy, régénérer, mettre à jour SOPS. Expiration en plein projet : le cron casse, d'où l'échéance post-projet. ### Dépendances Dépend de #69 (conteneur `daily-archive` et clé du compte).
gabriel self-assigned this 2026-09-02 09:04:21 +00:00
florian added this to the EnerVision project 2026-09-02 14:51:52 +00:00
gabriel removed their assignment 2026-09-03 09:53:56 +00:00
gabriel added the due date 2026-09-11 2026-09-03 12:41:07 +00:00
gabriel added this to the Post-jury milestone 2026-09-03 15:06:03 +00:00
florian removed their assignment 2026-09-09 08:14:29 +00:00
Member

Noeud de droits, resolu, et un ecart a acter.

Les criteres 1 et 2 : stored access policy + SAS de service

Faisables, mais pas avec mes droits initiaux. Le role Devops-cours-projet-eadl
porte Microsoft.Storage/storageAccounts/listkeys/action -- mais il est
attribue a chaque membre a la portee de son seul groupe de ressources. Le
compte stenervisiong2tfstate est dans rg-FHeuze2023_cours-projet-eadl, ou je
n'avais rien :

az storage account keys list --account-name stenervisiong2tfstate -g rg-FHeuze2023_cours-projet-eadl
-> (AuthorizationFailed) ... does not have authorization to perform action 'Microsoft.Storage/storageAccounts/listKeys/action'

Florian a ouvert l'acces nominativement : Devops a la portee du compte +
Reader sur le groupe. Ensuite : stored access policy depot-archive (cwl,
HTTPS, expiration 2026-10-05) posee, jeton SAS genere.

Le conteneur n'existait pas

#223 (le #69) a ete mergee mais jamais terraform apply -- le conteneur
archive n'existait que dans le code. Applique partiellement (import du compte +
creation du conteneur, apply -target). L'alerte de capacite et la politique
de retention de #69 ne sont applicables par personne
: le role Devops n'a ni
Microsoft.Insights/metricAlerts/write ni managementPolicies/write. A traiter
sur #223/#69.

Critere 3 : SOPS/age -> ansible-vault (a acter)

Je propose d'ecarter SOPS + age au profit du coffre ansible-vault existant :

SOPS + age ansible-vault (retenu)
Deja sur le projet non, #70 serait le premier oui, group_vars/all/vault.yml commite chiffre
Consommateur -- rale backup (#71), natif
Cle une par personne passphrase partagee (modele actuel du projet)
Outillage +1 outil 0

Pour un seul jeton, le second outil ne se justifie pas. Le jeton rejoint
vault_sas_archive_depot dans vault.yml. Si quelqu'un tient au critere
d'origine, on en discute -- sinon je considere le critere 3 amende.

Suite

PR #239 (brouillon). Reste : renseigner le jeton dans vault.yml, jouer la
recette (upload OK / download refuse), #71 pour la consommation.

**Noeud de droits, resolu, et un ecart a acter.** ## Les criteres 1 et 2 : stored access policy + SAS de service Faisables, mais pas avec mes droits initiaux. Le role `Devops-cours-projet-eadl` **porte** `Microsoft.Storage/storageAccounts/listkeys/action` -- mais il est attribue a chaque membre **a la portee de son seul groupe de ressources**. Le compte `stenervisiong2tfstate` est dans `rg-FHeuze2023_cours-projet-eadl`, ou je n'avais rien : ``` az storage account keys list --account-name stenervisiong2tfstate -g rg-FHeuze2023_cours-projet-eadl -> (AuthorizationFailed) ... does not have authorization to perform action 'Microsoft.Storage/storageAccounts/listKeys/action' ``` Florian a ouvert l'acces nominativement : `Devops` a la portee du compte + `Reader` sur le groupe. Ensuite : stored access policy `depot-archive` (`cwl`, HTTPS, expiration 2026-10-05) posee, jeton SAS genere. ## Le conteneur n'existait pas #223 (le #69) a ete mergee mais **jamais `terraform apply`** -- le conteneur `archive` n'existait que dans le code. Applique partiellement (import du compte + creation du conteneur, `apply -target`). **L'alerte de capacite et la politique de retention de #69 ne sont applicables par personne** : le role `Devops` n'a ni `Microsoft.Insights/metricAlerts/write` ni `managementPolicies/write`. A traiter sur #223/#69. ## Critere 3 : SOPS/age -> ansible-vault (a acter) Je propose d'ecarter SOPS + `age` au profit du coffre `ansible-vault` existant : | | SOPS + age | ansible-vault (retenu) | |---|---|---| | Deja sur le projet | non, #70 serait le premier | oui, `group_vars/all/vault.yml` commite chiffre | | Consommateur | -- | rale `backup` (#71), natif | | Cle | une par personne | passphrase partagee (modele actuel du projet) | | Outillage | +1 outil | 0 | Pour **un seul jeton**, le second outil ne se justifie pas. Le jeton rejoint `vault_sas_archive_depot` dans `vault.yml`. Si quelqu'un tient au critere d'origine, on en discute -- sinon je considere le critere 3 amende. ## Suite PR #239 (brouillon). Reste : renseigner le jeton dans `vault.yml`, jouer la recette (upload OK / download refuse), #71 pour la consommation.
Member

Recette -- ecriture autorisee, lecture refusee

Jouee le 09/09/2026 avec le jeton SAS si=depot-archive (adosse a la stored
access policy, permissions cwl). Test direct en HTTP sur le blob, sans passer
par l'auto-detection d'auth de az storage :

PUT  archive/verif/probe2.txt        -> HTTP 201            (permission w/c)
GET  archive/verif/probe2.txt        -> HTTP 403            (pas de r)
     <Error><Code>AuthorizationPermissionMismatch</Code>
     <Message>This request is not authorized to perform this operation using this permission.</Message>
LIST archive?comp=list               -> HTTP 200            (permission l)
     Name>verif/probe.txt  Name>verif/probe2.txt

az storage blob upload via le jeton reussit aussi (etag, lastModified,
version_id renvoyes). Les blobs verif/* ont ete supprimes apres coup avec la
cle de compte.

Ecriture + liste OK, lecture refusee : conforme au critere de recette.

Etat de #70

Livrable Etat
Stored access policy depot-archive pose (Azure)
Jeton SAS cwl HTTPS exp. 2026-10-05 genere
Jeton dans vault.yml (ansible-vault, critere 3 amende) vault_sas_archive_depot, commit 7b78f28
docs/runbooks/secrets.md ecrit
Recette ci-dessus

PR #239, prete a relire. Consommation cote serveur = #71.

## Recette -- ecriture autorisee, lecture refusee Jouee le 09/09/2026 avec le jeton SAS `si=depot-archive` (adosse a la stored access policy, permissions `cwl`). Test direct en HTTP sur le blob, sans passer par l'auto-detection d'auth de `az storage` : ``` PUT archive/verif/probe2.txt -> HTTP 201 (permission w/c) GET archive/verif/probe2.txt -> HTTP 403 (pas de r) <Error><Code>AuthorizationPermissionMismatch</Code> <Message>This request is not authorized to perform this operation using this permission.</Message> LIST archive?comp=list -> HTTP 200 (permission l) Name>verif/probe.txt Name>verif/probe2.txt ``` `az storage blob upload` via le jeton reussit aussi (etag, lastModified, version_id renvoyes). Les blobs `verif/*` ont ete supprimes apres coup avec la cle de compte. Ecriture + liste OK, lecture refusee : conforme au critere de recette. ## Etat de #70 | Livrable | Etat | |---|---| | Stored access policy `depot-archive` | pose (Azure) | | Jeton SAS `cwl` HTTPS exp. 2026-10-05 | genere | | Jeton dans `vault.yml` (ansible-vault, critere 3 amende) | `vault_sas_archive_depot`, commit 7b78f28 | | `docs/runbooks/secrets.md` | ecrit | | Recette | ci-dessus | PR #239, prete a relire. Consommation cote serveur = #71.
Member

Ok pour le critère 3

Ok pour le critère 3
Member

Precision de nommage : le conteneur s'appelle archive, pas daily-archive comme l'ecrit le critere 1. C'est le nom reel depuis le #43 (infra/terraform/variables.tf, nom_conteneur_archive par defaut archive). Le critere 1 est tenu, la stored access policy depot-archive porte bien sur ce conteneur.

Precision de nommage : le conteneur s'appelle **`archive`**, pas `daily-archive` comme l'ecrit le critere 1. C'est le nom reel depuis le #43 (`infra/terraform/variables.tf`, `nom_conteneur_archive` par defaut `archive`). Le critere 1 est tenu, la stored access policy `depot-archive` porte bien sur ce conteneur.
Sign in to join this conversation.
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
2026-09-11
Dependencies

No dependencies set

Reference
g2/enervision#70
No description provided.