Communitygithub.com

secretgate — pare-feu local de secrets pour agents de codage

Pare-feu local de secrets pour agents de codage — supprime les credentials des invites, lectures de fichiers et sorties d'outils avant qu'ils n'atteignent le LLM (Claude Code, Codex, OpenCode). Sans proxy, sans npm, hooks déterministes.

Qu'est-ce que secretgate — pare-feu local de secrets pour agents de codage ?

secretgate est un pare-feu de secrets local conçu pour les agents de codage comme Claude Code, Codex et OpenCode. Il intercepte et bloque les credentials (clés API, tokens, mots de passe) au niveau des hooks, avant qu'ils ne soient envoyés à un LLM. Le moteur déterministe intègre 221 règles issues de gitleaks, des vérifications d'entropie et des numéros de carte bancaire validés par Luhn. Il fonctionne sans npm install, sans clés et sans proxy. Selon l'API de hook de l'agent, il peut soit masquer les secrets par des placeholders stables et les restaurer localement lors de l'écriture (OpenCode), soit bloquer l'invite avec une copie masquée à renvoyer (Claude Code/Codex). L'installation se fait via une commande unique qui copie le bundle vers `~/.secretgate/bin/` et configure les hooks de l'agent. Après installation, la protection est automatique et déterministe. secretgate gère également les listes blanches, l'inspection du coffre-fort, et offre des commandes pour scanner des fichiers ou des flux. Il est important de noter certaines limitations, comme l'absence de protection pour les mentions `@file` de Claude Code ou les exécutions non interactives de Codex.

Compatible avec✓Claude Code✓Codex CLI~Cursor✓OpenCode
npx skills add maxgfr/secretgate

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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

CommandeCe qu'elle fait
statusDiagnostic : branchement par agent, moteur, santé du coffre-fort, limitations
`scan <fichierdossier
pipestdin -> 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 clearInspecter 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/.template restent 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: true dans ~/.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 @file de 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 le result JSON de claude -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": […]}}).

Skills associés