runbook: inventaire rotation secrets 18/07 + anomalies inter-spheres
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
# Rotation des secrets — inventaire et plan (établi 18/07/2026, à exécuter au retour)
|
||||
|
||||
## FENÊTRE D'EXÉCUTION
|
||||
NAS en arrêt programmé **16:30 → 01:30** (coupures Sfax). Toute session du soir est impossible.
|
||||
**Créneau utile : 01:30–16:30**, matinée de préférence. Prévoir 45–60 min.
|
||||
|
||||
---
|
||||
|
||||
## A. ROTATIONS OBLIGATOIRES (secrets exposés en clair le 18/07/2026)
|
||||
|
||||
### A1. Clé provider OpenCode — PRIORITÉ 1
|
||||
Exposée dans un traceback de session. **C'est la clé qui porte le budget 10 $/mois.**
|
||||
Portée réelle (vérifiée par empreinte SHA-256, valeurs jamais affichées) — la MÊME valeur sert à :
|
||||
| Emplacement | Variable / champ |
|
||||
|---|---|
|
||||
| Bifrost config.db | provider `opencode`, clé `opencode-1` |
|
||||
| `/volume1/docker/hermes-platform/.env` | `BIFROST_OPENCODE_KEY` |
|
||||
| container `family-help` | `OPENCODE_API_KEY` (appel direct, hors Bifrost) |
|
||||
|
||||
Procédure : générer la nouvelle clé sur OpenCode → mettre à jour `.env` → mettre à jour la clé
|
||||
provider dans Bifrost (UI ou config.json au boot, cf. piège de persistance) → recréer family-help
|
||||
→ **révoquer l'ancienne** → tester un appel par Bifrost et un appel family-help.
|
||||
|
||||
### A2. Token Cloudflare Workers AI — PRIORITÉ 1
|
||||
Dans `/volume1/docker/redaction-pro/nginx.conf`, bloc `location /api/cf/` (en-tête Authorization).
|
||||
Backup existant : `nginx.conf.bak_vk_20260718` — **contient l'ancien token, à supprimer après rotation.**
|
||||
Procédure : nouveau token côté Cloudflare → éditer nginx.conf (via container alpine, cf. piège
|
||||
permissions) → `docker restart redaction-pro` → tester → révoquer l'ancien → purger le .bak.
|
||||
|
||||
---
|
||||
|
||||
## B. ANOMALIES DÉCOUVERTES — à corriger pendant la même fenêtre
|
||||
|
||||
### B1. Secrets partagés entre sphères (violation de la règle d'étanchéité)
|
||||
| Container | Variable | Porte en réalité la valeur de |
|
||||
|---|---|---|
|
||||
| hermes-agent-perso | `TRILIUM_TOKEN_PERSO` | `TRILIUM_TOKEN_TT` (sphère TT !) |
|
||||
| hermes-agent-perso | `PAPERLESS_TOKEN_PERSO` | `PAPERLESS_TOKEN_NYORA` |
|
||||
| gsparc-mezzouna-api | `BASEROW_TOKEN` | `BASEROW_TOKEN_NYORA` |
|
||||
| gsparc-mezzouna-api | `VISION_API_KEY` | `HERMES_TT_OPENCODE_KEY` |
|
||||
| family-help | `TELEGRAM_BOT_TOKEN` | `HERMES_PERSO_TELEGRAM_TOKEN` |
|
||||
Conséquence : la sphère perso détient un accès TT. Générer des tokens distincts par sphère.
|
||||
|
||||
### B2. Redondance interne (non bloquant, à assainir)
|
||||
Dans les 3 Hermes, `OPENAI_API_KEY`, `NVIDIA_API_KEY` et `CUSTOM_API_KEY` pointent tous sur la même
|
||||
valeur `HERMES_<sphère>_NVIDIA_KEY`. Trois noms, un secret : une rotation manquée en laisse deux vivants.
|
||||
|
||||
### B3. Permissions
|
||||
`/volume1/docker/hermes-platform/.env` est en **777**. Cible 640 root:users — vérifier d'abord
|
||||
quels containers le lisent et sous quel uid (1026/100) avant de restreindre.
|
||||
|
||||
### B4. Token Gitea en clair dans un remote git
|
||||
Dépôt `nabil-brain` : URL remote de la forme `https://bolbol:<token>@gitea.bolbol.tn`.
|
||||
Roter le token et réécrire le remote (credential helper ou SSH).
|
||||
|
||||
---
|
||||
|
||||
## C. À NE PAS TOUCHER
|
||||
Les 13 clés virtuelles Bifrost `vk-*` créées le 18/07 ne sont pas compromises (jamais affichées,
|
||||
vérification par empreinte uniquement). Aucune rotation nécessaire.
|
||||
|
||||
---
|
||||
|
||||
## D. ORDRE D'EXÉCUTION RECOMMANDÉ
|
||||
1. A1 OpenCode (budget en jeu) — 2. A2 Cloudflare — 3. Vérifier logs Bifrost : plus aucun 401
|
||||
nouveau lié à la rotation — 4. B1 séparation des sphères — 5. B3 permissions — 6. B4 remote git.
|
||||
Après chaque rotation : tester AVANT de révoquer l'ancienne clé, et ne jamais afficher une valeur
|
||||
(vérification par longueur ou empreinte).
|
||||
Reference in New Issue
Block a user