Sikkerhet #4: La en hook stoppe det Claude ikke får gjøre
Jeg hadde skrevet «aldri rør git» i CLAUDE.md, lagt det i memory og sagt det i chatten. Likevel kom det en dag en git stash gjemt inni en lang kontrollkommando, og hele arbeidsmappa mi, med endringer fra flere saker, havnet i stashen. Regler i tekst er bare forslag. Modellen kan glemme dem.
Så nå ligger regelen i en hook i stedet. Claude Code kan kjøre et lite skript før hvert verktøykall, en PreToolUse-hook. Skriptet får kommandoen som JSON, og svarer «deny» hvis den inneholder git. Da kjøres kommandoen aldri, og Claude får beskjed om hvorfor.
Slik ser min ut, i ~/.claude/settings.json:
- Matcher: Bash. Hooken kjører bare på shell-kommandoer.
- Skriptet leser tool_input.command med jq og grep-er etter git og .git/.
- Treff: skriv ut JSON med permissionDecision «deny» og en grunn.
- Grunnen sier også hva Claude skal gjøre i stedet: gi meg kommandoen, så kjører jeg den selv.
- I tillegg står Bash(git *) i permissions.deny i samme fil, så det er to lag.
Én ting til, som jeg fant i dokumentasjonen: en hook som feiler, feks fordi jq mangler, slipper kommandoen gjennom. Fra versjon 2.1.295 kan du sette onFailure «block» på hooken, så stopper den også da. Den linja er verdt å legge til.
Det Claude bør gjøre står i CLAUDE.md. Det Claude ikke får gjøre, ligger i en hook. Det er hele tipset.
Har du hooks som har reddet deg? Del gjerne i kommentarfeltet.