Arrête de bourrer tes API keys dans .env : intègre le nouveau coffre-fort externe de Hermes v0.19 en 5 étapes

Combien de clés API traînent actuellement dans ton fichier ~/.hermes/.env ? OpenAI, Anthropic, GitHub, Telegram, Discord, Cloudflare, AWS — à chaque nouvelle intégration, tu colles une nouvelle ligne SOME_KEY=sk-.... Puis tu vérifies trois fois .gitignore avant de commit, tu t’envoies le fichier par Slack en changeant de machine, et tu le recopies dans les secrets CI. Pire, chaque membre de l’équipe garde une copie locale, donc personne ne sait quelle version est la bonne, qui a changé quoi, ou si une clé a fuité.
Hermes Agent v0.19.0 transforme ce bazar en une abstraction propre : SecretSource. Il permet à Hermes de lire les clés API depuis un coffre-fort externe au démarrage, avec un support natif pour Bitwarden Secrets Manager et 1Password. Tu gardes un seul token d’amorçage dans .env et tu laisses le vault gérer le reste. Les clés n’ont plus besoin de vivre en clair dans .env.
Cet article te propose une migration pratique en 5 étapes. Pas besoin de tout refactorer d’un coup — tu peux d’abord déplacer les clés les plus sensibles tout en gardant un chemin de rollback ouvert.
Pour le récapitulatif complet de la v0.19.0, consulte nos notes de version v0.19.0 et le guide des combos de skills.
Pourquoi .env n’est pas une solution pérenne
.env est parfait pour les prototypes, mais il montre ses limites dès que Hermes se connecte à une douzaine d’outils et de services :
- Risque de propagation. À chaque fois que tu copies
.envsur une autre machine, un conteneur ou un environnement CI, tu crées une nouvelle surface d’attaque. GitHub détecte chaque année des millions de secrets commités accidentellement. - Pas d’audit.
.envne te dit pas qui a changé quelle clé, ni quand. Une clé peut être rotatée et le reste de l’équipe ne s’en aperçoit que quand quelque chose tombe en panne. - Rotation douloureuse. Une rotation trimestrielle des tokens signifie modifier N fichiers et N points d’injection de variables d’environnement, puis espérer qu’on n’a rien oublié.
Un coffre-fort externe ne se contente pas de « cacher du texte en clair » : il transforme les secrets en ressources contrôlées, auditables et centralisées. SecretSource de Hermes v0.19.0 connecte cette idée directement au chemin de démarrage de l’agent, qui lit alors les valeurs du vault comme de simples variables d’environnement.
Ce que SecretSource de Hermes v0.19.0 peut faire
Selon les notes de version v0.19.0 et la documentation officielle Secrets, l’interface SecretSource offre :
- Plusieurs vaults à la fois. Bitwarden Secrets Manager et 1Password peuvent être activés simultanément. Une source générique
commandpermet aussi d’adapter n’importe quel vault qui imprime des lignesKEY=VALUE. - Précédence déterministe. Hermes résout les conflits selon une règle claire : les mappages
env:explicites (1Password, command source) battent les pulls massifs de projet (Bitwarden) ; au sein du même type, l’ordre de la liste optionnellesecrets.sourcesdécide ; les valeurs.envet shell l’emportent par défaut, sauf si une source aoverride_existing: true. - Avertissements de conflit. Si une source ultérieure fournit aussi une variable déjà revendiquée par une source antérieure, Hermes avertit au lieu de choisir silencieusement.
- Traçabilité des variables. Chaque variable injectée mémorise la source qui l’a fournie — visible dans les logs de démarrage et la commande
status. - Démarrage non bloquant. Si le vault est inaccessible ou si l’authentification échoue, Hermes affiche un avertissement d’une ligne avec la prochaine action recommandée, puis continue avec les credentials déjà présents dans
.env.
Cela signifie que tu peux écrire une configuration comme celle-ci sans mettre OPENAI_API_KEY dans .env du tout :
secrets:
onepassword:
enabled: true
env:
OPENAI_API_KEY: "op://Private/OpenAI/api key"
ANTHROPIC_API_KEY: "op://Private/Anthropic/credential"
override_existing: true
Les cinq sections suivantes montrent comment rendre cela concret.
Étape 1 : Passer à Hermes v0.19.0 et vérifier la CLI
SecretSource est une fonctionnalité de la v0.19.0, donc commence par vérifier la version :
hermes --version
Puis confirme que la sous-commande secrets existe :
hermes secrets --help
Tu devrais voir bitwarden, onepassword et d’autres helpers. Si tu es en dessous de la v0.19.0, lance le script d’installation :
# macOS / Linux / WSL2
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
# Windows (PowerShell)
iex (irm https://hermes-agent.nousresearch.com/install.ps1)
Étape 2 : Choisir un vault et s’authentifier
Hermes ne gère pas l’authentification à ta place ; il s’appuie sur le flux officiel de chaque vault. Tu dois configurer cela sur la machine où Hermes s’exécute.
Option A : Bitwarden Secrets Manager
Tu as besoin d’un compte machine dans Bitwarden Secrets Manager, pas du vault de mots de passe grand public. Le compte machine est conçu pour les charges de travail non interactives.
- Dans la web app Bitwarden, passe à Secrets Manager.
- Crée un Project (par exemple
Hermes keys). - Ajoute tes provider keys en tant que secrets. Le Nom du secret devient le nom de la variable d’environnement attendue par Hermes —
OPENAI_API_KEY,ANTHROPIC_API_KEY,TELEGRAM_BOT_TOKEN, etc. - Va dans Machine accounts → New machine account et accorde-lui un accès en lecture au projet.
- Sous Access tokens, crée un token (commence par
0., impossible à réafficher ensuite) et copie-le.
Stocke ce token dans ~/.hermes/.env sous BWS_ACCESS_TOKEN :
BWS_ACCESS_TOKEN=0.xxx...
La binaire bws est téléchargée automatiquement dans ~/.hermes/bin/ au premier besoin — pas besoin de brew, apt ni sudo.
Option B : 1Password
Installe le CLI officiel 1Password (op) et vérifie qu’il fonctionne :
op --version
op whoami
Ordinateur portable / interactif : connecte-toi avec op signin ou active l’intégration CLI dans l’application 1Password. Hermes transmettra tes variables de session au sous-processus op.
Serveur / CI / cron : crée un service account, accorde-lui un accès en lecture au vault concerné, puis stocke le token dans ~/.hermes/.env :
OP_SERVICE_ACCOUNT_TOKEN=ops_...
Note de sécurité : Le token d’amorçage (
BWS_ACCESS_TOKENouOP_SERVICE_ACCOUNT_TOKEN) est lui-même un credential de grande valeur. Garde.envhors du contrôle de version et restreins les permissions du fichier.
Étape 3 : Lancer l’assistant de configuration et configurer la source
Hermes fournit une CLI dédiée pour chaque source. L’assistant écrit dans ~/.hermes/config.yaml (ou ~/.hermes/profiles/<profile>/config.yaml si tu utilises un profil nommé).
Bitwarden
Lance l’assistant interactivement :
hermes secrets bitwarden setup
Ou en mode non interactif :
hermes secrets bitwarden setup \
--access-token "$BWS_ACCESS_TOKEN" \
--server-url https://vault.bitwarden.com \
--project-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
La configuration résultante ressemble à ceci :
secrets:
bitwarden:
enabled: true
project_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
server_url: "https://vault.bitwarden.com"
access_token_env: BWS_ACCESS_TOKEN
override_existing: true
cache_ttl_seconds: 300
1Password
Lance l’assistant :
hermes secrets onepassword setup
Ou avec un service-account token :
hermes secrets onepassword setup \
--account my.1password.com \
--token-env OP_SERVICE_ACCOUNT_TOKEN \
--token "$OP_SERVICE_ACCOUNT_TOKEN"
Puis mappe chaque variable d’environnement à une référence op:// :
hermes secrets onepassword set OPENAI_API_KEY "op://Private/OpenAI/api key"
hermes secrets onepassword set ANTHROPIC_API_KEY "op://Private/Anthropic/credential"
hermes secrets onepassword set TELEGRAM_BOT_TOKEN "op://Private/Telegram/token"
La configuration résultante :
secrets:
onepassword:
enabled: true
env:
OPENAI_API_KEY: "op://Private/OpenAI/api key"
ANTHROPIC_API_KEY: "op://Private/Anthropic/credential"
TELEGRAM_BOT_TOKEN: "op://Private/Telegram/token"
service_account_token_env: OP_SERVICE_ACCOUNT_TOKEN
override_existing: true
cache_ttl_seconds: 300
Utiliser les deux sources ensemble
Tu peux activer les deux simultanément. Contrôle l’ordre avec la liste sources :
secrets:
sources: [onepassword, bitwarden]
onepassword:
enabled: true
env:
OPENAI_API_KEY: "op://Private/OpenAI/api key"
bitwarden:
enabled: true
project_id: "..."
N’oublie pas que les sources avec mappages explicites (1Password) ont automatiquement la priorité sur les sources massives (Bitwarden), indépendamment de l’ordre. Au sein du même type, la première source gagne.
Étape 4 : Migrer les clés API en clair vers le vault
4.1 Inventorier les clés de .env
Liste les secrets actuellement utilisés par Hermes, regroupés par impact :
- Clés API de modèles :
OPENAI_API_KEY,ANTHROPIC_API_KEY,GEMINI_API_KEY, etc. - Tokens de plateformes :
TELEGRAM_BOT_TOKEN,DISCORD_BOT_TOKEN,SLACK_BOT_TOKEN - Credentials cloud :
AWS_ACCESS_KEY_ID,CLOUDFLARE_API_TOKEN,GCP_API_KEY - Outils tiers : GitHub PATs, Sentry DSNs, clés Stripe, etc.
4.2 Créer les secrets dans le vault
Bitwarden : dans le projet sélectionné, crée un secret par variable d’environnement. Le nom doit correspondre exactement à celui attendu par Hermes, par exemple OPENAI_API_KEY. Lorsque tu lances hermes secrets bitwarden sync, Hermes liste les variables qu’il peut résoudre.
1Password : crée les items et champs correspondant à tes références op://vault/item/field. Par exemple, si tu as mappé OPENAI_API_KEY vers op://Private/OpenAI/api key, tu dois créer un item nommé OpenAI dans le vault Private avec un champ api key.
Ordre de migration suggéré : déplace d’abord les clés à fort impact (Stripe, équivalents root AWS, clés principales des fournisseurs de modèles), puis les clés read-only à faible risque.
4.3 Réduire .env et créer un example.env
Une fois qu’une clé vit dans le vault, supprime-la ou commente-la dans .env. Ne garde que le token d’amorçage nécessaire à la source :
# ~/.hermes/.env
BWS_ACCESS_TOKEN=0.xxx...
# ou pour 1Password :
# OP_SERVICE_ACCOUNT_TOKEN=ops_...
Crée ensuite un example.env avec les noms de variables et des commentaires, mais sans valeurs réelles :
# example.env — les vraies valeurs sont dans le vault externe
OPENAI_API_KEY=see-vault
ANTHROPIC_API_KEY=see-vault
TELEGRAM_BOT_TOKEN=see-vault
Les nouveaux membres de l’équipe savent ainsi quelles variables sont attendues et quel vault consulter, sans que personne ne leur envoie un vrai .env.
Étape 5 : Vérifier, faire tourner et garder un chemin de rollback
5.1 Vérifier que l’intégration est active
Bitwarden :
hermes secrets bitwarden status
hermes secrets bitwarden sync # dry-run : aperçu de ce qui serait appliqué
hermes secrets bitwarden sync --apply # exporte dans le shell actuel
1Password :
hermes secrets onepassword status
hermes secrets onepassword sync # dry-run
hermes secrets onepassword sync --apply # exporte dans le shell actuel
Démarre un nouveau processus Hermes (ou un cron job, ou le service gateway) pour qu’il récupère les valeurs résolues. Tu peux confirmer la provenance dans le log de démarrage ou dans la commande status de la source.
5.2 Configurer des rappels de rotation
La plupart des vaults permettent d’ajouter un champ ou une note avec la date de rotation. Configure un rappel de 90 jours dans ton calendrier. Quand une clé de provider change, mets-la à jour uniquement dans le vault — rien d’autre. Le prochain démarrage de Hermes utilisera automatiquement la nouvelle valeur.
Si le token d’amorçage lui-même fuite ou expire, fais-le tourner sans relancer l’assistant complet :
hermes secrets bitwarden token
hermes secrets onepassword token
Ces deux commandes vérifient le token avant de l’écrire, donc une mauvaise copie ne casse pas la configuration actuelle.
5.3 Garder un chemin de rollback
Ne retire pas toutes les clés d’un coup. Une séquence plus sûre :
- Migration canari : déplace une clé non critique (par exemple une API de recherche en lecture seule) dans le vault et vérifie.
- Observation en double écriture : garde le vault et
.envpeuplés, mais activeoverride_existing: truesur la source. Observe quelques jours. - Nettoyage propre : une fois stable, supprime les vraies clés correspondantes de
.envet ne garde que le token d’amorçage.
Si quelque chose casse, le rollback le plus rapide est de désactiver la source :
hermes secrets bitwarden disable
hermes secrets onepassword disable
Hermes revient immédiatement à n’utiliser que les credentials de .env.
Pièges courants
-
Mettre de vrais secrets dans
config.yaml.config.yamlne doit contenir que des références (op://...) et des IDs de projet. Les vraies valeurs doivent rester dans le vault. -
Stocker le token d’amorçage du vault dans un
.envpartagé et le commiter.BWS_ACCESS_TOKENetOP_SERVICE_ACCOUNT_TOKENsont des tokens de grande valeur. Garde.envhors du contrôle de version et restreins les permissions du fichier. -
Penser que
.envperd automatiquement la priorité. Par défaut,.envet les exports shell l’emportent. Si une source aoverride_existing: falseet que d’anciennes clés restent dans.env, Hermes continue à utiliser les valeurs de.env. Règleoverride_existing: truequand le vault doit être la source de vérité. -
Ignorer les avertissements de conflit. Quand plusieurs sources fournissent la même variable, Hermes avertit. Ne désactive pas l’avertissement tant que tu n’as pas confirmé quelle source doit gagner, ou utilise
secrets.preserve_existingpour garder certaines variables dans.env. -
Utiliser un déverrouillage interactif sur un serveur.
op signinou les sessionsBW_SESSIONvont bien pour les ordinateurs portables, mais cron, gateway et CI devraient utiliser des service accounts ou comptes machines avec des tokens non interactifs. -
Oublier de mettre à jour
example.env. Une fois les secrets externalisés,example.envdevient la seule documentation des variables attendues. Garde-le synchronisé avec la structure réelle du vault.
Le combiner avec des approbations plus intelligentes
Sortir les clés de .env est la moitié statique de l’histoire de sécurité. La v0.19.0 active aussi par défaut les Smart Approvals : quand Hermes veut exécuter une commande marquée, un reviewer LLM indépendant l’évalue au lieu de te demander d’approuver chaque action. Combiné au coffre-fort externe, cela donne deux couches de protection :
- Sécurité statique : les secrets n’atterrissent pas en clair sur le disque, ne se propagent pas entre les machines et sont auditables.
- Sécurité dynamique : les opérations risquées reçoivent un second avis, donc un seul appel d’outil outrepassant ne peut pas exfiltrer une clé.
Résumé
SecretSource de Hermes v0.19.0 déplace la gestion des clés API de « copier-coller dans .env » à « injecter depuis un vault externe au démarrage ». Cinq étapes :
- Mets à jour vers la v0.19.0 et confirme que
hermes secretsexiste. - Authentifie-toi avec Bitwarden Secrets Manager ou 1Password, et stocke le token d’amorçage dans
.env. - Lance l’assistant et configure la source dans
config.yaml. - Migre les clés de
.envvers le vault, en ne gardant que le token d’amorçage. - Vérifie avec
status/sync, fais tourner les clés côté vault et garde un chemin de rollback.
Ton .env peut passer de dizaines de lignes de secrets à un seul token d’amorçage, tandis que Hermes continue d’obtenir chaque secret dont il a besoin au démarrage. L’onboarding des nouveaux membres n’implique plus d’envoyer des fichiers secrets, et la rotation des tokens ne signifie plus de fouiller dans une douzaine de configurations locales.
Références :