[Coffre Secrets] Phase 1b — API /api/coffres, autorisations, octrois et distribution #18

Open
opened 2026-10-27 21:36:20 -04:00 by bruno · 0 comments
Owner

Contexte : spec « Coffre de secrets ObsiGate » §7, §10, §11. Dépend de l'issue Phase 1a (chiffrement/store).

Périmètre :

  • Nouveau routeur backend/routers/coffres.py, monté dans backend/main.py à côté de config_router, JAMAIS dans backend/routers/vaults.py (frontière = critère d'acceptation).
  • Routes : GET /api/coffres ; POST /api/coffres ; GET/POST /api/coffres/{slug}/secrets ; POST /api/coffres/{slug}/secrets/{nom}/rotation ; DELETE /api/coffres/{slug}/secrets/{nom} ; GET/POST /api/coffres/{slug}/octrois ; DELETE /api/coffres/octrois/{id} ; GET /api/coffres/{slug}/journal ; POST /api/coffres/distribuer.
  • Règle d'or : toutes les lectures renvoient des métadonnées seules (has_value, version, dates, octrois_actifs), jamais valeur, fragment ou texte chiffré exploitable.
  • Distribution = seul endpoint rendant une valeur : jeton consommateur vérifié par jti/statut (jamais la session utilisateur), octroi actif couvrant la référence canonique coffre:/, contexte obligatoire (type + id d'opération), erreurs distinctes 403 octroi_absent / octroi_revoque, 410 secret_expire, 503 kek_absente. Interdits contractuels côté consommateur : persistance, journalisation, cache disque, renvoi au LLM ou à un client mobile.
  • Autorisations (matrice spec §6) : propriétaire seul sur son coffre personnel ; admin = coffres d'instance + consommateurs + KEK, jamais le coffre personnel d'autrui ; Home jamais couvert par l'ACL « * » (backend/auth/middleware.py check_vault_access). Contrôle serveur systématique à chaque requête, jamais confiance à l'UI ; refus des valeurs ressemblant à un secret dans les champs de métadonnées (note, description) ; limites de taille ; noms par regex stricte.
  • Audit : chaque événement (création, rotation, octroi, révocation, distribution réussie/refusée) dans data/audit.log via backend/audit.py, sans valeur ni texte chiffré.
  • AUCUN outil MCP de lecture de secret : la distribution est serveur-à-serveur, hors boucle LLM.

Hors périmètre : UI (issue Phase 1c), intégrations Spark/TikTak/Flowdeck (issues Phase 3/4).

Critères d'acceptation :

  • Chaque ligne de la matrice d'autorisation testée, y compris admin contre coffre personnel d'autrui et ACL « * ».
  • Contexte manquant refusé, octroi révoqué refusé au prochain appel, expiration respectée, audit complet sans valeur.
Contexte : spec « Coffre de secrets ObsiGate » §7, §10, §11. Dépend de l'issue Phase 1a (chiffrement/store). Périmètre : - Nouveau routeur backend/routers/coffres.py, monté dans backend/main.py à côté de config_router, JAMAIS dans backend/routers/vaults.py (frontière = critère d'acceptation). - Routes : GET /api/coffres ; POST /api/coffres ; GET/POST /api/coffres/{slug}/secrets ; POST /api/coffres/{slug}/secrets/{nom}/rotation ; DELETE /api/coffres/{slug}/secrets/{nom} ; GET/POST /api/coffres/{slug}/octrois ; DELETE /api/coffres/octrois/{id} ; GET /api/coffres/{slug}/journal ; POST /api/coffres/distribuer. - Règle d'or : toutes les lectures renvoient des métadonnées seules (has_value, version, dates, octrois_actifs), jamais valeur, fragment ou texte chiffré exploitable. - Distribution = seul endpoint rendant une valeur : jeton consommateur vérifié par jti/statut (jamais la session utilisateur), octroi actif couvrant la référence canonique coffre:<slug>/<nom>, contexte obligatoire (type + id d'opération), erreurs distinctes 403 octroi_absent / octroi_revoque, 410 secret_expire, 503 kek_absente. Interdits contractuels côté consommateur : persistance, journalisation, cache disque, renvoi au LLM ou à un client mobile. - Autorisations (matrice spec §6) : propriétaire seul sur son coffre personnel ; admin = coffres d'instance + consommateurs + KEK, jamais le coffre personnel d'autrui ; Home jamais couvert par l'ACL « * » (backend/auth/middleware.py check_vault_access). Contrôle serveur systématique à chaque requête, jamais confiance à l'UI ; refus des valeurs ressemblant à un secret dans les champs de métadonnées (note, description) ; limites de taille ; noms par regex stricte. - Audit : chaque événement (création, rotation, octroi, révocation, distribution réussie/refusée) dans data/audit.log via backend/audit.py, sans valeur ni texte chiffré. - AUCUN outil MCP de lecture de secret : la distribution est serveur-à-serveur, hors boucle LLM. Hors périmètre : UI (issue Phase 1c), intégrations Spark/TikTak/Flowdeck (issues Phase 3/4). Critères d'acceptation : - Chaque ligne de la matrice d'autorisation testée, y compris admin contre coffre personnel d'autrui et ACL « * ». - Contexte manquant refusé, octroi révoqué refusé au prochain appel, expiration respectée, audit complet sans valeur.
bruno added the kanban:todo label 2026-10-27 21:36:20 -04:00
bruno added kanban:review and removed kanban:todo labels 2026-10-27 21:55:04 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Projets/ObsiGate#18