secretgate — lokale Secrets-Firewall für Coding-Agenten
Ein Credential darf niemals zu einer LLM-API gelangen. secretgate setzt das lokal durch,
mit einer deterministischen Engine (node scripts/secretgate.mjs, kein npm install, keine
Schlüssel): 221 Regeln, konvertiert von gitleaks + Entropie-Gates + Luhn-geprüfte Karten.
Wo die Hook-API des Agenten das Umschreiben erlaubt, werden Secrets auf stabile
Platzhalter redacted und lokal wiederhergestellt, wenn der Agent sie zurückschreibt
(redact-and-restore); wo nur Blocken erlaubt ist (Prompts in Claude Code/Codex), wird der
Prompt mit einer redacted Kopie blockiert, um ihn erneut zu senden.
Aktivierung → Installation (dies zuerst tun, wenn der Skill ausgelöst wird)
Wenn dieser Skill aktiviert wird (der Nutzer bittet um Secrets-Schutz / secretgate-Installation / Einrichtung der Firewall), führen Sie den Doctor aus und verkabeln Sie alles, was noch nicht verkabelt ist. secretgate ist ein Skill, kein npm-Paket — Sie führen sein eigenes Bundle aus:
node scripts/secretgate.mjs status # was bereits verkabelt ist
node scripts/secretgate.mjs install --claude-code # hooks + permissions.deny in ~/.claude/settings.json
node scripts/secretgate.mjs install --codex # ~/.codex/hooks.json + [features] hooks = true
node scripts/secretgate.mjs install --opencode # eigenständiges Plugin in ~/.config/opencode/plugin/
node scripts/secretgate.mjs install --all # alle drei
--project beschränkt die Claude-Code-Installation auf ./.claude/settings.json.
install sichert eine Kopie des Bundles unter ~/.secretgate/bin/ und verdrahtet den
Agenten, DIESE aufzurufen, sodass es auch nach dem Löschen des Skill-Caches funktioniert.
Weisen Sie den Nutzer stets an, die Agenten-Sitzung danach NEU ZU STARTEN — Hooks werden
beim Start geladen. Sobald verkabelt, erfolgt die Redaktion automatisch und deterministisch
(der Hook erledigt das, nicht Sie).
Befehle
| Befehl | Was er tut |
|---|---|
status | Doctor: Verkabelung pro Agent, Engine, Vault-Health, Einschränkungen |
| `scan <Datei | Verz. |
pipe | stdin -> stdout mit auf Platzhalter redacted Secrets |
allow <Wert> / allow --rule <ID> / allow --path <Glob> | Whitelist (Werte als SHA-256 gespeichert, nie im Klartext) |
vault list / vault clear | Platzhalter-Zuordnungen anzeigen (zeigt niemals Secrets) |
uninstall --<Agent> | Entfernt genau das, was install hinzugefügt hat |
Wie der Schutz funktioniert (dem Nutzer auf Nachfrage erklären)
- Prompts: Claude Code/Codex → blockiert mit einer redacted Kopie
(
[allow-secret]hinzufügen, um einmal zu umgehen). OpenCode → stillschweigend an Ort und Stelle redacted. - Dateizugriffe:
.env*, Schlüssel,~/.aws,~/.ssh… werden direkt verweigert (.env.example/.sample/.templatebleiben lesbar). Der Wert gelangt nie ins Modell. - Tool/Bash-Ausgaben: redacted auf
SECRETGATE_<Hash>-Platzhalter (Claude Code + OpenCode; Codex kann Ausgaben noch nicht umschreiben). - Wiederherstellung: Wenn der Agent einen Platzhalter in eine Datei schreibt
(Write/Edit), landet der ECHTE Wert auf der Platte. Bash-Wiederherstellung ist
standardmäßig AUS (Prompt-Injection-Exfiltrationsschutz) — aktivieren mit
restoreBash: truein~/.secretgate/config.json. - Saubere Tool-Aufrufe: Der Claude-Code-Pre-Tool-Use-Hook antwortet mit minimalem JSON
(
{}, entscheidungsfrei = normaler Berechtigungsablauf) anstelle von leerem stdout. Eine leere Hook-Ausgabe löst einen Claude-Code-Bug (anthropics/claude-code#77782) aus, der bei jedem passenden Tool-Aufruf eine interaktive Berechtigungsabfrage erzwingt, selbst im Automatikmodus — und der dokumentierte Entscheidungswert"defer"wird von Claude Code <= 2.1.212 abgelehnt, daher ist{}die Enthaltung, die überall funktioniert.
NICHT abgedeckt (seien Sie ehrlich zum Nutzer)
- Claude Code
@fileErwähnungen von Inline-Inhalten ohne Auslösen von Tool-Hooks (permissions.deny-Regeln sind dort der einzige Schutz). - Codex nicht-interaktive Läufe (
codex exec) — Upstream-Bug, Hooks werden nicht ausgelöst. - Bilder/Screenshots/Zwischenablage, MCP-Tool-Verkehr und alles, was bereits vor der Installation im Gespräch war.
- Wenn ein Hook-Prozess gekillt wird/zeitlich ausläuft, fährt der Agent fort (agentenseitiges Fail-Open); secretgate selbst schlägt bei eigenen Fehlern für Pre-Events GESCHLOSSEN fehl.
- Ein blockierter Prompt wird von Claude Code lokal zurückgespiegelt (
Original prompt:im Terminal und imclaude -pJSONresult) — die API sieht ihn nie, aber behandeln Sie gepipte, kopflose Ausgaben als sensibel.
False Positives
Bevorzugen Sie die engste Korrektur: inline # pragma: allowlist secret (oder
gitleaks:allow) in der Zeile → allow <Wert> (gehasht) → allow --path <Glob> → allow --rule <ID> (letztes Mittel). Ein Projekt kann zusätzliche
Whitelist-Einträge in .secretgate.json festschreiben ({"allowlist": {"paths": […]}}).