Que fait secretgate — pare-feu local de secrets pour agents de codage ?
Un credential ne doit jamais voyager vers une API LLM. secretgate l'applique localement,
avec un moteur déterministe (node scripts/secretgate.mjs, pas de npm install, pas de
clés) : 221 règles converties depuis gitleaks + portes d'entropie + cartes vérifiées par Luhn.
Lorsque l'API de hook de l'agent permet la réécriture, les secrets sont masqués par des
placeholders stables et restaurés localement lorsque l'agent les réécrit
(redact-and-restore) ; lorsqu'elle ne permet que le blocage (invites sur Claude
Code/Codex), l'invite est bloquée avec une copie masquée à renvoyer.
Activation → installation (à faire en premier lorsque la compétence se déclenche)
Lorsque cette compétence s'active (l'utilisateur demande de protéger les secrets / installer secretgate / configurer le pare-feu), exécutez le diagnostic, puis branchez ce qui n'est pas encore branché. secretgate est une compétence, pas un paquet npm — vous exécutez son propre bundle :
node scripts/secretgate.mjs status # ce qui est déjà branché
node scripts/secretgate.mjs install --claude-code # hooks + permissions.deny dans ~/.claude/settings.json
node scripts/secretgate.mjs install --codex # ~/.codex/hooks.json + [features] hooks = true
node scripts/secretgate.mjs install --opencode # plugin autonome dans ~/.config/opencode/plugin/
node scripts/secretgate.mjs install --all # les trois
--project limite l'installation de Claude Code à ./.claude/settings.json.
install copie une copie du bundle sous ~/.secretgate/bin/ et branche
l'agent pour APPELER celui-ci, donc il continue de fonctionner après l'éviction du cache de la compétence. Dites toujours à l'utilisateur de REDÉMARRER la session de l'agent ensuite — les hooks se chargent au démarrage.
Une fois branché, le masquage est automatique et déterministe (c'est le hook qui le fait, pas vous).
Commandes
| Commande | Ce qu'elle fait |
|---|---|
status | Diagnostic : branchement par agent, moteur, santé du coffre-fort, limitations |
| `scan <fichier | dossier |
pipe | stdin -> stdout avec les secrets masqués par des placeholders |
allow <valeur> / allow --rule <id> / allow --path <glob> | Liste blanche (valeurs stockées en SHA-256, jamais en clair) |
vault list / vault clear | Inspecter les correspondances de placeholders (ne montre jamais les secrets) |
uninstall --<agent> | Supprimer exactement ce que install a ajouté |
Comment fonctionne la protection (à expliquer à l'utilisateur si demandé)
- Invites : Claude Code/Codex → bloquées avec une copie masquée (ajouter
[allow-secret]pour contourner une fois). OpenCode → masquée silencieusement sur place. - Lectures de fichiers :
.env*, clés,~/.aws,~/.ssh… sont refusées directement (.env.example/.sample/.templaterestent lisibles). La valeur n'entre jamais dans le modèle. - Sorties d'outils/bash : masquées en placeholders
SECRETGATE_<hash>(Claude Code + OpenCode ; Codex ne peut pas encore réécrire la sortie). - Restauration : lorsque l'agent écrit un placeholder dans un fichier (Write/Edit),
la VRAIE valeur arrive sur le disque. La restauration bash est DÉSACTIVÉE par défaut
(protection contre l'exfiltration par injection d'invite) — activez-la avec
restoreBash: truedans~/.secretgate/config.json. - Appels d'outils propres : le hook pré-utilisation d'outil de Claude Code répond
avec un JSON minimal (
{}, sans décision = flux d'autorisation normal) au lieu d'un stdout vide. Une sortie de hook vide déclenche un bogue de Claude Code (anthropics/claude-code#77782) qui force une demande d'autorisation interactive à chaque appel d'outil correspondant, même en mode automatique — et la valeur de décision"defer"documentée est rejetée par Claude Code <= 2.1.212, donc{}est l'abstention qui fonctionne partout.
NON couvert (soyez honnête avec l'utilisateur)
- Les mentions
@filede Claude Code incluent du contenu en ligne sans déclencher les hooks d'outil (les règles permissions.deny sont la seule couverture là). - Les exécutions non interactives de Codex (
codex exec) — bogue amont, les hooks ne se déclenchent pas. - Images/captures d'écran/presse-papier, trafic d'outil MCP, et tout ce qui est déjà dans la conversation avant l'installation.
- Si un processus de hook est tué/expire, l'agent poursuit (fail-open côté agent) ; secretgate lui-même échoue en FERMÉ sur ses propres erreurs pour les pré-événements.
- Une invite bloquée est renvoyée localement par Claude Code (
Original prompt:dans le terminal et dans leresultJSON declaude -p) — l'API ne la voit jamais, mais traitez la sortie headless canalisée comme sensible.
Faux positifs
Privilégiez le correctif le plus étroit : # pragma: allowlist secret en ligne
(ou gitleaks:allow) sur la ligne → allow <valeur> (hachée) → allow --path <glob> → allow --rule <id> (en dernier recours). Un projet peut valider des
entrées supplémentaires de liste blanche dans .secretgate.json ({"allowlist": {"paths": […]}}).