23. 보안과 안전

🎯 이 장의 목표
  • 자율 에이전트의 핵심 위험과 그 방어 계층을 이해한다
  • 샌드박싱(네이티브·Docker)으로 OS 수준 격리를 거는 법을 안다
  • 권한·훅·deny 규칙을 안전 설계에 조합한다
  • 프롬프트 주입 등 외부 입력 위험에 대비한다

자율 에이전트의 위험

Claude Code는 파일시스템에 직접 접근하고 명령을 실행하는 자율 도구입니다. 1장에서 봤듯, 2026년에 충분한 감독 없이 인프라 접근을 허용했다가 작업물을 잃은 사례들이 있었습니다(데이터베이스가 순식간에 지워진 스타트업 등).

흔한 실패 모드:

  • 무한 교정 루프(고칠 때마다 새 회귀)
  • 존재하지 않는 파일 경로 참조
  • 공유 모듈에 파괴적 변경
  • 무관한 영역의 테스트 회귀

방어는 여러 층으로

안전은 한 가지 장치가 아니라 겹겹의 층으로 만듭니다. 강제력이 약한 것부터 강한 것 순으로:

flowchart TB
    L1[CLAUDE.md<br/>안내 ~70% 준수]:::weak
    L2[권한 모드<br/>승인 빈도 조절]:::mid
    L3[권한 deny 규칙<br/>특정 도구·명령 차단]:::strong
    L4[Hooks<br/>이벤트 시점 결정적 개입]:::strong
    L5[샌드박싱<br/>OS 수준 격리]:::strongest
    L6[Git 버전 관리<br/>되돌리기 안전망]:::strongest

    L1 --> L2 --> L3 --> L4 --> L5 --> L6

    classDef weak fill:#FFE082,stroke:#F9A825,color:#000
    classDef mid fill:#FFCC80,stroke:#FB8C00,color:#000
    classDef strong fill:#EF9A9A,stroke:#E53935,color:#000
    classDef strongest fill:#A5D6A7,stroke:#43A047,color:#000
강제력
CLAUDE.md안내(약 70%)9장
권한 모드승인 빈도8장
권한 deny 규칙도구·명령 차단(우회 가능성↓)8장
Hooks이벤트 시점 결정적(주입엔 우회 가능)15장
샌드박싱OS 수준 격리이 장
Git되돌리기18장

📌 핵심: "반드시 막아야 하는 것"일수록 강한 층으로 내려가세요. .env 읽기·rm -rf는 CLAUDE.md 안내가 아니라 deny 규칙·훅·샌드박스로 막아야 합니다.

샌드박싱: OS 수준 격리

15장에서 "훅은 벽이 아니다"라고 했습니다. 진짜 벽이 필요할 때가 샌드박싱입니다. 샌드박스된 Bash 도구는 OS 수준 파일시스템·네트워크 격리를 강제합니다. 정의한 경계 안에서는 프롬프트 없이 명령이 돌고, 경계를 벗어나는 건 막힙니다.

flowchart LR
    subgraph Sandbox["샌드박스 경계 (OS 강제)"]
        Cmd[명령 실행]:::tool
        FS[허용된 파일시스템]:::result
        Net[허용된 네트워크]:::result
    end
    Cmd --> FS
    Cmd --> Net
    Cmd -.차단.-> Outside[경계 밖 접근]:::danger

    classDef tool fill:#90CAF9,stroke:#1E88E5,color:#000
    classDef result fill:#A5D6A7,stroke:#43A047,color:#000
    classDef danger fill:#EF9A9A,stroke:#E53935,color:#000

두 가지 접근:

  • 네이티브 샌드박싱: Claude Code가 제공하는 OS 수준 격리. 경계 안에서 자율 실행을 안전하게.
  • Docker 샌드박스: 컨테이너 안에서 Claude Code를 돌려 호스트와 격리. 20장의 자율 루프나 E2B 클라우드 샌드박스도 같은 맥락.
💡 팁
권한 deny 규칙은 전용 도구(Read·Edit)는 막아도 Bash 하위 프로세스는 못 막을 수 있습니다(6장). OS 수준에서 확실히 막으려면 샌드박싱입니다.

bypassPermissions는 격리 안에서만

8장bypassPermissions(모든 권한 검사 생략)는 반드시 샌드박스·컨테이너·VM·일회용 CI 러너 같은 격리 환경에서만 쓰세요. 격리 없이 쓰면 위 실패 모드가 그대로 현실이 됩니다.

CODE
완전 자율 실행을 원한다  →  격리 환경(샌드박스/컨테이너) + bypassPermissions
프로덕션·실제 자격증명     →  절대 완전 자율 금지. default/plan + 좁은 allow

비밀·자격증명 보호

  • .env 등 비밀 파일 읽기 차단: deny: ["Read(./.env)"]
  • CLAUDE.md에 비밀 금지: 접속 문자열·키를 절대 적지 않기(9장)
  • 자동 메모리 위치 보호: autoMemoryDirectory는 프로젝트 설정에서 못 바꾸게 막혀 있음(10장)
  • 자격증명 vault 활용: 자동화에 필요한 키는 안전한 곳에 저장

외부 입력·프롬프트 주입

⚠️ MCP·웹·파일 등 외부에서 들어오는 내용에는 주입 공격이 숨을 수 있습니다. 14장의 MCP 보안 수칙이 여기 적용됩니다:

  • 1차 벤더 서버 선호, 출처 불명 포크 경계
  • 되돌릴 수 없는 부작용(메시지 전송·PR·삭제)엔 사람 개입
  • 읽기 전용만 자동 승인
  • 런타임 감사: 도구 응답 로깅, 주입 지시 탐지
📌 핵심
훅은 "기회적 시점의 구조화된 개입"이라 주입을 완화하지만 막진 못합니다(15장). 진짜 격리는 샌드박스입니다.

코드 안전: Claude의 내장 거부

Claude Code는 악성으로 보이는 코드의 작성·설명을 거부하도록 설계돼 있습니다. 파일명·디렉터리 구조로 보아 멀웨어·악성 코드와 관련돼 보이면, 설명·속도 개선 같은 무해해 보이는 요청이라도 거부합니다. 이건 안전장치의 일부입니다.

팀·엔터프라이즈 안전 설계

  • 관리 정책(managed settings): OS 수준에서 조직 표준을 강제(10장)
  • .claude/ 버전 관리: CLAUDE.md·rules·skills·settings.json을 커밋해 팀 일관성
  • 프로젝트 범위 플러그인: --scope project로 git 공유(16장)
  • 플러그인 서브에이전트 제약: hooks·mcpServers·permissionMode 선언 불가(16장)

안전 체크리스트

CODE
□ Git 버전 관리 + 큰 작업 전 체크포인트 커밋
□ 별도 브랜치에서 작업
□ rm -rf, force-push, .env 읽기 등은 deny 규칙으로 차단
□ 완전 자율은 격리 환경(샌드박스/컨테이너)에서만
□ 프로덕션·실제 자격증명에는 자율 모드 금지
□ MCP·외부 입력: 1차 벤더 선호, 비가역 작업엔 사람 개입
□ 비밀은 CLAUDE.md·로그에 절대 노출 금지
□ 팀이면 managed settings로 표준 강제

이 장에서 배운 것

  • 자율 에이전트의 위험(데이터 손실·파괴적 변경)은 겹겹의 층으로 방어한다: CLAUDE.md→권한 모드→deny 규칙→훅→샌드박스→Git.
  • 진짜 격리는 샌드박싱(네이티브·Docker)으로 OS 수준에서 건다. deny 규칙은 Bash 하위 프로세스를 못 막을 수 있다.
  • bypassPermissions·완전 자율은 격리 환경에서만, 프로덕션·실제 자격증명엔 금지.
  • 외부 입력엔 프롬프트 주입 위험 → 1차 벤더·사람 개입·읽기만 자동 승인·런타임 감사.
  • 비밀은 deny 규칙으로 보호하고 CLAUDE.md·로그에 노출하지 않으며, 팀은 managed settings로 표준을 강제한다.

✍️ 확인 문제

  1. "반드시 막아야 하는 것"을 CLAUDE.md가 아니라 더 강한 층으로 막아야 하는 이유는 무엇인가요?
  2. deny 규칙으로 막기 어려운 경우(Bash 하위 프로세스 등)에 OS 수준 격리를 거는 방법은 무엇인가요?
  3. bypassPermissions를 안전하게 쓸 수 있는 조건은 무엇인가요?
다음 장: 24. 트러블슈팅 — 막혔을 때 푸는 법.