콘텐츠로 이동

03-실전

dev.to의 Lock Down Claude Code: 5 Permission Patterns 와 Korny의 Better Claude Code Permissions 가 묘사한 패턴을 통합해 정리한다.

패턴 1: 화이트리스트 + 기본 거부 (가장 안전)

섹션 제목: “패턴 1: 화이트리스트 + 기본 거부 (가장 안전)”
{
"permissions": { "defaultMode": "deny" },
"allowedTools": [
"Read", "Grep", "Glob", "Edit", "Write",
"Bash(git status)", "Bash(git diff*)", "Bash(git log*)",
"Bash(pnpm test*)", "Bash(pnpm lint*)", "Bash(pnpm typecheck*)"
]
}
  • 새 도구가 등장하면 명시적으로 추가해야 한다 → 마찰은 늘지만 사고는 거의 없다.
  • 팀 전체 .claude/settings.json로 커밋.

패턴 2: 자동 모드 + 위험 패턴 차단 hook

섹션 제목: “패턴 2: 자동 모드 + 위험 패턴 차단 hook”
{
"permissions": { "defaultMode": "auto" },
"hooks": {
"PreToolUse": [{
"matcher": "Bash",
"hooks": [{ "type": "command", "command": ".claude/hooks/block-dangerous.sh" }]
}]
}
}
  • block-dangerous.shrm -rf /, rm -rf ~, curl * | sh, git push --force 같은 패턴을 정규식으로 차단(07장에서 전문 제공).

패턴 3: 헤드리스 전용 settings.local.json

섹션 제목: “패턴 3: 헤드리스 전용 settings.local.json”

CI나 cron에서는 사람이 승인할 수 없으므로 별도 settings 프로파일을 만든다.

Terminal window
CLAUDE_SETTINGS_PATH=.claude/settings.ci.json claude -p "..." \
--max-turns 5 \
--permission-mode auto
  • .claude/settings.ci.json은 더 좁은 화이트리스트, 강한 hook, 짧은 타임아웃을 갖는다.

Edit(*) / Write(*) 매처에 디렉토리를 강제한다. 예:

{
"allowedTools": [
"Edit(src/**)", "Edit(tests/**)",
"Write(src/**)", "Write(tests/**)"
]
}
  • infra/, secrets/, .github/workflows/ 같은 민감 디렉토리는 명시적 사용자 승인.

패턴 5: 컨테이너/별도 사용자 격리

섹션 제목: “패턴 5: 컨테이너/별도 사용자 격리”

Wolak 사례의 결론은 hook 만으로 안전하지 않다는 것이다. 가능하면 별도 OS 사용자나 컨테이너에서 돌린다.

“Containerize hobby agent runs. Use a dedicated user account with no access to the rest of the disk.”
의역: “취미 에이전트는 컨테이너로 격리하라. 디스크의 다른 영역에 접근 권한이 없는 전용 사용자 계정을 써라.”