Ajout B5 a common/rotation-secrets-inventaire.md, redige selon la doctrine A1 (empreinte sha256:bbd43b3e, valeur JAMAIS en clair). Sweep unique grep -rlI sur /volume1/docker (08/08/2026) = ~30 fichiers : ~10 remotes git (.git/config), 7 .env desactives/backups, et DEJA en clair dans le repo nas-runbooks lui-meme (HEBERGEMENT-SITES-STATIQUES.md, n8n-skills-officiels.md, tap-gitea-hermes-skills.md, telegram-flood-control-...gitea-deploy-token.md) + context-hub/MEMORY/log. Liveness NON re-verifiee (172.17.0.1 injoignable hors NAS, test Tailscale non concluant) -> traiter comme potentiellement vivant. Remediation (rotation + reecriture remotes + scrub historique) = session dediee, hors perimetre du chantier message_id. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5.7 KiB
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).
B5. Mot de passe legacy bolbol (famille 2L2u519w*) largement embarqué en clair — git remotes, .env, docs (ajout 08/08/2026)
Instance non répertoriée de la famille 2L2u519w* (rotation en attente, cf. incident sudo Best0f 07/2026).
Mot de passe legacy bolbol, suffixe service gitea (empreinte sha256 : bbd43b3e, valeur non affichée
conformément à A1). Liveness NON re-vérifiée le 08/08/2026 (adresse interne 172.17.0.1 injoignable hors
NAS ; test via Tailscale non concluant) → traiter comme potentiellement vivant tant que non confirmé mort,
d'autant qu'il est embarqué dans de nombreux remotes actifs.
Portée réelle — sweep unique grep -rlI sur /volume1/docker (08/08/2026, ~30 fichiers) :
- ~10 remotes git (mot de passe dans l'URL de
.git/config) :nyora-notes(workspace hermes-nyora),hermes-perso,hermes-platform/.git.bak,family-help,bifrost-proxy,panda-dashboard,nyora-doc-api,context-hub,_archive/rayhan-erp,nas-runbooks.STALE-*. - 7 fichiers
.env(désactivés / backups) :hermes-tt/.env.disabled,hermes-nyora/.env.disabled,hermes-perso/.env.disabled, 2×hermes-nyora/.env.bak-*, 2×_rotation-backup-20260709/*/.env. - En clair DANS le repo
nas-runbookslui-même (déjà commité) :common/HEBERGEMENT-SITES-STATIQUES.md,common/n8n-skills-officiels.md,common/tap-gitea-hermes-skills.md,common/telegram-flood-control-overflow-split-et-gitea-deploy-token.md. Aussi : context-hub (CLAUDE.md,AGENTS.md, walkthroughs),hermes-nyora/.../MEMORY.md, untirith/log.jsonl. - Hors
/volume1/docker(non couvert par le sweep) :/tmp/nas-runbooks-work/.git/configsur l'hôte NAS.
Le push nas-runbooks du 08/08 a été fait via le token GITEA_TOKEN_TT (bolbol) de
/volume1/docker/hermes-platform/.env, sans jamais ré-embarquer ce mot de passe.
Action (session de rotation dédiée requise — hors périmètre du chantier message_id 08/08) : roter le mot de
passe famille 2L2u519w* ; réécrire tous les remotes sans credential embarqué (token via helper) ; purger les
.env.bak/.env.disabled et le clone STALE ; scrubber l'historique des runbooks/docs contenant la valeur
en clair (git-filter-repo / BFG).
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É
- 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).