Agent Safehouse – macOS 네이티브 샌드박싱으로 로컬 AI 에이전트 안전하게 돌리기
Agent Safehouse – macOS-native sandboxing for local agents
TL;DR Highlight
Claude Code, Codex 등 로컬 AI 에이전트를 macOS의 sandbox-exec 기반으로 격리해서, 프로젝트 디렉토리 밖의 파일(SSH 키, AWS 인증정보 등)에 접근하지 못하게 막아주는 오픈소스 도구.
Who Should Read
Claude Code, Codex, Cursor 같은 로컬 AI 에이전트를 --yolo 모드로 풀 자동화 돌리고 싶은데, SSH 키나 다른 레포가 날아갈까 불안한 개발자. 특히 macOS에서 컨테이너 없이 네이티브로 에이전트를 돌리는 사람.
Core Mechanics
- Agent Safehouse는 macOS 내장 sandbox-exec 위에 올린 정책 생성기(wrapper)다. 별도 의존성이나 가상화 없이 Bash 스크립트 하나로 동작하고, Homebrew로 설치하거나 curl로 단일 스크립트를 받으면 끝이다.
- 기본 동작은 deny-first 모델이다. 에이전트는 현재 프로젝트 디렉토리(git root)에만 읽기/쓰기 권한을 갖고, ~/.ssh, ~/.aws, 다른 레포 등 나머지 홈 디렉토리는 커널 레벨에서 접근이 차단된다.
- Claude Code, Codex, OpenCode, Amp, Copilot CLI, Gemini CLI, Aider, Cursor Agent, Cline 등 주요 에이전트 CLI를 모두 테스트했고, 각 에이전트가 정상 동작하는 데 필요한 최소 권한을 조사해서 프리셋으로 제공한다.
- shell 함수로 감싸면 에이전트 실행 시 자동으로 샌드박스가 적용된다. 예를 들어 `claude() { safe claude --dangerously-skip-permissions "$@"; }` 같이 zshrc에 넣으면 매번 safehouse를 명시적으로 호출할 필요가 없다.
- Policy Builder라는 웹 도구도 제공해서, GUI로 sandbox-exec 정책 파일을 생성한 뒤 dotfiles에 넣어 쓸 수도 있다. 프로젝트 전체를 안 써도 정책 파일 하나만 뽑아쓰는 게 가능하다.
- sandbox-exec는 Apple이 macOS Sierra(2016년)에서 공식 deprecated했지만, 실제로 macOS 내부 서비스들도 아직 의존하고 있어서 10년째 잘 동작하고 있다. 다만 언제 완전히 제거될지는 불확실하다.
- LLM 에이전트는 확률적으로 동작하기 때문에 1%의 재앙 확률이라도 장기적으로는 반드시 발생한다는 것이 핵심 전제다. 커널 레벨에서 syscall 자체를 차단하므로 에이전트가 아무리 똑똑해도 우회할 수 없다.
Evidence
- 제작자가 직접 댓글로 설명하길, 로컬 머신에서 에이전트를 풀 자동화로 돌리고 싶어서 만들었고, 각 에이전트가 auto-update, 키체인 통합, 이미지 붙여넣기 등을 정상적으로 하려면 어떤 최소 권한이 필요한지 수많은 시간을 투자해 조사했다고 한다.
- sandbox-exec를 직접 쓰면 되지 않냐는 반론이 있었다. 하지만 다른 댓글에서 'sandbox-exec 다루는 일의 90%는 내부 환경에 맞게 스코핑하는 것이고, 또 다른 90%는 sandbox-exec 자체가 어떻게 동작하는지 파악하는 것'이라며 프리셋의 가치를 인정했다.
- 파일시스템 샌드박싱은 절반일 뿐이라는 의견이 많았다. 에이전트가 프로덕션 DB에 접속하거나, 이메일/DM을 보내거나, 클라우드 리소스를 생성하는 등 외부 시스템에 대한 blast radius는 이 도구로 막을 수 없다. 에이전트별로 별도 인증 컨텍스트와 감사 로그가 필요하다는 주장이 나왔다.
- 2025년 여름에 Claude Code가 단일 파일 복원하려고 git hard revert를 해서 1000줄이 날아간 경험담이 공유됐다. 다만 2026년 3월 현재 에이전트 안정성이 많이 좋아져서 3개월간 큰 사고가 없었다고 하면서도, 다층 방어는 여전히 권장한다고 했다.
- 대안으로 Sandvault(sandbox-exec + Unix 유저 격리), nono.sh(프록시 기반 credential 격리), Apple Container(리눅스 VM에서 에이전트 실행) 등이 언급됐다. macOS용 네이티브 Docker가 없는 게 근본 문제라는 의견도 있었다.
How to Apply
- Claude Code나 Codex를 --dangerously-skip-permissions 모드로 쓰고 있다면, `brew install eugene1g/safehouse/agent-safehouse` 후 zshrc에 shell 함수를 등록해서 모든 에이전트 실행에 자동 샌드박싱을 걸 수 있다. SSH 키나 다른 레포가 보호된다.
- 여러 프로젝트를 오가며 에이전트를 쓰는 경우, `--add-dirs-ro=~/mywork` 옵션으로 읽기 전용 공유 디렉토리를 추가 지정하면 공통 라이브러리는 읽되 쓰기는 현재 프로젝트에만 허용할 수 있다.
- 팀에 에이전트 도입을 검토 중이라면, Policy Builder 웹 도구로 회사 환경에 맞는 최소 권한 정책 파일을 생성해서 팀 dotfiles에 표준으로 배포하는 것이 현실적인 첫 단계다.
- 파일시스템 샌드박싱만으로는 프로덕션 DB나 클라우드 API 접근을 막을 수 없으므로, 네트워크 레벨 격리가 필요하면 nono.sh 같은 프록시 기반 도구를 함께 쓰는 것을 고려하라.
Code Example
snippet
# 1. 설치
brew install eugene1g/safehouse/agent-safehouse
# 2. 샌드박스 안에서 에이전트 실행
cd ~/projects/my-app
safehouse claude --dangerously-skip-permissions
# 3. zshrc에 자동 적용 함수 등록
safe() { safehouse --add-dirs-ro=~/mywork "$@"; }
claude() { safe claude --dangerously-skip-permissions "$@"; }
codex() { safe codex --dangerously-bypass-approvals-and-sandbox "$@"; }
# 4. 샌드박스 테스트 (SSH 키 접근 차단 확인)
safehouse cat ~/.ssh/id_ed25519
# cat: /Users/you/.ssh/id_ed25519: Operation not permittedTerminology
sandbox-execmacOS에 내장된 프로세스 격리 도구. 특정 프로그램이 파일이나 네트워크에 접근할 수 있는 범위를 정책 파일로 제한한다. 2016년에 deprecated됐지만 아직 동작한다.
deny-first기본적으로 모든 접근을 차단하고, 명시적으로 허용한 것만 열어주는 보안 모델. 화이트리스트 방식이라고도 한다.
syscall프로그램이 OS 커널에 파일 읽기/쓰기 같은 작업을 요청하는 호출. 커널 레벨에서 차단하면 프로그램이 아무리 우회를 시도해도 막힌다.
blast radius보안 사고가 났을 때 영향을 받는 범위. 폭탄의 폭발 반경에 비유한 표현으로, 에이전트가 망칠 수 있는 최대 범위를 뜻한다.
overlay / copy-on-write원본 파일을 직접 수정하지 않고 변경 사항만 별도 레이어에 기록하는 방식. 에이전트가 .bashrc를 수정해도 내 원본은 안전한 구조.