콘텐츠로 이동

권한 정책

문제

새 레포에서 Claude Code 퍼미션을 설정할 때 허용 규칙을 얼마나 적어 두어야 안전한지 기준이 없습니다. 다 허용하자니 불안하고, 하나하나 적자니 끝이 없습니다.

추천

allowlist를 키우지 않습니다. 전역 설정에는 허용 규칙을 아예 두지 않고, 민감한 항목만 settings.local.json(gitignore 대상)에 최소한으로 적은 뒤, 나머지 판단은 auto 모드 분류기에 맡깁니다.

이유

Bash(curl:*)처럼 민감한 항목은 git에 커밋되는 파일이 아니라 local 쪽에 둡니다. 레포를 받는 사람에게 자신의 허용 범위를 강제하지 않기 위해서입니다. 전역 설정에는 defaultMode 같은 컨텍스트·모드 선언만 두고, allow/deny 규칙 자체는 최소한으로 유지합니다.

auto 모드는 모든 요청을 그대로 통과시키지 않습니다. 신뢰하는 레포, 민감한 데이터가 있는 위치, 운영 환경을 가리키는 이름 패턴을 알아채는 휴리스틱이 들어 있습니다. 이 판단 근거는 autoMode.environment에 조직 보안 프로파일로 등록해 둘 수 있습니다.

분류기는 allowlist가 못 잡는 것도 잡습니다. 예를 들어 병합 순서가 꼬여 --no-ff 머지 커밋이 두 벌 생긴 상황을 되돌리려고 git reset --hard를 쓰면, auto 모드 분류기가 이를 요청 범위를 벗어난 파괴적 작업으로 판단해 차단할 수 있습니다. allowlist에 규칙을 적어 두었다면 그대로 통과했을 상황입니다. 분류기는 명령 자체가 아니라 명령의 의도를 읽습니다.

이 방식은 정책을 CLAUDE.md 산문이 아니라 실행 가능한 형태로 강제하는 다른 사례들과 같은 방식입니다. worktree 결과를 원격에 push하지 못하게 막는 것도 문서가 아니라 PreToolUse 훅 (exit 2)입니다. 왜 산문만으로는 부족한지는 팀 CLAUDE.md에서 다룹니다.

설정 파일 네 종류는 성격이 다르므로 섞어서 다루면 안 됩니다.

파일 성격
~/.claude/settings.json 개인이 쓰는 선언적 설정, 커밋 대상 아님
~/.claude/settings.local.json gitignore 대상 퍼미션 allowlist
.claude/settings.json 프로젝트 공유 설정, 커밋 대상
~/.claude.json 앱이 실행 중 write back하는 UI 상태, 앱 실행 중 손편집 금지

서브에이전트에는 tools: 필드로 접근 가능한 도구 자체를 좁히는 방법도 씁니다. 자율로 호출되는 서브에이전트일수록 이 필드로 범위를 좁혀 두는 편이, 프롬프트만으로 행동을 제약하는 것보다 안전합니다.

병렬 세션 환경에서는 백그라운드 세션의 공유 체크아웃 편집을 하네스가 기본으로 거부합니다. 읽기·검색은 막지 않습니다. 이 가드는 "worktree": {"bgIsolation": "none"}으로 레포 단위로 끌 수 있습니다. 끄면 공유 체크아웃이 직접 수정되므로 병렬 잡이 도는 팀 환경에서는 켜 두는 쪽이 기본입니다.

예시

전역 설정에는 allow/deny 규칙 없이 컨텍스트와 모드만 선언합니다.

~/.claude/settings.json
{
"permissions": { "defaultMode": "auto" }
}

민감한 항목만 local에 최소로 둡니다.

// ~/.claude/settings.local.json (gitignore)
{
"permissions": {
"allow": ["Bash(curl:*)"],
"deny": []
}
}

bg 세션 격리 가드는 기본으로 켜져 있습니다. 병렬 잡이 도는 레포에서는 이 값을 굳이 끄지 않습니다. 끄면 공유 체크아웃이 직접 수정됩니다.

// .claude/settings.json (프로젝트, 커밋됨) — 격리를 끄는 경우에만 필요
{
"worktree": { "bgIsolation": "none" }
}

하지 말 것

allowlist를 계속 불리기. 명령 하나가 막힐 때마다 규칙을 추가하면 결국 분류기가 할 일을 사람이 대신 유지보수하게 됩니다.

민감한 규칙을 커밋되는 설정 파일에 적기. settings.local.json이 있는 이유가 그것이고, .gitignore에 걸려 있어야 합니다.

skillOverrides나 훅으로 막아 둔 것을 왜 막았는지 기록하지 않기. 억제 지침이 그 대상을 참조하지 않으면 다음 사람이 왜 막혔는지 모른 채 똑같이 우회를 시도합니다.