Secrets voor zelfstandige Claude-acties

Definitie

Beslismodel voor het opslaan van credentials die door een agent (Claude Code) gebruikt moeten worden zonder dat de gebruiker per actie iets doet. Maakt onderscheid tussen “gebruiker zelf typt commando’s” en “agent acteert tussen door zonder interactie”, omdat die twee verschillende credential-routes vragen.

Context

Een veelvoorkomende verwarring: de gebruiker zegt “ik wil mijn FTP-wachtwoord veilig opslaan” en kiest een password manager. Dat klopt voor zijn eigen gebruik, maar als de echte vraag was “Claude moet zonder mijn tussenkomst kunnen pushen”, dan past een password manager niet. De hele veiligheid van Bitwarden of 1Password zit erin dat ze zonder master-password niet open kunnen, en Claude heeft geen master-password.

Voor agentwerk geldt: kies de credential-store op basis van wie of wat de unlock doet, niet op basis van welke versleuteling de credential aan rest geeft.

Kernpunten

Beslismodel

Twee vragen, in volgorde:

  1. Moet Claude (of een script dat Claude triggert) de credential ophalen zonder gebruikersinteractie? Zo nee → password manager is fine. Zo ja → ga verder.
  2. Hoe gevoelig is de credential? Productie-database, signing-key, betaal-API: aparte machine of secrets-vault. Persoonlijke FTP, eigen-website API-token, lokale dev-tools: lichte oplossingen volstaan.

Routes voor zelfstandige Claude-acties

RouteEncrypted at restWerkt zonder promptGeschikt voor
~/.netrc met chmod 600neeja, automatisch via curl/lftp/ncftp/gitFTP, HTTP-basic, eenvoudige login-werk
Plain-text envfile met chmod 600neeja, na eenmalige sourceenv-vars die scripts verwachten
macOS Keychain (security cmd)jaja, na eenmalige Always Allow per binaryalgemene secrets, ook voor andere tools
Bitwarden / 1Password CLIjanee, vereist master password per shellNIET voor agent-werk, wel voor user-werk

Waarom Bitwarden/1Password CLI niet werkt voor Claude

bw unlock vraagt master password (interactief, niet pipebaar in Claude Code’s prompt-bridge). De resulterende BW_SESSION token kan technisch wel doorgegeven worden, maar dan moet de gebruiker telkens unlocken. Voor “Claude doet zelfstandig X” betekent dit: de gebruiker moet er bij zitten. Dan is de hele agent-route weg.

Uitzondering: Bitwarden Secrets Manager (apart product, betaald, voor machine-credentials). Die heeft service-accounts en wel echte machine-to-machine flow. Voor één FTP-wachtwoord overkill.

.netrc als pragmatische default voor FTP/HTTP

Standaard in ~/.netrc:

machine jimvandenbreemen.nl
  login Claude@jimvandenbreemen.nl
  password <wachtwoord>

Met chmod 600. Curl, lftp, ncftp, ftp, git-ftp lezen dit automatisch. Geen --user of -u op de commandline, geen env-var, geen unlock. Werkt voor FTP en HTTP-basic. Niet versleuteld op disk, maar toegankelijk alleen voor de eigenaar.

Voor “Claude moet zelfstandig pushen naar mijn eigen statische site” is dit de juiste route. Eenmalig instellen, daarna geen rituelen meer.

macOS Keychain met “Always Allow”-valkuil

Keychain is wel encrypted at rest en automatisch geünlock zodra de gebruiker is ingelogd. Maar:

security find-generic-password -s weboke-ftp -w

vraagt bij de eerste call door een nieuwe binary om bevestiging via een macOS-dialoog: “Allow Once / Always Allow / Deny”. Per unieke binary opnieuw. Bij Claude Code dat via Bash-tool verschillende paden aanroept levert dit onvoorspelbare prompts op. Voor secrets die door precies één lang-levende binary worden opgehaald is Keychain prima. Voor secrets die door wisselende scripts worden gebruikt is het storend.

Claude Code’s transcript en file-watcher als leak-vectoren

Twee paden waarlangs een secret in transcript belandt zonder dat de gebruiker het beseft:

  1. Chat-prompt: alles wat de gebruiker typt of plakt gaat naar de assistant context. Wachtwoord in chat = wachtwoord in transcript.
  2. File-modifications onder homedir: als de gebruiker tijdens een lopende Claude Code sessie een bestand bewerkt onder zijn home-directory dat Claude Code monitort, wordt de wijziging als system-reminder naar de assistant gestuurd, inclusief inhoud. TextEdit op ~/.netrc openen en het wachtwoord erin plakken stuurt het wachtwoord alsnog naar de context.

Veilige route voor het instellen van een secret op disk:

  • Open een aparte terminal-app (Terminal.app of iTerm), buiten de Claude Code sessie
  • Bewerk het bestand met nano, vim of een editor naar keuze
  • Doe dit op een moment dat geen Claude Code sessie loopt, of in een andere user-account

Voor secrets met laag risico-profiel (eigen FTP-account, eigen API-keys voor lokale tools): is het meeluisteren door Claude Code via API een acceptabel risico volgens consumer-policy (30 dagen retentie, niet voor training tenzij opt-in). Voor productie-secrets niet acceptabel — die horen sowieso niet op een dev-machine en al helemaal niet in transcript-bereik.

Vuistregels

  • “Claude moet zonder mij kunnen X-en” → .netrc, plain-text chmod 600, of Keychain. Geen Bitwarden of 1Password CLI.
  • “Ik moet zelf snel kunnen Y-en” → Bitwarden, 1Password, Keychain — wat je toch al gebruikt.
  • Secret in chat geplakt = roteren. Secret in monitored-file geplakt = roteren als blast-radius dat rechtvaardigt.
  • Voor lage blast-radius (persoonlijke website FTP, eigen lokale API): pragmatisch laten staan na rotatie volstaat, in plaats van eindeloos schoonschrobben.

Verbanden

Bronnen

Geen externe publicaties. Lessen uit een Claude Code sessie waarin de Bitwarden-route werd opgezet, daarna teruggedraaid naar ~/.netrc toen bleek dat de use case “Claude moet zelfstandig pushen” was, niet “ik moet zelf veiliger inloggen”.

Sessie-herkomst