macOS에서 Claude Code 격리 환경 구축: Anthropic 레퍼런스 컨테이너, OrbStack, SSH, Zed 활용
My isolated Claude Code setup on macOS: Anthropic's reference dev container, OrbStack, SSH and Zed
핵심 요약
Claude Code를 로컬 파일과 분리하여 안전하게 실행하기 위한 컨테이너 기반 격리 환경 구축기입니다.
- 보안 격리 — OrbStack 컨테이너와 방화벽을 통해 Claude Code의 접근 범위를 제한함
- SSH 연결 — 컨테이너 내부에 SSH 서버를 구축하여 터미널이나 Claude Desktop에서 직접 접속함
- 파일 시스템 제한 — .git 폴더를 읽기 전용으로 마운트하여 Claude의 임의 수정을 방지함
- 운영 효율성 — 자동 모드 사용 시 보안 위험을 줄이고 로컬 앱과 원활하게 연동함
Claude Code를 내 맥의 파일, 자격 증명, 다른 프로젝트들로부터 격리시키면서도 내가 좋아하는 네이티브 앱들은 그대로 쓰고 싶었거든. 온갖 테스트를 거쳐서 정착한 방법을 공유한다. 더 나은 방법이나 부족한 점 있으면 알려줘.
세팅 방법
-
Anthropic에서 제공하는 레퍼런스 dev container(Dockerfile, devcontainer.json, 방화벽 스크립트)를 베이스로 썼고, OrbStack 위에서 Dev Containers CLI를 사용해 공유 설정 하나로 실행함:
devcontainer up --workspace-folder <repo> --config <shared-folder>/devcontainer.json -
레포지토리는 맥에 그대로 두고, 각 컨테이너는 자기 레포지토리만 작업 공간으로 마운트함. 관련 없는 프로젝트나 개인 폴더는 아예 접근 불가.
-
각 컨테이너는 키 방식 SSH 서버만 돌려서 Claude Code에 접속함. Claude Desktop의 SSH 세션으로 들어가든, 터미널에서 그냥
ssh로 들어가서claude를 실행하든 편한 대로 하면 됨. 어쨌든 Claude의 명령어랑 수정 작업은 전부 컨테이너 안에서만 돌아감. -
Zed랑 GitHub Desktop은 맥에서 네이티브로 돌리면서 같은 폴더를 참조함.
-
공유 설정 파일은 레포지토리 밖에 둬서 Claude가 자기 컨테이너 설정을 멋대로 못 건드리게 함.
레퍼런스에서 바꾼 점
-
SSH 서버 추가: 키 방식만 허용, 비밀번호 없음, 루트 권한 없음, 사용자 한 명. 포트 개방 안 함. OrbStack의 컨테이너별 호스트네임인
claude-<repo>.orb.local로만 접속 가능. -
.git/hooks랑.git/config를 읽기 전용으로 마운트해서 Claude가 레포지토리의 깃 훅이나 로컬 깃 설정을 직접 못 바꾸게 막음. 깃은 맥에서 같은 폴더를 대상으로 실행되니까(난 GitHub Desktop 쓰지만 깃 CLI나 에디터 깃 패널도 마찬가지), 맥에서 뭔가 돌아갈 위험이 줄어듦. 물론 맥에서 실행하는 다른 파일들까지 다 커버되는 건 아님(한계점 참고). -
방화벽은 다른 거 실행하기 전에 "전부 차단" 규칙부터 박아버림. 일단 이게 적용되면 나중에 오류가 나도 아웃바운드 트래픽은 계속 차단된 상태로 유지됨. DNS는 컨테이너의 리졸버로만 허용하고, 전체 호스트 네트워크를 허용하던 레퍼런스 규칙은 삭제함. 테스트해보니 컨테이너가 맥이나 허용 목록에 없는 곳으로는 IPv4든 IPv6든 아예 통신을 못 함.
-
SSH는 방화벽이 성공적으로 켜져야만 시작됨. 레퍼런스 설정에 추가한 마운트랑 설정:
"mounts": [
"source=${localWorkspaceFolder}/.git/hooks,target=${localWorkspaceFolder}/.git/hooks,type=bind,readonly",
"source=${localWorkspaceFolder}/.git/config,target=${localWorkspaceFolder}/.git/config,type=bind,readonly"
],
"postStartCommand": "sudo /usr/local/bin/init-firewall.sh && sudo /usr/local/bin/start-sshd.sh"


