Sécuriser les secrets et clés API avec SecretRef dans OpenClaw
Comment utiliser SecretRef pour sortir les clés API du plaintext dans OpenClaw, auditer les résidus sensibles et garder une config propre.
Vendredi 17 avril 2026 — 4 min de lecture
On voit encore beaucoup d’instances OpenClaw avec des clés API laissées en clair dans openclaw.json, dans un .env trop large, ou recopiées à la main au moment d’un debug. Le problème n’est pas seulement “est-ce que quelqu’un peut lire mon fichier ?”. Le vrai risque, c’est la prolifération : une clé copiée dans un backup, un terminal, un dépôt ou un fichier généré reste une dette de sécurité très concrète.
Avec SecretRef, OpenClaw introduit une séparation utile entre la configuration et la matière secrète. Autrement dit : tu gardes dans ta config une référence vers un secret, pas le secret lui-même.
Ce que SecretRef représente exactement
Dans le code OpenClaw, un SecretRef est un objet simple avec trois champs : source, provider et id. Les sources prises en charge sont env, file et exec. En pratique, ça veut dire qu’OpenClaw peut aller chercher un secret dans une variable d’environnement, dans un fichier structuré, ou via un provider externe exécuté à la demande.
Pourquoi c’est mieux que du plaintext
Le gain n’est pas magique. Si ton host est compromis, SecretRef ne transforme pas OpenClaw en coffre-fort absolu. En revanche, il réduit fortement les surfaces de fuite courantes :
- plus besoin de laisser des
apiKeyen clair dansopenclaw.json - moins de risque de retrouver une clé dans un diff ou un copier-coller Slack/Discord
- meilleur contrôle quand plusieurs secrets vivent dans des sources différentes
- possibilité d’auditer l’état de la config sans réécrire toute la stack
OpenClaw documente d’ailleurs un flux opérateur très propre : secrets audit, puis secrets configure, puis secrets apply, puis secrets reload pour recharger le snapshot runtime sans écriture supplémentaire côté config.
L’exemple le plus simple : une clé en variable d’environnement
Si tu veux sécuriser un token Discord ou une clé provider, la forme canonique côté config ressemble à ça :
{
"source": "env",
"provider": "default",
"id": "DISCORD_BOT_TOKEN"
}
OpenClaw permet aussi de construire cette référence directement via CLI, par exemple avec openclaw config set ... --ref-provider default --ref-source env --ref-id DISCORD_BOT_TOKEN. L’intérêt est double : tu standardises le format et tu peux valider la résolvabilité avant d’écrire pour de vrai avec --dry-run.
Tout ne doit pas devenir un SecretRef
C’est un point important, et la doc officielle est très claire. SecretRef couvre uniquement les credentials fournis par l’utilisateur que l’outil ne doit ni mint ni faire tourner automatiquement. Sont supportés, par exemple, les models.providers.*.apiKey, les tokens de canaux comme channels.telegram.botToken, channels.discord.token, ou encore gateway.auth.token.
En revanche, certains champs sont explicitement hors périmètre : hooks.token, des webhooks de thread binding Discord, ou les credentials WhatsApp sérialisés en JSON. La raison donnée par OpenClaw est saine : ces surfaces relèvent de secrets rotatifs, de matériaux de session ou d’artefacts OAuth durables qui ne collent pas au modèle read-only de SecretRef.
Le vrai réflexe à adopter : auditer avant de migrer en masse
La commande la plus sous-estimée ici, c’est openclaw secrets audit --check. Elle ne sert pas juste à repérer du plaintext. Elle remonte aussi les refs non résolues, les dérives de précédence et certains résidus historiques dans les stores générés. Dit autrement : tu évites de “sécuriser” ta config sur le papier tout en laissant des traces sensibles ailleurs.
Si tu veux aller plus loin, OpenClaw précise aussi que les plans apply peuvent scrubber les résidus plaintext dans openclaw.json, auth-profiles.json, auth.json legacy et même certaines clés connues dans ~/.openclaw/.env. C’est précisément le genre de détail qui sépare une feature marketing d’une vraie surface d’hygiène opérationnelle.
Mon conseil pratique
Si tu administres une instance OpenClaw aujourd’hui, la bonne séquence n’est pas “je remplace tout d’un coup”. C’est :
- inventorier les secrets réellement présents
- migrer d’abord les credentials les plus stables (
apiKey, tokens fixes) - lancer un audit
- seulement ensuite élargir à d’autres providers
Et si tu es encore au stade du VPS ou de la première installation, ça vaut le coup de coupler cette démarche avec une base infra saine. J’avais détaillé ce point ici : Choisir et paramétrer son VPS OpenClaw de façon béton et, pour la logique de résilience côté stack, ici : OpenClaw : penser multi-provider avant la panne, pas après.
Le point à retenir
SecretRef ne remplace pas une discipline ops. Mais c’est un vrai pas vers une config OpenClaw plus propre : moins de secrets en clair, une meilleure auditabilité, et un modèle compatible avec des sources externes sérieuses.
Sources :
- OpenClaw docs — SecretRef Credential Surface : https://raw.githubusercontent.com/openclaw/openclaw/main/docs/reference/secretref-credential-surface.md
- OpenClaw docs —
openclaw config: https://raw.githubusercontent.com/openclaw/openclaw/main/docs/cli/config.md - OpenClaw docs —
openclaw secrets: https://raw.githubusercontent.com/openclaw/openclaw/main/docs/cli/secrets.md - OpenClaw source —
src/config/types.secrets.ts: https://raw.githubusercontent.com/openclaw/openclaw/main/src/config/types.secrets.ts